面向对象课程设计报告学生成绩管理系统.docx
《面向对象课程设计报告学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《面向对象课程设计报告学生成绩管理系统.docx(20页珍藏版)》请在冰豆网上搜索。
面向对象课程设计报告学生成绩管理系统
课程设计任务书
课程名称面向对象程序设计
课题学生成绩管理系统
专业班级计算机
学生姓名
学号
指导老师李珍辉陈淑红李杰军
审批
任务书下达日期2011年11月15日
任务完成日期2011年12月28日
设计内容与设计要求
1.课程设计目的:
面向对象程序设计课程设计是集中实践性环节之一,是学习完《面向对象程序设计》课程后进行的一次全面的综合练习。
要求学生达到熟练掌握C++语言的基本知识和技能;基本掌握面向对象程序设计的思想和方法;能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题,从而提高动手编程解决实际问题的能力。
2.课题题目
1)公司库存管理系统
2)高校学籍管理系统
3)高校工资管理系统
4)高校人事管理系统
5)通讯录程序设计
6)学生成绩管理系统
7)图书管理系统
8)文本编辑器的设计与实现
9)学生考勤管理系统
10)公司人员管理系统
3.设计要求:
⑴设计课题题目:
每位同学根据自己学号除以10所得的余数加1选择相应题号的课题。
随意换题者不记成绩。
⑵根据自己对应的课题完成以下主要工作:
①完成系统需求分析:
包括系统设计目的与意义;系统功能需求(系统流程图);输入输出的要求。
②完成系统总体设计:
包括系统功能分析;系统功能模块划分与设计(系统功能模块图)。
③完成系统详细设计:
包括数据库需求分析;数据库概念结构设计(E
-R图);数据库逻辑结构设计;类层次图;界面设计与各功能模块实现。
④系统调试:
调试出现的主要问题,编译语法错误及修改,重点是运行逻辑问题修改和调整。
⑤使用说明书及编程体会:
说明如何使用你编写的程序,详细列出每一步的操作步骤。
⑥关键源程序(带注释)
⑶按规定格式完成课程设计报告,将其打印稿(A4纸)上交给老师存档⑷不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计。
进度安排
第
17
周
星期一
8:
00—
—12:
00
星期二
8:
00——
12:
00
星期四
8:
00——
12:
00
第
18
周
星期一
8:
00——
12:
00
星期二
14:
30—
—18:
30
星期三
8:
00——
12:
00
课题6:
学生成绩管理系统
(一)、课程设计题目:
学生成绩管理系统
(二)、目的与要求:
1、目的:
(1)要求学生达到熟练掌握C++语言的基本知识和技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2、基本要求:
(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
(2)要求在设计的过程中,建立清晰的类层次;
(3)在系统中至少要定义四个类,每个类中要有各自的属性和方法;(4)在系统的设计中,至少要用到面向对象的一种机制。
3、创新要求:
在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。
4、写出设计说明书
(三)、设计方法和基本原理:
1、问题描述(功能要求):
设计一个实用的小型学生成绩管理程序,具有查询,检索和删除功能,并且能够打开或修改指定文件及将多个文件组成一个文件。
它完全使用类来实现,充分体现面向对象的程序设计特点。
要求:
实现主要功能:
建立文件,文件的存取和显示,删除记录,查询记录。
可以随时检
索,删除,或增加记录,也可以保存或取消新的记录
2、问题的解决方案:
根据系统功能要求,可以将问题解决分为以下步骤:
(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;
(2)分析系统中的各个实体及它们之间的关系包括属性和行为;
(3)根据问题描述,设计系统的类层次;
(4)完成类层次中各个类的描述(包括属性和方法);
(5)完成类中各个成员函数的定义;
(6)完成系统的应用模块;
(7)功能调试;
(8)完成系统总结报告以及系统使用说明书
1.系统需求分析1
2.总体设计1
3.详细设计3
4.系统调试5
5.结果分析8
6.总结8
7.程序代码9
1.系统需求分析
1.1系统设计的目的与意义:
现在的学校学生数量较多,各样的考试也比较频繁,因此需要一个学生成绩管理系统来对学生的成绩进行管理。
1.2系统功能需求:
本系统有四个类,Score类、Subject类、Student类、Class类,存储学生的个人信息、考试科目及成绩信息。
有学生成绩信息录入、学生成绩信息修改、学生成绩信息显示、学生成绩信息删除、学生成绩信息查询以及数据保存文件等功能。
2.总体设计
2.1系统功能分析:
系统通过调用函数来实现学生成绩信息录入、学生成绩信息修改、学生成绩信息删除、学生成绩信息查询以及数据保存文件等功能。
Insert()函数用于录入学生成绩及信息;Updatel()函数用来修改学生成绩及信息;Show()函数用于显示所有已有的
记录;Delete()函数用来删除学生成绩及信息;Searchi()及Search2()函数用来查询及信息;Save()函数用于将输入的信息存入文件内;主函数main()用于调用这
些函数。
2.2系统功能模块划分与设计:
本系统定义了Score类、Subject类、Student类以及Class类这四个类,定义了Insert()、Update1()、Show()、Save()>Delete()、Search1()及Search2()等函数来实现系统所需功能。
2.3系统功能模块图:
学生成绩管理系统
3.详细设计
3.1分数类的设计:
该类定义了一个整型变量用来存放分数,定义了设置份总数和显示分数的函数。
Score
-score:
int
+Score(s:
int=0)
+set1():
void+show1()
图3.1
3.2科目类的设计:
该类定义了一个Score类类型的变量,定义了一个字符数组用来存放科目名称,定义了设置和显示私有成员的函数。
Subject
-subject[20]:
char
-sc:
Score
+Subject()
+set2():
void
+show2():
void
图3.2
3.3学生类的设计:
该类定义了一个Subject类类型的数组,一个字符型数组和一个字符变量,两个整型变量以及设置和显示私有成员的函数。
Student-name[20]:
char-num:
int-S:
char-n:
int-p1[8]:
Subject+Student()+set3():
void+show3():
void+getNU1():
int
图3.3
3.4班级类的设计:
该类定义了一个Student类类型的变量、字符型数组、整型及设置和显示私有成员的函数等。
Class
-name[20]:
char-num2:
int+Class()+getNU():
int+set4():
void+show4():
void
图3.4
3.5各个类的关系描述
图3.5.1
Student
-name[20]:
char
-num:
int
-S:
char
-n:
int
+Student()
1
r
>仁*
-p1[8]
Subject
-subject[20]:
char
+Subject()+set2():
void+show2():
void
1
图3.5.2
图3.5.3
4.系统调试
4.1在调试过程中,出现了下面一些错误:
1输入数据时,输错了数据的类型会造成死循环,因此输入时需要注意。
2—开始主界面输入非正确字母时,没有提示错误。
容易造成用户误解,在主函数的switch语句结朿处加上default:
cout<<"选择错误,请从新选择!
";就可以了
4.2具体调试过程:
主界面
闵入除改录件甘录删傷记文顼绩绩绩部入统Jm^^^主王生生生示番hh盂于显记iaabcdef
学生成绩录入
请输入学生的学号.
学生成绩查询
++:
H0
学生成绩显示
班级:
计算机班号:
10肛姓名二张三性别加学号認
C++:
90
学生成绩修改
请樹入所要修改的学峑的姓名:
簷话入所要修改的学生的学号:
||
数
分
及
字
名
>-在号名号^所卅n学性课名:
蛊生生Re数该该養该每科分
IAIJAIJAIA吹11AJA
+输请看溝溝请青溝:
+溝0UIL1■-IL>1LP1■0Jbtll-■rVfu—rTL
记录存入文件
询入除改录件查录删修记文绩绩绩入统成成成威全生生生生示a.b.cd.efg-
保存文件成珈
学生成绩删除
询入除改录件查>.删修记文绩绩绩绩部入蟒成成咸威全44^生生主兰示番盂于显记退
请输入舉进行操作的学注的学弓
5.结果分析
程序总共设计了四个类,满足了课题对类的要求,在设计的过程中,建立了较为清晰的类层次,也利用了面向对象的方法以及C++勺编程思想来完成系统的设计,做到了用文件存储学生成绩信息、从文件中读取学生成绩信息、修改信息、查询信息、删除信息显示文件中存储的信息等要求。
而且界面简洁,容易操作。
但是程序太长,不够简练,导致出现错误很难发现和修改。
6.总结
首先,接到设计题目之后,在对本题目进行分析的时候,我懂得了一个很重要的道理,那就是说一个程序的产生需要一个对题目要求有一个正确全面的分析。
其次,就该考虑程序算法的问题了,一个好的算法是一个好程序的灵魂,也决定了一个程序的质量。
两个星期的课设虽然有些疲劳和困倦,但带给我很多的收获。
C++已经学了一个学
期了,有许多知识都存在似懂非懂的现象,这种现象通过实际的上机操作,已经减少了许多。
对这些知识也有了更深的理解和很好的掌握。
也有很多理论上说得过去的代码,但到了实际操作,却是行不通的。
这种困惑,有许多已经通过实际操作解决了,并能够深刻认识,但也有很多没有明白。
只能避过这些方法,换方法实现。
在课程设计之前,因为有了综合实验的经验与教训,明白了写代码这一步是非常重要的,因为当你把代码输入电脑,并用编译器将其运行,发现通过不了,再来检查找出问题,这是一件非常辛苦的事情,也很浪费时间。
于是在课程设计的时候,我花了四天的时间来规划与写代码,将要实现的内容分析清楚,才把代码输入电脑。
我觉得写程序,应该先找到该程序中的核心地方,用多种方法来实现该核心,这才可能避免等到发现逻辑上或者编译器不支持上的错误,才来想补救的措施,这样花费时间在想补救措施是很不值得的。
这次的课程设计,真是让我充分的感觉到了要自己设计一个程序是多么的难,以及学习好C++是多么的重要。
在这个程序的设计过程中,我清楚的意识到自己的水平有多么的薄弱,课程的知识学得有多么的不扎实。
看网上的例子好像觉得也没那么难,自己一上机实际操作就出现了很多问题,调试的时候系统总是在报错,还有很多警告,每增加一个函数就要调试好久,有时候应为少了一个大括号或是分号,导致要找很久很久。
虽然系统可以运行,也具有了一些基本的功能,但我意识到了自己有太多的不足。
以后还会有很多的课程设计,一定要吸取这次的教训,把知识学懂学透学精,真正的为我所用,这样走上社会我才能真正的发挥所长。
7.程序代码
#include#include
#include
usingnamespacestd;
intM=100;
staticintM2=0;
classScore{//分数类private:
intscore;
public:
Score(ints=0){
score=s;
}
voidset1(){
cout<<"请输入分数:
"<cin>>score;
}
voidshow1(){
cout<<":
"<}
};
classSubject{//科目类
private:
Scoresc;
charsubject[20];
public:
Subject(){
for(inti=0;i<20;i++)
subject[i]=0;
}
voidset2(){
cout<<"请输入科目名称:
"<cin>>subject;
sc.set1();
}
voidshow2(){cout<}
};
学生类
classStudent{//
private:
Subjectp1[8];
charname[20];
intnum;
charS;
intn;
public:
Student(){
for(inti=0;i<20;i++)
name[i]=0;
num=0;
S=0;
}
voidset3();
voidshow3();
intgetNU1(){returnnum;}
char*getNA1(){returnname;}};
voidStudent:
:
show3(){inti;
coutvv"姓名:
"<"<
"<p1[i].show2();
voidStudent:
:
set3(){//学生类修改函数
inti;
cout<<"请输入学生姓名:
";
cin>>name;
cout<<"请输入该生学号:
";
cin>>num;
cout<<"请输入该生性别:
";
cin>>S;
cout<<"请输入每门课程的名字及分数."<for(i=0;i<8;i++)
p1[i].set2();
}
classClass{//班级类
private:
Studentstu;
charname2[20];
intnum2;
public:
Class(){
for(inti=0;i<20;i++)
name2[i]=0;
num2=0;
}
intgetNU(){returnstu.getNU1();}
stringgetNA(){returnstu.getNA1();}
voidset4(){
cout<<"请输入该生所在班级名称:
";
cin>>name2;
cout<<"请输入该班班号:
";
cin>>num2;
stu.set3();
}
voidshow4(){
cout«"班级:
"<\t"<stu.show3();
}
friendvoidSearch1(Classc1[],intcount1);
friendvoidSearch2(Classc2[],intcount2);
friendvoidUpdate1(Classc3[],intcount_d);
friendvoidDelete(Classc4[],int*count_c);
friendvoidInsert(Classc5[],int&count_a);
}b[100];
voidSave(Classc6[],intcount)//记录存入文件函数
{
fstreamfile("class.dat",ios:
:
out|ios:
:
binary);
if(!
file)
{
cout<<"filecoun'topen."<abort();
}
for(inti=0;ifile.write(reinterpret_cast(&c6[i]),sizeof(c6[i]));
file.close();
}
显示记录函数
voidShow(Classc7[])//{
inti=0;
for(i=0;c7[i].getNU()!
=0;i++)c7[i].show4();
}
voidInsert(Classc5[],int&count_a)//信息录入函数
{
inti,in_number,n=0;if(count_a==M)
{
cout<<"空间已满!
";
return;
}
cout<<"请输入学生的学号:
"<do
{
do
cin>>in_number;
for(i=0;i{
if(c5[i].getNU()==in_number)
cout<<"已有相同的学号,请重新输入!
"<}
}while(c5[i].getNU()==in_number);
if(in_number<1)
cout<<"输入错误,请重新输入大于零的整数!
"<}while(in_number<=0);
i=count_a;
c5[i].set4();
count_a++;
cout<if(n!
=0)
cout<<"学生成绩录入成功!
"<}
voidSearch1(Classc1[],intcount1)//按学号查询信息函数{
inti,number,flag=1,n=0;
cout<<"请输入所要查询的学生的学号:
"<do
{
cin>>number;
if(number<=0)
cout<<"输入错误,请重新输入大于零的整数!
"<for(i=0;iif(c1[i].getNU()==number)
{
c1[i].show4();
flag=0;n=n+1;
}
if(n==0)
cout<<"没有查询到该学生的资料!
"<}
voidSearch2(Classc2[],intcount2)//按姓名查询信息函数
{
inti,n=0;
charnam[20];
cout<<"请输入所要查询的学生的姓名:
"<>nam;
for(i=0;i{
c2[i].show4();
n=n+1;
}
if(n==0)
cout<<"没有查询到该学生的资料!
"<}
voidUpdate1(Classc3[],intcount_d)//信息修改函数{
inti,n=0,flag=1,m;
charnam[20];
cout<<"请输入所要修改的学生的姓名:
"<cin>>nam;
for(i=0;i{
if(c3[i].getNA()==nam)
{
cout<<"请输入所要修改的学生的学号:
"<cin>>m;
for(i=0;i{
if(c3[i].getNU()==m)
{
c3[i].set4();
flag=0;n=n+1;
}
}
}
break;
}
if(n!
=0)
cout<<"修改成功!
"<if(n==0)
cout<<"没有查询到该学生的资料!
"<}
voidDelete(Classc4[])//信息删除函数
{
fstreamfile("class.dat",ios_base:
:
in|ios_base:
:
out|ios_base:
:
binary);
inti=0;
for(i=0;i<100;i++)
{
file.read(reinterpret_cast(&b[i]),sizeof(b[i]));
}
for(i=0;b[i].getNU()!
=0;i++)
M2=i;
Classc9;
intn=0,number,flag=1;
cout<<"请输入要要进行操作的学生的学号:
"<>number;
for(i=0;i{
if(c4[i].getNU()==number)
{
for(i;iflag=0;
(M2)--;n=1;
Save(b,M2);
break;
}
}
if(n==0)
cout<<"没有查询到可以删除的资料!
"<if(n!
=0)
cout<<"资料删除成功!
"<}
intmain()
{
chara1;
fstreamfile("class.dat",ios_base:
:
in|ios_base:
:
out|ios_base:
:
binary);
do
M2=i;
cin>>a1;
switch(a1)
{
case‘a':
{
cout<<"\t\t\t请继续选择:
"<cout<<"\t\t\t\t2.按姓名查询信息"<intx;
cin>>x;
switch(x)
{
case1:
Search1(b,M2);break;
case2:
Search2(b,M2);break;default:
cout<<"选择错误,请重新选择!
"<}
break;
case‘b':
Insert(b,M2);break;
case‘c':
{file.close();Delete(b);
}break;
case‘d':
Update1(b,M2);break;
case‘e':
Show(b);break;
case‘f':
{file.close();Save(b,M2);cout<<"保存文件成功!
"<file("class.dat",ios_base:
:
in|ios_base:
:
out|ios_base:
:
binary);
};break;
case‘g':
{file.close();break;}
default:
cout<<"选择错误,请重新选择!
"<}
}while(a1!
='g