资源描述
程序设计汇报
( 201 / 201 年 第 学期)
题 目: 学生成绩管理系统
专 业 软件工程(NIIT)
学 生 姓 名
班 级 学 号
指 导 教 师 成小惠
指 导 单 位 计算机软件学院
日 期 .3.26
评 分 细 则
评分项
优异
良好
中等
差
遵守机房规章制度
上机时表现
学习态度
程序准备情况
程序设计能力
团体合作精神
课题功效实现情况
算法设计合理性
用户界面设计
汇报书写认真程度
内容详实程度
文字表示熟练程度
回复问题正确度
简 短 评 语
老师署名:
年 月 日
评分等级
备注
评分等级有五种:优异、良好、中等、及格、不及格
学生成绩管理系统
一、 课题内容和要求
设计一个简化学生成绩管理系统,并用C或C#语言实现。对该系统要求以下:
1. 该系统应实现以下功效
(1)按班级按课程从文件中读入对应平时成绩、期中考试成绩和期末考试成绩。
(2)三个成绩对总评成绩百分比被定义为常数,各占总成绩30%、30%和40%。
(3)计算每位学生总评成绩。
(4)算该班级本课程总平均成绩。
(5)算处于优、良、中、及格、不及格学生人数和占总人数百分比。其中100-90为优,89-80为良,79-70为中,69-60为及格,60分以下为不及格。
(6)按要求输出成绩在优、良、中、及格、不及格各区间学生学号。
2. 系统应有以下菜单:
0.退出
1.计算每位学生总评成绩
2.计算班级本课程总评成绩
3.统计优、良、中、及格、不及格学生人数和所占百分比
4.查询成绩在优、良、中、及格、不及格各区间学生学号
许可用户不停从这个菜单选择任一功效实施, 直到选择退出, 才退出整个系统。
二、需求分析
1.系统要从文件中读入对应平时成绩、期中成绩和期末考试成绩。这里就用到了C++中输入输出文件操作。在C++语言中进行文件操作通常步骤为:
(1)为要进行操作文件定义一个流。
(2)建立(或打开)文件。
(3)进行读/写操作。
(4)关闭文件
另外从文件中读入数据要在后面进行计算,所以应该把文件中数据对应到类或结构体数组上去。(在这个程序中用是结构体数组)
2. 系统还要有计算功效,这里计算包含总评成绩计算和平均值计算。因为要计算多个学生成绩,所以利用循环语句来进行逐一学生成绩计算并输出。(在这个程序中全部是用for循环)
3. 统计功效。需要利用到条件语句,既满足条件就加1,以此来完成计数统计。
4. 查询功效。一样是利用条件语句,判定符合条件就对屏幕输出,达成用户查询目标。
5. 菜单功效。用简单菜单函数完成整体框架,用到switch语句来完成菜单函数循环。
定义结构体数组
三、概要设计
定义函数
对选项2计算课程总评成绩函数
void readaverage()
(调用file函数)
对选项1计算学生总评成绩函数
void readall()
(调用file函数)
对选项3统计计算函数
void readgrade()
(调用file函数)
对选项4查询学号函数
void readABCDE()
读入文件函数
void file()
定义一个菜单函数
在这个函数中调用上面定义函数
1. 首先用struct student定义一个结构数组,里面应该包含学号Id、平时成绩ps、期中成绩qz、期末成绩qm、总评成绩all、等级grade。
2. 定义函数
(1)读入文件(fs.open),对应到结构体数组中,利用for循环计算总评成绩并用判定语句来判定等级。
(2)调用file函数,把计算结果输出屏幕,而且根据要求保留到out文件中(ofstream fout(“out.dat”);)。
(3)调用file函数,计算平均成绩来得到课程总评成绩。
(4)调用file函数,if判定语句来统计人数并计算百分比,然后输出屏幕。
(5)if判定语句,把符适用户输入等级学生学号输出到屏幕。
四、具体设计
#include<iostream.h> /*输入输出头文件*/
#include<fstream.h> /*对文件操作*/
#include<string.h> /*定义字符串变量*/
#include<stdlib.h>
struct student /*定义一个结构数组*/
{
public:
char Id[10];
float ps;
float qz;
float qm;
float all;
char grade;
}stu[20];
fstream fs;
int num;
char str5[100]="学生学号";
char str6[100]="总评成绩";
char str7[100]="成绩等级";
void file() /*定义一个函数,方便后面调用*/
{
fs.open("note.dat",ios::in|ios::out); /*对文件读入操作,文件以输入输出方法打开*/
fs>>num;
for(int i=0;i<num;i++)
{
fs>>stu[i].Id>>stu[i].ps>>stu[i].qz>>stu[i].qm; /*把文件中得数值对应到结构数组中*/
}
for(i=0;i<num;i++) /*完成对总评成绩计算*/
{
stu[i].all=stu[i].ps*0.3+stu[i].qz*0.3+stu[i].qm*0.4;
if((stu[i].all<=100)&&(stu[i].all>=90))
stu[i].grade='A';
if((stu[i].all<90)&&(stu[i].all>=80))
stu[i].grade='B';
if((stu[i].all<80)&&(stu[i].all>=70))
stu[i].grade='C';
if((stu[i].all<70)&&(stu[i].all>=60))
stu[i].grade='D';
if((stu[i].all<60)&&(stu[i].all>=0))
stu[i].grade='E';
}
}
void readall() /*对选项1实现,后面调用*/
{ file();
int i;
ofstream fout("out.dat"); /*输出保留到out文件中*/
if(!fout) /*假如文件打开失败*/
{
cout<<"Cannot open the file!"<<endl;
}
fout<<str5<<"\t"<<str6<<"\t"<<str7<<endl; /*把表头文字存入文件*/
cout<<str5<<"\t"<<str6<<"\t"<<str7<<endl; /*把表头文字输出屏幕*/
for(i=0;i<num;i++) /*for循环逐次输出学生成绩*/
{
fout<<stu[i].Id<<"\t"<<stu[i].all<<"\t"<<stu[i].grade<<endl;
cout<<stu[i].Id<<"\t"<<stu[i].all<<"\t\t"<<stu[i].grade<<endl;
}
}
void readaverage() /*对选项2实现,后面调用*/
{
cout<<"本课程总评成绩:";
file();
int i;
float a[20],p;
for(i=0;i<num;i++)
{
a[i]=stu[i].all;
}
for(i=1;i<num;i++)
{
a[i]=a[i]+a[i-1];
}
p=a[num-1]/num;
cout<<p<<endl<<endl;
}
void readgrade() /*对选项3实现,后面调用*/
{ int i;
int j=0;
int k=0;
int x=0;
int y=0;
int z=0;
file();
for(i=0;i<num;i++)
{
if(stu[i].grade==65)
j++;
if(stu[i].grade==66)
k++;
if(stu[i].grade==67)
x++;
if(stu[i].grade==68)
y++;
if(stu[i].grade==69)
z++;
}
cout<<"成绩为优学生人数:";
cout<<j<<endl;
cout<<"成绩为良学生人数:";
cout<<k<<endl;
cout<<"成绩为中等学生人数:";
cout<<x<<endl;
cout<<"成绩为及格学生人数:";
cout<<y<<endl;
cout<<"成绩为不及格学生人数:";
cout<<z<<endl;
float n;
cout<<"成绩为优学生百分比:";
n=float(j)/num;
cout<<n<<endl;
cout<<"成绩为良学生百分比:";
n=float(k)/num;
cout<<n<<endl;
cout<<"成绩为中等学生百分比:";
n=float(x)/num;
cout<<n<<endl;
cout<<"成绩为及格学生百分比:";
n=float(y)/num;
cout<<n<<endl;
cout<<"成绩为不及格学生百分比:";
n=float(z)/num;
cout<<n<<endl<<endl;
}
void readABCDE() /*对选项4实现,后面调用*/
{ char m[10];
cout<<"请输入你需要查询学生成绩等级:";
cin>>m;
if((m[0]!=65)&&(m[0]!=66)&&(m[0]!=67)&&(m[0]!=68)&&(m[0]!=69))
cout<<"Input error!!!!"<<endl<<endl;
if(m[0]==65)
{ cout<<str5<<endl;
for(int i=0;i<num;i++)
{ if(stu[i].grade=='A')
cout<<stu[i].Id<<endl;
}
}
if(m[0]==66)
{ cout<<str5<<endl;
for(int i=0;i<num;i++)
{ if(stu[i].grade=='B')
cout<<stu[i].Id<<endl;
}
}
if(m[0]==67)
{ cout<<str5<<endl;
for(int i=0;i<num;i++)
{ if(stu[i].grade=='C')
cout<<stu[i].Id<<endl;
}
}
if(m[0]==68)
{ cout<<str5<<endl;
for(int i=0;i<num;i++)
{ if(stu[i].grade=='D')
cout<<stu[i].Id<<endl;
}
}
if(m[0]==69)
{ cout<<str5<<endl;
for(int i=0;i<num;i++)
{ if(stu[i].grade=='E')
cout<<stu[i].Id<<endl;
}
}
cout<<endl;
}
void main() /*菜单函数,整体框架*/
{ int m=1;
int n;
do{
cout<<"1.计算每位学生总评成绩"<<endl;
cout<<"2.计算班级本课程总评成绩"<<endl;
cout<<"3.统计优、良、中、及格、不及格学生人数和所占百分比"<<endl;
cout<<"4.查询成绩在优、良、中、及格、不及格各区间学生学号"<<endl;
cout<<"5.退出"<<endl;
cout<<"请选择:";
cin>>n; /*实现菜单函数循环*/
switch(n){
case 1:
readall();
break;
case 2:
readaverage();
break;
case 3:
readgrade();
break;
case 4:
readABCDE();
break;
case 5:
exit(0);
break;
default:
cout<<"Input error!!!!"<<endl<<endl;
}
}while(m==1);
}
五、测试数据及其结果分析
1.note.dat文件中内容:
20
06030201 88 75.5 66
06030202 91 79.5 76
06030203 85 75 77
06030204 79 82 80.5
06030205 66 70 63
06030206 53 60 52
06030207 90 90 98
06030208 86 77 83
06030209 88 56 69
06030210 75 59 60
06030211 68 69 70
06030212 66 80 89
06030213 55 59 56
06030214 70 52 90
06030215 90 88 97
06030216 88 52 60
06030217 60 80 56
06030218 80 68 77
06030219 90 80.5 82
06030220 75.5 88 66
2.out.dat文件中内容:
学生学号 总评成绩 成绩等级
06030201 75.45 C
06030202 81.55 B
06030203 78.8 C
06030204 80.5 B
06030205 66 D
06030206 54.7 E
06030207 93.2 A
06030208 82.1 B
06030209 70.8 C
06030210 64.2 D
06030211 69.1 D
06030212 79.4 C
06030213 56.6 E
06030214 72.6 C
06030215 92.2 A
06030216 66 D
06030217 64.4 D
06030218 75.2 C
06030219 83.95 B
06030220 75.45 C
运行结果演示:
1.运行程序后显示菜单:
2.输入1,并按Enter,得到学生总评成绩:
3.输入2,并按Enter,得到课程总评成绩:
4.输入3,并按Enter,统计各等级人数并计算百分比:
5.输入4,并按Enter,可输入要查询等级:
输入A:
输入B:
输入C:
输入D:
输入E:
六、调试过程中问题
1.对于此次程序书写,感悟良多,刚开始时候,认为课题不是极难,因为在书本上,有这么例题。而此题和其它学生成绩管理系统不一样,它基础要求实现对一个班级成绩录入,个人成绩,班级信息等等。对于学生成绩计算包含了平时成绩,期中成绩,期末成绩。不是书本例题似,实现多门科目标成绩录入。于是刚开始难点就是考虑怎样实现这一功效。刚开始,书本上实现时候,采取是指针,链表,去实现,然后,我在去调链表指针时候,就要去用很多头文件,要写4个左右大量头文件,做了4天左右时候,我们没有时候所要功效,在编译时候没有错误,不过程序还是实现不了,于是,放弃采取链表,指针。选择数组。即使数组在内存上有很大缺点,但对于此题,可能数组去实现,相对轻易;
2.实现学生成绩录入功效时候,我没能深去了解题目所要求得实现保留在note.dat中,开始对文件没有深刻去认识,于是我一根筋去认为首先建一个note.dat文件,然后用程序去读出这个文件其中数据。于是,我不管进行咋样操作,还是发觉程序中没有内容,以后考虑许久, 发觉没有了解题目标意思,对和一个系统而言首先要实现录入功效,于是我就想,能够在程序中实现程序数据录入,然后去保留在note.dat文件中,但于是写程序时候首先定义一个save函数用来存取学生数据,在main函数中,在录入功效后面增加一个选项,用来去实现保留功效,开始存入一个人信息时候,我没有发觉错误,不过录入大家时候,发觉在note.dat文件存入是一个人信息,于是我找不到错误,开始我去想可能是文件中输出格式有错误.可能是“r”问题,因为我不太确定用是“w”还是“r”,以后分别去试验,发觉还是处理不了问题,以后仔细想了想,之所以只存入一个学生信息,估量没有加入录入成功或保留成功,于是我把,save函数放在input函数,也就意思是在实现对一个学生录入功效时候,顺便实现保留在文本中然后发觉没录入一个学生成绩就要去保留,要是有很多学生,那么就要用很多遍去保留,发觉就是一个问题,于是在想到,之所以去调用一次,就是有for循环,于是我把save函数方法,写在for循环前面,系统实现默认保留功效。这么不会出现提醒信息,问是不是需要实现保留。
3. 以后经过一系列函数实现出个人成绩等级,总评,关键经过for循环,if语句,因为我定义grade,zongping ,number是结构体变量,而且是全局,这要对多个函数调用很轻易去实现到;在文件输出中,按要求输出三项,分别是学号,总评,等级;按要求输出在一个文件中,开始时候,输出没有实现,因为录入没有实现保留功效,于是发觉输出空,以后当实现了保留功效后,发觉输出功效自然处理。
4.开始时候,我把学生学号定义为了char类型,当输出时候在学生学号一栏时候,发觉字母,以后,想到改成int型,从而实现正确输出;
七、程序设计总结
1:这是我第一次做课程设计,感觉在前一个星期,没有做出结果,因为开始时候自己走错路,采取了指针,以后想到了数组,才有了一定气色,但去实现一个程序时候,就要有一定很清楚思绪,去了解到底实现什么样功效,开始时候,没有清楚思绪,在想到什么了函数,就在主函数下面就写想用程序,然而这么去写以后,才发觉程序很乱,错时候,找不到错在哪里。心里很是着急,有函数并不是有了就能去实现对应功效,要知道放在哪里,是放在for循环前面,还是放在for循环中,这是有很大不一样;
2:心态,很关键,尤其是程序犯错时候,自己程序碰到错误时候,发觉不管咋样去找,还是没能够找到函数,自己心态很乱,很着急;然后去找周围同学,可是周围同学也不知道时候自己心态更糟糕。于是去问部分专业课老师,可是有老师,还是没有够给出对应解释,于是自己静下心,深刻去想程序;
3:对于团体意识很关键,要有很明确分工,一起去探讨部分出现问题;
4:当程序独立完成时候,那种深深满足感无法用言语能够表示出来,程序出现问题时候,自己发觉自己在这方面知识很欠缺,比如在这个程序中,实现对文本输出,输入,这在以前不是很了解,做了程序以后,才有了部分了解。于是,我想自己以前学过知识肯定有很多不懂,这在以后学习中,一定要多多去加强。只有不停去复习,有些知识才不会忘记。只有自己亲自去动手完成这么程序,才能领悟到软件这门学科精髓。只有用心去做,亲自去做,用心去想,碰到无数错误时候,不放弃,不抛弃,错误一定会能找得到,部分功效一定能够实现;因为我坚信:成功,永远给予那些默默付出不放弃人!
展开阅读全文