资源描述
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"
#include"string.h"
#define N 1000 //N为可输入学生总人数,可依照需要更改
#define M 2 //M为宏定义(在创立密码函数中)可建立登陆顾客个数,可更改
struct student //定义学生信息构造体数组
{
char num[9]; //学号
char name[20]; //姓名
char depar[15]; //院系
char zhuanye[15]; //专业
char classes[5]; //班级
char age[3]; //年龄
char sex[4]; //性别
char nation[5]; //民族
char birth[9]; //出生日期
char add[10]; //籍贯
};
struct code //定义密码构造体数组
{
char name[20];
char code[7];
}co[M],s0;
//确认与否新创立密码文献模块
int code()
{
FILE *fp;
if((fp=fopen("学生学籍管理系统__code.txt","rt"))==NULL)
{
printf("密码文献不存在,请输入新顾客名及密码:\n");
//若不存在此密码文献,则提示顾客创立密码
printf("请输入任意键继续!");
getch();
system("cls");
return 1; //无密码文献返回1
}
else
return 0; //已有密码文献返回0
}
//新创立初始密码
void code_input()
{
FILE *fp;
int i;
if((fp=fopen("学生学籍管理系统__code.txt","wt"))==NULL); //当建立密码文献成功时,进入for循环
for(i=0;i<M;i++) //M为宏定义可建立登陆顾客个数,可更改
{
printf("请录入第%d个顾客名:",i+1); //创立不同顾客名及密码
scanf("%s",co[i].name);
printf("请录入第%d个密码(最多6位):",i+1);
scanf("%s",co[i].code);
printf("\n");
fwrite(&co[i],sizeof(struct code),1,fp); //将密码保存进文献中
}
fclose(fp);
getch();
system("cls");
}
//顾客登陆验证模块
int enter(char name1[20],char code1[6])
{
FILE *fp;
int flog=0;
int i;
fp=fopen("学生学籍管理系统__code.txt","rt");//打开存储密码文献
for(i=0;i<M;i++)
{
fread(&co[i],sizeof(struct code),1,fp); //读密码文献
if((strcmp(name1,co[i].name)==0)) //如果输入顾客名与已存在顾客名相似,再比较密码与否相似,否则进行下一种顾客名比较
{
if((strcmp(code1,co[i].code)==0)) //比较此顾客名下密码与否一致
return 1; //验证成功后回到主函数
}
}
if(i>=M) //当比较完毕后,都没有符合条件顾客名与密码,则直接跳出程序
printf("******您无权进入此管理系统!!!*****");
fclose(fp);
getch();
exit(1);
}
//从文献读入数据
int read_file(struct student stu[])
{
FILE *sp;
int i=0;
system("cls");
if((sp=fopen("学生学籍管理系统__学生信息.txt","rt"))==NULL)//读文献,若文献不存在,则需要创立一种新文献(文献创立在save_file函数中完毕)
{
printf("\n学生学籍管理系统__学生信息文献不存在,请创立!\n");
getch();
system("cls");
return 0;
}
while((fread(&stu[i],sizeof(struct student),1,sp))==1)//判断文献与否处在结束位置
{
if(stu[i].num==0) //若文献内容为空,则跳出循环
break;
else //若文献内容不为空,i自加1。
i++; //i为文献内构造体数组数量
}
fclose(sp);
return i; //返回i值,代表文献中学生人数
}
//保存学生信息(保存在文献中)
void save_file(struct student stu[],int sum)
{
FILE *sp;
int i;
if((sp=fopen("学生学籍管理系统__学生信息.txt","wb"))==NULL)//若不存在此TXT文档,则创立;
{
printf("读文献错误!\n"); //创立不成功,返回menu函数;
return;
}
for(i=0;i<sum;i++)
if(fwrite(&stu[i],sizeof(struct student),1,sp)!=1) //保存文献,sum为既有总学生人数,若未保存成功,提示"写文献错误!";
printf("写文献错误!\n");
fclose(sp);
return;
}
//创立并录入信息
int found(struct student stu[])
{
int i=0,x;
system("cls");
printf("请输入要录入学生个数:\n");
scanf("%d",&x);
if(x==0)
return 0;
do //输入信息
{
printf("\n请录入第%d个学生信息:\n",i+1);
printf("请录入学号:");
scanf("%s",stu[i].num);
printf("\n请录入姓名:");
scanf("%s",stu[i].name);
printf("\n请录入院系:");
scanf("%s",stu[i].depar);
printf("\n请录入专业:");
scanf("%s",stu[i].zhuanye);
printf("\n请录入班级:");
scanf("%s",stu[i].classes);
printf("\n请录入性别:");
scanf("%s",stu[i].sex);
printf("\n请录入年龄:");
scanf("%s",stu[i].age);
printf("\n请录入出生日期(yyyymmdd):");
scanf("%s",stu[i].birth);
printf("\n请录入民族:");
scanf("%s",stu[i].nation);
printf("\n请录入籍贯:");
scanf("%s",stu[i].add);
i++;
system("cls");
}while(i<x); //当i>=x(顾客规定创立学生人数)时,跳出输入信息for循环;
save_file(stu,x); //保存学生信息致文献
printf("录入完毕,请按任意键返回");
getch();
return i; //返回创立学生人数
}
//修改学生信息
void modify(struct student stu[],int sum)
{
int i,item,a=1; //i控制数组下标,item控制子菜单选取
char s1[8];
FILE *sp;
system("cls");
read_file(stu,sum); //读函数
do
{
printf("\n\n\n请输入你要修改学号:\n");
scanf("%s",s1); //要修改学生学号
for(i=0;i<sum;i++) //查找此学生
{
if(strcmp(stu[i].num,s1)==0) //若找到该生,输出该生信息
{
printf("该学生学号:%s\n",stu[i].num);
printf("该学生姓名:%s\n",stu[i].name);
printf("该学生院系:%s\n",stu[i].depar);
printf("该学生专业:%s\n",stu[i].zhuanye);
printf("该学生班级:%s\n",stu[i].classes);
printf("该学生性别:%s\n",stu[i].sex);
printf("该学生年龄:%s\n",stu[i].age);
printf("该学生出生日期:%s\n",stu[i].birth);
printf("该学生民族:%s\n",stu[i].nation);
printf("该学生籍贯:%s\n",stu[i].add);
a=0; //找到该生,a=0;
break; //出for循环
}
}
if(a==1) //若没有找到该生,a=1,输出提示语句
printf("\n\n该学号不存在!请重新输入学号:\n");
}while(a); //当a=0,即没有找到该生,则继续循环重新输入学生学号
printf("\t****************\n");
printf("\t你选取你要修改选项:\n");
printf("\t1.*修改姓名\n");
printf("\t2.*修改年龄\n");
printf("\t3.*修改性别\n");
printf("\t4.*修改出生日期\n");
printf("\t5.*修改籍贯\n");
printf("\t6.*修改院系名称\n");
printf("\t7.*修改专业名称\n");
printf("\t8.*修改班级\n");
printf("\t9.*修改民族\n");
printf("\t0.*退出菜单\n");
printf("\t****************\n");
while(1)
{
printf("\n\t请选取你要进行操作:");
scanf("%d",&item); ///item控制子菜单选取
switch(item)
{
case 1: //修改姓名
printf("\t请输入新姓名:");
scanf("%s",stu[i].name);
printf("\n\n\n修改成功!\n");
save_file(stu,sum);
break;
case 2: //修改年龄
printf("\t请输入新年龄:");
scanf("%s",stu[i].age);
printf("\n\n\n修改成功!\n");
save_file(stu,sum);
break;
case 3: //修改性别
printf("\t请输入新性别:");
scanf("%s",stu[i].sex);
printf("\n\n\n修改成功!\n");
save_file(stu,sum);
break;
case 4: //修改出生日期
printf("\t请输入新出生年月(yyyy.mm):");
scanf("%s",stu[i].birth);
printf("\n\n\n修改成功!\n");
save_file(stu,sum);
break;
case 5: //修改籍贯
printf("\t请输入新籍贯:");
scanf("%s",stu[i].add);
printf("\n\n\n修改成功!\n");
save_file(stu,sum);
break;
case 6: //修改院系
printf("\t请输入新院系:");
scanf("%s",stu[i].depar);
printf("\n\n\n修改成功!\n");
save_file(stu,sum);
break;
case 7: //修改专业
printf("\t请输入新专业名称:");
scanf("%s",stu[i].zhuanye);
printf("\n\n\n修改成功!\n");
save_file(stu,sum);
break;
case 8: //修改班级
printf("\t请输入新班级:");
scanf("%s",stu[i].classes);
printf("\n\n\n修改成功!\n");
save_file(stu,sum);
break;
case 9: //修改民族
printf("\t请输入新民族名称:");
scanf("%s",stu[i].nation);
printf("\n\n\n修改成功!\n");
save_file(stu,sum);
break;
case 0:return; //不修改,退出
default:printf("\t请在0到9之间选取:"); //若输入值不在0~9,则提示
}
}
}
//查询学生信息
void seek(struct student stu[],int sum)
{
int i,item,flag; //i控制数组下标,item控制子菜单选取,flag为判断条件
char s1[11];
system("cls");
while(1)
{
system("cls");
printf("\n\n\t\t------------------\n");
printf("\t\t 1.按学号查询\n");
printf("\t\t 2.按姓名查询\n");
printf("\t\t 3.退出本菜单\n");
printf("\t\t------------------\n");
printf("\t\t 请选取子菜单编号:");
scanf("%d",&item); //选取子菜单
flag=0;
switch(item)
{
case 1: //按学号进行查找
printf("\t\t请输入要查询学生学号:");
scanf("%s",s1);
for(i=0;i<sum;i++)
if(strcmp(stu[i].num,s1)==0) //判断学号与否存在
{ //输出
flag=1;
printf("该学生学号:%s\n",stu[i].num);
printf("该学生姓名:%s\n",stu[i].name);
printf("该学生院系:%s\n",stu[i].depar);
printf("该学生专业:%s\n",stu[i].zhuanye);
printf("该学生班级:%s\n",stu[i].classes);
printf("该学生性别:%s\n",stu[i].sex);
printf("该学生年龄:%s\n",stu[i].age);
printf("该学生出生日期:%s\n",stu[i].birth);
printf("该学生民族:%s\n",stu[i].nation);
printf("该学生籍贯:%s\n",stu[i].add);
getch();
}
if(flag==0) //当上一种if条件不成立,flag=0,学生学号不存在,输出提示;
printf("\n\n\n\t\t该学号不存在!\n");
getch(); break;
case 2: //按姓名进行查找
printf("\n\n\t\t请输入要查询学生姓名:");
scanf("%s",s1);
for(i=0;i<sum;i++)
if(strcmp(stu[i].name,s1)==0) //判断姓名与否存在
{ //输出
flag=1;
printf("该学生学号:%s\n",stu[i].num);
printf("该学生姓名:%s\n",stu[i].name);
printf("该学生院系:%s\n",stu[i].depar);
printf("该学生专业:%s\n",stu[i].zhuanye);
printf("该学生班级:%s\n",stu[i].classes);
printf("该学生性别:%s\n",stu[i].sex);
printf("该学生年龄:%s\n",stu[i].age);
printf("该学生出生日期:%s\n",stu[i].birth);
printf("该学生民族:%s\n",stu[i].nation);
printf("该学生籍贯:%s\n",stu[i].add);
getch();
}
if(flag==0) //当上一种if条件不成立,flag=0,学生姓名不存在,输出提示;
printf("\n\n\n\t\t该姓名不存在!\n");
getch(); break;
case 3: system("cls"); return;
default:printf("\n\n\n\t\t请在1-3之间选取\n"); //若输入值不在1~3,则提示
getch();
}
}
}
//删除某学生信息
int del(struct student stu[],int sum)
{
int i,j,flag=0;
char s1[9];
system("cls");
printf("\n\n\t\t请输入要删除学生学号:");
scanf("%s",s1);
for(i=0;i<sum;i++)
if(strcmp(stu[i].num,s1)==0) //判断学号与否存在
{
flag=1; //该学号存在,用后一种数组覆盖此数组,循环,即可删除
for(j=i;j<sum-1;j++)
stu[j]=stu[j+1];
}
if(flag==0) //该学号不存在
printf("\n\n\t\t该学号不存在!\n");
getch();
if(flag==1) //删除成功,输出提示
{
printf("\n\n\n\t\t删除成功\n");
getch();
sum--; //删除成功,sum自-1;
}
save_file(stu,sum); //保存
return sum; //返回删除后存在学生人数
}
//显示打印已有学生信息
void show(struct student stu[],int sum)
{ int i;
system("cls");
printf("\n\n\t\t 所有学生信息为:\n");
for(i=0;i<sum;i++) //for循环打印信息
{
printf("学号:%s\t",stu[i].num);
printf("姓名:%s\t",stu[i].name);
printf("院系:%s\t",stu[i].depar);
printf("专业:%s\t",stu[i].zhuanye);
printf("班级:%s\t",stu[i].classes);
printf("性别:%s\t",stu[i].sex);
printf("年龄:%s\t",stu[i].age);
printf("出生日期:%s\t",stu[i].birth);
printf("民族:%s\t",stu[i].nation);
printf("籍贯:%s\n\n",stu[i].add);
}
printf("按任意键返回");
getch();
system("cls");
}
//添加学生信息
int insert(struct student stu[],int sum)
{
int i,j,flag,m;
FILE *sp;
system("cls");
printf("\t请输入要添加学生个数:");
scanf("%d",&m);
read_file(stu); //在添加前读文献
do
{
flag=1;
i=sum; //此时i表达数组下标,添加学生,保存到当前已有数组下一种,sum为总数,stu[i]表达第sum+1个人
while(flag)
{
flag=0;
printf("\n\n 请输入第 %d 个学生学号:",i+1);
scanf("%s",stu[i].num);
for(j=0;j<i;j++) //判断此学号与否存在
if(strcmp(stu[i].num,stu[j].num)==0)
{
printf("\n\n\n该学号已有,请重新输入!\n");
flag=1;
break; /*如果该学号已有则立即对出该层for循环*/
}
}
printf("\n 请输入第 %d 个学生姓名:",i+1);
scanf("%s",stu[i].name);
printf("\n 请输入第 %d 个学生院系:",i+1);
scanf("%s",stu[i].depar);
printf("\n 请输入第 %d 个学生专业:",i+1);
scanf("%s",stu[i].zhuanye);
printf("\n 请输入第 %d 个学生班级:",i+1);
scanf("%s",stu[i].classes);
printf("\n 请输入第 %d 个学生性别:",i+1);
scanf("%s",stu[i].sex);
printf("\n 请输入第 %d 个学生年龄:",i+1);
scanf("%s",stu[i].age);
printf("\n 请输入第 %d 个学生出生日期:",i+1);
scanf("%s",stu[i].birth);
printf("\n 请输入第 %d 个学生民族:",i+1);
scanf("%s",stu[i].nation);
printf("\n 请输入第 %d 个学生籍贯:",i+1);
scanf("%s",stu[i].add);
if(flag==0)
{
i=i;
i++;
}
}while(i<sum+m); //当下标i不大于sum+m时,循环继续,stu[sum+m]指向添加所有学生后所用数组下一种单元
sum+=m; //添加完毕后,学生总人数变为sum+m;
printf("\n\n\n\n\n\n\n\n\t\t\t\t 录入完毕!");
save_file(stu,sum); //保存
getch();
system("cls");
return sum; //返回添加完毕后既有学生人数
}
//对学生信息排序
void rank(struct student stu[],int sum)
{
int i,j;
FILE *sp;
struct student s1;
system("cls");
for(i=0;i<sum-1;i++) //对学生信息按照学号用 选取排序法 进行排序
for(j=i+1;j<sum;j++)
if(strcmp(stu[i].num,stu[j].num)>0) //小者换到stu[i]
{
s1=stu[i];
stu[i]=stu[j];
stu[j]=s1;
}
printf("\n\n\t\t 所有学生信息为:\n");
for(i=0;i<sum;i++) //打印排好后学生信息
{
printf("学号:%s\t",stu[i].num);
printf("姓名:%s\t",stu[i].name);
printf("院系:%s\t",stu[i].depar);
printf("专业:%s\t",stu[i].zhuanye);
printf("班级:%s\t",stu[i].classes);
printf("性别:%s\t",stu[i].sex);
printf("年龄:%s\t",stu[i].age);
printf("出生日期:%s\t",stu[i].birth);
printf("民族:%s\t",stu[i].nation);
printf("籍贯:%s\n\n",stu[i].add);
}
printf("按任意键返回");
getch();
system("cls");
}
//对班级学生人数进行记录
void count(struct student stu[],int sum)
{
int i,count=0;
char s1[5],s2[5],s3[5];
system("cls");
printf("\t\t请输入你要记录学生人数学院:");
scanf("%s",s1);
printf("\t\t请输入你要记录学生人数专业:");
scanf("%s",s2);
printf("\t\t请输入你要记录学生人数班级:");
scanf("%s",s3);
for(i=0;i<sum;i++)
if(strcmp(s1,stu[i].depar)==0&&strcmp(s2,stu[i].zhuanye)==0&&strcmp(s3,stu[i].classes)==0) //判断条件
count++; //count为符合条件学生人数
printf("%s学院%s专业%s班级学生人数为:%d人",s1,s2,s3,count);
getch();
}
//菜单函数
void menu()
{
int choice,sum;
struct student stu[N];
sum=read_file(stu); //sum为现已存入文献中学生人数
do
{
system("cls");
printf("\n\n\n");
printf("\t\t **********欢迎进入**********\n");
printf("\t\t********学生学籍管理系统********\n\n\n");
printf("\t\t\t 1.创立学生信息\n");
printf("\t\t\t 2.修改学生信息\n");
printf("\t\t\t 3.查询学生信息\n");
printf("\t\t\t 4.删除学生信息\n");
printf("\t\t\t 5.添加学生信息\n");
printf("\t\t\t 6.保存学生信息\n");
printf("\t\t\t 7.显示已录入学生信息\n");
printf("\t\t\t 8.对学生信息排序\n");
printf("\t\t\t 9.记录学生信息\n");
printf("\t\t\t 0.退出程序\n");
printf("\t\t\t 请选取您要执行操作(0~9):");
scanf("%d",&choice);
switch(choice)
{
case 1:sum=found(stu); break; //sum=创立后所存储学生人数
case 2:modify(stu,sum); break; //修改
case 3:seek(stu,sum); break; //查询
case 4:sum=del(stu,sum); break; //sum=删除学生后所存储学生人数
case 5:sum=insert(stu,sum); break; //sum=添加学生后所存储学生人数
case 6:save_file(stu,sum); break; //保存文献
case 7:show(stu,sum); break; //显示
case 8:rank(stu,sum); break; //排序
case 9:count(stu,sum); break; //记录某班级学生人数
case 0: break;
}
}while(choice!=0);
}
void main()
{
int flag=0;
flag=code(); //确认与否新创立密码文献。若没有存储密码文献,则flag=1,若有,flag=0;
if(flag) //判断if条件与否成立
code_input(); //当flag=1,即没有存储密码文献时,进入code_input()函数,创立顾客名及密码;当flag=0,则不用新建密码;
printf("*******请输入你顾客名及密码*******:\n"); //登陆该管理系统前需身份验证
scanf("%s %s",s0.name,s0.code); //输入顾客顾客名及密码
enter(s0.name,s0.code); //登陆管理系统前,进入enter()函数验证模块
system("cls");
menu();
}
展开阅读全文