学生成绩管理系统课程设计报告书C语言.docx
《学生成绩管理系统课程设计报告书C语言.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统课程设计报告书C语言.docx(22页珍藏版)》请在冰点文库上搜索。
学生成绩管理系统课程设计报告书C语言
课程设计报告书
课程名称:
学院:
班级:
学号:
姓名:
指导老师:
设计时间:
学生成绩管理课程设计
1、设计题目
用C语言编写程序完成以下任务:
(1)能按学期、按班级完成对学生成绩的录入、修改
(2)能按班级统计学生的成绩,求学生的总分及平均分,并能根据学生的
平时成绩进行查询
(3)能查询学生成绩,不及格科目及学生名单
(4)能按班级输出学生的成绩单
二、设计要求
(1)贯彻结构化的程序设计思想。
(2)用户界面友好,功能明确,操作方便。
(3)用户界面中的菜单至少应包括“统计各班总分及平均分”、“平均成绩排
序”、“成绩单显示”和“退出”4项。
(4)代码应适当缩进,并给出必要的注释,以增强程序的可读性。
三、设计需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为十个模块,每一个模块对应一个函数。
在这些函数当中,按学期对学生信息查询函数、按班级对学生信息查询函数、按平均成绩排序函数、按班级显示学生成绩单函数、统计全部学生总分及平均分函数、按总成绩排序函数、统计成绩不及格学生信息函数、显示全部学生信息并统计人数函数的实现严格按照题目的要求。
读取文件函数对其它函数的实现起辅助作用,主函数及菜单函数控制程序的整体运行。
1.显示全部学生信息并统计人数这里要用到文件打开函数和文件读取数据函数,再加入人数的统计语句,以实现将文件内容显示到窗体并统计总人数。
2.统计全部学生总分及平均分这一步在第一项功能的基础上稍加改动,添加求学生总分和平均分的函数就可以实现预期的功能。
3.按学期对学生信息查询实现的功能是按照学期对学生的成绩和数据进行查询,要求输入正确学期实现该功能。
4.按班级对学生信息查询实现的功能是按照班级对学生的成绩和数据进行查询,要求输入正确班级实现该功能。
5.按总成绩排序该项为附加功能实现的是总成绩的递减排序以及名次显示,其中总成绩相同者名次相同。
6.按平均成绩排序按照题目的具体要求实现的是平均成绩的递减排序以及名次显示,其中平均成绩相同者名次相同。
7.统计成绩不及格学生信息该项即统计所有学生中各科中至少有一科不及格的学生的所有信息。
8.按班级显示学生成绩单该项即显示所有学生的基本信息及在总体中成绩排序信息。
除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序,这使整个程序更加完善。
每一个学生记录都包含学期、班级、学号、姓名,以及英语、计算机两门成绩,在程序当中将学生记录类型定义为结构体类型,函数每次对学生记录的访问,其数据来源都是file.txt文件,这样做保证学生数据的一致性,每次运行程序都可以采用原来的数据。
4、程序流程图
1.程序总体结构图
图1程序总体结构图
2.具体功能框图
(1)显示全部学生信息并统计学生人数函数
图2读取学生数据
(2)按平均分排序函数
图3按平均分排序
五、核心技术的实现说明及相应程序段
本程序主要由十个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其它函数来实现要求的所有功能。
在这些函数当中,按学期对学生信息查询、按班级对学生信息查询函数、按平均成绩排序函数、统计成绩不及格学生信息函数等是程序中较为核心的部分,下面分别进行说明。
1.按学期、班级对学生信息查询函数首先调用reads函数读取文件中的信息,利用for循环按照班级号循环查找,通过strcmp函数比较所查找学期、班级和已知学期、班级字符,利用if语句对所输入的待查找学期、班级与已知学期、班级字符进行判断,如果所查学期、班级字符不是已知,则显示无此学期、班级信息,在符合条件的情况下则输出该学期学生所有信息。
具体的程序段如下:
/*按学期对学生信息查询*/
voidxueqi()
{
structstudentstud[N];
charnumber[20];
inti,n;
n=reads(stud);
printf("\n请输入待查询的学生学期号,按回车键确认:
\n",number);
scanf("%s",number);
printf("***********************所查学生信息如下************************\n");
printf("学期班级学号姓名计算机英语总分平均分\n");
printf("***************************************************************\n");
for(i=0;i{
if(strcmp(number,stud[i].xq)!
=0)continue;
if(i>=n)
{printf("没有找到该学期信息!
\n");
return;
}
elseprintf("%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].computer+stud[i].english,(stud[i].computer+stud[i].english)/2);
}
}}}
/*按班级对学生信息查询*/
voidquery()
{
structstudentstud[N];
charnumber[20];
inti,n;
n=reads(stud);
printf("\n请输入待查询的学生班级号,按回车键确认:
\n",number);
scanf("%s",number);
printf("***************************所查学生信息如下**********************\n");
printf("班级学期学号姓名计算机英语总分平均分\n");
printf("*****************************************************************\n");
for(i=0;i{
if(strcmp(number,stud[i].cla)!
=0)continue;
if(i>=n)
{printf("没有找到该班级信息!
\n");return;}
else
printf("%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",stud[i].cla,stud[i].xq,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].computer+stud[i].english,(stud[i].computer+stud[i].english)/2);
}
}
2.按平均成绩排序函数
该函数的核心内容是求平均成绩并对所有人进行排序。
采用冒泡法对平均分进行排序,并记录对于总分的排序采用的排序算法是冒泡法排序,其中平均分的求得是在排序的过程中实现的,这部分程序仍然调用了reads函数,整个排序过程在结构体数组stud中实现,由于排序算法涉及到两个数组元素的信息交换,因此还需要定义一个中间变量来协助。
对于学生排序后名次的确定在结果输出时予以显示。
具体程序段如下:
/*按平均成绩排序*/
voidsort2()
{
structstudentstud[N],temp;
inti,j,n;
n=reads(stud);
for(i=0;ifor(j=0;j{
if((stud[j].english+stud[j].computer)/2<(stud[j+1].english+stud[j+1].computer)/2)
{
temp=stud[j];stud[j]=stud[j+1];stud[j+1]=temp;
}
}
j=1;
printf("***********************平均成绩排序结果如下*************************\n\n");
printf("名次学期班级学号姓名英语计算机平均成绩\n");
printf("***************************************************************************\n");
for(i=0;i{
if(stud[i].english+stud[i].computer==stud[i+1].english+stud[i+1].computer)
printf("%d\t%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\n",j,stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,(stud[i].computer+stud[i].english)/2);
else
printf("%d\t%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\n",j++,stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,(stud[i].computer+stud[i].english)/2);
}
getch();}
3.统计成绩不及格学生信息
该函数首先读取文件中的内容,通过循环将挑选出至少一科成绩不及格的学生的信息。
具体的程序段如下:
/*统计成绩不及格学生信息*/
voidbujige()
{
structstudentstud[N];
inti,n;
n=reads(stud);
printf("***************成绩不及格学生信息如下************\n\n");
printf("学期班级学号姓名计算机英语\n");
printf("**************************************************\n");
for(i=0;iif((stud[i].computer<60)||(stud[i].english<60))
printf("%s\t%s\t%s\t%s\t%3.1f\t%3.1f\n",stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english);
}
六、测试情况
七、课程设计总结
不觉之中C语言课程设计很快结束了,通过这一段时间的设计使我学到了许多,以前对C语言的认识比较肤浅,不过在不断尝试中我知道能利用C语言解决比较复杂的问题,也对许多函数有了很深的认识。
通过我的努力以及遇到不会的问题主动向老师请教和向同学们探讨,我顺利的完成了这次语言课程设计,感到要想对一门课程了解深刻就必须亲自身入其中的去体验,这样才能发现自己的很多缺点,才能一一的去克服,也才能真正的学到知识,也明白了那句“纸上谈来终觉浅,深知此是要躬行”的真正意义。
纵然把结论书本背得滚瓜烂熟而不运用与实际,也不过是纸上谈兵罢了,终究在未来需要动手能力和实践人才的社会竞争中被淘汰,所以我们需要实际的操作,需要更多的实践训练,这样才能成为真正的二十一世纪合格的大学生!
八、源程序代码
#include
#include
#include
#include
#defineN25
structstudent
{
charcla[10];
charxq[10];
charnum[20];
charname[10];
floatcomputer;
floatenglish;
floatsum,aver;
}
stud[N];
voidmenu();
voidsort();
voidprintll();
intreads(structstudentstu[N]);
voidsort1();
voidsort2();
voidxueqi();
voidquery();
voidbujige();
voidcjdan();
voidmain()
{
intc;
while
(1)
{
menu();
printf("\n请输入您要选择的操作序号,按回车键确认:
");
scanf("%d",&c);
if(c>8||c<1)
printf("------对不起,没有此项功能-----!
\n");
switch(c)
{
case1:
printll();break;
case2:
sort();break;
case3:
xueqi();break;
case4:
query();break;
case5:
sort1();break;
case6:
sort2();break;
case7:
bujige();break;
case8:
cjdan();break;
case9:
exit(0);
}
}
}
voidmenu()
{
printf("*******************************************************\n");
printf("*******************************************************\n");
printf("※☆欢迎光临☆※\n");
printf("\n");
printf("★★成绩统计系统★★\n");
printf("\n");
printf("★1.显示全部学生信息并统计人数\n");
printf("\n");
printf("★2.统计全部学生总分及平均分\n");
printf("\n");
printf("★3.按学期对学生信息查询\n");
printf("\n");
printf("★4.按班级对学生信息查询\n");
printf("\n");
printf("★5.按总成绩排序\n");
printf("\n");
printf("★6.按平均成绩排序\n");
printf("\n");
printf("★7.统计成绩不及格学生信息\n");
printf("\n");
printf("★8.按班级显示学生成绩单\n");
printf("\n");
printf("★9.退出\n");
printf("\n");
printf("*******************************************************\n");
printf("*******************************************************\n");
}
intreads(structstudentstud[N])//读取文件中的内容
{
FILE*fp;
inti=0;
if((fp=fopen("e:
\\file04.txt","r"))==NULL)
{
printf("文件打开失败!
\n");
return0;
}
else
{
for(i=0;!
feof(fp);i++)
fscanf(fp,"%s\t%s\t%s\t%s\t%f\t%f\n",stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,&stud[i].computer,&stud[i].english);}
fclose(fp);
returni;
}
voidprintll()/*读取D盘文件并打印全部,统计总人数*/
{
FILE*fp;
intnumber=0,i,n=20;
if((fp=fopen("E:
\\file04.txt","r"))==NULL)
{
printf("无法打开文件\n");
}
printf("*********************所有的学生信息如下*********************\n");
printf("学期班级学号姓名计算机英语\n");
printf("************************************************************\n");
for(i=0;i{
fscanf(fp,"%s\t%s\t%s\t%s\t%f\t%f\n",stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,&stud[i].computer,&stud[i].english);
printf("%s\t%s\t%s\t%s\t%f\t%f\n",stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english);
number++;
if(feof(fp))
break;
}
printf("学生总人数为:
%d\n",number);
fclose(fp);
}
voidsort()/*统计全部学生总分及平均分*/
{
structstudentstud[N];
inti,n;
n=reads(stud);
printf("***************************全部学生信息如下***************\n");
printf("班级学号姓名计算机英语总分平均分\n");
printf("**********************************************************\n");
printf("**********************************************************\n");
for(i=0;i{
stud[i].sum=stud[i].computer+stud[i].english;
stud[i].aver=(stud[i].computer+stud[i].english)/2;
printf("%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].sum,stud[i].aver);
}
getch();
}
voidxueqi()/*按学期对学生信息查询*/
{
structstudentstud[N];
charnumber[20];
inti,n;
n=reads(stud);
printf("\n请输入待查询的学生学期号,按回车键确认:
\n",number);
scanf("%s",number);
printf("***********************所查学生信息如下************************\n");
printf("学期班级学号姓名计算机英语总分平均分\n");
printf("***************************************************************\n");
for(i=0;i{
if(strcmp(number,stud[i].xq)!
=0)continue;
if(i>=n)
{printf("没有找到该学期信息!
\n");
return;
}
else
printf("%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",stud[i].xq,stud[i].cla,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].computer+stud[i].english,(stud[i].computer+stud[i].english)/2);
}
}
voidquery()/*按班级对学生信息查询*/
{
structstudentstud[N];
charnumber[20];
inti,n;
n=reads(stud);
printf("\n请输入待查询的学生班级号,按回车键确认:
\n",number);
scanf("%s",number);
printf("***************************所查学生信息如下**********************\n");
printf("班级学期学号姓名计算机英语总分平均分\n");
printf("*****************************************************************\n");
for(i=0;i{
if(strcmp(number,stud[i].cla)!
=0)continue;
if(i>=n)
{printf("没有找到该班级信息!
\n");return;}
else
printf("%s\t%s\t%s\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",stud[i].cla,stud[i].xq,stud[i].num,stud[i].name,stud[i].computer,stud[i].english,stud[i].computer+stud[i].english,(stud[i].computer+stud[i].english)/2);
}
}
voidsort1()/*按总成绩排序*/
{
struct