学生成绩管理系统程序分析.docx
《学生成绩管理系统程序分析.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统程序分析.docx(38页珍藏版)》请在冰点文库上搜索。
学生成绩管理系统程序分析
学生成绩管理分析系统设计报告
本次作业的任务是设计一个学生成绩管理分析系统,通过此次设计任务达到基本掌握面向过程程序设计的基本思路和方法,熟练使用C语言的知识和技能来解决简单的程序设计问题。
一、需求分析
1.功能需求
为了实现学生成绩的管理与分析,需要输入学生的基本信息和学习信息,要保证信息的准确性,需要提供包含添加、删除等修改功能,在此基础上,提供统计与分析手段。
因此,通过对需求的分析,本程序设计的功能需求如下:
a)信息输入
b)信息显示
c)信息修改
d)信息分析
2.系统需求
根据任务要求,实现学生成绩的管理与分析需要使用标准C语言进行编程;由于本程序满足任务要求的功能需求计算简单,信息的显示均为文本类型,且无通讯方面的需求,因此占用计算机的资源较少。
本程序的数据量大小取决于管理学生数量的多少,根据中国各高校情况分析,在校学生少则数百人,多则数万人,而每一名学生记录仅需要数十字节,因此数据的存取量需求最大不会超过10GB。
综上所述,本程序对系统的需求,目前一台普通计算机即可满足使用。
本程序设计拟采用VC编制,在Windows2000操作系统下开发实现。
二、总体设计
本程序设计采用模块化设计,每一个模块实现一项功能。
按照不同的功能对学生成绩管理分析系统进行模块划分,其总体设计如下:
数据录入模块。
每个学生的基本信息和成绩用一个结构体来表示,称为一条记录,可以增加或者删除记录。
为简化问题,能对学生的总成绩进行排序,这里约定相同系别的学生所选科目的数量一致,不同系别的学生所选科目可以不同。
数据查询模块。
对已经录入的学生基本信息和成绩进行查询,可以查询单个学生的基本信息和成绩,比如通过学号、姓名等关键字查询,也可以查询某类数据,比如通过系别关键字查询该系所有学生的资料、通过科目名称查询参加该科考试的所有学生的成绩。
数据修改模块。
对学生基本信息或成绩进行修改,并保存记录。
数据分析模块。
包括对每系或每班的单科成绩的分析,如求平均成绩、及格率、优秀率等;对选修某科的所有学生成绩进行分析,包括求平均分、最高分、最低分等;对同一学期每个班的学生总成绩进行排序。
数据保存模块。
将录入的学生基本信息和成绩以及修改后的数据记录以二进制文件的形式保存在磁盘指定位置。
数据显示模块。
将查询结果或者修改后的记录显示在屏幕上。
三、详细设计
程序开始运行后,首先要显示主菜单,由用户选择相应的操作。
用数字来代表不同的操作,其对应关系如下表所示:
操作命令
对应数字
输入记录
1
删除记录
2
查询记录
3
修改记录
4
插入记录
5
数据分析
6
数据排序
7
数据保存
8
数据显示
9
退出程序
0
1.输入记录
首先提示输入学号,输入后以回车符作为输入结束符;然后依次提示输入姓名,系别,班级,各科成绩等,每次输入均以回车符作为输入结束符。
输入完一条完整的记录后,重复以上步骤;当所有记录输入完成,按“0”键退出输入记录,显示主菜单。
2.删除记录
首先将所有数据记录显示出来,然后提示用户选择需要删除的记录,“1”表示通过学号删除相应记录,“2”表示通过姓名删除相应记录。
删除完成后提示删除成功,然后显示主菜单。
3.查询记录
首先提示输入相应的关键字查询方式,“1”表示通过学号查询,“2”表示通过姓名查询,“3”表示通过系别查询,把该系所有学生记录查询出来,“4”表示通过班级查询,把该班所有学生记录查出来。
然后输入需要查询记录的关键字,把相应的记录显示出来,然后显示主菜单。
4.修改记录
首先将所有记录显示出来,输入需要修改的记录的学号,然后按照输入记录的操作录入修改后的数据,每次输入均以回车符作为结束符。
输入完成后将修改后的数据记录显示出来,然后显示主菜单。
5.插入记录
当需要插入新的记录时,首先将所有记录显示出来,提示用户输入需要插入记录的位置,然后按照输入记录的操作录入一条新的记录,完成后将记录表显示出来,然后显示主菜单。
6.分析
首先将记录表显示出来,按回车键后显示统计分析结果,包括每科不及格人数,平均成绩,最高分,最低分等信息。
7.排序
首先将记录表显示出来,按回车键后按照总分名次从高到低的顺序进行排序显示,然后显示主菜单。
8.保存
将全部数据记录以二进制文件的形式保存在指定的磁盘位置,然后显示主菜单。
9.显示
将记录表显示出来,然后显示主菜单。
1.退出
退出前如果数据记录有修改则询问是否保存数据记录到文件,然后退出程序。
四、程序编制
按照以上详细设计的思路进行程序设计,每个功能设计成一个子程序。
各模块的程序流程如下:
图1主程序流程
图2输入记录流程
图3删除记录流程
图4查询记录流程
图5修改记录流程
图6插入记录流程
图7数据分析流程
图8数据排序流程
图9数据保存流程
五.源代码
#include
#include
#include
#defineMAXN100//一个班最多的人数
#defineMAXM2//成绩的课程门数
intR;
voidinput();//1.学生成绩新建
voidsort();//2.学生成绩插入
voidload();//3.学生成绩修改
voidprint();//4.学生成绩删除
voidtotal();//5.学生成绩统计
voidsearch();//6.学生成绩查询
voidsave();//7.学生成绩保存
voidend();//8.结束
structstudent
{
charname[20];//保存全班姓名
charnum[12];//保存全班学号
charman[20];//保存全班性别
floatscore[MAXM];//保存全班所有课程成绩
floatsum;//保存全班每个人的总成绩
floatavg;//保存每个人的平均成绩
};
structstudents[MAXN];
structhttp
{
charsubject[20];//保存全班所有课程
};
structhttpc[MAXM];
voidmain()//欢迎首界面
{
intselect,l;
system("colorfC");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥\n");
printf("**\n");
printf("**\n");
printf("*欢迎进入终极一班学生管理系统*\n");
printf("**\n");
printf("*︻┳═一cf...*\n");
printf("*┈━═☆甘总管的多塔生活∝╬══→*\n");
printf("**\n");
printf("*凸^-^凸凸^-^凸凸^-^凸凸^-^凸凸^-^凸凸^-^凸凸^-^凸*\n");
printf("¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥\n");
printf("╭v╮╔══╗╔╗╔╗╔╗╭'''╮\n");
printf("(@^o^@)╚╗╔╝║║╔═╦╦╦═╗║╚╝╠═╦╦╗(~:
~)\n");
printf("(~):
(~)╔╝╚╗║╚╣║║║║╠╣╚╗╔╣║║║║(~)v(~)\n");
printf("╚══╝╚═╩═╩═╩═╝╚╝╚═╩═╝\n");
printf("\n");
printf("\n");
printf("请按任意键进入下一界面\n");
printf("------------------------------------------------------------------\n");
system("pause");
system("colorf2");
system("colorf1");
system("colorf3");
system("colorfE");
system("colorfB");
system("colorf5");
system("colorf9");
system("colorf6");
system("colorf1");
system("colorf3");
system("colorfE");
system("colorfB");
system("colorf5");
system("colorf9");
system("colorf6");
system("colorf1");
system("colorf3");
system("colorf5");
system("colorf9");
system("colorf6");
system("colorfD");
system("pause");
system("colorfC");
system("cls");//上面是第一个界面
while
(1)
{
system("cls");
printf("****************欢迎进入终极一班学生管理系统****************\n");
printf("******************************************************\n");
printf("*∝╬══→ 1.学生成绩新建囧rz欢*\n");
printf("*:
:
======>> 2.学生成绩插入迎*\n");
printf("*┈━═☆ 3.学生成绩修改来*\n");
printf("*∝╬══→ 4.学生成绩删除到*\n");
printf("*∝╬══→ 5.学生成绩统计英*\n");
printf("*∝╬══→ 6.学生成绩查询雄*\n");
printf("*▄︻┻═┳ 7.学生成绩保存联*\n");
printf("*∝╬══→ 8.退出/撒拉嘿盟*\n");
printf("*(⊙_⊙)(⊙_⊙)(⊙_⊙)(⊙_⊙)(⊙_⊙)(⊙_⊙)*\n");
printf("******************************************************\n");
printf("\n");printf("\n请输入您的选择编号,回车键继续:
\n");
printf("---------------------------------------------------------------------------\n");
scanf("%d",&select);
do
{
if(select<1||select>8)
{
printf("您输入有误,请重新输入,谢谢!
!
!
\n");
scanf("%d",&select);
}
l=select;
}
while(l<1||l>8);
switch(select)
{
case1:
input();break;//1.学生成绩新建
case2:
sort();break;//2.学生成绩插入
case3:
load();break;//3.学生成绩修改
case4:
print();break;//4.学生成绩删除
case5:
total();break;//5.学生成绩统计
case6:
search();break;//6.学生成绩查询
case7:
save();break;//7.学生成绩保存
case8:
end();break;//8.结束
default:
printf("请按相应数学选择系统功能:
");
}
}
}
voidinput()//1学生成绩输入成绩模块
{
inti,j,b;
floata=0;
printf("请输入该班同学的人数:
\n");
printf("班同学的人数在1~%d之间:
\n",MAXN);
scanf("%d",&R);
do
{
if(R<1||R>100)
{
printf("您输入有误,请重新输入,谢谢!
!
!
\n");
scanf("%d",&R);
}
b=R;
}
while(b<1||b>100);
for(i=0;i{
printf("请输入该班同学的第%d门课程名称为:
\n",(i+1));
scanf("%s",&c[i].subject);
}
for(i=0;i{
printf("请输入第%d个同学的姓名:
\n",(i+1));
scanf("%s",&s[i].name);
printf("请输入第%d个同学的学号:
\n",(i+1));
scanf("%s",&s[i].num);
printf("请输入第%d个同学的性别(注:
可以不详):
\n",(i+1));
scanf("%s",&s[i].man);
printf("请依次输入%d门学科的成绩:
\n",MAXM);
for(j=0;j{
printf("请输入课程%s的成绩为:
\n",c[j].subject);
scanf("%f",&s[i].score[j]);
a=a+s[i].score[j];
}
s[i].sum=a;
s[i].avg=s[i].sum/MAXM;
a=0;
}
}
voidsort()//2学生成绩插入成绩模块
{
inti,j,k,b;
floata=0;
printf("请输入要插入的学生的位置1~%d号:
\n",R);
printf("第几个学生的位置之后:
\n");
scanf("%d",&k);
do
{
if(k<1||k>R)
{
printf("您输入有误,请重新输入,谢谢!
!
!
\n");
scanf("%d",&k);
}
b=k;
}
while(b<1||b>R);
R=R+1;
for(i=R;i>k;i--)
{
strcpy(s[i].name,s[i-1].name);
strcpy(s[i].num,s[i-1].num);
strcpy(s[i].man,s[i-1].man);
s[i].sum=s[i-1].sum;
s[i].avg=s[i-1].avg;
for(j=0;j{
s[i].score[j]=s[i-1].score[j];
}
}
printf("请输入第%d个同学的姓名:
\n",(k+1));
scanf("%s",&s[k].name);
printf("请输入第%d个同学的学号:
\n",(k+1));
scanf("%s",&s[k].num);
printf("请输入第%d个同学的性别(注:
可以不详):
\n",(k+1));
scanf("%s",&s[k].man);
printf("请依次输入%d门学科的成绩:
\n",MAXM);
for(j=0;j{
printf("请输入课程%s的成绩为:
\n",&c[j].subject);
scanf("%f",&s[k].score[j]);
a=a+s[k].score[j];
}
s[k].sum=a;
s[k].avg=s[k].sum/MAXM;
}
voidload()//3学生成绩修改
{
intload1();
intload2();
intselect,index,b;
while
(1)
{
printf("*************************************************************\n");
printf("*1.按学号修改*\n");
printf("*2.按姓名修改*\n");
printf("*0.返回*\n");
printf("*请输入您的选择编号:
*\n");
printf("*************************************************************\n");
scanf("%d",&select);
do
{
if(select<0||select>2)
{
printf("您输入有误,请重新输入,谢谢!
!
!
\n");
scanf("%d",&select);
}
b=select;
}
while(b<0||b>2);
switch(select)
{
case1:
index=load1();break;
case2:
index=load2();break;
case0:
return;
}
if(index!
=-1)
{
inti,j;
floata=0,h[MAXM];
i=index;
printf("请输入%d号的新学号:
\n",i+1);
scanf("%s",&s[i].name);
printf("请输入%d号的新姓名:
\n",i+1);
scanf("%s",&s[i].num);
printf("请输入第%d个同学的性别(注:
可以不详):
\n",(i+1));
scanf("%s",&s[i].man);
for(j=0;j{
printf("请输入课程%s的成绩为:
\n",&c[j].subject);
scanf("%f",&h[j]);
s[i].score[j]=h[j];
a=a+s[i].score[j];
}
s[i].sum=a;
s[i].avg=s[i].sum/MAXM;
printf("修改成功。
\n");
}
elseprintf("没有这个同学。
\n");
}
}
intload1()//按学号修改模块
{
inti;
chars_num[12];
printf("请输入要修改的学号:
");
scanf("%s",&s_num);
for(i=0;iif(strcmp(s[i].num,s_num)==0)
break;
if(ireturni;
elsereturn-1;
}
intload2()//按姓名修改模块
{
inti;
chars_name[10];
printf("请输入要修改的姓名:
");
scanf("%s",&s_name);
for(i=0;iif(strcmp(s[i].name,s_name)==0)
break;
if(ireturni;
elsereturn-1;
}
voidprint()//4学生成绩删除
{
inti,j,k,b;
printf("请输入删除学生的位置1~%d号:
\n",R);
scanf("%d",&k);
do
{
if(k<1||k>R)
{
printf("您输入有误,请重新输入,谢谢!
!
!
\n");
scanf("%d",&k);
}
b=k;
}
while(b<1||b>R);
i=k-1;
for(i;i{
strcpy(s[i].name,s[i+1].name);
strcpy(s[i].num,s[i+1].num);
strcpy(s[i].man,s[i+1].man);
s[i].sum=s[i+1].sum;
s[i].avg=s[i+1].avg;
for(j=0;j{
s[i].score[j]=s[i+1].score[j];
}
}
R=R-1;
printf("删除成功!
\n");
}
voidtotal()//5.学生成绩统计
{
inti,j;
floata[MAXM],b=0;
printf("学号:
姓名:
性别:
%s的分数:
%s的分数:
总成绩:
平均成绩:
\n",c[0].subject,c[1].subject);
for(i=0;i{
printf("%s%11s%11s%14.2f%14.2f%14.2f%14.2f\n",s[i].num,s[i].name,s[i].man,s[i].score[0],s[i].score[1],s[i].sum,s[i].avg);
}
for(i=0;i{
for(j=0;j{
b=b+s[j].score[i];
}
a[i]=b/R;
b=0;
}
for(i=0;i{
printf("全班课程%s的平均分为:
%f\n",c[i].subject,a[i]);
}
printf("排序完毕.\n");
system("pause");
}
voidsearch()//6查询成绩模块
{
intsearch1();
intsearch2();
intselect,index,b;
while
(1)
{
printf("*************************************************************\n");
printf("*1.按学号查询*\n");
printf("*2.按姓名查询*\n");
printf("*0.返回*\n");