学生成绩管理系统课程.docx
《学生成绩管理系统课程.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统课程.docx(24页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统课程
高级语言程序设计
(1)课程设计
1.程序设计说明书
【设计题目】数学1001班期末学生成绩管理系统
【问题描述】
对数学1001班每个同学本学期期末八门课的成绩进行处理。
每个同学的成绩用该软件通过键盘敲入并以文本文件方式存放在磁盘,内容为十二列:
学号、姓名、概率论与数理统计、复变函数与积分变换、高级语言程序设计、C语言课程设计、大学英语(4)、大学体育(4)、思政概论、选修课、平均成绩和排名情况。
并对我班所有同学的成绩进行分析。
编写程序,求出各个学生的平均成绩以及每个学生成绩的方差,计算出我班学生的总体平均成绩,及格率和优秀率,统计平均分低于60分的学生名单。
并可以对每位同学的成绩和排名进行查看,以及修改等。
【基本要求】
1.通过此软件可以直接录入各个学生的各科成绩,并且会将成绩自动保存到盘上。
2.通过此软件可以直接对已录入学生成绩进行修改,并且修改完成后会将更改后的成绩情况自动保存到原磁盘文件中。
3.通过此软件可以直接对各个学生的各科成绩、平均成绩和排名情况进行查询。
4.通过此软件可以统计我班学生的及格率,优秀率和均分低于60学生情况。
5.可以计算出我班的班平均成绩以及计算出班上每个同学成绩的方差。
【算法思想】
1.构造一个结构体类型,成员包括11项:
字符型数组,存放学生名称;9个整形变量,分别存放学号、八门课的成绩;1个实型变量,存放平均成绩。
2.录入各个学生成绩时,通过循环语句将学生名称与成绩得分输入到结构体中,然后通过循环语句算出平均分、成绩方差并写入文本文件中,并存入磁盘。
3.查询成绩排名时,直接通过已经存在的文本文件进行读出到结构体中,并将结构提数组通过平均分的大小用冒泡法进行排序,然后将结果显示在屏幕。
4.通过循环语句计算出班上学生成绩的总体平均分,并计算出我班学生的及格率和优秀率等。
【模块划分及调用关系】
1:
程序设计组成框图:
2:
模块功能说明:
1输入功能:
输入学生姓名学号及成绩。
2查看功能:
输出姓名学号及各科成绩。
3查询功能:
通过学号查询学生姓名及各科成绩。
4统计功能:
统计班级学生及格率,优秀率,各个学生成绩方差等。
5修改功能:
通过输入学号修改指定学生的错误信息。
6添加功能:
添加学生信息。
7删除功能:
通过输入学号输入指定学生信息。
8保存功能:
将学生信息保存。
9退出系统。
3:
主要函数之间的调用关系及各自功能:
主要函数的函数原型
voidinputscore(void);
voidsavescore(void);
voidavergescore(void);
voidmodifyscore(void);
voidlookscore(void);
voidsearchscore(void);
voidstatistic(void);
voidadd(void);
voidmodify(void);
voiddelscore(void);
voidmenu(void);
i.在菜单界面输入1,调用函数inputscore()实现输入学生成绩信息功能。
ii.在菜单界面2,调用函数lookscore()实现学生成绩按平均分高低排序输。
出,同时lookscore()函数调用avergescore()函数实现各个学生平均分的计算。
iii.在菜单界面输入3,调用searchscore()函数实现通过学号查找学生成绩信息功能。
iv.在菜单界面输入4,调用statistic()函数输出班级及格率,优秀率,学生成绩方差,不及格学生名单。
v.在菜单界面输入5,调用modify()函数实现通过学号修改学生成绩的功能
vi.在菜单界面输入6,调用add()函数实现添加学生成绩。
vii.在菜单界面输入7,调用delscore()函数实现删除指定学生成绩。
viii.在菜单界面输入8,调用savescore()函数将学生成绩信息保存。
ix.在菜单界面输入9,退出成绩管理系统。
【模块流程图】
main函数
Inputscore函数
......
Lookscore函数
Searchscore函数
Statistic函数
Modify函数
【程序使用方法】
1.执行程序,按照界面提示进行选择。
输入“1”,进入成绩的输入。
2.按照程序提示,分别输入第一个同学的学号,姓名和8科成绩的分数。
(注:
这里只要求输入每个学生学号的最后两位,因为数学1001班学生前10位学号都为2010010301)
3.输入成功后,按任意键返回主界面。
输入“8”,进入成绩保存。
在按任意键返回主菜单,输入“2”查看成绩,程序自动将各个已录入保存的学生成绩及排名情况输出到屏幕上。
4.按任意键返回主菜单,输入“3”查询成绩。
根据提示输入学号查询改学号下的学生成绩。
5.输入“4”,进行该班成绩统计输出,程序自动将数学100班的平均分,及格率,每位同学的成绩方差和平均分低于60分等统计信息输出显示。
6.输入“5”,“6”,“7”分别为修改成绩,添加成绩和删除成绩,根据提示操作。
输入“9”,退出程序。
2.程序上机调试报告
【语法错误及其排除】
1.在语句末尾少了“;”号,导致程序运行错误。
根据提示找出修改。
2.部分单词的拼写错误,导致出现没有定义的变量存在,根据提示修改纠正。
3.对字符数组进行比较和赋值时用了“==”号,应该用strcmp函数与strcpy函数。
【算法错误及其排除】
1.在voidavergescore(void)函数中,计算平均值没有清0.导致计算结果错误。
先找到调用函数,逐行找出错误修正。
2.在修改学生成绩时,进行比较完成后用变量i代替常量进行赋值语句,结果导致错误,应该将变量i的值赋给m后用m进行赋值语句。
3.程序测试结果
程序运行效果截图
1主菜单
2输入成绩
3查看成绩
4查询成绩
5.统计成绩
6.修改成绩
7.添加成绩
8.删除成绩
9.保存成绩
【收获及体会】
整个程序主要运用了课本上的基础知识,并未有太大创新,通过for循环,循环输入学生成绩。
在学生成绩排序中运用选择法,同时实现学生名次的确定。
在删除指定学生成绩时,先确定信息存储位置即其在结构体数组中的序号,通过结构体变量的整体赋值将从指定位置以后的学生信息赋给前一个结构体变量,并将学生总数n减1,实现删除学生成绩信息。
对自己的这个程序还比较满意,基本上达到了当初的想法。
刚开始编写这个程序的时候思路比较清楚,也比较顺利。
可是编写到中间的时候碰到了很多难题,譬如无法将信息写入文件或者写入文件的是一堆乱码,最后通过自己的认真检查、调试和查阅课本资料,终于将程序编写成功了。
从编写这个程序的过程中不但发现了许多自己没有学明白的地方,而且锻炼了意志力,相信这会对自己的将来带来很多益处。
4.源程序代码
#include//预编译命令
#include//预编译命令
#include//预编译命令
#include//预编译命令
#defineN30//(宏定义)班上学生的人数
#defineM8//(宏定义)每个同学的科目数
typedefstructstudent//定义学生成绩的结构体
{charnumber[10];//学号
charname[20];//姓名
floatscore[M];//成绩
floataver;//平均成绩
}STU;
STUstu[N];
intn;
voidinputscore(void);//输入学生成绩函数
voidsavescore(void);//保存函数
voidavergescore(void);//计算平均分函数
voidmodifyscore(void);//修改分数函数
voidlookscore(void);//浏览函数
voidsearchscore(void);//查找函数
voidstatistic(void);//统计函数
voidadd(void);//添加函数
voidmodify(void);//修改函数
voiddelscore(void);//删除函数
voidmenu(void);//主菜单函数
voidmain()//主函数
{shortintflag=0;
menu();
do
{flag=1;
switch(getch())
{case'1':
inputscore();break;//输入成绩
case'2':
lookscore();break;//查看成绩
case'3':
searchscore();break;//查找成绩
case'4':
statistic();break;//成绩统计
case'5':
modify();break;//修改成绩
case'6':
add();break;//添加成绩
case'7':
delscore();break;//删除成绩
case'8':
savescore();break;//保存成绩
case'9':
exit(0);//退出程序
default:
printf("输入有误\n");
}
printf("按任意键继续\n");
getch();
menu();
}while(flag==1);
}
voidmenu(void)//主菜单函数
{
system("cls");
printf("\n");
printf("*******欢迎进入数学1001班成绩管理系统*******\n");
printf("*菜单*\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("*9-----退出系统----------------------*\n");
printf("*******欢迎进入数学1001班成绩管理系统*******\n");
printf("请输入您的选择\n");
}
//**********输入各个同学的学生信息************************
voidinputscore(void)//输入学生成绩函数
{inti,j;
system("cls");
printf("请输入学生总数:
\n");
scanf("%d",&n);
printf("提示:
*数学1001班学生前十位学号为2010010301请输入每位同学学号的最后2位*\n");/*同班同学只有最后两位学号不一样最后因二维表上下需对正故有此要求*/
for(i=0;i{printf("请输入学生%d的学号姓名:
\n",i+1);
scanf("%s%s",stu[i].number,stu[i].name);
printf("请输入学生成绩:
\n");
printf("概率复变C语言C实践英语体育思政选修\n");
for(j=0;jscanf("%f",&stu[i].score[j]);
}
printf("成功输入\n");
}
//*************计算各个同学的平均分*************************
voidavergescore(void)//计算各个学生平均分函数
{inti,j;
for(i=0;i{stu[i].aver=0;
for(j=0;j{
stu[i].aver+=stu[i].score[j];
}
stu[i].aver=stu[i].aver/M;
}
}
//****查看学生成绩及根据平均分对学生进行排序****************
voidlookscore(void)//查看学生成绩及排序函数
{inti,j,k;
STUt;
avergescore();
system("cls");
for(i=0;i{for(k=i,j=i+1;jif(stu[j].aver>stu[k].aver)
k=j;
if(k!
=j)
{t=stu[k];
stu[k]=stu[i];
stu[i]=t;
}
}
printf("名次学号姓名概率复变C语言C实践英语体育思政选修平均分\n");
for(i=0;i{printf("%d\t%s%s",i+1,stu[i].number,stu[i].name);
for(j=0;jprintf("%1.2f",stu[i].score[j]);
printf("%1.2f",stu[i].aver);
printf("\n");
}
}
//***********通过输入学号查找学生成绩***********************
voidsearchscore(void)//通过学号查找学生成绩函数
{chara[10];
inti,j;
system("cls");
printf("请输入需查询的学生学号\n");
scanf("%s",a);
for(i=0;i{if(strcmp(a,stu[i].number)==0)
{printf("名次学号姓名概率复变C语言C实践英语体育思政选修平均分\nn");
printf("%d\t%s%s",i+1,stu[i].number,stu[i].name);
for(j=0;jprintf("%1.2f",stu[i].score[j]);
printf("%1.2f",stu[i].aver);
printf("\n");
break;/*找到该学生成绩信息后跳出for循环*/
}
else
printf("未找到该学生信息\n");
}
}
//***统计学生成绩信息,平均分及格率,优秀率,成绩方差************
voidstatistic(void)//统计数据函数
{STU*p=stu;
inti,j;
floatcount=0.0,sum=0.0;
system("cls");
for(i=0;i{sum+=(p+i)->aver;}
printf("该班级平均分为%4.2f\n",sum/n);//平均分计算
for(i=0;i{if((p+i)->aver>=60)
count++;
}
printf("该班级及格率为%4.2f%%\n",count/n*100);//及格率计算
count=0.0;
for(i=0;i{if((p+i)->aver>=90)
count++;
}
printf("该班级优秀率为%4.2f%%\n",count/n*100);//优秀率计算
for(i=0;i{for(j=0;j{sum=((p+i)->score[j]-(p+i)->aver)*((p+i)->score[j]-(p+i)->aver);
}
sum=sum/n;
printf("学生%s的成绩方差为%4.2f\n",(p+i)->name,sum);
//方差计算
}
printf("平均分低于60的学生名单\n");
for(i=0;i{
if(stu[i].aver<60)
printf("%s\n",stu[i].name);
}//统计不及格学生名单
}
//***************修改学生成绩*****************
voidmodify(void)//修改函数
{chara[10];
inti,j;
system("cls");
printf("请输入需要修改成绩的学生学号\n");
scanf("%s",a);
for(i=0;i{if(strcmp(a,stu[i].number)==0)
{printf("名次学号姓名概率复变C语言C实践英语体育思政选修平均分\n");
printf("%d\t%s%s",i+1,stu[i].number,stu[i].name);
for(j=0;jprintf("%1.2f",stu[i].score[j]);
printf("%1.2f",stu[i].aver);
printf("\n");
printf("请重新输入该学生的学号姓名:
\n");
scanf("%s%s",stu[i].number,stu[i].name);
printf("请重新输入学生成绩:
\n");
printf("概率复变C语言C实践英语体育思政选修\n");
for(j=0;jscanf("%f",&stu[i].score[j]);//找到该学生成绩后进行修改,跳出for循环
printf("修改成功\n");
break;
}
else
printf("未找到该学生信息\n");
}
}
//*****************添加学生成绩********************
voidadd(void)//添加函数
{inta,i,j;
system("cls");
printf("请输入新增加的学生人数:
\n");
scanf("%d",&a);
n=n+a;
for(i=n-a;i{printf("请输入学生%d的学号姓名:
\n",i+1);
scanf("%s%s",stu[i].number,stu[i].name);
printf("请输入学生成绩:
\n");
printf("概率复变C语言C实践英语体育思政选修\n");
for(j=0;jscanf("%f",&stu[i].score[j]);
printf("添加成功\n");
}
}
//*******************删除学生成绩*************************
voiddelscore(void)//删除函数
{inti,j,c;
charm,a[10];
system("cls");
printf("请输入学生学号\n");
scanf("%s",a);
for(i=0;i{if(strcmp(a,stu[i].number)==0)
{printf("名次学号姓名概率复变C语言C实践英语体育思政选修平均分\n");
printf("%d\t%s%s",i+1,stu[i].number,stu[i].name);
for(j=0;jprintf("%1.2f\t",stu[i].score[j]);
printf("%1.2f",stu[i].aver);
printf("\n");
c=i;
break;
}
else
printf("未找到该学生信息\n");
}
printf("是否删除该学生成绩(y/n)\n");
scanf("%s",&m);
if(m=='y')
{
for(i=c;istu[i]=stu[i+1];//结构体整体赋值将后一位学生成绩信息拷贝进入前一位学生信息的存储位置
n=n-1;//删除该学生信息后学生总数减一
printf("删除成绩成功\n");
}
else
printf("删除成绩失败\n");
}
//******************保存学生成绩************************
voidsavescore(void)//保存函数
{FILE*fp;
inti,flag=1;
charm;
system("cls");
puts("是否保存学生成绩(y/n)");
scanf("%s",&m);
if(m=='y')
{if((fp=fopen("score.dat","wb"))==NULL)
{printf("文件打开失败\n");
return;
}