1、运行前需在功程里新建个 ni.txt.内容如下7004 sun 98.0 89.0 97.0 94.7 284.0005 li 98.0 48.0 78.0 74.7 224.0002 zhao 98.0 78.0 59.0 78.3 235.0006 zhou 89.0 97.0 86.0 90.7 272.0003 qian 78.0 98.0 89.0 88.3 265.0001 chen 59.0 60.0 98.0 68.3 205.0007 wu 57.0 76.0 87.0 73.3 220.0代码#include /使程序包含头文件#include /使程序包含头文件#incl
2、ude /使程序包含头文件#define SIZE 50 /定义常量 SIZE 来控制数组的长度 void input_num(struct Student stud,int n,int i);/声明学号输入函数 void input_name(struct Student stud,int n,int i);/声明姓名输入函数 void input_score(struct Student stud,int n,int i);/声明成绩输入函数 void output_stu(struct Student stud,int n,int i);/声明输出函数 void stat_stu(str
3、uct Student stud,int n,int o);/声明统计函数 float class_avr(struct Student stud,int n,int o);/声明排序函数 void chenji_stu(struct Student stud,int n,int o);void desc_stu(struct Student stud,int n,int o);/声明降序函数 int find_stu(struct Student stud,int n);/声明查找函数 void delete_stu(struct Student stud,int n,int y);/声明删
4、除函数 void amend_stu(struct Student stud,int n,int y);/声明修改函数 void write_text(struct Student stud,int n);/声明保存文件函数 int add_text(struct Student stud,int n);/声明读取文件函数 struct Student /*声明结构体*/char num10;char name20;float score5;void main()/*主函数,是程序的入口*/struct Student stuSIZE;/定义一个结构数组 int count=0;/定义整型变量
5、 count 用来存放学生信息的个数,初始化为 0 int choice;/定义 choice 用于存放用户对主菜单的选择 int a;/用于接收主选单中 scanf()函数的返回值 char judge;/用于帮助判断输入的选择是否正确 int flag_main;/用于判断主菜单用户输入的选择是否有误 int stat_choice=0;/定义 stat_choice 用于用户对统计项目的选择,初始化为 0 int flag_stat;/用于接收 scanf()函数的返回值 int flag_find;/定义 flag_find 用于接收查寻函数的返回值 char man_choice;/
6、定义 man_choice 用于接收用户对是否进行修改删除的选择 int con_choice;/定义 con_choice 用于接收用户对修改或删除的选择 char sign_main;/定义 sign_main 接收用户对是否离开程序的选择 char sign_input;/定义 sign_main 接收用户对是否继续输入的选择 int i;/定义 i,j 作为控制循环的变量 while(1)/形成一个死循环 system(color 71);/设置输出显示颜色 /*输出主选菜单*/printf(n=欢迎使用班级成绩管理系统=nn);printf(=请选择您要使用的功能=nn);print
7、f(tt-n);printf(tttt 1:班级成绩录入 nn);printf(tttt 2:班级成绩显示 nn);printf(tttt 3:班级成绩统计 nn);printf(tttt 4:班级成绩查询 nn);printf(tttt 5:班级成绩修改 nn);printf(tttt 6:班级成绩表 nn);printf(tttt 7:班级成绩存档 nn);printf(tttt 8:班级成绩读入 nn);printf(tttt 0:退出 nn);printf(tt-);printf(=);/*输入对菜单的选择*/do flag_main=0;printf(nttt 请您选择需要的操作(0
8、-6):);fflush(stdin);a=scanf(%d%c,&choice,&judge);if(a2|judge!=n)printf(nttt 您的选择有误,请重新输入!n);flag_main-;while(flag_main 0);printf(nttt );system(pause);/令屏幕暂停待输入任意键后恢复运行 system(cls);/清屏 system(color 71);/设置输出显示颜色 switch(choice)/把用户对主菜单的选择作为 switch 结构的判断条件 case(1):printf(ntt 请录入学生信息:n);i=0;/循环前对 i 清零 d
9、o if(count+i=50)break;input_num(stu,count,i);/输入学号 input_name(stu,count,i);/输入姓名 input_score(stu,count,i);/录入成绩及总成绩平均成绩 i+;/每录入一个学员信息 i 加 1 printf(ntt 还需要继续录入吗?(Y/N);/*产生是否继续录入的条件*/fflush(stdin);sign_input=getchar();while(sign_input=y|sign_input=Y);/判断 count=count+i;/计算出本次录入后总的已录入成员个数 printf(tt);bre
10、ak;case(2):/*printf(n 显示班级成绩信息:n);printf(-);printf(学号tt 姓名tt 数据库t 算法tC 语言t 总成绩t 平均成绩);/*格式化输出提示信息*/printf(学生信息表n);*/printf(=nn);printf(n);printf(学号 姓名 数据库 算法 C 语言总成绩 平均成绩 n);printf(n);for(i=0;i 0)/*返回值大于 0,用户选择的是姓名查找方式*/printf(n 学号tt 姓名tt 数据库t 算法tC 语言t 总成绩t 平均成绩n);output_stu(stu,count,flag_find-1);p
11、rintf(n-);else if(flag_find=0)/*查找失败返回失败信息*/printf(n 对不起没有找到您的成绩!n);else/*返回值大于 0,用户选择的是学号查找方式*/printf(n 学号tt 姓名tt 数据库t 算法tC 语言t 总成绩t 平均成绩n);output_stu(stu,count,-flag_find-1);printf(n-);break;case(5):flag_find=find_stu(stu,count);/实现用户的查找功能/*根据查找函数的返回值为用户显示查找的信息*/if(flag_find 0)/*返回值大于 0,用户选择的是姓名查找
12、方式*/printf(n 学号tt 姓名tt 数据库t 算法tC 语言t 总成绩t 平均成绩n);output_stu(stu,count,flag_find-1);printf(n-);else if(flag_find=0)/*查找失败返回失败信息*/printf(n 对不起没有找到您的成绩!n);else/*返回值大于 0,用户选择的是学号查找方式*/printf(n 学号tt 姓名tt 数据库t 算法tC 语言t 总成绩t 平均成绩n);output_stu(stu,count,-flag_find-1);printf(n-);if(flag_find!=0)/*查找成功的情况下用户可
13、选择修改或删除操作*/fflush(stdin);man_choice=getchar();/*接收用户选择是否进行下一步操作*/while(man_choice)/*判断用户的选择*/printf(tt1:修改n);printf(tt2:删除n);printf(tt3:退出n);printf(n 请选择您的操作);fflush(stdin);scanf(%d,&con_choice);/*用于接收用户选择的操作*/*根据用户的选择完成用户选择的操作*/if(con_choice=1)/*进行修改操作*/amend_stu(stu,count,flag_find);else if(con_ch
14、oice=2)/*进行删除操作,一旦删除则无法再进行修改*/delete_stu(stu,count,flag_find);count-;printf(n 删除成功!n);break;else if(con_choice=3)/*选择 4 则 break 循环退出*/break;else/*用户输入错误信息返回用户选择有误*/printf(您的选择有误!n);stat_choice=0;/每次循环结束stat_choice 归 0 /修改删除操作结束 printf(n);break;case(7):printf(ttt 将学生成绩信息存盘:nnn);write_text(stu,count);
15、/*循环写入数据*/printf(ttt);break;case(8):printf(ttt 从文件载入学生信息:nnn);count=add_text(stu,count);/*读入文件信息*/break;case(6):printf(ttt 学生成绩排名信息:n);chenji_stu(stu,count,stat_choice);/*读入文件信息*/printf(ttt);break;case(0):printf(nttt 确定您真的要退出吗?(y/n);/*提醒用户是否退出并接收选择*/fflush(stdin);sign_main=getchar();if(sign_main=y|s
16、ign_main=Y)/*若用户确定退出则返回退出信息*/printf(nnnnttt 谢谢使用本软件!nnnnn);exit(0);/退出主程序 printf(nttt);break;default:/提示用户输入错误 printf(nttt 您的输入有误,请重新输入!nnttt);system(pause);/令屏幕暂停待输入任意键后恢复运行 system(cls);/清屏 system(color 71);/设置输出屏幕颜色 /*功能:从键盘输入正确学号依次存放入 stun.num 中 参数:参数 struct Student stud 代表结构体数组首地址,n 代表已有成员个数,i 代
17、表本次录入的第 i 个学号。返回值:空*/void input_num(struct Student stud,int n,int i)int j;/*j 用于对输入字符串的遍历*/int k;/*k 用于对是否有重复学号的判断*/int num_flag=0;/其值作为判断录入学号是否正确的标志 while(num_flag!=2)/*如果 num_flag=2 则输入学号无误,终止循环*/j=0;/*每次循环后令 j 和 num_flag 的值为 0*/num_flag=0;printf(ntt 学号:ttt);/*首次录入学号*/fflush(stdin);scanf(%9s,studn
18、+i.num);while(studn+i.numj!=0)/*遍历 studn+i.num*/if(studn+i.numj 57)/*判断输入是否错误并重新输入*/j=0;printf(ntt 请您用数字输入!请重新输入!n);printf(ntt 学号:ttt);fflush(stdin);scanf(%9s,studn+i.num);/循环结束 else/*该位输入正确则令 j+*/j+;/循环结束 num_flag+;/判断标志加 1 if(n+i 0)/*当有 2 个或以上的学号*/for(k=0;k n+i;k+)/*令输入学号与以往录入学号比较*/if(strcmp(studn
19、+i.num,studk.num)=0)/*如果存在重号则提示重新输入*/num_flag-;/令 num_flag-printf(ntt 已存在这个学号!请重新输入:n);num_flag+;else num_flag+;/*只有一个学号存在 num_flag+*/*功能:从键盘输入正确姓名依次存放入 stun.num 中 参数:参数 struct Student stud 代表结构体数组首地址,n 代表已有成员个数,i 代表本次录入的第 i 个学号。返回值:空*/void input_name(struct Student stud,int n,int i)int j=0;/用于遍历输入姓
20、名 printf(ntt 姓名:ttt);/用户首次输入 fflush(stdin);scanf(%15s,studn+i.name);while(studn+i.namej!=0)/遍历姓名对应的字符串 if(studn+i.namej 90&studn+i.namej 122)/*如果输入格式不正确则重新输入*/j=0;printf(ntt 请您用字母输入!请重新输入!n);printf(ntt 姓名:ttt);fflush(stdin);scanf(%15s,studn+i.name);else/*正确则令 i+*/j+;/*功能:从键盘输入正确成绩依次存放入 stun.score 中,
21、同时计算出平均成绩 和总成绩存放入 stun.score 中。参数:参数 struct Student stud 代表结构体数组首地址,n 代表已有成员 个数,i 代表本次录入的第 i 个学号。返回值:空*/void input_score(struct Student stud,int n,int i)int j;/用于控制循环依次录入三门成绩 int h;/接收 scanf()函数的返回值 int flag_score;/值作为输入有误就重复输入的循环条件 char x;/用于判断用户中是否包含不合法输入 printf(ntt 请输入学生成绩(1:数据库;2:算法;3:C 语言):n);f
22、or(j=0;j 3;j+)/*循环输入三门成绩*/do printf(ntt 第%d 门:ttt,j+1);flag_score=0;h=0;fflush(stdin);h=scanf(%f%c,&studn+i.scorej,&x);/*输入成绩并返回正确接收的次数*/if(studn+i.scorej 100)|(h!=2)|(x!=n)/*用户输入不合法则提示重新输入并产生循环条件*/flag_score=-1;printf(ntt 输入有误,请重新输入成绩(0-100):n);while(flag_score 0);/*表达式成立则输入有误循环重新输入*/studn+i.score4
23、=0;/*计算总成绩并录入*/for(j=0;j 3;j+)studn+i.score4=studn+i.score4+studn+i.scorej;studn+i.score3=studn+i.score4/3;/*计算平均成绩并录入*/*功能:格式化输出一名学员信息 参数:参数 struct Student stud 代表结构体数组首地址,n 代表已有成员个数,i 代表本次输出其中的第 i 个成员。返回值:空*/void output_stu(struct Student stud,int n,int i)int j;/用于控制循环依次输出三门成绩 printf(%-10s%-15s,st
24、udi.num,studi.name);for(j=0;j 3;j+)/*依次输出三门成绩*/printf(%.1f,studi.scorej);printf(%.1f,studi.score4);/输出总成绩 printf(%.1f,studi.score3);/输出平均成绩printf(n);printf(n);/*功能:对某项成绩中所有元素总和求平均 参数:参数 struct Student stud 代表结构体数组首地址,n 代表成员个数,o 代表该项成绩的下标。返回值:某项成绩所有成员的平均值*/float class_avr(struct Student stud,int n,in
25、t o)int i;/用于控制 for 循环次数 float ach_avr=0;/用来存放平均值 for(i=0;i n;i+)/*求总和*/ach_avr=ach_avr+studi.scoreo;/累加 ach_avr=ach_avr/n;/求平均 return ach_avr;/返回平均值 /*功能:将某项成绩的所有元素按降序排列 参数:参数*a 代表结构体数组首地址,n 代表调用部分包含成员个数,o 代表该项成绩的下标 返回值:空*/void desc_stu(struct Student stud,int n,int o)int i,j;/用来控制循环次数 struct Stude
26、nt temp;/用于交换 printf(n 学号tt 姓名tt 分数);for(i=0;i n-1;i+)/*冒泡排序*/for(j=i+1;j studi.scoreo)/*如果 j 为下标的成绩大于 i为下标成绩则交换*/temp=studi;/*交换 2 个下标对应的所有学员信息*/studi=studj;studj=temp;for(i=0;i n;i+)/*输出排序后的学号姓名及排序的成绩*/printf(n-n);printf(%-10st%-15st%.1f,studi.num,studi.name,studi.scoreo);printf(n-n);void chenji_s
27、tu(struct Student stud,int n,int o)int i,j;/用来控制循环次数 struct Student temp;/用于交换 printf(nn);printf(n);printf(学号 姓名 数据库 算法 C 语言总成绩 平均成绩 n);printf(n);for(i=0;i n-1;i+)/*冒泡排序*/for(j=i+1;j studi.scoreo)/*如果 j 为下标的成绩大于 i为下标成绩则交换*/temp=studi;/*交换 2 个下标对应的所有学员信息*/studi=studj;studj=temp;for(i=0;i n;i+)/*循环输出学
28、员信息*/int j;/用于控制循环依次输出三门成绩 printf(%-10s%-15s,studi.num,studi.name);for(j=0;j 3;j+)/*依次输出三门成绩*/printf(%.1f,studi.scorej);printf(%.1f,studi.score4);/输出总成绩 printf(%.1f,studi.score3);/输出平均成绩printf(n);printf(n);printf(n);/输出单个学员信息/*功能:对某项成绩进行统计(求平均成绩,优生人数,及格人数,优生率,及格率)并格式化输出 参数:参数*a 代表结构体数组首地址,n 代表调用部分包含
29、成员个数,o 代表该项成绩的下标 返回值:空*/void stat_stu(struct Student stud,int n,int o)int i;/控制循环次数 float stat5;/用来存放 5 个统计数据 printf(n 平均成绩t 及格率tt 优生率tt 及格人数t 优生人数n);printf(-);stat0=class_avr(stud,n,o);/调用求平均函数求出平均成绩 stat4=0;/*求优生人数*/for(i=0;i=80)stat4+;stat3=0;/*求及格人数*/for(i=0;i=60)stat3+;stat2=(stat4/n)*100;/求优生率
30、 stat1=(stat3/n)*100;/求及格率 printf(%.1ftt%.1f%tt%.1f%tt%dtt%dn,/*格式化输出 5 项成绩*/stat0,stat1,stat2,int(stat3),int(stat4);printf(-);/*功能:接收用户的选择分别按姓名或学号查找用户需要的信息 参数:参数 struct Student stud代表结构数组首地址,n 代表数组调用长度 返回值:返回值不为零则返回的是与查找到的信息对应的下标有数学关系的值 返回值为 0 则表示查找失败*/int find_stu(struct Student stud,int n)int i;/
31、用于控制循环次数 int flag=0;/用于接收用户的选择及判断 int sign=0;/存放函数的返回值 char you_choice16;/接收用户输入的查找信息 fflush(stdin);/*接收用户的选择*/printf(请选择您要查询的方式:(1:按学号 2:按名字;);scanf(%d,&flag);while(flag 2)/*判断用户选择是否有误有误则重新输入选择*/printf(n 输入有误,请重新输入选择!);fflush(stdin);scanf(%d,&flag);printf(n 请输入该学生信息:);/*接收用户的查找信息*/fflush(stdin);sca
32、nf(%15s,you_choice);if(flag=2)/*如果用户选择按姓名查找*/*根据输入信息查找相关信息并根据查找情况得出不同返回值*/for(i=0;i n;i+)/依次查找 if(strcmp(studi.name,you_choice)!=0)/如果第 i 项与查找信息不匹配 sign=0;/令 sign 为 0 表示查找失败 else/如果第 i 项与查找信息匹配 sign=i+1;/令 sign 的值在 0 到 n-1 之间,并且等于该匹配项下标 i加 1 break;/查找到则中断查找循环 else /*根据输入信息查找相关信息并根据查找情况得出不同返回值*/for(i
33、=0;i 0)/若用户是根据姓名查找的该信息 /*把该信息后的信息依次前移一位,覆盖该信息*/for(i=y-1;i n-1;i+)studi=studi+1;else/若用户根据学号查找到该信息 /*把该信息后的信息依次前移一位,覆盖该信息*/for(i=-y-1;i n-1;i+)studi=studi+1;/*功能:根据查找函数的返回值找到对应信息并进行选择性修改 参数:参数 struct Student stud代表结构数组首地址,n 代表数组长度,y 与要删除的数对应的下标有固定数学关系 返回值:空*/void amend_stu(struct Student stud,int n,
34、int y)int ch;/用于接收用户对某门成绩修改的选择 int flag_score;/值作为输入有误就重复输入的循环条件 int h;/接收 scanf()函数的返回值 char x;/用于判断用户中是否包含不合法输入 float am_score;/用于接收用户输入的成绩/*接收用户对修改列项的选择*/printf(n 请输入您要对哪一门成绩进行修改?(0:数据库;1:算法;2:C 语言);fflush(stdin);scanf(%d,&ch);do/*接收用户输入成绩的同时判断输入是否正确*/*接收用户输入并产生返回值*/printf(n 请输入该门课的成绩:);flag_scor
35、e=0;h=0;fflush(stdin);h=scanf(%f%c,&am_score,&x);if(am_score 100)/如果用户信息输入有误|(h!=2)|(x!=n)flag_score=-1;printf(n 输入有误,请重新输入成绩(0-100):n);/提示重新输入 while(flag_score 0)study-1.scorech=am_score;printf(n 修改成功!n);else stud-y-1.scorech=am_score;printf(n 修改成功!n);/*功能:从文件中读入学生成绩信息 参数:参数 struct Student stud代表结构
36、数组首地址,n 代表数组长度 返回值:空*/int add_text(struct Student stud,int n)int i=0;/用于控制循环 int num;FILE*fp;/定义文件指针 /*char filename20;printf(ttt 请输入您要打开的文件名:);scanf(%19s,filename);/输入文件名*/if(fp=fopen(ni.txt,r)=NULL)/打开文件 printf(nnttt 打开失败!nnn);/打开失败信息 printf(ttt);system(pause);return(n);fscanf(fp,%d,&num);/读入总记录量
37、while(inum)/*循环读入数据*/fscanf(fp,%s%s%f%f%f%f%f,studi.num,studi.name,&studi.score0,&studi.score1,&studi.score2,&studi.score3,&studi.score4);i+;n=num;fclose(fp);/*关闭文件*/printf(nnttt 打开成功!nnn);printf(ttt);return(n);/*功能:将学生成绩信息保存到一个文件 参数:参数 struct Student stud代表结构数组首地址,n 代表数组长度 返回值:空*/void write_text(st
38、ruct Student stud,int n)/将所有记录写入文件 int i=0;FILE*fp;/定义文件指针 /*char filename20;/定义文件名 printf(ttt 请输入您要保存的文件名:);/输入文件名 scanf(%19s,filename);*/if(fp=fopen(ni.txt,w)=NULL)/打开文件 printf(nnttt 无法打开这个文件!nnn);return;fprintf(fp,%dn,n);/循环写入数据 while(i n)fprintf(fp,%-10s%-16s%.1f%.1f%.1f%.1f%.1fn,studi.num,studi.name,studi.score0,studi.score1,studi.score2,studi.score3,studi.score4);i+;fclose(fp);/关闭文件 printf(nnttt 成功记录!nnn);/返回成功信息