面向对象程序设计高校学籍管理系统Word格式.docx
《面向对象程序设计高校学籍管理系统Word格式.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计高校学籍管理系统Word格式.docx(46页珍藏版)》请在冰点文库上搜索。
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2、基本要求:
(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
(2)要求在设计的过程中,建立清晰的类层次;
(3)在系统的设计中,至少要用到面向对象的一种机制。
3、创新要求:
在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。
4、写出设计说明书
(三)、设计方法和基本原理:
1、问题描述(功能要求):
(1)能够从屏幕上读取一个学生的信息并将信息存入到数据文件中。
(2)能够将指定的信息从文件中删除。
(3)能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上。
(4)可以统计全部学生的总成绩,及其在班上的排名。
(5)能够统计各科的平均成绩及及格率。
(6)要求有错误提示功能,例如性别只能输入男女,输入错误提示重新输入。
(7)如果检索不到相应的信息应提示用户。
(8)扩展要求:
能先行设置本学期的科目
每个学生信息应该包括:
姓名、学号、成绩
成绩信息应该包括:
科目数量、各科目名称、各科目成绩
2、问题的解决方案:
根据系统功能要求,可以将问题解决分为以下步骤:
(1)写出需求分析(做什么);
(2)分析系统中的各个实体之间的关系及其属性和行为;
(3)根据问题描述,设计系统的类层次;
(4)完成类层次中各个类的描述(包括属性和方法);
(5)完成类中各个成员函数的定义;
(6)用户界面的设计;
(7)分析系统功能模块(系统流程图);
(8)代码编写,功能调试;
(9)完成系统总结报告以及系统使用说明书。
1.系统需求分析
1.程序的功能
这个程序的主要功能是能够从屏幕上读取一个学生的信息并将其信息存入到数据文件中;
能够将指定的信息从文件中删除;
能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上;
可以统计全部学生的总成绩,及其在班上的排名;
能够统计各科的平均成绩及及格率;
要求有错误提示功能,例如性别只能输入男女,输入错误提示重新输入,如果检索不到相应的信息应提示用户该信息不存在。
2、系统的设计目标
本系统要求工作人员输入并存储学生学籍的有关信息,如:
学生的姓名、学号、性别、年龄、班级等信息。
能够在查询学生信息的时候根据提示项输入所要查找的类型,再根据提示输入一项学生信息进行查找及修改,实现学生学籍的动态管理。
2.总体设计
1.系统功能分析
这个程序是用来对学生的学籍资料进行管理。
主要功能包括:
a.能够从屏幕上读取一个学生的信息并将其信息存入到数据文件中;
b.能够将指定的信息从文件中删除;
c.能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上;
d.可以统计全部学生的总成绩,及其在班上的排名;
e.能够统计各科的平均成绩及及格率;
f.要求有错误提示功能,例如性别只能输入男女,输入错误提示重新输入,如果检索不到相应的信息应提示用户该信息不存在。
2.系统功能模块划分与设计
Student类进行学生基本信息的录入及保存,学生基本信息包括姓名、学号、年龄、性别、班级、各科成绩等。
Stu类里定义了Student类的子对象,不但继承了Student类的数据及函数,还能对信息进行进一步的加工。
如:
学生信息的录入、显示、修改、查询、删除以及对学生成绩进行统计,算出全部学生的总成绩、班上排名、各科平均分和及格率等,main函数贯穿全局,利用mune函数对程序的各部分进行掌控。
3.详细设计
该程序应用了2个类,Student类和Stu类,其UML图如下:
Student类的UML图
Student类
#Tag:
bool
#name:
char
#num:
int
#sex:
#cname:
#age:
#mark:
#sum:
double
+Student()
+input():
void
+show():
Stu类的UML图
Stu类
#count:
int
#s:
Student
+insert():
+Show():
+search():
+Delete():
+update():
+tongji():
+mune():
4.系统调试与使用说明
4.1系统调试过程中遇到的问题及解决方法
4.1.1信息显示时出错
程序运行后出现以下界面
设置好科目信息,录入学生信息后。
选择3,本应将之前录入的信息显示出来的。
但没有将所有的学生信息显示出来,而是只显示了最后一个同学的信息。
经检查发现,show函数里没有使用循环,导致每输入一个学生信息时就会将前一个的学生信息覆盖,所以只能输入最后一个学生的信息。
信息显示的原有程序为:
voidshow()
{sum=0;
cout<
<
"
姓名:
name<
endl;
cout<
学号:
num<
性别:
sex<
年龄"
age<
班级:
cname<
for(inti=0;
i<
numb;
i++)
{sum+=mark[i];
cout<
sbj[i]<
成绩:
mark[i]<
}
总分为:
sum<
}
在Stu类中再定义一个Show函数,使用循环,然后这个Show函数里调用Student类中的show函数,便可以将所有的学生信息显示出来。
修改后的程序为:
voidStu:
:
Show()
{for(inti=0;
count;
{
if(s[i].Tag==true)
{s[i].show();
若是退出程序再运行,上来选择3就应该将所有的信息显示出来,可是显示的是乱码。
经检查后发现,在录入信息后,保存信息时,没有成功把信息保存到文件
中。
导致程序再次运行时打开文件后找不到相应的学生信息,所以输出了
乱码。
原程序中使用了C++中二进制文件的保存方式,file.seekg(0,ios:
end);
file.write((char*)&
stu,sizeof(Student));
而却没有对该保存方式进行相应的函数声明,造成未能成功保存信息。
后经老师帮忙修改才得以将信息保存到文件中。
修改后的程序,上来选择3就可以将所有已录入的学生信息显示出来。
4.1.2删除、修改、检索信息时出错
因为在信息录入时,保存信息的不对,致使要对信息进行删除、修改或检索等操作时,都未能在打开的文件中找到相应的信息,所以都不能对信息进行这些操作。
后经老师修改,都能正常显示。
在执行修改模块时还出现了不该有的错误。
修改学号的时候选择“y”也不能修改就直接跳到下一步。
经检查程序,发现将变量ch1写成了ch,导致不能识别输入的是否为“y”。
原程序为:
是否要修改学号?
(y/n)"
//修改学号的程序
charch1;
cin>
>
ch1;
if(ch=='
y'
||ch=='
Y'
)
{
cout<
请输入新学号:
以回车键结束"
cin>
s[i].num;
}
修改后程序:
if(ch1=='
||ch1=='
改正后的程序便可以对学号进行修改。
4.1.3统计信息时出错
在对已有的学生信息进行统计时出现了几个错误。
1.
计算全部学生总成绩时,未对all进行初始化,导致输出的是乱码。
原程序为:
tongji()
{
inti,j,t;
floatsbj;
floatcnum=0,pass=0;
doubleall,aver;
$$$$$1.全部学生总成绩,2.班上排名,3.各科平均成绩,4.及格率$$$$$"
**********请从1~4中选择*********"
cin>
t;
switch(t)
case1:
//全部学生总成绩
for(j=0;
j<
j++)
{s[j].sum=0;
for(i=0;
{s[j].sum=s[j].sum+s[j].mark[i];
}
s[j].name<
的总成绩为:
s[j].sum<
all=all+s[j].sum;
}
全部学生的总成绩为:
all<
break;
修改后程序为:
case1:
//全部学生总成绩
all=0;
break;
对all进行初始化后便能够正常显示出总成绩。
2.对已有学生的总成绩进行排名时出错。
经调试检查后发现在该程序中多写了一个for循环且少写了位置的交换,导致将排名信息输出时出错。
case2:
intn,zf[100];
;
doublepm[100],t;
for(j=0;
{s[j].sum=0;
for(i=0;
s[j].sum=s[j].sum+s[j].mark[i];
cout<
班上排名为:
\n"
for(j=0;
j++)
{pm[j]=s[j].sum;
zf[j]=j;
for(n=j+1;
n<
n++)
{if(pm[j]<
pm[n])
{t=pm[n];
pm[n]=pm[j];
pm[j]=t;
}
{cout<
第"
j+1<
名"
s[zf[j]].name<
pm[j]<
}
break;
修改后的程序为:
intn,z,zf[100];
doublepm[100],t;
for(i=0;
{s[j].sum=s[j].sum+s[j].mark[i];
pm[j]=s[j].sum;
for(j=0;
{for(n=j+1;
{if(pm[n]>
pm[j])
{t=pm[n];
pm[n]=pm[j];
pm[j]=t;
z=zf[n];
zf[n]=zf[j];
zf[j]=z;
break;
去掉最后一个for循环后,便可以正常输出排名信息。
3.
计算各科平均分时显示的信息出错。
经检查后发现在定义及格人数cnum和及格率pass时,将其定义为了int型,所以计算时科目及格率不对。
inti,j,t;
intcnum=0,pass=0;
\t$$$$$$$$$$请从以下项选择$$$$$$$$"
\t1.全部学生总成绩\t\t\t"
\t2.班上排名\t\t\t"
\t3.各科平均成绩\t\t\t"
\t4.各科及格率\t\t\t"
\t$$$$$$$$$$请从1~4中选择$$$$$$$$$"
inti,j,t;
将cnum和pass的类型改为float类后,便可以正常计算各科及格率。
4.2运行结果
4.2.1主菜单界面
4.2.2科目设置界面
4.2.3信息录入界面
4.2.4信息显示界面
4.2.5删除信息界面
4.2.6信息修改界面
4.2.7信息检索界面
4.2.8统计信息界面
计算总成绩
班上排名
各科平均分
各科及格率
5.结果分析
1.该程序的修改模块先提示输入要修改的学生姓名,再根据提示一项一项的进行修改。
不需要修改的项则保留原有的数据,使用起来简单方便快捷。
2.不足之处
a.选择进入某一功能模块之后,要对该模块执行操作完后才能推出到主菜单,使得有时候选择了错误的功能也无法返回。
b.程序利用了C++中二进制fstream的保存方法,该方法操作很不方便,容易出错。
c.该程序将保存与退出绑定在一起,要求一定要选择正确的退出方式退出才能将数据保存到文件,否则保存失败。
6.总结
这次课程设计,从拿到题目开始到现在,前前后后自己大概花了整整一个多星期去搞。
刚拿到题目时以为很简单,谁知真正写起程序来才发现它的困难之处。
一开始自己总是贪图程序简单功能又多,老想着写好了基本的模板就能用它来实现各项具体的要求。
于是在写程序时只是简单的把基本的东西写出来就完了,然而调试时才发现根本行不通。
要想写出好的程序就得下功夫,不能贪图简单而使用不懂的东西,这会使程序越写越吃力,越行不通。
就比如在将信息保存到文件时,本来可以用C语言里的方法,很快就能搞定的,自己却贪图简单而去使用未学过的C++里的方法。
不仅又花了大量时间去看书,而且还写不出能用的程序。
最后还得劳烦老师去修改。
通过这次课设才发现自己原来存在很多的不足。
很多东西以前都是只知道理论,并没有将其用到实践中来,导致使用时才发现原来什么都不会。
一些以前学过的知识也因长期没有运用,导致要用时却也不懂理了。
理解上存在误区,写程序时不能理好前后的逻辑关系,导致出现很多不该有的问题。
经过这一次的课设,我们再一次将学习中学到的各个知识点串联起来统一的运用到程序的设计中去,将理论与应用结合在一起。
再一次巩固了学过的知识,也加深了对新知识的了解。
附录
#include<
iostream.h>
iomanip.h>
fstream.h>
string.h>
stdlib.h>
math.h>
stdio.h>
intnumb=0;
//科目数量
charsbj[20][20];
//科目名称
classStudent//定义学生类
public:
boolTag;
//有效标志,true:
有效false:
无效
charname[20];
//姓名
intnum;
//学号
charsex[3];
//性别
charcname[20];
//班级
intage;
//年龄
intmark[10];
//各科成绩
doublesum;
//总成绩
Student()
Tag=false;
//保证新对象产生时被置为无效,即表示这个对象尚未填入信息
voidinput()
请输入学生信息"
cin>
name;
num;
性别(f,m):
sex;
while(strcmp(sex,"
f"
)!
=0&
&
strcmp(sex,"
m"
=0)
{
错误请重新输入!
cin>
break;
cname;
年龄:
age;
请输入成绩:
{
mark[i];
Tag=true;
voidshow()
{
sum=0;
sum+=mark[i];
};
/**************************科目设置函数***************************/
voidsubjects()
{
请设置科目数量"
请输入科目名称"
for(inti=0;
i+1<
科目名称:
sbj[i];
classStu//定义Stu类
Students[100];
public:
intcount;
//表示有效学生的数量
Stu(){count=0;
}//一开始没学生
voidinsert();
//录入信息
voidShow();
//显示信息
voidsearch();
//检索信息
voidDelete();
//删除信息
voidupdate();
//修改信息
voidtongji();
//统计信息
voidmune(fstream&
file,Stu&
c);
//菜单函数
friendfstream&
operator>
(fstream&
f,Stu&
operator<
fstream&
c)
f>
c.count;
f>
c.s[i].age>
c.s[i].cname>
c.s[i].name>
c.s[i].num>
c.s[i].sex>
c.s[i].sum;
//每次从文件读入一个学生信息
for(intj=0;
j++)f>
c.s[i].mark[j];
c.s[i].Tag=t