#include #include #include typedef struct { char name[20]; //学生姓名 char xuehao[20]; //学生学号 char phone[20]; //学生手机号 char qq[20]; //学生QQ号 int score[3]; //学生的三门课成绩 int sum; //学生三门课成绩的总和 }STU; int addstu(); //增添学生信息 void stupaixu(); //将学生信息按分数由高到低显示 int xhcz(); //用学号进行查找 int namecz(); //用姓名查询 int xxxg(); //搜索学号,并对该生的信息进行修改 int shanchu(); //搜索学号,删除该生所有信息 void fsdxs(); //分数段显示 成绩 int menu(); //菜单函数 int stdk(); //学生端口界面 int tedk(); //教师端口界面 int main() { system("color f1"); //包含于头文件 两个16进制的数来换颜色,第一个是背景颜色,第二个是字体颜色 menu(); //调用菜单界面函数 for(;;) { switch(menu()) //将菜单界面 用户输入的需求返回值进行选择 { case 1: printf("\n\t\t正在进入学生界面\n\n\t\t"); system("cls"); //先清屏 stdk(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 break; case 2: printf("\n\t\t正在进入教师界面\n\n\t\t"); system("cls"); //先清屏 tedk(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 break; case 0: printf("\n\t\t欢迎再次使用!\n\n\t\t"); system("pause"); exit(0); } } return 0; } int menu() //菜单函数 { char xuanze; //定义一个 字符型 的"选择", 用于接收用户的需求 int xz; //定义一个 整型 的"选择", 作为 字符型选择的 返回值 do { system("cls"); //清屏 printf("\n\t\t************湖南工业大学信息管理系统************\n"); printf("\t\t*┌-------------------------------------------┐ *\n"); printf("\t\t*│ 请问您的身份是: │ *\n"); printf("\t\t*│ 1.学生 │ *\n"); printf("\t\t*│ 2.教师 │ *\n"); printf("\t\t*│ 0.退出 │ *\n"); printf("\t\t*└-------------------------------------------┘ *\n"); printf("\t\t************************************************\n"); printf("\t\t请您选择(0-2):"); fflush(stdin); //防止用户一次性输入多个字符 scanf("%c", &xuanze); //查看用户的身份,进入下一界面 }while(xuanze<'0' || xuanze>'2'); //检查输入是否符合规范 xz = xuanze-'0'; //将字符型的选择转换成整型 switch(xz) //将整型返回值进行 "选择" { case 1: printf("\n\t\t正在进入学生界面\n\n\t\t"); system("cls"); //先清屏 stdk(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 break; case 2: printf("\n\t\t正在进入教师界面\n\n\t\t"); system("cls"); //先清屏 tedk(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 break; case 0: printf("\n\t\t欢迎再次使用!\n\n\t\t"); system("pause"); exit(0); } } int addstu() //增添学生信息 { FILE *fp1=NULL, *fp=NULL; //定义两个文件指针 STU st[1000]; //定义一个零时结构体数组,用来存储从文件读入的学生信息 int n, k=0, q; // n 用来存储需要添加的学生人数 // k 用来计算原文件中的学生总数 // q 用来做循环的整型变量 char names[20]; //定义零时姓名字符串,用于零时存储学生姓名 char xuehaos[20]; //定义零时学号字符串,用于零时存储学生学号 if((fp1 = fopen("xsxx.txt","r"))==NULL) { printf("\n\t\tError\n\n\t\t"); exit(0); } while(!feof(fp1)) { fscanf(fp1,"%s %s %s %s %d %d %d %d",&st[k].name,&st[k].xuehao,&st[k].phone,&st[k].qq,&st[k].score[0], &st[k].score[1],&st[k].score[2],&st[k].sum); k++; //每读入一个学生信息,学生总数加一 } fclose(fp1); printf("\n\t\t请输入要增添的学生人数:\n\n\t\t"); scanf("%d",&n); //读入需要添加的学生人数 system("cls"); for(int i=0; ik) // i > k 时,即整个文件所有学号都没有匹配的,执行此步骤 { printf("\n\t\t查无此人!\n\n\t\t"); system("pause"); //暂停一下,让用户知道为啥返回主界面 return main(); //返回主界面 } else // i < k 时,说明有匹配的人,他时第 i 个人 { printf("\n\t\t********************************学生信息******************************\n"); printf("\t\t----------------------------------------------------------------------\n"); printf("\t\t姓名:%-16s\t学号:%-16s\n",st[i].name,st[i].xuehao); printf("\t\t手机号:%-16s\tQQ号:%-16s\n",st[i].phone,st[i].qq); for(int s=0; s<3; s++) { printf("\t\t"); printf("第%d科目成绩:%3d",s+1,st[i].score[s]); } printf("\n\t\t总分:%d\n",st[i].sum); printf("\t\t----------------------------------------------------------------------\n"); printf("\n\t\t"); system("pause"); //先让用户看够了,然后按任意键返回 return main(); //返回主界面 } } int xxxg() //修改信息的函数 == "学号 修改"的拼音 { FILE *fp=NULL, *fp2=NULL; //定义两个文件指针 STU st[1000], tempa; //定义一个零时结构体数组,一个零时结构体 int n, i, j, k=0, x; // k用于计数 int km1, km2, km3, q, r; //科目1,科目2,科目3,两个用于循环的整型变量 char xuehaos[20], xiugais[20]; //定义一个零时 学号字符串,一个 "修改"字符串 char xuanze; //字符型 选择 if((fp = fopen("xsxx.txt","r"))==NULL) { printf("Error\n"); exit(0); } while(!feof(fp)) { fscanf(fp,"%s %s %s %s %d %d %d %d",&st[k].name,&st[k].xuehao,&st[k].phone,&st[k].qq,&st[k].score[0], &st[k].score[1],&st[k].score[2],&st[k].sum); k++; //每读入一个学生信息总数加一 } fclose(fp); printf("\n\t\t请输入需要修改信息的学生学号:\n\n\t\t"); scanf("%s", &xuehaos); //读入用户想要修改人的学号 for(i=0; i<=k; i++) //循环查找这个人 { if(strcmp(xuehaos,st[i].xuehao)==0) break; } if(i>k) { printf("\n\t\t查无此人!\n\n\t\t"); system("pause"); return main(); } else { printf("\n\t\t********************************学生信息******************************\n"); printf("\t\t----------------------------------------------------------------------\n"); printf("\t\t姓名:%-16s\t学号:%-16s\n",st[i].name,st[i].xuehao); printf("\t\t手机号:%-16s\tQQ号:%-16s\n",st[i].phone,st[i].qq); for(int s=0; s<3; s++) { printf("\t\t"); printf("第%d科目成绩:%3d",s+1,st[i].score[s]); } printf("\n\t\t总分:%d\n",st[i].sum); printf("\t\t----------------------------------------------------------------------\n"); printf("\n\t\t************************************************\n"); printf("\t\t*┌-------------------------------------------┐ *\n"); printf("\t\t*│ 请选择您需要的服务: │ *\n"); printf("\t\t*│ 1.修改姓名: │ *\n"); printf("\t\t*│ 2.修改学号: │ *\n"); printf("\t\t*│ 3.修改手机号: │ *\n"); printf("\t\t*│ 4.修改QQ号: │ *\n"); printf("\t\t*│ 5.修改成绩: │ *\n"); printf("\t\t*│ 0.返回上一界面 │ *\n"); printf("\t\t*└-------------------------------------------┘ *\n"); printf("\t\t************************************************\n"); printf("\n\t\t请输入需要修改的信息:\n\t\t"); fflush(stdin); scanf("%c", &xuanze); x = xuanze - '0'; switch(x) { case 1: printf("\n\t\t请输入新的姓名:\n\n\t\t"); scanf("%s", &xiugais); strcpy(st[i].name, xiugais); printf("\n\t\t修改成功!\n\n\t\t"); system("pause"); break; case 2: printf("\n\t\t请输入新的学号:\n\n\t\t"); scanf("%s", &xiugais); for(q=0; q<=k; q++) { if(strcmp(xiugais,st[q].xuehao)==0) //判断是否与文件中的学号冲突 { //将新学号与文件中所有学号进行比对,如果重复了就不能成功修改 printf("\n\t\t该学号已存在,无法修改!!!\n\n\t\t"); printf("\n\t\t将返回上一界面\n\n\t\t"); system("pause"); system("cls"); return main(); //返回主界面 } } strcpy(st[i].xuehao, xiugais); //如果不冲突,就修改 printf("\n\t\t修改成功!\n\n\t\t"); system("pause"); break; case 3: printf("\n\t\t请输入新手机号:\n\n\t\t"); scanf("%s", &xiugais); strcpy(st[i].phone, xiugais); printf("\n\t\t修改成功!\n\n\t\t"); system("pause"); break; case 4: printf("\n\t\t请输入新的QQ号:\n\n\t\t"); scanf("%s", &xiugais); strcpy(st[i].qq, xiugais); printf("\n\t\t修改成功!\n\n\t\t"); system("pause"); break; case 5: printf("\n\t\t请输入新的三门科目成绩:\n\n\t\t"); scanf("%d %d %d", &km1, &km2, &km3); //将新的三门科目的成绩赋给第 i 个人的成绩里面 st[i].score[0] = km1; st[i].score[1] = km2; st[i].score[2] = km3; st[i].sum = km1 + km2 + km3; printf("\n\t\t修改成功!\n\n\t\t"); system("pause"); break; } system("cls"); //成功修改了之后,将这个人的信息显示出来 printf("\n\t\t********************************学生信息******************************\n"); printf("\t\t----------------------------------------------------------------------\n"); printf("\t\t姓名:%-16s\t学号:%-16s\n",st[i].name,st[i].xuehao); printf("\t\t手机号:%-16s\tQQ号:%-16s\n",st[i].phone,st[i].qq); for(int s=0; s<3; s++) { printf("\t\t"); printf("第%d科目成绩:%3d",s+1,st[i].score[s]); } printf("\n\t\t总分:%d\n",st[i].sum); printf("\t\t----------------------------------------------------------------------\n"); printf("\n\t\t"); } if((fp2 = fopen("xsxx.txt","w"))==NULL) { printf("\n\t\tError\n\n\t\t"); exit(0); } for(int o=0; ok) //如果 i > k ,说明整个文件所有的学生信息对比完,都没有一个能匹配,执行此步骤 { printf("\n\t\t查无此人!\n\n\t\t"); system("pause"); //让用户知道为啥不能删除 return main(); } else //此步骤是将删除信息后的零时结构体输入重新全部写入文件 { printf("\n\t\t删除成功!\n\n\t\t"); if((fp = fopen("xsxx.txt","w"))==NULL) //以 "w" 的方式打开,完全覆盖原文件 { printf("\n\t\tError\n\n\t\t"); exit(0); } for(int o=0; o=90) { printf("\t\t姓名:%-16s\t平均分:%5.2f\n", st[i].name, st[i].sum/3.0); s = 1; //如果执行此步骤,就打开开关,就不会输出 "此分数段无人"的语句了 } ave = 0; } if(s==0) //判断开关是否打开,如果未打开,就执行此步骤 printf("\t\t此分数段没有人!\n"); s = 0; //每一次都要重置开关 printf("\t\t----------------------------------------------------------------------\n"); printf("\t\t平均分80~90的人是:\n"); for(i=0; i=80 && ave<90) { printf("\t\t姓名:%-16s\t平均分:%5.2f\n", st[i].name, st[i].sum/3.0); s = 1; //如果执行此步骤,就打开开关,就不会输出 "此分数段无人"的语句了 } ave = 0; } if(s==0) //判断开关是否打开,如果未打开,就执行此步骤 printf("\t\t此分数段没有人!\n"); s = 0; //每一次都要重置开关 printf("\t\t----------------------------------------------------------------------\n"); printf("\t\t平均分70~80的人是:\n"); for(i=0; i=70 && ave<80) { printf("\t\t姓名:%-16s\t平均分:%5.2f\n", st[i].name, st[i].sum/3.0); s = 1; //如果执行此步骤,就打开开关,就不会输出 "此分数段无人"的语句了 } ave = 0; } if(s==0) //判断开关是否打开,如果未打开,就执行此步骤 printf("\t\t此分数段没有人!\n"); s = 0; //每一次都要重置开关 printf("\t\t----------------------------------------------------------------------\n"); printf("\t\t平均分60~70的人是:\n"); for(i=0; i=60 && ave<70) { printf("\t\t姓名:%-16s\t平均分:%5.2f\n", st[i].name, st[i].sum/3.0); s = 1; //如果执行此步骤,就打开开关,就不会输出 "此分数段无人"的语句了 } ave = 0; } if(s==0) //判断开关是否打开,如果未打开,就执行此步骤 printf("\t\t此分数段没有人!\n"); s = 0; //每一次都要重置开关 printf("\t\t----------------------------------------------------------------------\n"); printf("\t\t平均分低于60的人是:\n"); for(i=0; i=0 && ave<60) { printf("\t\t姓名:%-16s\t平均分:%5.2f\n", st[i].name, st[i].sum/3.0); s = 1; //如果执行此步骤,就打开开关,就不会输出 "此分数段无人"的语句了 } ave = 0; } if(s==0) //判断开关是否打开,如果未打开,就执行此步骤 printf("\t\t此分数段没有人!\n\n\t\t"); printf("\n\t\t"); } int stdk() //学生端口 "st == 学生, dk == 端口" { char xuanze; //"选择" int xz; //"选择的整型返回值" do { system("cls"); //清屏 printf("\n\t\t************湖南工业大学信息管理系统************\n"); printf("\t\t*┌-------------------------------------------┐ *\n"); printf("\t\t*│ 请选择您需要的服务: │ *\n"); printf("\t\t*│ 1.显示所有学生的成绩信息 │ *\n"); printf("\t\t*│ 2.按分数段显示成绩信息 │ *\n"); printf("\t\t*│ 3.按学号查询成绩信息 │ *\n"); printf("\t\t*│ 4.按姓名查询成绩信息 │ *\n"); printf("\t\t*│ 0.返回上一界面 │ *\n"); printf("\t\t*└-------------------------------------------┘ *\n"); printf("\t\t************************************************\n"); printf("\t\t请您选择(0-4):"); fflush(stdin); //防止用户一次性输入多个字符 scanf("%c", &xuanze); //查看用户的身份,进入下一界面 }while(xuanze<'0' || xuanze>'4'); //检查输入是否符合规范 xz = xuanze-'0'; //将字符型"选择"变成它的整型返回值 switch(xz) //将整型返回值进行 "选择" { case 1: printf("\n\t\t正在进入 显示所有成绩信息界面\n\n\t\t"); system("cls"); //先清屏 stupaixu(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 break; case 2: printf("\n\t\t正在进入 按分数段显示成绩信息界面\n\n\t\t"); system("cls"); //先清屏 fsdxs(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 break; case 3: printf("\n\t\t正在进入 按学号查询成绩信息界面\n\n\t\t"); system("cls"); //先清屏 xhcz(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 case 4: printf("\n\t\t正在进入 按姓名查询成绩信息界面\n\n\t\t"); system("cls"); //先清屏 namecz(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 break; case 0: printf("\n\t\t正在为您返回上一界面\n\n\t\t"); system("cls"); return main(); //返回主界面 } return stdk(); //返回学生端口 } int tedk() //教师端口 "te == 老师, dk == 端口" { char xuanze; //"选择" int xz; //"选择"的整型返回值 do { system("cls"); //清屏 printf("\n\t\t************湖南工业大学信息管理系统************\n"); printf("\t\t*┌-------------------------------------------┐ *\n"); printf("\t\t*│ 请选择您需要的服务: │ *\n"); printf("\t\t*│ 1.显示所有学生的成绩信息 │ *\n"); printf("\t\t*│ 2.按分数段显示成绩信息 │ *\n"); printf("\t\t*│ 3.按学号查询成绩信息 │ *\n"); printf("\t\t*│ 4.按姓名查询成绩信息 │ *\n"); printf("\t\t*│ 5.增添学生信息 │ *\n"); printf("\t\t*│ 6.修改学生信息 │ *\n"); printf("\t\t*│ 7.删除学生信息 │ *\n"); printf("\t\t*│ 0.返回上一界面 │ *\n"); printf("\t\t*└-------------------------------------------┘ *\n"); printf("\t\t************************************************\n"); printf("\t\t请您选择(0-7):"); fflush(stdin); //防止用户一次性输入多个字符 scanf("%c", &xuanze); //查看用户的身份,进入下一界面 }while(xuanze<'0' || xuanze>'7'); //检查输入是否符合规范 xz = xuanze-'0'; //将字符型"选择"变成它的整型返回值 switch(xz) //将整型返回值进行 "选择" { case 1: printf("\n\t\t正在进入 显示所有成绩信息界面\n\n\t\t"); system("cls"); //先清屏 stupaixu(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 break; case 2: printf("\n\t\t正在进入 按分数段显示成绩信息界面\n\n\t\t"); system("cls"); //先清屏 fsdxs(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 break; case 3: printf("\n\t\t正在进入 按学号查询成绩信息界面\n\n\t\t"); system("cls"); //先清屏 xhcz(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 case 4: printf("\n\t\t正在进入 按姓名查询成绩信息界面\n\n\t\t"); system("cls"); //先清屏 namecz(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 break; case 5: printf("\n\t\t正在进入 增添学生信息界面\n\n\t\t"); system("cls"); //先清屏 addstu(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 break; case 6: printf("\n\t\t正在进入 按学号查询,修改信息界面\n\n\t\t"); system("cls"); //先清屏 xxxg(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 break; case 7: printf("\n\t\t正在进入 按学号查询,删除信息界面\n\n\t\t"); system("cls"); //先清屏 shanchu(); //再调用函数,显示界面 system("pause"); //将显示的界面固定住 break; case 0: printf("\n\t\t正在为您返回上一界面\n\n\t\t"); system("cls"); return main(); //返回主函数 } return tedk(); //返回教师端口 } int namecz() //"cz == 查找",用"姓名"进行查找的函数 { FILE *fp=NULL; //定义文件指针 STU st[1000]; //零时储存数据的结构体数组 int i, k=0; //k 用于计算学生人数 char names[20]; //定义用户输入需查找的学生姓名,方便进行比对 if((fp = fopen("xsxx.txt","r"))==NULL) //从文件读出所有学生信息,存入零时结构体,进行比对 { printf("\n\t\tError\n\n\t\t"); exit(0); } while(!feof(fp)) { fscanf(fp,"%s %s %s %s %d %d %d %d",&st[k].name,&st[k].xuehao,&st[k].phone,&st[k].qq,&st[k].score[0], &st[k].score[1],&st[k].score[2],&st[k].sum); k++; //每读入一个学生的信息,记录学生的总数 } fclose(fp); printf("\n\t\t请输入学生姓名:\n\n\t\t"); scanf("%s", &names); for(i=0; i<=k; i++) { if(strcmp(names,st[i].name)==0) break; } if(i>k) //如果判断完所有人的姓名都对不上,执行此步骤 { system("cls"); printf("\n\t\t查无此人!\n\n\t\t"); system("pause"); return main(); } else //如果 i < k 成立,就说明有匹配的,执行此步骤 { system("cls"); //先清屏,再显示信息,就不乱了 printf("\n\t\t********************************学生信息******************************\n"); printf("\t\t----------------------------------------------------------------------\n"); printf("\t\t姓名:%-16s\t学号:%-16s\n",st[i].name,st[i].xuehao); printf("\t\t手机号:%-16s\tQQ号:%-16s\n",st[i].phone,st[i].qq); for(int s=0; s<3; s++) { printf("\t\t"); printf("第%d科目成绩:%3d",s+1,st[i].score[s]); } printf("\n\t\t总分:%d\n",st[i].sum); printf("\t\t----------------------------------------------------------------------\n"); printf("\n\t\t"); system("pause"); //先让用户看够了 , 然后按任意键返回 return main(); //输出结束后就返回主界面 } }