学生成绩管理系统合肥工业大学.docx
《学生成绩管理系统合肥工业大学.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统合肥工业大学.docx(26页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统合肥工业大学
“数据结构与算法”
课程设计报告
(一)需求和规格说明
主要功能是对批量学生的各门成绩进行录入、修改、查询、统计等,要求方便快速。
记录学生的学号、姓名、班级、性别、联系电话以及课程和成绩;可以对学生的成绩按学号和姓名进行查寻;输出显示学生成绩;并实现排序、统计及格率和优秀率功能。
编程任务:
(1)界面基本要求:
****************************
学生成绩管理系统
****************************
************************************
**F1--帮助**
**F2--输入数据并存入文件**
**F3--根据学号查询成绩**
**F4--根据姓名查询成绩**
**F5--输出文件内容**
**F6–成绩排序**
**F7--统计及格和优秀人数**
**ESC--退出系统**
************************************
另:
提倡用MFC的对话框做简单的输入输出交互界面。
(2)功能要求:
1)帮助:
系统使用方法的相关信息。
2)输入数据并存入文件:
输入相关信息,并实现文件流的读写操作。
3)根据学号查询成绩:
输入学号,查询学生的各门成绩
4)根据姓名查询成绩:
输入姓名,查询学生的各门成绩
5)输出文件内容:
屏幕输出显示所有学生的成绩
6)成绩排序:
对某门成绩或总分进行快速排序,显示、保存
7)统计及格和优秀人数:
统计及格和优秀率。
8)退出
(二)设计
主要内容如下:
1.关键类的设计,继承层次关系,代码:
(编译器C-Free5.0)
首先,创建了一个student类.在student类的共有部分声明程序所需函数;然后就是student类的函数实现部分,其中定义student类的带参数及不带参数构造函数;再是常用函数的调用,并定义系统菜单函数及其界面;最后就是主函数文件。
属性和方法定义
类名
成员类别
类型
成员名
描述
student
属性
string
Name
学生姓名
string
Number
学生学号
string
CLas
所在班级
char
Gender
性别
string
Phone
电话号码
double
Math
数学成绩
double
Computer
微机机成绩
double
Sum
总的分数
float
Jige_num
数学及格人数
float
Yousheng_num
数学优秀人数
float
Jige
微机及格人数
float
Youxiu
微机优秀人数
float
Jigelv
数学及格率
float
youshenglv
数学优秀率
float
Jigel
微机及格率
float
youxiul
微机优秀率
int
Count
统计输入数据个数
方法
void
help()
帮助文件
void
sum_score()
总分函数
void
app_score
动态节点建立的函数
void
cin_app()
输入数据的函数
void
del_score()
删除数据的函数
void
displist()
打印数据的函数
void
lookup(int,string)
查找数据的函数
void
compositor(int)
排序数据的函数
void
tongji()
计算及格率和优秀率
void
menu()
系统菜单函数
(三)用户手册
程序运行时,进入主界面
选择”0”,读取帮助信息
帮助信息
系统有对学生的学号、姓名、班级、性别、联系电话以及计算机、数学的成绩录入等功能
可以对学生的成绩按学号和姓名进行查寻,并且能对学生成绩实现排序功能。
按照界面说明进行程序的各个子程序调用,最终完成工作后便可退出。
@2014Anpengfei.Allrightsreserved.
(四)调试及测试
在调试过程中也出现了多处错误,逐一修改,坦然漏洞还是有的。
由于系统每增加一个学生信息,无论他(她)是的情况如何,其学号和其他信息都是自定义的,但是当出现相同学号时,系统能返回上级菜单,让用户重新输入。
对于班级、性别、电话号码都是后输入系统的,没有进行限制,此系统只有保存和调用数据的功能,并不能对数据进行判断,查验是否为合法班级。
合法电话号码等等。
但是编程过程中对数学和微机的成绩输入是有限制的,输入数据必须满足0<=输入值<=100,否则将返回上级菜单重新输入。
(五)运行实例:
以两组数据为例:
学号姓名班级性别电话数学成绩微机成绩
01qq01b6666668859
02ww02g8888887980
运行各功能函数如图所示:
(六)进一步改进
(1)、并未实现文件流的读取,目前程序只能逐条进行输入,不能实现批量读入,以后会做改进。
(2)、没有实现结果的输出保存功能,信息只能在系统中调用,当系统关闭后没有保存想要的数值等功能,以后要加强。
(3)、没有进行MFC的优化设计,程序只是单纯的存在编译器当中,不过利用C-Free5.0倒是能生成”函数.exe”文件,能单独拿出来在windows操作系统下使用。
(4)、对于信息的修改,用删除重新输入的方式来完成,并未构建直接修改函数。
(七)心得体会
由于本课题中的许多知识点都没有学过都要靠自己到课外的资料中去查找。
在用的时候难免出现这样那样的错误。
如开始设计出来的菜单不是预想的那样,而是总个窗中出现混乱。
解决的这个问题的办法是调整。
一个系统的菜单和提示信息非常重要。
如果没有这些用户根本不知道怎么用这个成绩管理系统。
在设计的调试过程中也无法顺利的完成调试工作。
有了一个清晰简单的菜单和一些提示信息这后,调试过程完成的非常顺利。
回顾此次课程设计,我感慨颇多,的确,从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识熟悉了,本次课程设计结束了,我们通过这次实践学到了许多知识。
学到了设计一个简单的系统。
要注意哪些方面。
也使我知道自己哪些方面做得还不够。
这不仅是程序设计,更是锻炼处理问题的能力,同时编写程序是件细心活,稍不留神就会出错,这就必须要求我对待事情要认真!
在编写程序的过程中,错误不断出现,不同的类型(如少写了一个符号,写错了字母,用错了函数等等)层出不穷,这考验我们待事细心,耐心,能不能坚持到底,不能半途而废。
但我总结出了一点点的经验如下:
1、要对系统的功能和要求做出详细的分析,并合理分解任务。
2、把分解出来的子任务,做给一个相对独立的模块。
3、在设计一个模块之前,要简单构想一下总界面的显视情况。
4、针对构想出来的界面进行程序的编写。
(八)对课程设计的建议
1、可以多做一些技术上的指导,多讲讲算法。
针对每个人的题目,有一些建设性的指导,比如我的题目中要求MFC设计,可以简单得培训一下,或许效果会更好。
2、课程设计,每个人的题目都不一样,相互之间交流还是很少的,我建议今后可以出一些相对难一点儿题目,分组进行设计,这样在过程中每个人都能得到锻炼,还能培养合作意识和团队精神,这对即将成为程序员的我们是很重要的。
(九)附录−−源程序
#include
#include
#include
#include
#include
usingnamespacestd;
classstudent
{
private:
stringnumber;
stringname;
stringclas;
chargender;
stringphone;
doublecomputer;
doublemath;
doublesum;
student*head;
student*curnode;
student*next;
floatjige_num;
floatyoushen_num;
floatjige;
floatyouxiu;
floatjigelv;
floatyoushenglv;
floatjigel;
floatyouxiul;
intcount;
public:
student();//不带参数的构造函数
//带数据域参数的构造函数,用来动态建立节点---------------------------------
student(string,string,string,char,string,double,double,double=0.0);
voidhelp();//用于描述帮助信息
voidsum_score();//总分函数
voidcin_app();//用于输入
voidapp_score(string,string,string,char,string,double,double);//动态的建立节点
voiddel_score();//删除全部节点
voiddisplist();//输出节点中的全部数据
voidlookup(int,string);//查找函数
voiddel_score(int,string);//删除函数
voidcompositor(int);//排序函数
voidtongji();//统计及格率和优秀率
};
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////student类的实现
voiderr_char();//输入错误字符检测函数
voidscore_err();//成绩范围检测函数,当输入成绩不在0到100之间时提示重新输入
student:
:
student():
next(NULL)//不带参数的构造函数
{
head=curnode=this;
}
//带参数的构造函数
student:
:
student(stringNumber,stringName,stringClas,charGender,stringPhone,doubleComputer,doubleMath,doubleSum):
next(NULL)
{
number=Number;
name=Name;
clas=Clas;
gender=Gender;
phone=Phone;
computer=Computer;
math=Math;
sum=Sum;
}
//////////////////////////////////统计及格率和优秀率?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
voidstudent:
:
tongji(){
intcount;
intjige_num=0,youshen_num=0,jige=0,youxiu=0;//分别算计算机和数学成绩的率人数和率
floatjigelv,youshenlv,jigel,youxiul;//jigelvstandforcomputer;jigelstandformath
intm=count;
for(inti=0;i<=m;i++)
{
if(computer>=60){jige_num=jige_num+1;}
if(computer>=85){youshen_num=youshen_num+1;}
if(math>=60){jige=jige+1;}
if(math>=85){youxiu=youxiu+1;}
}
jigelv=jige_num/m;
youshenlv=youshen_num/m;
jigel=jige/m;
youxiul=youxiu/m;
cout<<"计算机及格率:
"<"<cout<<"数学及格率:
"<"<jige_num=0;
youshen_num=0;
jigelv=0;
youshenlv=0;
}
////////////////////////////////帮助信息//////////////////////////
voidstudent:
:
help(){
cout<<"帮助信息"<cout<<"系统有对学生的学号、姓名、班级、性别、联系电话以及计算机、数学的成绩录入等功能"<cout<<"可以对学生的成绩按学号和姓名进行查寻,并且能对学生成绩实现排序功能。
"<cout<<"@2014Anpengfei.Allrightsreserved."<cout<<"";system("pause");
}
///////////////////////////////////////////////////////计算总成绩
voidstudent:
:
sum_score()
{sum=computer+math;}
voidstudent:
:
app_score(stringNumber,stringName,stringClas,charGender,stringPhone,doubleComputer,doubleMath)//动态建立节点
{
curnode->next=newstudent(Number,Name,Clas,Gender,Phone,Computer,Math);
curnode=curnode->next;
}
/////////////////////////////////////////////////////删除表中的全部数据
voidstudent:
:
del_score()
{
student*p;
curnode=head->next;
while(curnode!
=NULL)
{
p=curnode->next;
deletecurnode;
curnode=p;
}
head->next=NULL;
curnode=head;
cout<<"现已是一个空表"<cout<<"";system("pause");
}
///////////////////////////////////////////////////输出表中的全部数据
voidstudent:
:
displist()
{
if(head->next==NULL)
{
cout<<"!
这是一个空表!
"<cout<<"";system("pause");
return;
}
else{
student*pw=curnode;
curnode=head->next;
cout<<"学号姓名班级性别电话计算机数学总分"<while(curnode!
=NULL)
{
cout<number;
cout<name;
cout<clas;
cout<gender;
cout<phone;
cout<computer;
cout<math;
curnode->sum_score();
cout<sum;
if(curnode->next!
=NULL)
cout<else
cout<curnode=curnode->next;
}
curnode=pw;
cout<<"!
表中内容输出完毕!
"<cout<cout<<"";system("pause");
}
}
//////////////////////////////////////////////////////////////输入数据
voidstudent:
:
cin_app()
{
student*p=curnode;
boolb=0;
stringNumber;
stringName;
stringClas;
charGender;
stringPhone;
doubleComputer;
doubleMath;
intcount=0;
while
(1)
{
cout<<"学号:
";
cin>>Number;
curnode=head->next;
while(curnode!
=NULL)
{
b=(Number==curnode->number);
curnode=curnode->next;
}
if(!
b)
break;
else
{
cout<<"出现了相同的学号,请重新输入"<}
}
curnode=p;
cout<<"姓名:
";
cin>>Name;
count++;
curnode=p;
cout<<"班级(数字):
";
cin>>Clas;
curnode=p;
cout<<"性别(bforboy,gforgirl):
";
cin>>Gender;
curnode=p;
cout<<"电话:
";
cin>>Phone;
while
(1)
{
cout<<"计算机:
";
cin>>Computer;
while(cin.fail())
{
err_char();
cout<<"计算机:
";
cin>>Computer;
}
if(Computer>=0&&Computer<=100)
break;
else
score_err();
}
while
(1)
{
cout<<"数学:
";
cin>>Math;
while(cin.fail())
{
err_char();
cout<<"数学:
";
cin>>Math;
}
if(Math>=0&&Math<=100)
break;
else
score_err();}
this->app_score(Number,Name,Clas,Gender,Phone,Computer,Math);
cout<<"记录已添加!
"<cout<<"";system("pause");
}
/////////////////////////////////////////////////////////查找函数的实现
voidstudent:
:
lookup(intn,stringstr)
{
student*p=curnode;
boolb;
//定义i=1,当找到数据时把i置为0.用于输出没有找到数据
inti=1;
if(!
(curnode=head->next))
{
cout<<"!
这是一个空表!
"<curnode=p;
cout<<"";system("pause");
return;
}
cout<<"学号姓名班级性别电话计算机数学总分"<while(curnode!
=NULL)
{
switch(n)
{
case1:
b=curnode->number==str;break;
case2:
b=curnode->name==str;break;
default:
return;
}
if(b)
{
i=0;
cout<number;
cout<name;
cout<clas;
cout<gender;
cout<phone;
cout<computer;
cout<math;
curnode->sum_score();
cout<sum;
cout<}curnode=curnode->next;
}
//当i=1是代表没有找到数据
if(i)
{
cout<cout<<"没有匹配的数据"<}
curnode=p;
cout<<"以上是本次查找的结果!
"<cout<<"";system("pause");
}
/////////////////////////////////////////////////////////删除函数的实现
voidstudent:
:
del_score(intn,stringstr)
{
student*p=curnode,*pw=head;
boolb;
//定义i=1,当找到数据时