for(j=0;j
{if(p[j]->getid()==2)
p[j]->display();}
cout<<"\n输入任意数字返回主菜单:
";
cin>>c5;
switch(c5)
{
case1:
case2:
case3:
default:
gotolab2;}
default:
cout<<"\n输入错误!
\n";
break;
cout<<"\n输入任意数字返回主菜单:
";
cin>>c5;
switch(c5)
{case1:
case2:
case3:
default:
gotolab2;}
}
图1年级输出图
9.case6按性别输出,也同样指针p[j]指向对象的函数getsex()取性别来与“female”或“male”比较,相等则调用display函数输出学生信息。
界面如下:
图性别输出图
10.case7按姓名检索信息,管理员输入查询姓名后,系统利用类指针,从头开始p[i]->getname()==xingm(存放输入姓名的变量)查找配对的对象,如果if语句返回真值则执行display函数,接着switch接收任何数字返回主菜单,最后指针指向头结点。
case7:
system("cls");
cout<<"请输入学生的姓名:
";
cin>>xingm;
for(j=0;j
{if(p[j]->getname()==xingm)
{p[j]->display();}
}
cout<<"\n\n输入任意数字返回主菜单:
";
cin>>c7;
switch(c7)
{case1:
case2:
case3:
default:
gotolab2;}
11.case8按总分升序排序,使用for循环用指针变量p[ci]指向对象的成员函数getsum()取总分,将第一个对象依次和其他对象的比较,若前者总分大于后者,则通过两个中间变量htp和ztp把二者的学号与总分对换,以此类推直到排序完成。
接着用hao[j]、zong[j]输出信息。
case8:
模块功能及主要模块的流程图
●各模块功能
1.整个程序中构造了一个学生基类,它应该包括学生的共有属性,而两个年级学生作为派生类,可以从基类中继承共有的成员,并在此基础上增加了年级的特性。
其中学生基类中的函数如表1:
表基类模块表
Student
getid()
取年级号,用于识别一二年级
set()
在派生类中调用,录入信息
display()
在派生类中调用,显示信息
getnum()
取学号
getname()
取姓名
getsum()
取成绩总分
getsex()
取性别
getch()
取语文成绩
geten()
取英语成绩
getma()
取数学成绩
getborth()
取出生时间
该程序采用的是类类型来处理学生的所有基本信息。
通过对设计要求的分析构造基类Student,信息中应包含的学号、姓名、性别等就作为数据成员,而派生类一二年级学生继承了基类的一些属性,如姓名、学号等,但由于所处的年级不同,需要增加id号来识别年级。
而且它应该根据选择自动生成,不需要人为的录入。
所以getid()、set()、display()三个函数分别加上关键字virtual,使其成为纯虚函数,留待派生类定义调用同名函数却能实现不同的功能,这就体现了C++的多态性,既用不着重载函数,也能通过指针去调用派生类对象中的成员函数。
另外增加构造函数Student(),并对其数据成员进行赋初值,但id不用赋值,留待派生类分别进行定义。
而其余的8个函数则是用来取对象的数据。
代码如下:
classStudent
{public:
intid;在派生类中我分别定义了五个函数,主要是要体现录入、显示功能和重载,模块如表:
表学生1类模块表
Student1
getid()
取id=1,为一年级学生
set()
录入一年级学生信息
display()
显示一年级学生信息
ostream&operator<<(ostream&,Student1&)
一年级学生类中重载输出符
istream&operator>>(istream&,Student1&)
一年级学生类中重载输入符
表学生2类模块表
Student2
getid()
取id=2,为二年级学生
set()
录入二年级学生信息
display()
显示二年级学生信息
ostream&operator<<(ostream&,Student2&)
二年级学生类中重载输出符
istream&operator>>(istream&,Student2&)
二年级学生类中重载输入符
两个派生类需采用公用派生,这样便于调用基类中的函数,以及为当中的重载输入输出符的友元函数做准备。
前三个函数分别调用了基类中的纯虚函数,并加以定义。
首先在派生类的构造函数Student1()中定义id为1,二年级类Student2的为2,通过函数getid()取值;其次函数set()、display()实现了录入和显示的功能。
后两个函数是对输入输出符的重载作为友元函数,这是因为在输入信息时,会不小心引入或者需要有空格,重载就是要允许空格的存在,添加记录时使用。
Student1代码如下:
classStudent1:
publicStudent
件调试分析
●错误分析
整个的代码编写和程序运行的过程中,我遇到了很多困难,一开始会心烦气躁,不想往下写。
但在调试解决了一个个错误之后,我学习到很多东西。
主要出现的错误如下:
1.起初对派生类的概念没有搞清楚,基类中的函数无法调用,在将其改为虚函数之后,问题解决了;
2.输入密码验证时,设置最多能登录三次,否则结束运行,但是却出现无法跳出循环的情况,经过检查后发现,for语句一直执行返回操作,应在密码验证超过三次之后加上输出提示“已登录三次,请退出!
”及结束语句“return0”;
3.由于主函数过长,导致“{}”没有划分清楚,结果提示文件没有结束,在添加之后解决了这一问题;
4.最初是在Word文档中编写代码,使用了中文的标点符号,到了VC++无法运行,认识到:
原来任何一个细小的问题都会牵连整个程序,所以任何方面都要仔仔细细,不能粗心大意。
●系统特点及缺点
系统最终基本实现一个小型学生管理系统的主要要求,它代替了人工作业的复杂繁琐和易错,体现数字化的方便高效。
每一步操作系统都会给出提示,能够记录学生的重要信息,并及时实现增添、删除、修改、查询等功能,而平均成绩等能自动计算准确。
当输入错误时,系统提示并允许重新更改,凸显了人性化。
同时,系统还是暴露了许多缺点。
首先,界面不美观,缺乏特点;另外异常处理效果差,强制退出会导致资料丢失;而网络功能的欠缺,使其只能在单片机上运行,无法实现资源共享;数据安全仍然没有得到完善的解决,单一的密码识别无法做到万无一失,用户权限应该有更好的控制措施。
这些都需要在今后的运行调试中去慢慢改进,结合更多的新技术。
5.结语
经过一个月的努力,我的课程设计任务终于完成了。
在这次设计中我不但温故了以前学过的知识,更学到了很多新的知识。
对对象这个概念有了比较全面的认识和理解;对学生信息管理系统开发的基本框架和基本设计方法有了比较深入的理解;对页面的布局、美化有了新的认识;同时对VisualC++的应用变得更熟练了;通过本次课程的分析和设计,对如何进行需求分析、系统结构搭建等也有了一些更深的理解和体会。
在整个设计过程中,也出现过很多的问题,在不断学习的过程中我体会到:
a.设计是一个不断学习新鲜事物的过程,从设计初的摸不着头脑到最后能够顺利完成,我体会到在实践中学习的重要性。
首先必须掌握好课本上的理论体系,打牢知识基础,最重要的是能够学以致用,在设计过程中体现C++的思想及用途。
b.由于前期工作的不彻底,对系统的需求分析的要求认识不够清楚,使得后续的工作不得不经常返回去修改模块功能和个别代码。
使我体会到在设计中的每一步的重要性,如果上一个步骤不能很好的完成,在后续的设计将会付出几倍的代价。
c.设计过程中,由于要实现某些功能,互联网帮了我的大忙。
网络资源是一个丰富的共享体系,我通过在CSDN论坛上提出问题得到了很多热心网友的帮助,使我在很多地方少走了很多的弯路。
d.程序设计是一个漫长而琐碎的过程,有的时候仅仅因为一个标点符号或者数据类型,就会让整个程序无法运行。
所以设计需要我们耐心严谨的态度,从最初的模块设计、流程图分析就要小心翼翼,代码完成后还需要仔细检查和完善。
e.由于开始的设计思路不是很清晰,后期时间有比较紧,导致主函数繁多复杂,没有把各函数提出来,通过调用来实现,所以整个程序代码不太清晰明了,在以后的学习中要注意这个问题。
最后,整个过程是在同学和老师的帮助指导下完成的,要特别感谢徐老师和同学的付出!
参考文献
[1]潭浩强.C++面向对象程序设计.清华大学出版社,
[2]Robert,Alexander.C++数据结构与程序设计.清华大学出版社,
[3]梁普选.VisualC++程序设计与实践.清华大学出版社&北京交通大学出版社,
[4]郑莉,董渊.C++语言程序设计(第2版).清华大学出版社,2001.
[5]吕凤翥.C++语言基础教程.清华大学出版社,1999.