程序设计报告
( 201 / 201 学年 第 学期)
题 目: 学生成绩管理系统
专 业 软件工程(NIIT)
学 生 姓 名 杨金霖
班 级 学 号 B12041015
指 导 教 师 成小惠
指 导 单 位 计算机软件学院
日 期 2013.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语句来完成菜单函数的循环。
三、概要设计
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,可输入要查询的等级:
输入C:
输入D:
六、调试过程中的问题
1.在这个系统中存在的一个难点是如何将note文件中的数据读入到系统中。在这个过程中我刚开始是定义了一组字符串str1,str2,str3,str4,希望能把note文件中的内容对应到字符串中,但是在读取信息的时候出了问题。不能够识别读多少位。后来换了一种思路,定义结构体数组,然后一行一行地来读取note中的内容就能够对应上了。
2.在对文件的操作,即对文件的输入和输出操作中,刚开始是用了文件的路径加文件名,但是打不开文件。后来把文件路径去掉,直接打开文件操作,这样就能读取保存了。
3.在选项4的操作中要用到if判断语句来输出满足条件的学号。开始的时候就是判断m[0]是否等于A(BCDE),但是错误提示A(BCDE)未定义,后来用ASC码值(65.66.67.68.69)来代替A.B.C.D.E就可以了,或者在A.B.C.D.E上加‘’。
七、程序设计总结
这次的课程设计我主要使用只是是C语言中的,虽然是用C++编写的,但是总体思路都是C语言的。通过这个课程设计,我更加牢固的掌握了C语言和C++的知识。并对于以前不熟悉的知识有了更加深刻的了解。同时,在完成此次课程设计的过程中,老师同学给了我很多宝贵的建议,我很感谢他们。虽然有时候编的很痛苦,但带给我很多的收获。C语言已经学了一个学期了,但是还有很多只是不是很理解,这次上机实践操作让我理解了很多东西。对这些知识也有了更深的理解和很好的掌握。没有实践,就不会发现和深刻体会编程的乐趣的。这次实践也培养了我的团队精神,使我懂得了团队的重要性。
数据结构课程设计报告课题名称姓名学院系科班级指导老师日期学生成绩管理系统20xx年1月17日目录一问题描述3二基本要求3三设计目的…
电子信息科学与技术专业课程设计题单班级_***_学生***课程名称专业课程设计_课题密码锁的设计设计要求利用visualc#作为前…
学生成绩管理系统报告小组成员:##指导老师:##学生成绩管理系统1.系统概述1.1系统开发背景随着计算机技术的发展,特别是计算机网…
目录1需求分析2总体设计21功能模块设计22所有功能模块的流程图3详细设计31输入函数32输出函数4测试的步骤和内容41调试方法与…
阜阳师范学院计算机与信息学院本科生毕业设计论文开题报告论文题目基于Java的学生成绩管理系统设计与实现学院计算机与信息学院专业学生…
课程设计报告课程名称面向对象程序设计课题名称学生成绩管理系统专业计算机科学与技术班级计算机1001学号姓名指导教师20##年12月…
福建师范大学人民武装学院C语言程序设计报告书设计名称学生成绩管理系统专业软件工程指导老师陈琳姓名黄强学号119xx20xx0262…
C语言课程设计报告一问题描述题目七学生成绩管理系统设计学生成绩信息包括学期学号班别姓名四门课程成绩语文数学英语和计算机等主要功能1…
一实验题目学生证管理系统数据库的设计与实现描述设计一个学生证管理系统实现下列功能1录入某位学生的学生证信息2给定学号查询某位学生的…
阜阳师范学院计算机与信息学院本科生毕业设计论文开题报告论文题目基于Java的学生成绩管理系统设计与实现学院计算机与信息学院专业学生…
学生信息管理系统HUNANUNIVERSITY程序设计训练报告学生姓名学生学号专业班级指导老师院长系主任20xx年5月25日第1页…