#include<stdio.h>#define N 50#define M 200int stumax=0,scoremax=0;FILE *fp;struct student{char num[9]; //学号char name[20]; //姓名int sex; //性别int room; //宿舍号码long int tel; //电话号码}stu[N];struct stuscore{char num[9]; //学号char coursenum[10]; //课程编号char course[15]; //课程名称float point; //学分int nscore; //平时成绩int expscore; //实验成绩int examscore; //卷面成绩int comscore; //综合成绩float getpoint;//实得学分}score[M],score1[M];void enter_stu();void input_stu(int j);void enter_score();void input_score(int i);void com_score(int i);void browse_stu();void browse_score();void search();void search_stu();void search_num();void search_name();void search_room();void search_score();void printf_onestu_score(char snum[]);void delete_one();void order();void order_course_num();void order_course();void order_printf(int k);/***********菜单***********/void menu(){int w1;char n;/*变量n保存选择菜单数字,w1判断输入的数字是否在功能菜单对应数字范围内*/system("cls");do{puts("**************************************************************** \n\n");puts("\t ***************** 总菜单*****************\n\n");puts("\t*** 1.输入学生的基本信息***");puts("\t*** 2.浏览学生的基本信息***");puts("\t*** 3.输入学生的成绩基本信息***");puts("\t*** 4.浏览学生的成绩基本信息***");puts("\t*** 5.查询信息功能***"); puts("\t*** 6.删除信息功能***");puts("\t*** 7.排序:按综合成绩或实得学分***");puts("\t*** 8.退出***"); puts("\n\n************************************************************* ***");printf("\n选择要进行的功能代号(1-8):[ ]\b\b");scanf("%c",&n);if(n<'1'||n>'8') /*对选择的数字作判断*/{w1=1;printf("\n\n 请输入数字1~8!\n\n");}else{w1=0;/*选择功能*/switch(n){case'1':enter_stu();break; /*输入基本信息模块*/case'2':browse_stu();break; /*浏览基本信息模块*/case'3':enter_score();break; /*输入成绩基本信息模块*/case'4':browse_score();break; /*浏览成绩基本信息模块*/case'5':search();break; /*查找模块*/case'6':delete_one();break; /*删除学籍模块*/case'7':order();break; /*排序模块*/case'8':exit(0);}}}while(w1==1); getch();}/**********主函数*********/void main(){menu(); /*进入菜单*/}/*公用函数********************************************************************* **//*保存所有分数*/void save_score(){int i;if((fp=fopen("b.txt","w+"))==NULL) /*以输出方式打开,在此前的记录被覆盖*/{printf("\n 不能打开文件.");getch();}for(i=0;i<scoremax;i++)if(fwrite(&score[i],sizeof(struct stuscore),1,fp)!=1)printf("\n 文件输入错误.");fclose(fp);printf("\n 输入数据结束.Press any key to continue . . .");getch();}/*保存所有学生信息*/void save(){int i;if((fp=fopen("a.txt","w+"))==NULL) /*以输出方式打开,在此前的记录被覆盖*/{printf("\n不能打开文件");getch();}for(i=0;i<stumax;i++)if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)printf("\n文件输入错误.");fclose(fp);}/*显示一个分数,形参i表示显示第i个记录*/void printf_one_score(int i){printf("\n学号:%s 课程编号:%s 课程名称:%s 学分:%f\n 平时成绩:%d 实验成绩:%d 卷面成绩:%d 综合成绩:%d 实得学分:%f",score[i].num,score[i].coursenum,score[i].course,score[i].point,score[i].nscore, score[i].expscore,score[i].examscore,score[i].comscore,score[i].getpoint);}/*显示一个学生信息,形参j表示显示第j个记录*/void printf_one_stu(int j){printf("\n学号:%s 姓名:%s 性别:%d 宿舍号码:%d 电话号码:%ld",stu[j].num,stu[j].name,stu[j].sex,stu[j].room,stu[j].tel);}/*删除一个分数,形参i表示删除第i个记录*/void delete_one_score(int i){printf_one_score(i);score[i]=score[scoremax];scoremax--;printf("\n删除学生数据成功!Press any key to continue . . .");getch();save_score();}/*录入模块********************************************************************* **//*学生信息录入*/void enter_stu(){int i,n,es1;printf("\n要输入多少学生基本信息(1~%d)? ",N-1);scanf("%d",&n); /*要输入的学生基本信息的个数*/es1=n+stumax; /*输入n个后应有的记录个数*/printf("\n输入信息:");for(i=stumax;i<es1;i++)input_stu(i); /*调用输入学生基本信息函数*/printf("\n共输入%d 项基本信息.Press any key to continue . . .",n);getch();menu();/*提示输入任务结束,按任意键返回主菜单*/}/*录入一个学生信息*/void input_stu(int j){int i1,k=0,d;switch((j+1)%10){case 1:printf("\n Input the %dst student's information:",j+1);break;case 2:printf("\n Input the %dnd student's information:",j+1);break;default:printf("\n Input the %dth student's information:",j+1);}printf("\n学号姓名性别宿舍号码电话号码\n"); scanf("%s%s%d%d%ld",stu[j].num,stu[j].name,&stu[j].sex,&stu[j].room,&stu[j].tel);stumax++; /*输入一个信息,总数加1*/for(i1=0;i1<stumax;i1++)if(i1!=j&&strcmp(stu[i1].num,stu[j].num)==0) /*表示学号已存在*/{k=1; /*k为学号是否已存在标记,k=1表存在*/printf_one_stu(i1); /*显示已存在的学号的信息*/printf("\n此学生存在!"); /*提示学号已存在*/stumax--; /*总数减1,删除输入信息*/printf("\n删除信息成功!");save(); /*调用保存函数*/break;}if(k==0) /*表示学号不重复*/{printf("\n输入信息成功!"); /*提示输入成功*/save(); /*调用保存函数*/}}/*学生成绩信息录入*/void enter_score(){int i,n,es1;printf("\n要输入的学生基本信息的个数(1~%d)? ",M-1);scanf("%d",&n); /*要输入的学生基本信息的个数*/es1=n+scoremax; /*输入n个后应有的记录个数*/printf("\n输入数据:\n");for(i=scoremax;i<es1;i++)input_score(i); /*调用输入学生成绩基本信息函数*/ save_score(); /*调用保存学生成绩基本信息函数*/printf("\n 共输入了%d 项数据.Press any key to continue . . .",n);getch();menu();/*提示输入任务结束,按任意键返回主菜单*/}/*录入一个成绩*/void input_score(int i){int j,j1,k,c;float a;switch((i+1)%10){case 1:printf("\n Input the %dst student's score:",i+1);break;case 2:printf("\n Input the %dnd student's score:",i+1);break;default:printf("\n Input the %dth student's score:",i+1);}printf("\n学号课程编号课程名称学分平时成绩实验成绩卷面成绩\n");scanf("\n%s%s%s%f%d%d%d",score[i].num,score[i].coursenum,score[i].course,&a, &score[i].nscore,&score[i].expscore,&score[i].examscore);score[i].point=a;com_score(i); /*调用计算综合成绩、实得学分函数*/scoremax++;for(j1=0;j1<stumax;j1++)if(strcmp(score[i].num,stu[j1].num)==0)break;if(j1==stumax) /*学生不存在*/{printf("\n该学生不存在!");delete_one_score(i);/**************/}else/*学生存在*/{for(k=0;k<scoremax;k++){if(k!=i&&strcmp(score[k].num,score[i].num)==0&&strcmp(score[k].coursenum,scor e[i].coursenum)==0&&strcmp(score[k].course,score[i].course)==0) /*该学生该课程已存在*/{printf("\n该学生的此项信息已经存在!");delete_one_score(i);/**************/break;}if((strcmp(score[k].coursenum,score[i].coursenum)==0&&strcmp(score[k].course,sco re[i].course)!=0)||(strcmp(score[k].coursenum,score[i].coursenum)!=0&&strcmp(scor e[k].course,score[i].course)==0)) /*该课程编号和课程名称与前面矛盾并提示删除哪一个*/{printf("\n课程编号和课程名称不符:");printf("\n成绩信息[%d]:",i);printf_one_score(i); /*显示矛盾课程*/printf("\n成绩信息[%d]:",k);printf_one_score(k); /*显示矛盾课程*/printf("\n 1)删除成绩[%d] 2)删除成绩[%d]? [ ]\b\b",i,k);scanf("%d",&c);switch(c){case 1:delete_one_score(i);break; /*调用删除函数*/default:delete_one_score(k); /*调用删除函数*/}break;}}if(k==scoremax)printf("\n输入信息成功! Press any key to continue . . .");getch();}}/*计算综合成绩*/void com_score(int i){if(score[i].expscore==-1) /*判断是否有实验*/score[i].comscore=score[i].nscore*0.3+score[i].examscore*0.7;elsescore[i].comscore=score[i].nscore*0.15+score[i].expscore*0.15+score[i].examscore* 0.7;switch(score[i].comscore/10){case 10:case 9: score[i].getpoint=score[i].point*1.0;break;case 8: score[i].getpoint=score[i].point*0.8;break;case 7: score[i].getpoint=score[i].point*0.75;break;case 6: score[i].getpoint=score[i].point*0.6;break;default:score[i].getpoint=0;}printf("\n综合成绩计算结束. Press any key to continue . . .");getch();}/*浏览模块********************************************************************* **//*浏览学生信息*/void browse_stu(){int i;for(i=0;i<stumax;i++) /* stumax 为总的学生数*/printf_one_stu(i); /*调用显示一个学生基本信息函数*/ printf("\n浏览学生基本信息结束.Press any key to continue . . .");getch();menu();}/*浏览学生成绩信息*/void browse_score()int j;for(j=0;j<scoremax;j++) /* stumax 为总的学生数*/printf_one_score(j); /*调用显示一个学生成绩基本信息函数*/ printf("\n浏览学生成绩信息结束.Press any key to continue . . .");getch();menu();}/*查找模块********************************************************************* **//*查找*/void search(){int c,c1;printf("\n查找中...\n 选择要查询的信息:\n1)学生基本信息2)学生成绩3)返回菜单[ ]\b\b");scanf("%d",&c); /*选择查找内容*/if(c>=1&&c<=3)switch(c){case 1:search_stu();break; /*调用查找学生基本信息函数*/case 2:search_score();break; /*调用查找学生成绩基本信息函数*/default:menu();}printf("\n查询结束...\n 是否继续查询? 1)是2)否[ ]\b\b"); /*询问是否继续查找*/scanf("%d",&c1);switch(c1){case 1:search();break; /*继续查找*/default:menu();}}/*查找学生信息*/void search_stu(){int i,c;printf("\n 查找学生信息中...\n 选择查询方式:\n1)学号2)姓名3)宿舍编号4)返回查询? [ ]\b\b");scanf("%d",&c); /*选择查找方式*/switch(c){case 1:search_num();break; /*调用按学号查询函数*/case 2:search_name();break; /*调用按姓名查询函数*/case 3:search_room();break; /*调用按宿舍号查询函数*/default:printf("\n继续查询...");}printf("\n查询结束. Press any key to continue . . .");getch();}/*按学号查找学生信息*/void search_num(){int i,c;char n1[9];printf("\n请输入要查询学生的学号: ");scanf("%s",&n1); /*输入要查询的学号*/for(i=0;i<stumax;i++)if(strcmp(stu[i].num,n1)==0){printf_one_stu(i); /*显示查到的记录*/break;}if(i==stumax){printf("\n此学号不存在!\n查询下一个学号? 1)是2)否[ ]\b\b"); /*未查到相应记录,询问是否继续查找*/scanf("%d",&c);switch(c){case 1:search_num();break; /*继续按此方式查找*/default:printf("\n继续查找...");}}else{printf("\n学生信息查询结束. Press any key to continue . . .");getch();}}/*按姓名查找学生信息*/void search_name(){int i,c,sn1=0;char n2[20];printf("\n输入要查询学生的名字: ");scanf("%s",&n2);for(i=0;i<stumax;i++)if(strcmp(stu[i].name,n2)==0){printf_one_stu(i); /*显示查到的记录*/sn1++;}if(sn1==0){printf("\n此学生不存在!\n查询下一个学生? 1)是2)否[ ]\b\b"); /*未查到相应记录,询问是否继续查找*/scanf("%d",&c);switch(c){case 1:search_name();break; /*继续按此方式查找*/default:printf("\n继续查询...");}}else{printf("\n查询结束. Press any key to continue . . .");getch();}}/*按宿舍查找学生信息*/void search_room(){int i,c,r,sr1=0;printf("\n输入要查询学生的宿舍号码: ");scanf("%d",&r);for(i=0;i<stumax;i++)if(stu[i].room==r){printf_one_stu(i); /*显示查到的记录*/sr1++;}if(sr1==0){printf("\n这个宿舍号码不存在!\n查询下一个宿舍号码? 1)是2)否[ ]\b\b"); /*未查到相应记录,询问是否继续查找*/scanf("%d",&c);switch(c){case 1:search_room();break; /*继续按此方式查找*/default:printf("\n继续查询...");}}else{printf("\n查询结束. Press any key to continue . . .");getch();}}/*按学号查找学生成绩*/void search_score(){int i,a,s1;char n3[9];printf("\n输入要查询成绩的学生的学号: ");scanf("%s",n3);printf_onestu_score(n3); /*显示查到的记录*/printf("\n查询结束. \n 是否查询其他学生? 1)是2)否[ ]\b\b"); /*询问是否继续查找*/scanf("%d",&s1);switch(s1){case 1:search_score();break; /*继续按此方式查找*/default:printf("\n查询结束. Press any key to continue . . .");getch();}}/*显示一个学生的所有分数*/void printf_onestu_score(char snum[]){int i,j,k=0,a1;float gp=0;for(j=0;j<stumax;j++)if(strcmp(snum,stu[j].num)==0){printf("\n学号: %s 姓名:%s",stu[j].num,stu[j].name);printf("\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");break;}if(j==stumax)printf("\n此学生不存在!");else{for(i=0;i<scoremax;i++)if(strcmp(score[i].num,snum)==0) /*显示该学生的所有成绩*/{printf_one_score(i);k++;gp+=score[i].getpoint;}printf("\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");printf("\n共修: %d 科实得总学分: %-5.1f\n",k,gp);printf("\n此学生成绩显示完毕. Press any key to continue . . .");getch();}}/*删除*/void delete_one(){int i,j,sd1=0,sd2,sd3;char c[9];printf("\n你要删除哪位同学的信息记录? \n请输入他的学号:");scanf("%s",c); /*输入要删除的学号*/for(i=0;i<stumax;i++)if(strcmp(stu[i].num,c)==0)break;if(i==stumax) /*未找到学生*/printf("\n未找到该学生!");else/*找到学生*/{printf_one_stu(i); /*显示学生基本信息记录*/printf("\n要删除这些信息么? 1)是2)否并返回[ ]\b\b");scanf("%d",&sd2); /*删除确认?*/if(sd2==1) /*确认*/{stu[i]=stu[stumax-1]; /*删除该学生基本信息*/stumax--;printf("\n删除学生信息成功!\n");save(); /*调用保存学生基本信息函数*/for(j=0;j<scoremax;j++) /*删除该学生的成绩信息*/if(strcmp(score[j].num,c)==0){delete_one_score(j); /*调用删除成绩函数*/sd1++;}if(sd1==0)printf("\n该学生无成绩记录."); /*该学生无成绩记录*/printf("\n删除信息成功.");}}printf("\n删除其他学生的成绩? 1)是2)否[ ]\b\b"); /*是否继续删除*/scanf("%d",&sd3);switch(sd3){case 1:delete_one();break; /*继续删除*/default: printf("\n查询学生的号码结束. Press any key to continue . . .");getch();menu();}}/*********排序*********/void order(){int c;printf("排序中...\n按什么排序: 1)课程编号2)课程[ ]\b\b");scanf("%d",&c); /*指定按什么排序*/switch(c){case1:order_course_num();printf("\n排序结束. Press any key to continue . . .");break; /*选择按课程编号排序*/case2:order_course();printf("\n排序结束. Press any key to continue . . .");break;/*选择按课程名称排序*/default:printf("\n输入错误. 请重新输入(1~2)!\n");order();}getch();menu();}/*按课程编号排序*/void order_course_num(){int i,j,k=0;char cnum[10];struct stuscore sco;printf("\n输入要排序的课程编号:");scanf("%s",cnum); /*输入要排序的课程编号*/for(i=0;i<scoremax;i++)if(strcmp(score[i].coursenum,cnum)==0) /*查找对应信息并保存在score1[M]中*/{score1[k]=score[i]; /* score1[M]为全局数组*/k++;}for(i=0;i<k-1;i++)for(j=i+1;j<k;j++){if(score1[i].comscore>score1[j].comscore) /*升序排序*/{sco=score1[i];score1[i]=score1[j];score1[j]=sco;}}order_printf(k); /*调用显示函数*/printf("\n排序结束Press any key to continue . . .");getch();}/*按课程名称排序*/void order_course(){int i,j,k=0;char c[15];struct stuscore sco;printf("\n输入要排序的课程名称:");scanf("%s",c); /*输入要排序的课程名称*/for(i=0;i<scoremax;i++)if(strcmp(score[i].course,c)==0) /*查找对应信息并保存在score1[M]中*/{score1[k]=score[i];k++;}for(i=0;i<k-1;i++)for(j=i+1;j<k;j++){if(score1[i].comscore>score1[j].comscore) /*升序排序*/{sco=score1[i];score1[i]=score1[j];score1[j]=sco;}}order_printf(k); /*调用显示函数*/printf("\n排序结束.Press any key to continue . . .");getch();}/*排序显示*/void order_printf(int k){int w1,i,c;do{printf("\n选择排序的顺序:\n 1)升序2)降序[ ]\b\b"); /*选择显示顺序*/scanf("%d",&c);if(c>=1&&c<=2){w1=0;switch(c){case 1:for(i=0;i<k;i++) /*选择升序显示*/printf("\n 学号:%s 课程编号:%-10s 课程名称:%-15s 综合成绩:%5d 实得学分:%f",score1[i].num,score1[i].coursenum,score1[i].course,score1[i].comscore,score1 [i].getpoint);break;case 2:for(i=k-1;i>=0;i--) /*选择降序显示*/printf("\n 学号:%s 课程编号:%-10s 课程名称:%-15s 综合成绩:%5d 实得学分:%f",score1[i].num,score1[i].coursenum,score1[i].course,score1[i].comscore,score1 [i].getpoint);break;}printf("\nPress any key to continue . . .");getch();}else{w1=1;printf("\n输入错误请重新输入(1~2)!");}}while(w1==1);printf("\n排序结束.Press any key to continue . . .");getch();}。