学生成绩管理系统1.docx
《学生成绩管理系统1.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统1.docx(38页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统1
学生成绩管理系统
(1)
2.2数据需求1
3.2录入函数功能设计3
3.3查找函数功能设计4
3.4统计函数功能设计5
3.5添加函数功能设计6
3.6更新函数功能设计7
3.7执行流程介绍设计8
4.调试与测试8
4.1调试9
4.2测试10
5.结论10
结束语10
参考文献10
附录1-用户手册11
附录2-源程序17
摘要
随着科学教育事业的发展,学生成绩管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生成绩管理系统应该能够为用户提供充足的信息和快捷的查询手段。
但一直以来人们使用传统人工的方式管理文件档案,这种管理方式存在着许多缺点。
随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
关键词:
学习成绩查询;管理;C语言
1.绪论
随着科技的发展,愈来愈多的学校选择了运用学生成绩管理系统来管理学生的各项信息。
学生成绩管理系统是一个学校不可缺少的部分,学校可以利用这套程序进行学生成绩的各种信息管理,也方便查询修改成绩的各项信息,可以提高管理工作的效率和简化管理工作的程序。
有利的为学校节省了运作成本,优化资源利用率,这也正是编写本程序的目的所在。
根据课程设计任务书要求,本系统开发主要完成以下功能和性能。
1.录入学生数据信息(不用考虑学期),学生信息至少包括姓名、学号、数学成绩三方面,学生信息应及时保存在文件中;
2.根据学号查询某生成绩;
3.插入新的学生数据信息。
2.系统分析
2.1功能需求
本系统主要是学校对学生成绩管理的系统。
该系统需要有录入信息,删除信息,根据所给条件查询信息,修改信息,统计信息,循环显示主菜单,保存信息的功能,并且利用显示函数将学生的所有信息显示出来。
2.2数据需求
需要向系统输入学号,姓名,数学成绩等信息。
2.3性能需求
在运行本程序时只要按照正确的操作方法不会出现无法运行的情况,系统稳定性好,安全,可靠。
3.总体设计
3.1系统功能模块描述
图3-1学生成绩管理系统模块图
3.2录入函数功能设计
首先会给定一个要输入的人数界限,根据自己要输入的人数进行输入,系统会提示你输入学生的信息,其中包括姓名、性别、各科目的分数,系统会自动生成一个有序数列,即学号。
其执行流程图如下所示:
否
是
图3-2录入函数设计
3.3查找函数功能设计
查找函数有两种查找方法,分别为按姓名和学号查找,当输入为flag=1时,系统会提示按照姓名查找,当输入为flag=2时,系统则提示按照学号查找,其流程图为:
Flag=1Flag=2
不不
存正
在确
存在正确
图3-3查找函数设计
3.4统计函数功能设计
统计函数会统计各科目的最高分、最低分以及平均分的统计,并且按照操作进行科目统计。
会有4中选择,当flag=1时,对数学进行统计;当flag=2时,对英语进行统计,当flag=3时,对c成绩进行统计,当flag=4时,统计函数功能结束。
跳出循环。
如图3-4所示:
Flag=4
Flag=1
flag=3
flag=2
图3-4统计函数设计
3.5添加函数功能设计
添加函数主要是对额外的学生记录进行添加,同前面一样,也是对其信息的输入,并且输入完成之后,再对学生成绩进行排序和统计,如图所示
Flag=Yflag=N
图3-5添加函数设计
3.6更新函数功能设计
更新函数包含了两个子函数,分别是修改和删除两项,修改主要是修改录入函数里面错误的内容,而删除主要是删除一些不必要的学生信息,其功能流程如图3-6所示
Flag=1Flag=2
Flag=YFlag=Y
Flag=NFlag=N
图3-6更新函数设计
3.7执行流程介绍
主要是主函数调用子函数来进行操作和子函数相互之间的调用来完成执行,如图:
否
是
图3-7流程执行图
4.调试与测试
4.1调试
调试是软件开发过程中的一个重要环节,也是最复杂,对软件开发者者来说也是最艰巨的任务。
调试的任务是及时改正测试过程中发现的软件错误。
具体地说,调试过程由两个步骤组成,它从表示程序中存在错误的某迹象开始,首先确定错误的准确位置,也就是找出哪个模块或哪个语句引起的错误。
然后仔细研究推断代码以确定问题的原因,并设法改正。
调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。
本系统调试过程中遇到问题、原因和解决方法如下面介绍。
(1)程序不能运行
定义的指针,很多次引用,过个函数里面,定义的不明确,造成错误连连发生。
(2)不能正确输出信息,有乱码现象
原因是键入信息的时候,没有一一对应,逗号的位置不正确,后来,用的是信息逐一输入,保证了信息的一一对应和高度的准确性,使程序可以正常运行。
(3)程序运行途中,出现错误,被迫中止
其中定义字符数组,却没有定义长度,导致定义类型变成了字符型,而不能接受字符串,因此出现了错误。
4.2测试
软件测试是软件生存期中的一个重要阶段,是软件质量保证的关键步骤从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。
或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。
过度测试则会浪费许多宝贵的资源。
到测试后期,即使找到了错误,然而付出了过高的代价。
测试数据过程如下。
当职工信息管理程序已经具备录入,利用显示函数将职工所有信息显示,删除,修改,按指定条件查询,统计,查询,保存信息,循环显示主菜单功能时,现在测试系统是否能够正确显示系统内部所有的职工信息,当系统中已存入一定的职工信息当执行显示功能时,系统会将内部职工信息全部列出,当系统中未存入任何职工的信息时执行显示职工系统内部信息,系统会提示“listnull!
”。
创建一条职工信息:
工号:
1姓名:
marry性别:
F年龄:
21学历:
U工资:
2458联系电话:
48425678
则输出如下:
theworker'sinformation:
Nonamesexage学历paytelephone
1hahaF21U245848425678
5.结论
课程设计顺利完成,题目所要求的功能也都一一实现,可以对职工信息进行添加,修改,删除,查询,模糊查询,按条件查询,存储至文本文件等,在通常情况下,可以良好的运作。
不过这个程序还有些不够完善,例如有时候,输出的结果会因为字符的长短,与上面的提示栏对不上。
而且,由于自己英语的不够特别好,后几个功能不知道该怎么翻译,就直接写的汉字,显得程序主菜单有点乱,以后会加强英语,好好规划编程。
结束语
为期两个礼拜的的软件综合课程设计实习终于顺利完成,在这期间,我学到了很多课堂上学不到的东西,而且,将所学付之于实践,理论联系实际,是令我很兴奋的,但同时也感觉到了难度。
对C语言,有了更深一步的了解,并且培养出了良好的思考方式,对于编程。
虽然困难很多,问题出现的也很多,但好在,顺利完成任务了,很有成就感。
.
参考文献
[1]谭浩强.C语言程序设计(第三版).北京:
清华大学出版社,2005.7
附录1-用户手册
主菜单测试
进入系统后,主函数调用menu函数,显示主菜单,并提示用户根据屏幕输入选择。
截图如下图4-1所示:
图4-1主菜单测试
4.2录入功能测试
主函数调用此函数后,屏幕依次提示用户输入人数,姓名、性别、计算机分数、数学分数和英语分数信息,截图如下图4-2所示:
图4-2录入功能测试
4.3浏览功能测试
进入此功能后屏幕显示菜单,提示用户根据需要输入选择。
并观看全部信息。
截图如下图4-3所示:
图4-3浏览功能测试
4.4查找功能测试
4.4.1按姓名查找
按屏幕提示输入所要查找的姓名,如有符合条件的信息记录,则全部显示出来。
截图如下图4-4所示:
图4-4按姓名查找测试
4.4.2按学号查找
按屏幕提示输入所要查找的学号,有符合的学生则显示此学生信息。
截图如下图5-4所示:
图4-4按学号查找测试
4.5排序功能测试
按屏幕操作对学生记录进行排序。
截图如下图4-5所示:
图4-5排序功能测试
4.6统计功能测试
按操作对学生的各们科目的最大,和最小以及平均分进行统计,截图如下图4-6所示:
图4-6统计功能测试
4.7更新功能测试
4.7.1修改功能测试
根据输入的学号找到指定的信息记录,然后可以选择修改的项。
如下图4-7所示:
图4-7修改功能测试
4.7.2删除功能测试
根据指定的学号找到相应的信息记录,进行删除的操作。
截图如下图4-7所示:
图4-7删除功能测试
4.8添加功能测试
添加若干各学生的信息,同样包括他的名字,性别,学号及各科目分数。
截图如下4-8:
图4-8添加功能测试
附录2-源程序
#include
#include"string.h"
#include"time.h"
#include"stdlib.h"
intmenu();
voidsave();
voidincre();
voidload();
voidluru();
intchazhao();
voidliulan();
voidtianjia();
voidpaixu();
voidtongji();
voidshanchu_xiugai();
#defineN50
intcout[10];
intK;//定义全局变量
structstudent//定义结构体变量student
{
charname[20];
charsex[N];
intid;
floatscore[3];
floatsum;
}stu[N],stu1;
intmenu()//菜单函数
{
inti,flag;
system("cls");//运行前清屏
for(i=0;i<80;i++)
printf("*");
printf("\n----------------学习信息管理系统----------------\n");
printf("\t|1.录入学生信息|\t\t\t|2.浏览学生信息|\n");
printf("\t|3.查找学生信息|\t\t\t|4.对学生信息排序|\n");
printf("\t|5.统计学生信息|\t\t\t|6.添加学生信息|\n");
printf("\t|7.更新学生信息|\t\t\t|8.退出程序|\n");
printf("\n----------------------------------------\n");
for(i=0;i<80;i++)
printf("*");
printf("\n\t输入选择类型1--8:
");
scanf("%d",&flag);
returnflag;
}
voidsave()
{
FILE*fp;
if((fp=fopen("c:
\\student","wb"))==NULL)
{
printf("Cannotopenthefile!
\n");
exit(0);
}
fputc(K,fp);
for(inti=0;iif(fwrite(&stu[i],sizeof(structstudent),1,fp)!
=1)
{
printf("Filecannotbesaved!
\n");
exit(0);
}
fclose(fp);
}
voidincre()
{
FILE*fp;
if((fp=fopen("c:
\\student","ab"))==NULL)
{
printf("Cannotopenthefile!
\n");
exit(0);
}
if(fwrite(&stu[K],sizeof(structstudent),1,fp)!
=1)
{
printf("Filecannotbesaved!
\n");
exit(0);
}
fclose(fp);
}
voidload()
{
FILE*fp;
if((fp=fopen("c:
\\student","rb"))==NULL)
{
printf("Cannotopenthefile!
\n");
exit(0);
}
K=fgetc(fp);
for(inti=0;iif(fread(&stu[i],sizeof(structstudent),1,fp)!
=1)
{
printf("Filecannotbesaved!
\n");
exit(0);
}
fclose(fp);
}
voidluru()//录入函数
{
inti,j;
intm,x,num;
system("cls");
printf("请输入要录入的学生人数,在(1-50)之间:
");
while
(1)
{
scanf("%d",&num);//用来控制需要录入学生的数目(用当循环是为了保证需要录入的学生数合法(1-100))
if(1<=num&&num<=50)
break;
else
printf("\t请重新输入人数(1-50):
");
}
for(i=K;i{
printf("\t请输入学生信息:
");
printf("\n\tName%d:
",i+1);
scanf("%s",stu[i].name);//输入姓名
srand((long)time(NULL));//提供不重复的seed
while
(1)//保证产生的随机数不重复
{
m=0;
x=rand()%10000+2010000;//控制随机数产生的范围
for(j=0;j
if(stu[j].id==x)
{
m=1;
break;
}
if(m==0)
break;
}
stu[i].id=x;
printf("\tID:
%ld\n",x);//输出产生的随机数
printf("\tSex:
");
scanf("%s",stu[i].sex);//输入性别
stu[i].sum=0;
printf("\t数学:
");
scanf("%f",&stu[i].score[0]);//输入分数
printf("\t英语:
");
scanf("%f",&stu[i].score[1]);
printf("\tc:
");
scanf("%f",&stu[i].score[2]);
for(j=0;j<3;j++)//求出学生的总成绩
{
stu[i].sum+=stu[i].score[j];
}
}
K+=num;//这样是为了达到重复批量录入的效果
save();
liulan();
system("pause");
}
voidliulan()//浏览函数
{
inti,j;
load();
printf("-------------------------------------------------------------------------\n");
printf("姓名\t性别\t学号\t\t数学\t\t英语\t\tC语言\t总和\n");
for(i=0;i{
printf("\n%s\t%s\t%d",stu[i].name,stu[i].sex,stu[i].id);//打印学生的信息
for(j=0;j<3;j++)
printf("\t\t%.f",stu[i].score[j]);
printf("\t%.f\n",stu[i].sum);
}
printf("-------------------------------------------------------------------------\n");
system("pause>null");
}
intchazhao()//查找函数
{
load();
charname[20];
inti,j=0,k,x=0,flag;
longnumber;
printf("\t你能够根据学生姓名或者学号来查找信息:
1.名字,2,学号:
");
scanf("%d",&flag);
if(flag==1)//当key==1时按name查找给学生
{
printf("\t请输入学生名字:
");
scanf("%s",name);
for(j=0,i=0;iif(strcmp(name,stu[i].name)==0)
{
cout[j++]=i;
x=1;
}
}
elseif(flag==2)
{
printf("\t请输入学生学号:
");
scanf("%ld",&number);
for(j=0,i=0;iif(stu[i].id==number)
{
cout[j++]=i;
x=1;
}
}
else
x=2;
if(x==1)//当x=1时表示查找到学生
{
printf("该学生的信息为:
\n");
for(i=0;i{
printf("姓名\t性别\t学号\t\t数学\t英语\tC语言\t总和\n",cout[i]+1);
printf("%s%s%ld",stu[cout[i]].name,stu[cout[i]].sex,stu[cout[i]].id);
for(k=0;k<3;k++)
printf("\t%.f",stu[cout[i]].score[k]);
printf("%.f\n",stu[cout[i]].sum);
}
}
elseif(x==0)
printf("\t\t对不起没有找到您需要的学生信息!
\n");
else
{
printf("\t请输入(1-2)!
\n");
j=chazhao();
}
system("pause>null");
returnj;
}
voidpaixu()//排序函数
{
load();
inti,j;
for(i=0;i{
for(j=0;j{
if(stu[j].sum{
stu1=stu[j];
stu[j]=stu[j+1];
stu[j+1]=stu1;
}
}
}
save();
printf("\t按总分排序成功!
\n");
liulan();//排序成功后自动调用浏览函数将排序结果输出
}
voidtongji()//统计函数
{
load();
inti,flag;
floatmax,min,average,sum;
printf("\t1.英语\t\t2.数学\t\t3.C\t4.back.\n");
floatnum1,num2,num3,num4,num5;//用来统计各分数段学生的数目
while
(1)
{
num1=num2=num3=num4=num5=0;//注意赋初值0应该放在当循环里面
printf("\t\t请选择要统计科目:
(1-4):
");
scanf("%d",&flag);//用来选择所需要统计分数段的科目
if(1<=flag&&flag<=3)
{
sum=0;
for(i=0;i{
if(90<=stu[i].score[flag-1]&&stu[i].score[flag-1]<=100)
num1++;
elseif(80<=stu[i].score[flag-1])
num2++;
elseif(70<=stu[i].score[flag-1])
num3++;
elseif(60<=stu[i].score[flag-1])
num4++;
else
num5++;
min=max=stu[0].score[flag-1];//假设第一个学生的各门成绩既是最大值也是最小值
if(stu[i].score[flag-1]>max)//求单门科目中的最高分
max=stu[i].score[flag-1];
if(stu[i].score[flag-1]min=stu[i].score[flag-1];
sum+=stu[i].score[flag-1];
}
average=sum/K;
printf("\t\tmax=%.2f\n",max);
printf("\t\tmin=%.2f\n",min);
printf("\t\taverage=%.2f\n",average);
}
elseif(flag==4)
break;
else//当输入超过4或小于1时提示输入错误
printf("\t请重新输入(1-4)!
\n");
}
}
voidtianjia()
{
load();
charflag;
inti,j;
intm,x;
f