《最新c语言实训报告—学生成绩系统(文件实现).doc》由会员分享,可在线阅读,更多相关《最新c语言实训报告—学生成绩系统(文件实现).doc(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品资料c语言实训报告学生成绩系统(文件实现).实训报告题 目: 学生成绩管理系统院 系: 专 业: 姓 名: 学 号: 指导教师: 日 期: 2017年9月9日 目 录1 问题定义 12 系统设计 121 总体设计122 函数预览23 系统实现 33. 1 功能模块33. 2 全部代码124 系统维护 1941 调试和测试195 归纳总结 195. 1 开发经验205. 2 实训中遇到的问题及解决方法205. 3 设计中的不足之处205. 4 感想和心得体会206 参考资料 20前 言课程设计环节是应用型本科院校非常重要的一个教学环节,是学完一门课后应用本课知识及以前的知识积累而进行的综合性
2、、开放性的训练。通过课程设计,不仅能够使学生得到系统的技能训练,巩固和加强所学得专业理论知识,而且能够培养学生工程意识、创新能力、团队精神等综合素质,培养学生的设计能力和解决实际问题的能力。C语言由于其强大的功能,丰富的表达能力,高效的代码,良好的移植性和灵活性,自1972年问世以来,经久不衰,即使现在出现了面向对象的程序设计方法和开发工具,但它仍然是人们学习程序设计的首选语言,用它训练和提高编程技术,以及开发应用程序等。我们通过C语言程序设计这门课程的学习,已经能编写解决小问题的程序,对程序的开发也有了初步的认识,还掌握了C 语言的基本语法,这一过程确确实实令我们感到欣喜,有点计算机可以完成
3、自我任务的成就感。但是,对于程序设计而言,学习C 的步伐不应该停留于此。我们最终的目的应该是掌握开发大型综合程序的方法,即遵循软件工程的开发步骤和结构化程序设计思想, 用C 语言开发出解决复杂问题的大型综合程序。可是对于多数学生来说,学习了C语言后,除了应付各种考试之外,别无它用,对Turbo C语言丰富的函数知之甚少,加上DOS环境所限,因而对C语言兴趣不大,也感到C语言比较难以掌握。本实训就是为了让学生在学完C语言后进一步了解C语言的知识,掌握C语言在软件开发方面的使用方法,希望通过此次实训,不仅能提高学生学习C语言的兴趣,更为今后学习其它专业知识及开发程序打下坚实的基础。本指导书中有些内
4、容借鉴了互联网上相关程序的设计思想,在此对相关者表示衷心的感谢。由于时间、经验及水平的原因,不当、不足之处,请大家提出宝贵意见。编者 桂林电子科技大学信息科技学院学生成绩管理系统 本题目设计目的是训练学生的基本编程能力,了解管理学生成绩信息系统的设计开发流程,熟悉C语言的文件各种基本实现和操作。本程序中涉及结构体、文件读写、宏等方面的知识。通过本程序的训练和制作,使学生能对C语言的文件操作等方面有一个更深刻的了解,掌握利用结构体存储实现对学生成绩管理的原理,为进一步开发出高质量的管理信息系统以及之后的其他编程方面知识的学习和理解打下坚实的基础。1、问题定义创建一个学生成绩管理系统。假设系统中每
5、个学生记录只包括学号、姓名、平时成绩、期末成绩、总评成绩、总分、平均分、名次等信息。程序的运行效果如上图图所示,选择任意菜单后,实现相应功能。具体结构体设定请见以后。程序初始主界面截图如下:在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。2、系统设计21 总体设计本管理系统的程序主要由C语言编写,考虑到各方面的维护和需求实现考虑,程序代码总体上采用模块化编程方式设计以及编写。即将一个大的功能需求分作几个小模块来配合实现,为了降低添加和维护功能和需求的成本和时间。尽量不依赖于C语言全局变量而是通过函数调用之间的参数来传递数据。以下是本管理系统的功能模
6、块:新建功能查询功能主功能菜单计算功能输出功能22 函数预览1)主函数调用其他不同功能2)主菜单函数输出显示界面3)新建信息函数1(手写输入)手动输入学生的成绩信息,包括学号、姓名、平时成绩、总评成绩4)新建信息函数2(文件输入)通过文件导入学生成绩信息5)计算成绩函数计算学生试卷分数的总评成绩6) 查询成绩函数1(按学号)按学号查询学生试卷的总评成绩7) 查询成绩函数2(按姓名)按学号查询学生试卷的总评成绩8)计算成绩函数1(计算总成绩的及格率和优秀率)计算全班学生总评成绩的及格率和优秀率,并按优良中差输出学生人数9)计算成绩函数2(计算总成绩的平均分和标准差)计算学生总评成绩的平均分和标准
7、差10)输出成绩函数输出全班学生的所有成绩,包括学号、姓名、总评成绩11)导出成绩函数将学生所有成绩的列表导出到文本score.txt中 3、系统实现31功能模快(附代码)int main()STU stuSIZE;int n,a,b;char ch;int oh;printf(tt*n);printf(ttt* 欢迎使用 * n);printf(ttt* 学生试卷分数统计系统 * n);printf(tt*n);while (1)ch = Menu();switch (ch)case 1: printf(请输入学生人数n(n=%d):, SIZE);scanf(%d, &n);printf(
8、请输入学生平时成绩与期末成绩所占总评成绩的的比例(用整数表示,满分100分):n); scanf(%d%d,&a,&b);printf(以下有两种输入试卷分数的方式:n*1.手动输入试卷分数t2.从student.txt文件中导入试卷分数*n);scanf(%d,&oh);switch (oh)case 1:Read_data(stu,n,a,b);break;case 2:Read_data1(stu,n,a,b);break;default:printf(输入菜单序号错误!);break;case 2:Total_mark(stu,n,a,b);break;case 3:Sortbynum
9、(stu,n);break;case 4:Sortbyname(stu,n);break;case 5: Count_pass(stu,n);break;case 6: Count_average(stu,n);break;case 7:Show_data(stu,n);break;case 8:Write_data(stu,n);break;case 0:printf(tt*n);printf(ttt* 感谢使用 * n);printf(ttt* 学生试卷分数统计系统 * n);printf(tt*n);exit(0);default:printf(输入菜单序号错误!);return 0;1
10、) 主函数ch = Menu();switch (ch)case 1: printf(请输入学生人数n(n=%d):, SIZE);scanf(%d, &n);printf(请输入学生平时成绩与期末成绩所占总评成绩的的比例(用整数表示,满分100分):n); scanf(%d%d,&a,&b);printf(以下有两种输入试卷分数的方式:n*1.手动输入试卷分数t2.从student.txt文件中导入试卷分数*n);scanf(%d,&oh);switch (oh)case 1:Read_data(stu,n,a,b);break;case 2:Read_data1(stu,n,a,b);br
11、eak;default:printf(输入菜单序号错误!);break;case 2:Total_mark(stu,n,a,b);break;case 3:Sortbynum(stu,n);break;case 4:Sortbyname(stu,n);break;case 5: Count_pass(stu,n);break;case 6: Count_average(stu,n);break;case 7:Show_data(stu,n);break;case 8:Write_data(stu,n);break;case 0:printf(tt*n);printf(ttt* 感谢使用 * n
12、);printf(ttt* 学生试卷分数统计系统 * n);printf(tt*n);exit(0);default:printf(输入菜单序号错误!);return 0;1) 输入限定2) 主菜单函数/* 函数功能:显示菜单并获得用户键盘输入的选项 */int Menu(void)int itemSelected;printf(n【菜单】n);printf(1.输入记录n);printf(2.计算学生总评成绩n);printf(3.按学号查询成绩n);printf(4.按姓名查询成绩n);printf(5.计算学生及格率和优秀率n);printf(6.计算学生平均分和标准差n);printf
13、(7.成绩列表n);printf(8.导出文件n);printf(0.退出n);printf(请输入你的选择:);scanf(%d, &itemSelected); /* 读入用户输入 */return itemSelected;3)限定功能模块限定(或者说确定)学生的人数和总评成绩的计算方式printf(请输入学生人数n(n=%d):, SIZE);scanf(%d, &n);printf(请输入学生平时成绩与期末成绩所占总评成绩的的比例(用整数表示,满分100分):n); scanf(%d%d,&a,&b);4) 新建成绩函数1(手动输入)/* 函数功能:手动输入分数 */void Rea
14、d_data(STU stu,int n,int a,int b)int i=0;printf(请输入学生的学号、姓名、平时成绩和期末成绩(逗号隔开):n);for(i=0;in;i+)scanf(%ld,%s,%d,%d,&stui.num,&stui.name,&stui.score0,&stui.score1);stui.score2=stui.score0*a/100+stui.score1*b/100;05) 新建成绩函数2(文件输入)/* 函数功能:从文本student.txt中导入试卷分数 */void Read_data1(STU stu,int n,int a,int b)i
15、nt i;FILE *fp;if(fp=fopen(student.txt,r)=NULL)printf(打开文件student.txt失败!n);exit(0);for(i=0;!feof(fp);i+)fscanf(fp,%ld,&stui.num);fscanf(fp,%s,stui.name);fscanf(fp,%d,&stui.score0);fscanf(fp,%d,&stui.score1);fclose(fp);for(i=0;in;i+)stui.score2=stui.score0*a/100+stui.score1*b/100;6)计算成绩及输出函数/* 函数功能:计算
16、学生试卷分数的总评成绩 */void Total_mark(STU stu,int n,int a,int b)int i;for(i=0;in;i+)stui.score2=stui.score0*a/100+stui.score1*b/100;printf(学生:%ldt姓名:%st总评成绩:%dn,stui.num,stui.name,stui.score2);7) 查询成绩函数1(按学号)/* 函数功能:按学号查询学生试卷的总评成绩 */void Sortbynum(STU stu,int n)int number,i;printf(请输入要查找的学生学号:);scanf(%d,&nu
17、mber);for(i=0;in;i+)if(stui.num=number)printf(学号:%ldt姓名:%st平时成绩:%dt期末成绩:%dt总评成绩:%dn,stui.num,stui.name,stui.score0,stui.score1,stui.score2);return;printf(抱歉,没有找到!n);for(i=0;in;i+)if(stui.num=number)printf(学号:%ldt姓名:%st平时成绩:%dt期末成绩:%dt总评成绩:%dn,stui.num,stui.name,stui.score0,stui.score1,stui.score2);r
18、eturn;printf(抱歉,没有找到!n);8) 查询成绩函数2(按姓名)/* 函数功能:按姓名查询学生试卷的总评成绩 */void Sortbyname(STU stu,int n)char named10;int i;printf(请输入要查找的学生姓名:);scanf(%s,named); for(i=0;in;i+)if(strcmp(named,stui.name)=0)printf(学号:%ldt姓名:%st平时成绩:%dt期末成绩:%dt总评成绩:%dn,stui.num,stui.name,stui.score0,stui.score1,stui.score2);retur
19、n;printf(抱歉,没有找到!n);9) 计算成绩函数1(计算总成绩的及格率和优秀率)/* 函数功能:计算全班学生总评成绩的及格率和优秀率,并按优良中差输出学生人数 */void Count_pass(STU stu,int n)int i,pass_num,t4;float passrate;memset(t,0,sizeof(t);for(i=0;in;i+)if(stui.score260) t0+;else if(stui.score2=75) t1+;else if(stui.score2=85) t2+;else if(stui.score2=100) t3+;pass_num
20、=t1+t2+t3;passrate=(float)(t1+t2+t3)/n;printf(及格人数:%dn,pass_num);printf(优:%dt良:%dt中:%dt差:%dn,t3,t2,t1,t0);printf(总评成绩及格率:%.2fn,passrate);printf(总评成绩优秀率:%.2fn,(float)t3/n);10) 计算成绩函数2(计算总成绩的平均分和标准差)/* 函数功能:计算学生总评成绩的平均分和标准差 */void Count_average(STU stu,int n)int i;double sum=0,aver,temp=0,standard;for
21、(i=0;in;i+)sum=stui.score2+sum;aver=(float)sum/n;for(i=0;in;i+)temp=(stui.score2-aver)*(stui.score2-aver)+temp;standard=sqrt(temp/n);printf(总评成绩平均分:%.2ft总评成绩标准差:%.2lfn,aver,standard);11)输出成绩函数/* 函数功能:输出全班学生的所有成绩 */void Show_data(STU stu,int n)int i;for(i=0;in;i+)printf(学号:%ldt姓名:%st平时成绩:%dt期末成绩:%dt总
22、评成绩:%dn,stui.num,stui.name,stui.score0,stui.score1,stui.score2);12)导出成绩函数/* 函数功能:将学生所有成绩的列表导出到文本score.txt中 */void Write_data(STU stu,int n)FILE *fp;int i;if(fp=fopen(score.txt,w)=NULL)printf(打开文件失败!n);exit(0);fprintf(fp,以下各项分别对应学号、姓名、平时成绩、期末成绩和总评成绩:n);for(i=0;in;i+)fprintf(fp,%ldt%st%dt%dt%dn,stui.n
23、um,stui.name,stui.score0,stui.score1,stui.score2);fclose (fp);3、系统实现31 全部实现代码#include #include #include #include #include #define SIZE 100typedef struct studentlong num;char name10;int score3;STU;int Menu(void);void Read_data(STU stu,int n,int a,int b);void Read_data1(STU stu,int n,int a,int b);void
24、 Total_mark(STU stu,int n,int a,int b);void Sortbynum(STU stu,int n);void Sortbyname(STU stu,int n);void Count_pass(STU stu,int n);void Count_average(STU stu,int n);void Show_data(STU stu,int n);void Write_data(STU stu,int n);int main()STU stuSIZE;int n,a,b;char ch;int oh;printf(tt*n);printf(ttt* 欢迎
25、使用 * n);printf(ttt* 学生试卷分数统计系统 * n);printf(tt*n);while (1)ch = Menu();switch (ch)case 1: printf(请输入学生人数n(n=%d):, SIZE);scanf(%d, &n);printf(请输入学生平时成绩与期末成绩所占总评成绩的的比例(用整数表示,满分100分):n); scanf(%d%d,&a,&b);printf(以下有两种输入试卷分数的方式:n*1.手动输入试卷分数t2.从student.txt文件中导入试卷分数*n);scanf(%d,&oh);switch (oh)case 1:Read_
26、data(stu,n,a,b);break;case 2:Read_data1(stu,n,a,b);break;default:printf(输入菜单序号错误!);break;case 2:Total_mark(stu,n,a,b);break;case 3:Sortbynum(stu,n);break;case 4:Sortbyname(stu,n);break;case 5: Count_pass(stu,n);break;case 6: Count_average(stu,n);break;case 7:Show_data(stu,n);break;case 8:Write_data(
27、stu,n);break;case 0:printf(tt*n);printf(ttt* 感谢使用 * n);printf(ttt* 学生试卷分数统计系统 * n);printf(tt*n);exit(0);default:printf(输入菜单序号错误!);return 0;/* 函数功能:显示菜单并获得用户键盘输入的选项 */int Menu(void)int itemSelected;printf(n【菜单】n);printf(1.输入记录n);printf(2.计算学生总评成绩n);printf(3.按学号查询成绩n);printf(4.按姓名查询成绩n);printf(5.计算学生及
28、格率和优秀率n);printf(6.计算学生平均分和标准差n);printf(7.成绩列表n);printf(8.导出文件n);printf(0.退出n);printf(请输入你的选择:);scanf(%d, &itemSelected); /* 读入用户输入 */return itemSelected;/* 函数功能:手动输入分数 */void Read_data(STU stu,int n,int a,int b)int i=0;printf(请输入学生的学号、姓名、平时成绩和期末成绩(逗号隔开):n);for(i=0;in;i+)scanf(%ld,%s,%d,%d,&stui.num,
29、&stui.name,&stui.score0,&stui.score1);stui.score2=stui.score0*a/100+stui.score1*b/100;/* 函数功能:从文本student.txt中导入试卷分数 */void Read_data1(STU stu,int n,int a,int b)int i;FILE *fp;if(fp=fopen(student.txt,r)=NULL)printf(打开文件student.txt失败!n);exit(0);for(i=0;!feof(fp);i+)fscanf(fp,%ld,&stui.num);fscanf(fp,%
30、s,stui.name);fscanf(fp,%d,&stui.score0);fscanf(fp,%d,&stui.score1);fclose(fp);for(i=0;in;i+)stui.score2=stui.score0*a/100+stui.score1*b/100;/* 函数功能:计算学生试卷分数的总评成绩 */void Total_mark(STU stu,int n,int a,int b)int i;for(i=0;in;i+)stui.score2=stui.score0*a/100+stui.score1*b/100;printf(学生:%ldt姓名:%st总评成绩:%
31、dn,stui.num,stui.name,stui.score2);/* 函数功能:按学号查询学生试卷的总评成绩 */void Sortbynum(STU stu,int n)int number,i;printf(请输入要查找的学生学号:);scanf(%d,&number);for(i=0;in;i+)if(stui.num=number)printf(学号:%ldt姓名:%st平时成绩:%dt期末成绩:%dt总评成绩:%dn,stui.num,stui.name,stui.score0,stui.score1,stui.score2);return;printf(抱歉,没有找到!n);
32、/* 函数功能:按姓名查询学生试卷的总评成绩 */void Sortbyname(STU stu,int n)char named10;int i;printf(请输入要查找的学生姓名:);scanf(%s,named); for(i=0;in;i+)if(strcmp(named,stui.name)=0)printf(学号:%ldt姓名:%st平时成绩:%dt期末成绩:%dt总评成绩:%dn,stui.num,stui.name,stui.score0,stui.score1,stui.score2);return;printf(抱歉,没有找到!n);/* 函数功能:计算全班学生总评成绩的
33、及格率和优秀率,并按优良中差输出学生人数 */void Count_pass(STU stu,int n)int i,pass_num,t4;float passrate;memset(t,0,sizeof(t);for(i=0;in;i+)if(stui.score260) t0+;else if(stui.score2=75) t1+;else if(stui.score2=85) t2+;else if(stui.score2=100) t3+;pass_num=t1+t2+t3;passrate=(float)(t1+t2+t3)/n;printf(及格人数:%dn,pass_num)
34、;printf(优:%dt良:%dt中:%dt差:%dn,t3,t2,t1,t0);printf(总评成绩及格率:%.2fn,passrate);printf(总评成绩优秀率:%.2fn,(float)t3/n);/* 函数功能:计算学生总评成绩的平均分和标准差 */void Count_average(STU stu,int n)int i;double sum=0,aver,temp=0,standard;for(i=0;in;i+)sum=stui.score2+sum;aver=(float)sum/n;for(i=0;in;i+)temp=(stui.score2-aver)*(stui.score2-aver)+temp;standard=sqrt(temp/n);printf(总评成绩平均分:%.2ft总评成绩标准差:%.2lfn,aver,standard);/* 函数功能:输出全班学生的所有成绩 */void Show_data(STU stu,int n)int i;for(i=0;in;i+)printf(学号:%ldt姓名:%st平时成