C语言实训报告学生成绩管理系统文件实现.docx
《C语言实训报告学生成绩管理系统文件实现.docx》由会员分享,可在线阅读,更多相关《C语言实训报告学生成绩管理系统文件实现.docx(29页珍藏版)》请在冰豆网上搜索。
C语言实训报告学生成绩管理系统文件实现
实训报告
C语言程序设计
题目:
学生成绩管理系统
院系:
专业:
姓名:
学号:
指导教师:
日期:
2017年9月9日
1问题定义……………………………………………………………………………………1
2系统设计……………………………………………………………………………………1
2.1总体设计………………………………………………………………………………1
2.2函数预览………………………………………………………………………………2
3系统实现……………………………………………………………………………………3
3.1功能模块………………………………………………………………………………3
3.2全部代码………………………………………………………………………………12
4系统维护……………………………………………………………………………………19
4.1调试和测试……………………………………………………………………………19
5归纳总结……………………………………………………………………………………19
5.1开发经验………………………………………………………………………………20
5.2实训中遇到的问题及解决方法………………………………………………………20
5.3设计中的不足之处……………………………………………………………………20
5.4感想和心得体会………………………………………………………………………20
6参考资料……………………………………………………………………………………20
前言
课程设计环节是应用型本科院校非常重要的一个教学环节,是学完一门课后应用本课知识及以前的知识积累而进行的综合性、开放性的训练。
通过课程设计,不仅能够使学生得到系统的技能训练,巩固和加强所学得专业理论知识,而且能够培养学生工程意识、创新能力、团队精神等综合素质,培养学生的设计能力和解决实际问题的能力。
C语言由于其强大的功能,丰富的表达能力,高效的代码,良好的移植性和灵活性,自1972年问世以来,经久不衰,即使现在出现了面向对象的程序设计方法和开发工具,但它仍然是人们学习程序设计的首选语言,用它训练和提高编程技术,以及开发应用程序等。
我们通过《C语言程序设计》这门课程的学习,已经能编写解决小问题的程序,对程序的开发也有了初步的认识,还掌握了C语言的基本语法,这一过程确确实实令我们感到欣喜,有点计算机可以完成自我任务的成就感。
但是,对于程序设计而言,学习C的步伐不应该停留于此。
我们最终的目的应该是掌握开发大型综合程序的方法,即遵循软件工程的开发步骤和结构化程序设计思想,用C语言开发出解决复杂问题的大型综合程序。
可是对于多数学生来说,学习了C语言后,除了应付各种考试之外,别无它用,对TurboC语言丰富的函数知之甚少,加上DOS环境所限,因而对C语言兴趣不大,也感到C语言比较难以掌握。
本实训就是为了让学生在学完C语言后进一步了解C语言的知识,掌握C语言在软件开发方面的使用方法,希望通过此次实训,不仅能提高学生学习C语言的兴趣,更为今后学习其它专业知识及开发程序打下坚实的基础。
本指导书中有些内容借鉴了互联网上相关程序的设计思想,在此对相关者表示衷心的感谢。
由于时间、经验及水平的原因,不当、不足之处,请大家提出宝贵意见。
编者
桂林电子科技大学信息科技学院
学生成绩管理系统
本题目设计目的是训练学生的基本编程能力,了解管理学生成绩信息系统的设计开发流程,熟悉C语言的文件各种基本实现和操作。
本程序中涉及结构体、文件读写、宏等方面的知识。
通过本程序的训练和制作,使学生能对C语言的文件操作等方面有一个更深刻的了解,掌握利用结构体存储实现对学生成绩管理的原理,为进一步开发出高质量的管理信息系统以及之后的其他编程方面知识的学习和理解打下坚实的基础。
1、问题定义
创建一个学生成绩管理系统。
假设系统中每个学生记录只包括学号、姓名、平时成绩、期末成绩、总评成绩、总分、平均分、名次等信息。
程序的运行效果如上图图所示,选择任意菜单后,实现相应功能。
具体结构体设定请见以后。
程序初始主界面截图如下:
在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。
2、系统设计
2.1总体设计
本管理系统的程序主要由C语言编写,考虑到各方面的维护和需求实现考虑,程序代码总体上采用模块化编程方式设计以及编写。
即将一个大的功能需求分作几个小模块来配合实现,为了降低添加和维护功能和需求的成本和时间。
尽量不依赖于C语言全局变量而是通过函数调用之间的参数来传递数据。
以下是本管理系统的功能模块:
2.2函数预览
1)主函数
调用其他不同功能
2)主菜单函数
输出显示界面
3)新建信息函数1(手写输入)
手动输入学生的成绩信息,包括学号、姓名、平时成绩、总评成绩
4)新建信息函数2(文件输入)
通过文件导入学生成绩信息
5)计算成绩函数
计算学生试卷分数的总评成绩
6)查询成绩函数1(按学号)
按学号查询学生试卷的总评成绩
7)查询成绩函数2(按姓名)
按学号查询学生试卷的总评成绩
8)计算成绩函数1(计算总成绩的及格率和优秀率)
计算全班学生总评成绩的及格率和优秀率,并按优良中差输出学生人数
9)计算成绩函数2(计算总成绩的平均分和标准差)
计算学生总评成绩的平均分和标准差
10)输出成绩函数
输出全班学生的所有成绩,包括学号、姓名、总评成绩
11)导出成绩函数
将学生所有成绩的列表导出到文本score.txt中
3、系统实现
3.1功能模快(附代码)
1)
主函数
1)输入限定
2)主菜单函数
/*函数功能:
显示菜单并获得用户键盘输入的选项*/
intMenu(void){
intitemSelected;
printf("\n【菜单】\n");
printf("1.输入记录\n");
printf("2.计算学生总评成绩\n");
printf("3.按学号查询成绩\n");
printf("4.按姓名查询成绩\n");
printf("5.计算学生及格率和优秀率\n");
printf("6.计算学生平均分和标准差\n");
printf("7.成绩列表\n");
printf("8.导出文件\n");
printf("0.退出\n");
printf("请输入你的选择:
");
scanf("%d",&itemSelected);/*读入用户输入*/
returnitemSelected;
}
3)限定功能模块
限定(或者说确定)学生的人数和总评成绩的计算方式
printf("请输入学生人数n(n<=%d):
",SIZE);
scanf("%d",&n);
printf("请输入学生平时成绩与期末成绩所占总评成绩的的比例(用整数表示,满分100分):
\n");
scanf("%d%d",&a,&b);
4)新建成绩函数1(手动输入)
/*函数功能:
手动输入分数*/
voidRead_data(STUstu[],intn,inta,intb)
{
inti=0;
printf("请输入学生的学号、姓名、平时成绩和期末成绩(逗号隔开):
\n");
for(i=0;i{
scanf("%ld,%s,%d,%d",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1]);
stu[i].score[2]=stu[i].score[0]*a/100+stu[i].score[1]*b/100;
}
}
0
5)新建成绩函数2(文件输入)
/*函数功能:
从文本student.txt中导入试卷分数*/
voidRead_data1(STUstu[],intn,inta,intb)
{
inti;
FILE*fp;
if((fp=fopen("student.txt","r"))==NULL)
{
printf("打开文件student.txt失败!
\n");
exit(0);
}
for(i=0;!
feof(fp);i++)
{
fscanf(fp,"%ld",&stu[i].num);
fscanf(fp,"%s",stu[i].name);
fscanf(fp,"%d",&stu[i].score[0]);
fscanf(fp,"%d",&stu[i].score[1]);
}
fclose(fp);
for(i=0;istu[i].score[2]=stu[i].score[0]*a/100+stu[i].score[1]*b/100;
}
}
6)计算成绩及输出函数
/*函数功能:
计算学生试卷分数的总评成绩*/
voidTotal_mark(STUstu[],intn,inta,intb)
{
inti;
for(i=0;i{
stu[i].score[2]=stu[i].score[0]*a/100+stu[i].score[1]*b/100;
printf("学生:
%ld\t姓名:
%s\t总评成绩:
%d\n",stu[i].num,stu[i].name,stu[i].score[2]);
}
}
7)查询成绩函数1(按学号)
8)查询成绩函数2(按姓名)
/*函数功能:
按姓名查询学生试卷的总评成绩*/
voidSortbyname(STUstu[],intn)
{
charnamed[10];
inti;
printf("请输入要查找的学生姓名:
");
scanf("%s",named);
for(i=0;i{
if(strcmp(named,stu[i].name)==0)
{
printf("学号:
%ld\t姓名:
%s\t平时成绩:
%d\t期末成绩:
%d\t总评成绩:
%d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
return;
}
}
printf("抱歉,没有找到!
\n");
}
9)计算成绩函数1(计算总成绩的及格率和优秀率)
/*函数功能:
计算全班学生总评成绩的及格率和优秀率,并按优良中差输出学生人数*/
voidCount_pass(STUstu[],intn)
{
inti,pass_num,t[4];
floatpassrate;
memset(t,0,sizeof(t));
for(i=0;i{
if(stu[i].score[2]<60)t[0]++;
elseif(stu[i].score[2]<=75)t[1]++;
elseif(stu[i].score[2]<=85)t[2]++;
elseif(stu[i].score[2]<=100)t[3]++;
pass_num=t[1]+t[2]+t[3];
passrate=(float)(t[1]+t[2]+t[3])/n;
printf("及格人数:
%d\n",pass_num);
printf("优:
%d\t良:
%d\t中:
%d\t差:
%d\n",t[3],t[2],t[1],t[0]);
printf("总评成绩及格率:
%.2f\n",passrate);
printf("总评成绩优秀率:
%.2f\n",(float)t[3]/n);
}
}
10)计算成绩函数2(计算总成绩的平均分和标准差)
/*函数功能:
计算学生总评成绩的平均分和标准差*/
voidCount_average(STUstu[],intn){
inti;
doublesum=0,aver,temp=0,standard;
for(i=0;i{
sum=stu[i].score[2]+sum;
}
aver=(float)sum/n;
for(i=0;i{
temp=(stu[i].score[2]-aver)*(stu[i].score[2]-aver)+temp;
}
standard=sqrt(temp/n);
printf("总评成绩平均分:
%.2f\t总评成绩标准差:
%.2lf\n",aver,standard);
}
11)输出成绩函数
/*函数功能:
输出全班学生的所有成绩*/
voidShow_data(STUstu[],intn)
{
inti;
for(i=0;i{
printf("学号:
%ld\t姓名:
%s\t平时成绩:
%d\t期末成绩:
%d\t总评成绩:
%d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
}
12)导出成绩函数
/*函数功能:
将学生所有成绩的列表导出到文本score.txt中*/
voidWrite_data(STUstu[],intn)
{
FILE*fp;
inti;
if((fp=fopen("score.txt","w"))==NULL)
{
printf("打开文件失败!
\n");
exit(0);
}
fprintf(fp,"以下各项分别对应学号、姓名、平时成绩、期末成绩和总评成绩:
\n");
for(i=0;i{
fprintf(fp,"%ld\t%s\t%d\t%d\t%d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
fclose(fp);
}
3、系统实现
3.1全部实现代码
#include
#include
#include
#include
#include
#defineSIZE100
typedefstructstudent{
longnum;
charname[10];
intscore[3];
}STU;
intMenu(void);
voidRead_data(STUstu[],intn,inta,intb);
voidRead_data1(STUstu[],intn,inta,intb);
voidTotal_mark(STUstu[],intn,inta,intb);
voidSortbynum(STUstu[],intn);
voidSortbyname(STUstu[],intn);
voidCount_pass(STUstu[],intn);
voidCount_average(STUstu[],intn);
voidShow_data(STUstu[],intn);
voidWrite_data(STUstu[],intn);
intmain(){
STUstu[SIZE];
intn,a,b;
charch;
intoh;
printf("\t\t********************************************\n");
printf("\t\t\t*欢迎使用*\n");
printf("\t\t\t*学生试卷分数统计系统*\n");
printf("\t\t********************************************\n");
while
(1)
{
ch=Menu();
switch(ch)
{
case1:
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)
{
case1:
Read_data(stu,n,a,b);
break;
case2:
Read_data1(stu,n,a,b);
break;
default:
printf("输入菜单序号错误!
");
}
break;
case2:
Total_mark(stu,n,a,b);
break;
case3:
Sortbynum(stu,n);
break;
case4:
Sortbyname(stu,n);
break;
case5:
Count_pass(stu,n);
break;
case6:
Count_average(stu,n);
break;
case7:
Show_data(stu,n);
break;
case8:
Write_data(stu,n);
break;
case0:
printf("\t\t********************************************\n");
printf("\t\t\t*感谢使用*\n");
printf("\t\t\t*学生试卷分数统计系统*\n");
printf("\t\t********************************************\n");
exit(0);
default:
printf("输入菜单序号错误!
");
}
}
return0;
}
/*函数功能:
显示菜单并获得用户键盘输入的选项*/
intMenu(void){
intitemSelected;
printf("\n【菜单】\n");
printf("1.输入记录\n");
printf("2.计算学生总评成绩\n");
printf("3.按学号查询成绩\n");
printf("4.按姓名查询成绩\n");
printf("5.计算学生及格率和优秀率\n");
printf("6.计算学生平均分和标准差\n");
printf("7.成绩列表\n");
printf("8.导出文件\n");
printf("0.退出\n");
printf("请输入你的选择:
");
scanf("%d",&itemSelected);/*读入用户输入*/
returnitemSelected;
}
/*函数功能:
手动输入分数*/
voidRead_data(STUstu[],intn,inta,intb)
{
inti=0;
printf("请输入学生的学号、姓名、平时成绩和期末成绩(逗号隔开):
\n");
for(i=0;i{
scanf("%ld,%s,%d,%d",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1]);
stu[i].score[2]=stu[i].score[0]*a/100+stu[i].score[1]*b/100;
}
}
/*函数功能:
从文本student.txt中导入试卷分数*/
voidRead_data1(STUstu[],intn,inta,intb)
{
inti;
FILE*fp;
if((fp=fopen("student.txt","r"))==NULL)
{
printf("打开文件student.txt失败!
\n");
exit(0);
}
for(i=0;!
feof(fp);i++)
{
fscanf(fp,"%ld",&stu[i].num);
fscanf(fp,"%s",stu[i].name);
fscanf(fp,"%d",&stu[i].score[0]);
fscanf(fp,"%d",&stu[i].score[1]);
}
fclose(fp);
for(i=0;istu[i].score[2]=stu[i].score[0]*a/100+stu[i].score[1]*b/100;
}
}
/*函数功能:
计算学生试卷分数的总评成绩*/
voidTotal_mark(STUstu[],intn,inta,intb)
{
inti;
for(i=0;i{
stu[i].score[2]=stu[i].score[0]*a/100+stu[i].score[1]*b/100;
printf("学生:
%ld\t姓名:
%s\t总评成绩:
%d\n",stu[i].num,stu[i].name,stu[i].score[2]);
}
}
/*函数功能:
按学号查询学生试卷的总评成绩*/
voidSortbynum(STUstu[],intn)
{
intnumber,i;
printf("请输入要查找的学生学号:
");
scanf("%d",&number);
for(i=0;i{
if(stu[i].num==number)
{
printf("学号:
%ld\t姓名:
%s\t平时成绩:
%d\t期末成绩:
%d\t总评成绩:
%d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
return;
}
}
printf("抱歉,没有找到!
\n");
}
/*