1、 高级语言程序设计课程设计报告课题名称: 学生成绩管理管理 姓 名: 田宇 班 级: 通信 1412 学 号: 141003440228 指导教师: 陶恂 电子信息学院2015年 07 月 10 日目 录1 课题分析 11.1 问题描述 1(1) 录入每个学生的学号、姓名和各科考试成绩 1(2) 计算每门课程的总分和平均分 1(3) 计算每个学生的总分和平均分 1(4) 按每个学生的总分由高到低排出名次表 1(5) 按每个学生的总分由低到高排出名次表 1(6) 按学号由小到大排出成绩表 1(7) 按姓名的字典顺序排出成绩表 1(8) 按学号查询学生排名及其考试成绩 1(9) 按姓名查询学生排名
2、及其考试成绩 1(10) 按优秀(90-100) 、良好(89-89) 、中等(70-79) 、及格(60-69) 、不及格(0-59)5 个类别,对每门课程分别统计每个类别的人数以及所占的百分比 1(11) 输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分 1(12) 将每个学生的记录信息写入文件 .1(13) 从文件中读出每个学生的记录信息并显示 .11.2 功能需求分析 12 系统设计 32.1 数据结构设计 32.2 函数设计与说明 32.3 菜单设计 32.4 文件清单与说明 43 系统实现 53.1 管理系统菜单 53.2 学生成绩排名 53.3 学生成绩统计 9
3、4 测试数据与测试过程记录 .104.1 菜单测试 104.2 系统功能测试 134.2.1 管理系统菜单 .134.2.2 输入学生信息 .14录入每个学生的学号、姓名和各科考试成绩 144.2.3 计算总分和平均分 .14计算每门课程的总分和平均分测试 14计算每个学生的总分和平均分测试 154.2.4 学生成绩排名 .16按每个学生总分由高到低排名 16按每个学生总分由低到高排名 16按学号由大到小排名 17按姓名的在字典顺序排名 184.2.5查询学生成绩 .18按学号查询学生排名及其考试成绩测试 18按姓名查询学生排名及其考试成绩测试 194.2.6 学生成绩统计 .20各等级学生的
4、百分比 204.2.6 学生信息的输入输出 .20输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分测试 20将每个学生的记录信息写入文件测试 21从文件中读出每个学生的记录信息并显示测试 225 课程设计遇到的问题及解决方法 .226 课程设计总结 .23参考文献 .23附录源代码 .23学生信息管理系统 11 课题分析1.1 问题描述某班有最多不超过 30 人(具体人数键盘输入)参加期末考试,考试科目为数学(MT) 、英语( EN)和物理(PH) 。学生成绩管理系统是一个非常实用的程序,如果能够把用户输入的数据存盘,下次运行时读出,就更有用了。编程实现如下菜单驱动的学生成绩
5、管理系统(1) 录入每个学生的学号、姓名和各科考试成绩(2) 计算每门课程的总分和平均分(3) 计算每个学生的总分和平均分(4) 按每个学生的总分由高到低排出名次表(5) 按每个学生的总分由低到高排出名次表(6) 按学号由小到大排出成绩表(7) 按姓名的字典顺序排出成绩表(8) 按学号查询学生排名及其考试成绩(9) 按姓名查询学生排名及其考试成绩(10) 按优秀(90-100) 、良好(89-89) 、中等(70-79) 、及格(60-69) 、不及格(0-59 )5 个类别,对每门课程分别统计每个类别的人数以及所占的百分比(11) 输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和
6、平均分(12) 将每个学生的记录信息写入文件(13) 从文件中读出每个学生的记录信息并显示1.2 功能需求分析若要完成问题中的各项要求,首先需要运用结构体数据储存学生的成绩信息,再运用循环语句求得各学生成绩之和及平均分和各学科成绩之和及平均分,再运用文件存储数据便于以后查询,对于数据查询,则同样需要运用循环语句将要查询的姓名或学号与已储存的信息进行对比,直至找到要查询的信息。系统功能模块如图 1.2.1 所示学生信息管理系统 2图 1 系统功能模块图表 1.2.1学生成绩管理系统录入每个学生的学号、姓名和各科考试成绩计算每门课程的总分和平均分 计算每个学生的总分和平均分按每个学生的总分由高到低
7、排出名次表 按每个学生的总分由低到高排出名次表按学号由小到大排出成绩表 按姓名的字典顺序排出成绩表按学号查询学生排名及其考试成绩 按姓名查询学生排名及其考试成绩对每门课程分别统计每个类别的人数以及所占的百分比输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分 从文件中读出每个学生的记录信息并显示将每个学生的记录信息写入文件排名计算 查询 统计 输入输出学生信息管理系统 32 系统设计2.1 数据结构设计系统处理的数据主要是学生信息,由 C 语言数据体表示struct student char nameNUM_N; /学生姓名int scoreSCORE_N; /学生成绩(物理
8、数学 英语)float averstudent; /平均成绩STUDENT; 2.2 函数设计与说明学生信息管理系统采用结构化程序设计思想,程序处理主函数以外,共设计了 13 个函数,函数的原型及功能说明如表 2.3.1 所示表 2.3.1 函数列表2.3 菜单设计采用二级菜单设计,为保证程序有效性,先选择 1 项录入学生各项信息,再进入其他功能选择。序号 函 数 原 型 功 能 说 明1 int Input() 输入学生信息2 void Print() 输出学生信息3 void Sum() 计算学生总成绩4 void Average() 计算学生平均成绩5 void High() 按每个学生
9、的总分由高到低排出名次表6 void Down() 按每个学生的总分由低到高排出名次表7 void Score() 将学生成绩由小到大排序8 void SortString() 按姓名的字典顺序排出成绩表9 int Refernum() 按学号查询学生排名及其考试成绩10 int Refername() 按姓名查询学生排名及其考试成绩11 void Count() 对每门课程分别统计每个类别的人数以及所占的百分比12 void Writetofile() 将每个学生的记录信息写入文件13 void Readfromfile() 从文件中读出每个学生的记录信息并显示学生信息管理系统 4否是是否2
10、.4 文件清单与说明表 2.3.1 中的函数与主函数,以及函数声明、数据结构定义、数据存储二进制文件共两个,程序文件清单如表 2.5.1 所示。序号 程序文件名 文件说明1 16.c 主程序文件2 Student.txt 存储学生信息的文本文件表 2.5.1开始是否录入学生信息输入学生信息选择进入二级菜单选择功能是否继续结束学生信息管理系统 53 系统实现3.1 管理系统菜单进入菜单选择界面,进行成绩单录入和各项功能的选择否是是否3.2 学生成绩排名按每个学生的总分由高到低排出名次表进入菜单后选择该功能,用循环语句计算出存储在不同结构体中每个学生各科的分数之和即为总分。再应用比较语句进行比较总
11、分大小,按照从高到低进行输出显示开始是否录入学生信息输入学生信息选择进入二级菜单选择功能是否继续结束学生信息管理系统 6NY按每个学生的总分由低到高排出名次表进入菜单后选择该功能,用循环语句计算出存储在不同结构体中每个学生各科的分数之和即为总分。再应用比较语句进行比较总分大小,按照从低到高进行输出显示开始是否有学生信息输入成绩应用 do,for 语句循环和if 语句比较总分高低按总分由高到低输出结果结束学生信息管理系统 7NY按学号由小到大排出名次表进入菜单后选择该功能,用循环语句计算出存储在不同结构体中每个学生各科的分数之和即为总分。再应用比较语句进行比较学号大小,按照学号从小到大进行输出显
12、示开始是否有学生信息输入成绩应用 do,for 语句循环和if 语句比较总分高低按总分由低到高输出结果结束学生信息管理系统 8NY按姓名的在字典顺序排出成绩表进入菜单后选择该功能,用循环语句计算出存储在不同结构体中每个学生各科的分数之和即为总分。再应用比较语句进行比较姓名在字典顺序,按照姓名在字典顺序进行输出显示开始是否有学生信息输入成绩应用 do,for 语句循环和if 语句比较学号大小按学号由小到大输出结果结束学生信息管理系统 9NY3.3 学生成绩统计进入菜单后选择该功能,用 switch 语句进行各项等级累加,在将各项累加的数量处于总人数算出百分比,输出显示开始是否有学生信息输入成绩应
13、用 for 循环语句和if 语句比较姓名按照姓名在字典顺序输出结果结束学生信息管理系统 10NY4 测试数据与测试过程记录4.1 菜单测试进入菜单选择,可以有多项选择,选择录入学生信息后进行其他从菜单功能的选择进行该项功能。进行完此项功能后有选择是否继续的功能,可以进行选择继续返回主菜单在进行其他功能的选择。开始是否有学生信息输入成绩应用 for 循环语句和switch 语句计算输出各项等级百分比结束学生信息管理系统 11图 4.1.1图 4.1.2学生信息管理系统 12图 4.1.3图 4.1.4学生信息管理系统 13图 4.2.54.2 系统功能测试4.2.1 管理系统菜单进入菜单选择界面
14、,选择想要执行的功能图 4.2.1学生信息管理系统 144.2.2 输入学生信息录入每个学生的学号、姓名和各科考试成绩先选择 1 进入录入信息界面,再按要求输入总人数,然后根据弹出的格式依次输入学生信息,按回车结束输入后可选择是否继续进行其他功能。图 4.2.24.2.3 计算总分和平均分计算每门课程的总分和平均分测试输入成绩后,在菜单界面选择计算成绩功能进入二级菜单,选择计算每门课程的总分和平均分,则功能完成,然后可选择是否继续实现其他功能。学生信息管理系统 15图 4.2.3.1计算每个学生的总分和平均分测试输入成绩后,在菜单界面选择计算成绩功能进入二级菜单,选择计算每个学生的总分和平均分
15、,则功能完成,然后可选择是否继续实现其他功能。图 4.2.3.2学生信息管理系统 164.2.4 学生成绩排名按每个学生总分由高到低排名先输入学生信息,在一级菜单选择排名,在二级菜单选择该功能,可以选择是否继续图 4.2.4.1按每个学生总分由低到高排名先输入学生信息,在一级菜单选择排名,在二级菜单选择该功能,可以选择是否继续学生信息管理系统 17图 4.2.4.2按学号由大到小排名先输入学生信息,在一级菜单选择排名,在二级菜单选择该功能,可以选择是否继续图 4.2.4.3学生信息管理系统 18按姓名的在字典顺序排名先输入学生信息,在一级菜单选择排名,在二级菜单选择该功能,可以选择是否继续图
16、4.2.4.44.2.5 查询学生成绩按学号查询学生排名及其考试成绩测试输入成绩后,在菜单界面选择查询功能进入二级菜单,选择按学号查询学生排名及其考试成绩,输入要查询的学号,则功能完成,然后可选择是否继续实现其他功能。学生信息管理系统 19图 4.2.5.1按姓名查询学生排名及其考试成绩测试输入成绩后,在菜单界面选择查询功能进入二级菜单,选择按姓名查询学生排名及其考试成绩,输入要查询的姓名,则功能完成,然后可选择是否继续实现其他功能。图 4.2.5.2学生信息管理系统 204.2.6 学生成绩统计各等级学生的百分比先输入学生信息,在一级菜单选择统计进入该功能,可以选择是否继续图 4.2.64.
17、2.6 学生信息的输入输出输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分测试输入学生个人信息后,进入菜单选择界面,选择菜单代码 1,则完成此功能。选择是否继续,进行其他操作。学生信息管理系统 21图 4.2.6.将每个学生的记录信息写入文件测试输入学生个人信息后,进入菜单选择界面,选择菜单代码 2,则完成此功能。选择是否继续,进行其他操作。学生信息管理系统 22图 4.2.6.2从文件中读出每个学生的记录信息并显示测试输入学生个人信息后,进入菜单选择界面,选择菜单代码 3,则完成此功能。选择是否继续,进行其他操作。图 4.2.5.35 课程设计遇到的问题及解决方法(1)在建
18、立二级菜单是定义错误问题内容:在 switch 选择语句中定义变量,导致程序出错;问题分析:switch 选择语句中不能定义变量;解决方法:重新定义变量在 switch 选择语句前,同时修改二级菜单选择的变量与一级菜单选择的变量不同。(2)输出统计成绩百分比时错误问题内容:将第一门成绩输出错误,而后面课程的成绩百分比变为前一门成绩的百分比问题分析:学生成绩与学号的混淆,系统错将学号为学生成绩;解决方法:修改学生成绩的输出方式,将循环输出是定义的 j=0 改为j=1,输出的 j #include #include #define NUM_N 30 #define N 100 #define SC
19、ORE_N 7 #define COURSE_N 6typedef struct student /*声明一个结构体模板 STUDENT*/ char nameNUM_N; int scoreSCORE_N; 学生信息管理系统 24float averstudent; STUDENT; int Input(STUDENT stu,int n); /*函数原型声明*/ int Refernum(STUDENT stu,int n); int Refername(STUDENT stu,int n); void Print(STUDENT stu,int n); void High(STUDENT
20、 stu,STUDENT b,int n); void Down(STUDENT stu,STUDENT b,int n); void Score(STUDENT stu,STUDENT b,int n); void SortString(STUDENT stu,STUDENT b,int n); void Sum(STUDENT stu,int n,int coursesum); void Count(STUDENT stu,int n); void Printf(STUDENT stu,int n,float avercourse,int coursesum); void Average(
21、STUDENT stu,int n,float avercourse,int coursesum); void Writetofile(STUDENT stu,FILE *fp,int n); void Readfromfile(FILE *fp,int n); void main() int coursesumCOURSE_N=0,countNUM_NCOURSE_N=0;float avercourseNUM_N; int i,j,p,n,op,r=0,m; char answer=Y;FILE *fp; STUDENT stuNUM_N; STUDENT bNUM_N; menu:; s
22、ystem(“cls“); printf(“ *欢迎使用学生成绩管理系统 *n“); printf(“n“); printf(“ 欢迎使用如下菜单n“); printf(“n“); printf(“ 1.录入每个学生的学号、姓名、各科考试成绩n“); printf(“ 2.计算成绩 n“); printf(“ 3.排名 n“); printf(“ 4.查询 n“); printf(“ 5.统计 n“); printf(“ 6.输入输出 n“); printf(“ 0.退出 n“); printf(“n“); choose:;printf(“请输入你的选择:n“); scanf(“%d“, if
23、(op!=1 r+; goto choose; else r+; goto start; do answer=N; printf(“请输入你的选择:n“); scanf(“%d“, start:; switch(op) case 1: n=Input(stu,n);break; /*调用 Input 函数 */case 2: printf(“1.计算每门课程的总分和平均分n“);printf(“2.计算每个学生的总分和平均分n“);printf(“请输入你的选择:n“); scanf(“%d“,switch(m)case 1: printf(“计算每门课程的总分和平均分n“); /*调用 Su
24、m 和Average 函数*/Sum(stu,n,coursesum); for(i=0;i3;i+) printf(“课程%d 总分=%dn“,i,coursesumi); Average(stu,n,avercourse,coursesum);for(i=0;i3;i+) printf(“课程%d 平均分=%fn“,i,avercoursei); break; case 2: printf(“计算每个学生的总分和平均分 n“); /*调用 Sum 和Average 函数*/Sum(stu,n,coursesum); for(i=0;in;i+) printf(“学生%d 总分=%dn“,i
25、+1,stui.score4); Average(stu,n,avercourse,coursesum); for(i=0;in;i+) printf(“学生%d 平均分=%fn“,i+1,stui.averstudent); break;break;学生信息管理系统 26case 3: printf(“1.按每个学生的总分由高到低排出名次表n“);printf(“2.按每个学生的总分由低到高排出名次表n“);printf(“3.按学号由小到大排出成绩表n“);printf(“4.按姓名的字典顺序排出成绩表n“);printf(“请输入你的选择:n“); scanf(“%d“,switch(m
26、)case 1:printf(“按每个学生的总分由高到低排出名次表 n“); /*调用Sum、High 函数*/Sum(stu,n,coursesum); High(stu,b,n); Print(stu,n); break; case 2: printf(“按每个学生的总分由低到高排出名次表 n“); /*调用Sum、Down 函数*/Sum(stu,n,coursesum); Down(stu,b,n);Print(stu,n); break; case 3:printf(“按学号由小到大排出成绩表 n“); /*调用 Score 函数*/Score(stu,b,n); Print(stu
27、,n); break; case 4: printf(“按姓名的字典顺序排出成绩表 n“); /*调用Sum、SortString 函数*/Sum(stu,n,coursesum); SortString(stu,b,n); printf(“姓名 学号 物理 数学 英语 总分n“); for(i=0;in;i+) puts(stui.name); for(j=0;j5;j+) printf(“%6ld“,stui.scorej); printf(“n“); break;学生信息管理系统 27break;case 4: printf(“1.按学号查询学生排名及其考试成绩n“);printf(“2
28、.按姓名查询学生排名及其考试成绩n“);printf(“请输入你的选择:n“); scanf(“%d“,switch(m)case 1:Sum(stu,n,coursesum); /*调用 Sum、High 和 Refernum 函数*/High(stu,b,n); printf(“按学号查询学生排名及其考试成绩 n“); i=Refernum(stu,n); if(i!=-1) printf(“姓名 学号 物理 数学 英语 总分 名次n“); for(j=0;j5;j+) printf(“%6ld“,stui.scorej); printf(“%6ldn“,i+1); else printf
29、(“查无此人n“); break; case 2: printf(“按姓名查询学生排名及其考试成绩 n“); /*调用 Sum、High和 Refername 函数 */Sum(stu,n,coursesum); High(stu,b,n); i=Refername(stu,n); if(i!=-1) printf(“姓名 学号 物理 数学 英语 总分 名次n“); printf(“%s“,stui.name); for(j=0;j5;j+) printf(“%6ld“,stui.scorej); printf(“%6ldn“,i+1); else printf(“查无此人n“); break; break;case 5: printf(“按优秀、良好、中等、及格、不及格对每门课程分别统计人数及其所占百分比n“); /*调用 Count 函数*/Count(stu,n);