1、 学生成绩管理系统实验报告一、实验内容实验名称:学生成绩管理系统实验目的:1)利用所学的三种程序基本结构以及数组、用户自定义函数进行一个简单管理系统的设计,进一步理解和掌握c语言的语法以及三种基本程序结构的综合应用。2)通过程序中涉及的排序、查找、求和等操作加深对算法、程序设计思路、常用程序设计技巧的理解与掌握,逐步培养学生的程序开发能力。实验的基本要求:学号(字符串)、姓名(字符串)、数学成绩(整型)、程序设计成绩(整型)。设计程序完成以下五项功能:新建数据档案、添加数据、删除数据、对输入的数据进行排序和查询。二、算法说明将数学成绩、程序设计成绩、姓名、学号分别设一个数组,其中姓名和学号是二
2、维数组,其他是一维数组,并设为全局变量方便使用。分别将各个功能以及菜单等功能设置为函数,介时调用。主函数中运行菜单函数。菜单函数中提供选择用switch语句调用函数。1、新建数据build()。用文档导入的方式导入数据。2、添加数据add()。界面出现相应信息并提示输入。输入完成后用if语句选择是否再添加数据。如果选择是则继续调用add函数,否则调用print函数继续选择其他功能。用全局变量m来计算增加的次数。3、删除数据rid()。用swith语句选择是按姓名删除还是按学号删除或者返回主菜单。按姓名则输入想要删除的对象,用for语句找到对象后,再用stremp赋值的方法将下一个信息往上一个位
3、置移动,达到覆盖要删除的信息的效果。最后用for循环输出。按学号删除也是同理。用全局变量m来计算删除的次数4、排序arrange()。用swith语句选择是按数学成绩arr_math(),程序设计成绩arr_design()还是总分arr_total()。按数学成绩排序时用冒泡排序的方法排列数学成绩,同时其他的姓名、学号的信息的下标也随着数学成绩的下标变动,最后用for语句一起输出。按程序设计以及总分的具体算法也是同理。每个程序后调用arrange()返回上级子菜单以便继续操作。5、查询search()。也用switch语句选择是按学号s_code()、姓名s_name()、数学成绩s_mat
4、h()、程序设计成绩s_design()、总分s_total()查找。按学号则是输入学号,用if语句查找,输出该位置所对应的成绩以及姓名。按姓名、成绩查找也是同理。按成绩查找时用到flag=0标记,找到至少一个flag=1输出,否则flag=0时输出不存在。并重新调用search()函数返回上级子菜单。6、退出。三、程序清单#include#define N 5#define M 100 int i,j,m=N-1,k,choice; /*全局变量*/ int mathM; int designM; char name50M; char code50M; int totalM; void pr
5、int() /*菜单函数*/ void build(); void add(); void arrange(); void search(); void rid(); printf( 欢迎使用学生成绩管理系统!n); printf(1.新建数据n2.添加数据n3.删除数据n4.排序n5.查询n6.退出n请选择:); scanf(%d,&choice); switch(choice) case 1: build();break; case 2: add();break; case 3: rid();break; case 4: arrange();break; case 5: search();
6、break; case 6:break; void build() /*新建数据*/ FILE*cp; FILE*np; FILE*mp; FILE*dp; np=fopen(d:code.txt,r); /*导入文件*/ for(i=0;iN;i+) fscanf(np,%s,codei); cp=fopen(d:name.txt,r); for(i=0;iN;i+) fscanf(cp,%s,namei); mp=fopen(d:math.txt,r); for(i=0;iN;i+) fscanf(mp,%d,&mathi); dp=fopen(d:design.txt,r); for(i
7、=0;iN;i+) fscanf(dp,%d,&designi); for(i=0;iN;i+) totali=mathi+designi; char select; printf(学号 姓名 数学 程序设计 总分n); for(i=0;iN;i+) printf(%s %4s %4d %4d %4dn,codei,namei,mathi,designi,totali); printf(成功!n); print(); void add() /*添加数据函数*/ char select; m+; printf(请输入信息); printf(请输入学号:); scanf(%s,codem); pr
8、intf(请输入姓名:); scanf(%s,namem); printf(请输入数学成绩:); scanf(%d,&mathm); printf(请输入程序设计成绩:); scanf(%d,&designm); totalm=mathm+designm; for(i=0;i=m;i+) printf(%s %s %d %d %dn,codei,namei,mathi,designi,totali); printf(是否继续Y/N?); getchar(); scanf(%c,&select); if(select=y|select=Y) add(); else print(); void n
9、ame_rid() /*按名字删除函数*/ void rid(); m-; char name210,select; printf(输入您要删除姓名:); scanf(%s,name2); for(i=0;i=m+1;i+) if(strcmp(name2,namei)=0) for(j=i;j=m;j+) strcpy(codej,codej+1); strcpy(namej,namej+1); mathj=mathj+1; designj=designj+1; for(i=0;i=m;i+) printf(%s %s %4d %4d %4d n,codei,namei,mathi,desi
10、gni,totali); printf(是否继续Y/N?); getchar(); scanf(%c,&select); if(select=y|select=Y) name_rid(); else rid(); void code_rid() /*按学号删除函数*/ void rid(); m-; char NO10; int select; printf(输入您要删除的学号:); scanf(%s,&NO); for(i=0;i=m+1;i+) if(strcmp(NO,codei)=0) for(j=i;j=m;j+) strcpy(codej,codej+1); strcpy(name
11、j,namej+1); mathj=mathj+1; designj=designj+1; for(i=0;i=m;i+) printf(%s %s %4d %4d %4d n,codei,namei,mathi,designi,totali); printf(是否继续Y/N?); getchar(); scanf(%c,&select); if(select=y|select=Y) code_rid(); else rid(); void rid() /*删除数据总函数*/ int select; printf(1.按姓名n2.按学号n3.返回主菜单n请选择:); scanf(%d,&sel
12、ect); switch(select) case 1: name_rid();break; case 2:code_rid();break; case 3:print(); break; default:break; void arr_math() /*按数学成绩排序函数*/ void arrange(); int temp1; char str1100,str2100; for(j=0;j=m-1;j+) for(i=0;i=m-1-j;i+) if(mathimathi+1) temp1=mathi; mathi=mathi+1; mathi+1=temp1; strcpy(str1,n
13、amei); strcpy(namei,namei+1); strcpy(namei+1,str1); strcpy(str2,codei); strcpy(codei,codei+1); strcpy(codei+1,str2); printf(按数学成绩排序n); for(i=0;i=m;i+) printf(%s %s %4dn,codei,namei,mathi); arrange(); void arr_design() /*按程序设计成绩排序*/ void arrange(); int temp1; char str1100,str2100; for(j=0;j=m-1;j+) f
14、or(i=0;i=m-1-j;i+) if(designidesigni+1) temp1=designi; designi=designi+1; designi+1=temp1; strcpy(str1,namei); strcpy(namei,namei+1); strcpy(namei+1,str1); strcpy(str2,codei); strcpy(codei,codei+1); strcpy(codei+1,str2); printf(按程序设计成绩排序n); for(i=0;i=m;i+) printf(%s %s %4dn,codei,namei,designi); arr
15、ange(); void arr_total() /*按总分排序*/ void arrange(); int temp1; char str1100,str2100; for(j=0;j=m;j+) for(i=0;i=m-1-j;i+) if(totalitotali+1) temp1=totali; totali=totali+1; totali+1=temp1; strcpy(str2,codei); strcpy(codei,codei+1); strcpy(codei+1,str2); strcpy(str1,namei); strcpy(namei,namei+1); strcpy
16、(namei+1,str1); printf(总分排序/n); for(i=0;i=m;i+) printf(%s %s %4dn,codei,namei,totali); arrange(); void arrange() /*排序的总函数*/ int select; printf(1.数学成绩排序n2.程序设计成绩排序n3.总分排序n4.返回主菜单n); scanf(%d,&select); switch(select) case 1:arr_math();break; case 2:arr_design();break; case 3:arr_total();break; case 4:
17、print();break; void s_code() /*按学号查找函数*/ void search(); char NO10;int flag=0; printf(请输入学号:); scanf(%s,NO); for(i=0;i=m;i+) if(strcmp(NO,codei)=0)flag=1; printf(%s %s %4d %4d %4dn,codei,namei,mathi,designi,totali); if(flag=0) printf(不存在n欢迎继续使用!n);search(); else printf(欢迎继续使用!n);search(); void s_name
18、() /*按姓名查找函数*/ void search(); char name210;int flag=0; printf(请输入姓名:); scanf(%s,name2); for(i=0;i=m;i+) if(strcmp(name2,namei)=0) flag=1;printf(%s %s %4d %4d %4dn,codei,namei,mathi,designi,totali); if(flag=1) printf(欢迎继续使用!n);search(); else printf(不存在n欢迎继续使用!n);search(); void s_math() /*按数学成绩查找*/ vo
19、id search(); int mark,flag=0; printf(请输入数学成绩:); scanf(%d,&mark); for(i=0;i=m;i+) if(mark=mathi) flag=1; printf(%s %s %4d %4d %4dn,codei,namei,mathi,designi,totali); search(); if(flag=0) printf(不存在n欢迎继续使用!n); search(); void s_design() /*按程序设计成绩查找*/ void search(); int mark,flag=0; printf(请输入程序设计成绩:);
20、scanf(%d,&mark); for(i=0;i=m;i+) if(mark=designi) flag=1; printf(%s %s %4d %4d %4dn,codei,namei,mathi,designi,totali); search(); if(flag=0) printf(不存在n欢迎继续使用!n); search(); void s_total() /*按总分查找*/ void search(); int mark,flag=0; printf(请输入总分:); scanf(%d,&mark); for(i=0;i=m;i+) if(mark=totali) flag=1
21、; printf(%s %s %4d %4d %4dn,codei,namei,mathi,designi,totali); search(); if(flag=0) printf(不存在n欢迎继续使用!n); search(); void search() /*查找总函数*/ int select; printf(1.学号查询n2.姓名查询n3.数学成绩查询n4.程序设计成绩查询n5.总分查询n6.返回主菜单n); scanf(%d,&select); switch(select) case 1:s_code();break; case 2:s_name();break; case 3:s_
22、math();break; case 4:s_design();break; case 5:s_total();break; case 6:print();break; void main() /*主函数*/ print();四、运行结果运行界面,显示“欢迎您使用学生成绩管理系统”,并提供菜单,供选择。1、新建数据:输出按序号排列的学生姓名、成绩。2、添加数据:输入相关信息后,界面输出添加后的学号、姓名、成绩(数学,程序设计和总分)列表。并提示成功,要求选择是否继续,若继续则继续先前输出的提示信息,否则返回显示主菜单。3、删除数据:输入相关信息后,界面输出删除后的学号、姓名、成绩(数学,程序设
23、计和总分)列表。并提示成功,提供选择是否继续。若继续则继续先前输出的提示信息,否则返回上级子菜单。4、排序。界面要求选择按数学成绩还是程序设计成绩排序,或者返回主菜单。选择数学成绩后,输入数学成绩,最后显示按数学成绩的、从高到低排列的各个学生的学号、姓名和数学成绩。程序设计也是类似。排序完成后,提示成功并返回上级子菜单,继续操作。5、查询。界面要求选择按学号、姓名、数学成绩,程序设计成绩还是总分查询。输入学号后输出该学号所对应的学生姓名和各个成绩。姓名查找是类似的。按数学成绩查找则是输入数学成绩,则输出大与该分数的所有人的学号以及相应的姓名和成绩。程序设计成绩和总分查找类似。所有查找若找不到就
24、显示“不存在”。最后提示成功,要求选择是否结束操作还是返回主菜单。6、退出。退出后显示“感谢您使用学生成绩管理系统”。五、分析与思考刚开始拿到题目时,感觉很棘手。但是慢慢分析后,我发现一切都是可以解决的。我和其他人不一样,别人是分步调试完成,而我是全部编好再进行调试,一运行大批的错误提示让我迷茫了。首先第一个问题,函数调用时我写上了如build(math,design,total,name,code),发现是错的,查书之后才发现是不对的应该是build(math,design,total,name,code)。而且设为全局变量更简洁;还有第93行中的 scanf(%ld,codek);运行的时
25、候是对的,而调试时就不成功,原因是没有取地址符号。这些都是书本上的基础知识,我觉得基础知识非常重要不能小看,c语言是门严谨的学科,一点小错误都会导致全局的失败,应当十分小心。在第70行中的getchar()也是我找了好就才发现的重要问题。没有getchar()语句,前面的回车键就当作一个字符出入scanf中,运行时就直接显示 下面的操作,系统默认选了其他。所以用一个空的getchar()避开了这个问题。一直坐在电脑前面调试是一件十分辛苦的事,但是调试成功的结果让人很欣慰忘记了劳累。我觉得老师布置的这个作业是很有道理的,她让我们学会了自己摸索,自己尝试其中的滋味:找不出所时的泄气,求该成功时的喜悦;也让我们喜欢上了这门课!