c语言程序设计 学生成绩管理系统
实验题目:学生成绩管理系统
一、课程设计目的
1、进一步掌握和利用C语言进行程设计的能力;
2、进一步理解和运用结构化程设计的思想和方法;
3、初步掌握开发一个小型实用系统的基本方法;
4、学会调试一个较长程序的基本方法;
5、学会利用流程图或N-S图表示算法;
6、掌握书写程设计开发文档的能力(书写课程设计报告);
二、课程设计内容
1、每一条记录包括一个学生的学号、姓名、性别、4门课成绩、平均成绩。
2、输入功能:可以一次完成若干条记录的输入。
3、输出功能:完成全部学生记录的显示。
4、查找功能:完成按姓名查找学生记录,并显示。
5、新增功能:完成对任意学生信息的增加。
6、删除功能:完成对任意学生信息的删除。
7、统计功能:完成对学生四门成绩最高分、最低分、平均成绩的统计。
8、排序功能:完成学生四门成绩由高到低的排序,并显示。
9、将学生记录存在文件student中。
10、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!
三、需求分析
1、用C语言实现系统;
2、利用结构体数组实现学生成绩的数据结构设计;
3、系统具有增加,查询,插入,排序等基本功能;
4、系统的各个功能模块要求用函数的形式实现;
5、完成设计任务并书写课程设计报告。
6、将学生成绩信息存在文件中。
四、概要设计
1、方案设计
对系统进行分析,给出结构图
分析:系统要求实现许多的功能,因此遵循结构化程序设计思想来进行本系统的设计—自顶向下、逐步细化,将系统设计任务分解出许多子功能模块进行设计
结构图如下:
2、模块功能说明
对各个模块进行功能的描述
(1)、输入模块:
录入需要管理的学生信息并将信息保存于文件中,以方便日后进行打印、读取、修改等操作。
(2)、输出模块:
将所有学生信息或想要查询的学生信息显示于屏幕,用于打印学生信息或查找某些学生信息。
(3)、查询模块:
可对已建立的学生信息进行查询,并且可根据需要选择按姓名查询。
(4)、新增模块:
根据需要随时增加学生信息。
(5)、修改模块:
可根据需要对多个学生信息进行修改,也可随时对个别项进行修改。
(6)、删除模块:
可对退学或休学的学生信息做删除处理。
(7)、统计模块:
对学生四门成绩最高分、最低分、平均成绩的统计。(8)、排序模块:
对学生四门成绩由高到低的排序。
(9)、退出系统:
选择该项,自动退出该系统。
五、详细设计及运行结果
流程图,函数之间相互调用的图示,程序设计及编码, 运行结果。
六.调试情况及运行结果
1、对自己设计进行评价,指出合理和不足之处,提出改进的方案。
此次实践课编写的是一个应用程序,相对于以前我们见的程序,它要大得多,运行的结果也没有预想中的好,数据
的输出格式不太规范,而且各模块也出现了一些小问题,在同学们的帮助下,我很有耐心的一次又一次的进行修改,最后运行的结果基本上达到了预期的目的。可是毕竟是第一次独立完成这样的大程序,结果还不是太理想。
由于时间很短,在选题报告中设想到的好多功能都没有实现。已有的那些功能虽已能基本上满足用户的需要,但如果还有更多的功能程序就会更加完美。如:再录入数据时,没有设计数据输入出错的提示,如果成绩输的是负值程序也继续执行,这就给运用上带来一些不便;没有设计按各科成绩排序的功能。
2、在设计过程中的感受。
本次C 语言的实习课让我对C 语言的学习又有了更深入的了解,也让我更深刻地领悟到了“实践出真理”这个道理,在上机实践过程中学到的知识远远超过了在课堂上十几周学到的,学校组织的这次实习让我们这些实践知识匮乏的大学生增添了许多社会经验,为我们将来走上工作岗位其了不小的铺垫作用。
本次实习中遇到了很多以前没有遇到过的问题,也曾想要放弃,但看到那些同学都在那认真的写程序,给了我继续的信心。在同学的帮助下,我顺利的结束了本次实习,让我知道原来凭借自己努力取得的成功会让自己这么欣慰,也让我知道了友谊和团结的重要性。
3、程序中出现的问题及解决方法
问题一、学生初始信息模块:
其中包括学生的姓名、学号和性别以及学生的语文数学、英语和计算机等相关信息;可用函数input()来实现此操作。当正确输入存在的学生学号,系统进行判断时,提示不存在此学生。解决办法及步骤:
(1)一个个输出所有的学生的学号,检查文件中是否有此学生,发现有。
(2)既然有此学生,那么检查循环判断是否有此学生的语句发现没有错。
(3)仔细分析原因后,最后发现是变量的类型错误,错将学生
类型的结构体指针变量定义为了其他类型的变量。
问题二、查询模块:
可用inquire()函数来实现。找到就输出此学生全部信息,包括学生的语文、数学、英语和计算机等的成绩。当正确输入查找信息时,系统却不能够得到所要查找的学生信息以及学生的语文、数学、英语和计算机的成绩。解决办法及步骤:(1)检查所编写的程序代码是否完全正确,若不是,则改之,然后再继续正确输入查找信息看能否得到所要查找的学生信息以及学生的语文、数学、英语和计算机的成绩。(2)检查当我们在输入查找信息时,看是否我们输入的信息有误,若是这样的话,我们应当仔细输入查找信息。
问题三、插入模块:
可用insert( )函数来实现。当我们输入插入信息时,系统却提示插入不进数据。解决办法及步骤:
(1)检查所编写的程序代码是否完全正确,若不是,则改之,然后再继续正确输入插入信息看能否插入进去得到所要插入的学生信息以及学生的语文、数学、英语和计算机的成绩。
( 2)检查当我们在输入插入信息时,看是否我们输入的插入信息有。
七.参考文献
《C语言程序设计》王曙燕曹锰科学出版社2005年2月
八. 附录:
# include
# include
# define N 5
int sum; /*用来记录学生人数*/
/*学生信息结构体类型*/
struct student
{ int num;
char name[12];
char sex;
int score[4];
int ave;
}stu[N];
/*全新保存函数*/
save_message(int sum) /*保存函数,保存sum个记录*/
{ FILE *fp;
int i;
if((fp=fopen("student.txt","wb"))==NULL) /*以输出打开方式,在此前的记录被覆盖*/
{ printf("\nCannot open file\n");
return NULL;
}
for(i=0;i if(stu[i].ave!=0) /*stu[i].ave=0表此记录已删除*/ if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) printf("file write error\n"); fclose(fp); } /*学号输入函数*/ void no_input(int i) /*表示第i个的学生信息*/ { int j,k; printf("NO.:"); scanf("%d",&stu[i].num); if(stu[i].num<0 || stu[i].num>9) /*判断学号是否为数字*/ printf("Input errror!Only bemade up of (0-9).Please reinput!\n"); } /*对分数输入*/ void score_input(int i) { int j; for(j=0;j<4;j++) { printf("score %d:",j+1); scanf("%d",&stu[i].score[j]); } } void average(int i) /*对第i个记录的分数求平均值*/ { int j,sum=0; for(j=0;j<4;j++) sum+=stu[i].score[j]; stu[i].ave=sum/4; } /*输入模块*/ void input_message(int i) { printf("\n\n 录入学生信息(最多%d种)\n",N); for(i=0;i { printf("please input name:\n"); fflush(stdin); scanf("%3s",stu[i].name); no_input(i); fflush(stdin); printf("please input sex:\n"); scanf("%c",&stu[i].sex); fflush(stdin); score_input(i); fflush(stdin); average(i); } fflush(stdin); printf("\n --%d名学生信息输入完毕!--\n",i); sum=i; printf("\n 按任意键返回主菜单!"); } /*读取信息*/ int read_message() { FILE *fp; int i=0; if((fp=fopen("student.txt","rb"))==NULL) { printf("\n\n****暂时还没有任何库存信息,按任意键进入 主菜单选择基本信息的录入!****\n"); return; } while(feof(fp)!=1) { fread(&stu[i],sizeof(struct student),1,fp); if(stu[i].num==0) break; else i++; } fclose(fp); return(i); } /*输出模块*/ void output_message() { int i=0,j; do { printf("%d %3s %c\t\t",stu[i].num,stu[i].name,stu[i].sex); for(j=0;j<4;j++) printf("%d\t\t",stu[i].score[j]); average(i); printf("%d\n",stu[i].ave); i++; }while(i printf("按任意键返回主菜单!"); getch(); } /*查询模块*/ void inquire_message() { char name[4]; int j=0,i; printf("please input the name of the student you want to find:"); /*通过姓名查看*/ scanf("%3s",name); fflush(stdin); for(i=0;i { if(strcmp(name,stu[i].name)==0) { printf("\n----------学生信息----------\n"); printf("学号--姓名--性别--语文成绩--数学成绩--英语成 绩--计算机成绩--平均成绩\n"); printf("%d %3s %c %d %d %d %d %d\n",stu[i].num,stu[i].nam e,stu[i].sex,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].sc ore[3],stu[i].ave); } else j++; } if(j==sum) printf("\n 该学生不存在!"); /*判断要查询的学生信息是否存在*/ printf("\n 按任意键返回主菜单!"); getch(); } /*新增学生信息*/ void insert_message() { int i=sum,flag=0; char choice; printf("\n\n 添加一名学生信息\n"); fflush(stdin); do { printf("\n\n student number:"); scanf("%d",&stu[i].num); fflush(stdin); printf("\n\n student name:"); scanf("%3s",stu[i].name); fflush(stdin); printf("\n\n student sex:"); scanf("%c",&stu[i].sex); fflush(stdin); printf("\n\n Chinese score:"); scanf("%d",&stu[i].score[0]); fflush(stdin); printf("\n\n Math score:"); scanf("%d",&stu[i].score[1]); fflush(stdin); printf("\n\n English score:"); scanf("%d",&stu[i].score[2]); fflush(stdin); printf("\n\n Computer score:"); scanf("%d",&stu[i].score[3]); fflush(stdin); average(i); printf("\n\n average:%d",stu[i].ave); printf("\n Go on?(Y/N)"); /*判断是否继续*/ getchar(); printf("%c",choice); if(choice=='Y') { printf("\n Go on!\n"); i++; flag=1; } else flag=0; }while(flag==1); printf("\n 按任意键返回主菜单!"); getch(); } /*修改学生信息*/ void revise_message() { int c,i=0,num,flag=1; char choice; inquire_message(); /*调用查询函数*/ printf("\n modify 1.num https://www.360docs.net/doc/4a12780730.html, 3.sex 4.score1 5.score2 6.score3 7.score4 8.average"); /*输入选择做个判断*/ printf("Which do you need?"); scanf("%d",&c); if(c>8||c<1) { printf("\nChoice error!Please again!"); /*判断选择是否错误,若是则重新选择*/ getchar(); /*当输入是字符时,可以防止死循环*/ } switch(c) /*选择要修改的项目*/ { case 1:printf("\n 输入修改后的学号:"); scanf("%d",&stu[i].num); break; case 2:printf("\n 输入修改后的姓名:"); scanf("%3s",stu[i].name); break; case 3:printf("\n 输入修改后的性别:"); getchar(); scanf("%c",&stu[i].sex); break; case 4:printf("\n 输入修改后的语文成绩:"); scanf("%d",&stu[i].score[0]); break; case 5:printf("\n 输入修改后的数学成绩:"); scanf("%d",&stu[i].score[1]); break; case 6:printf("\n 输入修改后的英语成绩:"); scanf("%d",&stu[i].score[2]); break; case 7:printf("\n 输入修改后的计算机成绩:"); scanf("%d",&stu[i].score[3]); break; case 8:printf("\n 输入修改后的平均成绩:"); scanf("%d",&stu[i].ave); break; } printf("\n\n Go on? (Y/N)"); /*判断是否继续*/ scanf("%c",&choice); getchar(); if (choice=='Y') { flag=1; printf("\n Go on!\n"); } else flag=0; printf("\n 按任意键返回主菜单!"); getch(); } /*删除学生信息*/ void del_message() { int i,k,del_num,flag=1; char choice; printf("please input the deleted student num:"); scanf("%d",&del_num); for(i=0;i if(stu[i].num==del_num) { for(k=i;k stu[k]=stu[k+1]; break; } if(i==sum) printf("\n 学生信息不存在:"); printf("\n\n Go on? (Y/N)"); fflush(stdin); getchar(); scanf("%c",&choice); if(choice=='Y') { flag=1; printf("\n Go on!\n"); } else flag=0; printf("\n 按任意键返回主菜单!"); getch(); } /*求学生语文最高分,最低分,平均成绩*/ void Chinese_average() { int i,max,min,SUM=0,ave; max=min=stu[0].score[0]; for(i=0;i { if (stu[i].score[0]>max) max=stu[i].score[0]; if (stu[i].score[0] SUM+=stu[i].score[0]; } ave=SUM/sum; printf("\n Chinese average:%d",ave); printf("\n Chinese max:%d",max); printf("\n Chinese min:%d",min); printf("\n 按任意键返回主菜单!"); getch(); } /*求学生数学最高分,最低分,平均成绩*/ void Math_average() { int i,max,min,SUM=0,ave; max=min=stu[0].score[1]; for(i=0;i { if (stu[i].score[1]>max) max=stu[i].score[1]; if (stu[i].score[1] SUM+=stu[i].score[1]; } ave=SUM/sum; printf("\n Math average:%d",ave); printf("\n Math max:%d",max); printf("\n Math min:%d",min); printf("\n 按任意键返回主菜单!"); getch(); } /*求学生英语最高分,最低分,平均成绩*/ void English_average() { int i,max,min,SUM=0,ave; max=min=stu[0].score[2]; for(i=0;i { if (stu[i].score[2]>max) max=stu[i].score[2]; if (stu[i].score[2] SUM+=stu[i].score[2]; } ave=SUM/sum; printf("\n English average:%d",ave); printf("\n English max:%d",max); printf("\n English min:%d",min); printf("\n 按任意键返回主菜单!"); getch(); } /*求学生计算机最高分,最低分,平均成绩*/ void Computer_average() { int i,max,min,SUM=0,ave; max=min=stu[0].score[3]; { if (stu[i].score[3]>max) max=stu[i].score[3]; if (stu[i].score[3] SUM+=stu[i].score[3]; } ave=SUM/sum; printf("\n Computer average:%d",ave); printf("\n Computer max:%d",max); printf("\n Computer min:%d",min); printf("\n 按任意键返回主菜单!"); getch(); } /*学生语文成绩排序*/ void sort_Chinese() { int i,j,t; printf("Input %d scores:\n",sum); for(i=0;i printf("%d",stu[i].score[0]); printf("\n"); for(i=0;i for(j=i+1;j if(stu[i].score[0] { t=stu[i].score[0]; stu[i].score[0]=stu[j].score[0]; stu[j].score[0]=t; } printf("The sorted scores:\n"); for(i=0;i printf("%4d\t",stu[i].score[0]); printf("\n"); printf("\n 按任意键返回主菜单!"); getch(); } /*学生数学成绩排序*/ void sort_Math() { int i,j,t; printf("Input %d scores:\n",sum); printf("%d",stu[i].score[1]); printf("\n"); for(i=0;i for(j=i+1;j if(stu[i].score[1] { t=stu[i].score[1]; stu[i].score[1]=stu[j].score[1]; stu[j].score[1]=t; } printf("The sorted scores:\n"); for(i=0;i printf("%4d\t",stu[i].score[1]); printf("\n"); printf("\n 按任意键返回主菜单!"); getch(); } /*学生英语成绩排序*/ void sort_English() { int i,j,t; printf("Input %d scores:\n",sum); for(i=0;i printf("%d",stu[i].score[2]); printf("\n"); for(i=0;i for(j=i+1;j if(stu[i].score[2] { t=stu[i].score[2]; stu[i].score[2]=stu[j].score[2]; stu[j].score[2]=t; } printf("The sorted scores:\n"); for(i=0;i printf("%4d\t",stu[i].score[2]); printf("\n"); printf("\n 按任意键返回主菜单!"); getch(); } /*学生计算机成绩排序*/ void sort_Computer() { int i,j,t; printf("Input %d scores:\n",sum); for(i=0;i printf("%d",stu[i].score[3]); printf("\n"); for(i=0;i for(j=i+1;j if(stu[i].score[3] { t=stu[i].score[3]; stu[i].score[3]=stu[j].score[3]; stu[j].score[3]=t; } printf("The sorted scores:\n"); for(i=0;i printf("%4t",stu[i].score[3]); printf("\n"); printf("\n 按任意键返回主菜单!"); getch(); } /*主程序*/ main() { int i; sum=read_message(); printf("~~~~~~~~~~\t\t\t~~~~~~~~~~\n"); /*操作界面*/ printf("\t\tW elcime to the system\n"); printf("Author:-----\tClass:-----\tNum:-----\n"); /*作者,班级和学号*/ printf("%%%%%%%%%%%%%%%%%%%%%%%%%%\n" ); printf("\n\n\n"); printf("===========\t\t==========\n"); printf("===========\t\t==========\n"); do { printf("\n\n\n ******学生成绩管理系统******\n\n"); printf(" 1.录入学生信息\n\n"); printf(" 2.输出学生信息\n\n"); printf(" 3.查询学生信息\n\n"); printf(" 4.新增学生信息\n\n"); printf(" 5.修改学生信息\n\n"); printf(" 6.删除学生信息\n\n"); printf(" 7.统计学生语文最高分、最低分、平均成绩\n\n"); printf(" 8.统计学生数学最高分、最低分、平均成绩\n\n"); printf(" 9.统计学生英语最高分、最低分、平均成绩\n\n"); printf(" 10.统计学生计算机最高分、最低分、平均成绩\n\n"); printf(" 11.学生语文成绩排序\n\n"); printf(" 12.学生数学成绩排序\n\n"); printf(" 13.学生英语成绩排序\n\n"); printf(" 14.学生计算机成绩排序\n\n"); printf(" 0.退出系统\n\n"); printf(" 请选择(0-14) :"); scanf("%d",&i); switch(i) { case 1: input_message(i);break; case 2: output_message();break; case 3: inquire_message(i);break; case 4: insert_message();break; case 5: revise_message();break; case 6: del_message();break; case 7: Chinese_average();break; case 8: Math_average();break; case 9: English_average();break; case 10: Computer_average();break; case 11: sort_Chinese();break; case 12: sort_Math();break; case 13: sort_English();break; case 14: sort_Computer;break; case 0: break; } }while(i!=0); save_message(sum); printf("\n-The messages have been saved! - (filename:student.txt)\n"); }