《C++课程设计(论文)学生信息管理系统设计报告.doc》由会员分享,可在线阅读,更多相关《C++课程设计(论文)学生信息管理系统设计报告.doc(19页珍藏版)》请在三一办公上搜索。
1、目录1.引言12设计依据及框图2l2.1设计思想2l2.2 设计框图、用户界面23.各模块功能及主要模块的流程图11l3.1 各模块功能11l3.2 主要流程图144.软件调试分析15l4.1 错误分析15l4.2 系统特点及缺点155.结语16参考文献17摘要这一款学生信息管理小系统采用面向对象的设计方法,主要是面对管理端,管理者可以通过密码登录进入系统对学生的各类数据统进行管理和维护。在主界面中主要设置了8个基本功能:增加学生、显示全部学生、计算平均成绩、删除一个学生、按年级输出学生信息、按性别输出学生信息、按姓名检索学生、按总分进行排序。这些功能基本上能满足学生管理的基本要求,此程序可以
2、初步体现课程设计的目标。采用Visual C+作为开发工具,界面简单友好,操作方便易行,便于维护,是一个功能比较完善的管理系统。关键字:学生系统;继承;重载;派生1.引言随着我国经济与计算机技术的日益发展,信息化技术逐渐取代传统人工作业,而学生也不例外。由于学生信息管理系统应用范围之广,版本各式各样,功能不尽管理系统相同。如何做出一个比较出众的学生系统,是对程序员的一种考验,这其中选择一种合适的程序设计语言、一个开发平台和编程思想是至关重要的。而建成一个数字化的学生信息管理系统,进行统一的管理,管理者就会对学生情况得到及时准确的了解,并根据具体情况提供及时的查询与修改。这样,就可以使学生的管理
3、变得更为高效。本系统是从学生信息管理系统最基本的功能进行设计和开发。设计希望用VC+编写一个界面美观流畅学生信息管理系统,管理者能够使用它对学生数据进行基本的查询、增加、删除、修改等,而且程序运行结果正确,操作方便,界面美观,逻辑层次清楚,程序结构合理,程序代码精简易懂。管理者通过密码登录进入学生信息管理系统,根据需要可以实现以下功能:增加学生、显示全部学生、计算平均成绩、删除一个学生、按年级输出学生信息、按性别输出学生信息、按姓名检索学生、按总分进行排序。该学生信息管理系统是采用面向对象的程序设计思想,选择C+语言进行编写的,整个程序由一个学生基类和两个年级派生类、若干个函数及主函数构成的。
4、使用面向对象的程序设计方法是设计一个复杂的软件系统时,首要的问题是确定该系统是有哪些对象组成的,并且设计这些对象。本学期,专业开设了C+面向对象课程设计,为我们提供了一个既动手又动脑独立实践的机会,这就要求根据所学的C+程序设计原理与程序设计的知识,能够针对一个小型的学生信息管理系统,进行系统的任务分析,系统设计,运行调试等,完成题目要求的功能。学会运用Visual C+ 6.0设计学生信息管理系统,从而达到了解设计一个小型应用系统的目的,提高适应实际,实践编程的能力。2设计依据及框图l 2.1设计思想学生信息管理系统是一个管理学生数据的服务平台,它应该包括登录界面,通过输入密码,核对正确进而
5、进入主菜单界面,然后通过需要选择不同的操作,最终能够达到查询,增添,删除等功能。l 2.2 设计框图、用户界面2.2.1通过对需求的分析和设计,我初步构造了程序的结构框图。如图2.1:开始登录界面年级输出录入信息平均成绩显示学生删除学生性别输出姓名检索总分排序结束程序图2.1 设计框图2.2.2根据各模块功能的逐步展开与分析,我完成了程序的全部代码设计,详见附录。在一次次的调试完善后,成功运行了这个学生管理系统。 1. 这个系统是作为管理端存在的,为了保证信息的隐蔽性及安全性,防止人为破坏,所以设计一个登录界面,需要输入的密码核实正确后方能进入主菜单操作,以此来确保只有预先获得密码有管理权限的
6、人才能使用该系统。在此还设定了登录次数不得多于三次,否则强制退出程序。这里将管理员输入的密码通过ifelse语句判断是否等于code(预先定义在后台存储的),若相等则跳转至主界面,否则提示重新输入。代码如下:lab1: system(cls); coutendlendlendl; coutco; if(co=code) goto lab2; else if(s=4) cout已登录三次,请退出!endl; return 0; else goto lab1; 2.在输入事先设定的密码,经检查正确,就到了主菜单界面,如下图;功能选择通过管理员输入数字,使用switch语句来判断接收,从而能够进入各
7、个子菜单。图2.1 主菜单图lab2:system(cls); coutttt*欢迎使用学生信息管理系统*endlendl; cout1.录入信息endl; cout2.显示全部学生endl; cout3.计算平均成绩endl; cout4.删除一个学生endl; cout5.按年级输出学生信息endl; cout6.按性别输出学生信息endl; cout7.按姓名检索学生endl; cout8.按总分排序endl; cout9.结束程序运行endl endl; coutgetin; switch(getin)注:lab2是一个标签,能通过之后的goto lab2从各级子菜单快速地跳转回来。3
8、 .case1是录入信息菜单,pi是存储学生信息的数组对象,同样通过switch语句判断选择,可以不限次地分别录入一、二年级的学生信息,完成后自动保存并返回主菜单。这里用类类型的指针变量指向已存在的最后一个记录,追加到最后一个记录后面,然后通过指针指向对象的成员函数set()从键盘上输入信息,用new开辟一段空间以存放该类型的对象,而统计创建的对象个数的变量i则进行自加运算,最后指针指回头结点。增加学生信息,界面如下:case 1: /录入信息lab3: system(cls); cout1.录入一年级生信息endl; cout2.录入二年级生信息endl; cout3.返回上一级菜单endl
9、; coutc1; switch(c1) case 1: pi=new Student1; pi-set(); i+; goto lab3; case 2: pi=new Student2; pi-set(); i+; goto lab3; default:goto lab2; break;图2.2 录入信息2图5case2为显示信息菜单,先通过for循环语句并利用类指针,从类数组第一个对象开始调用display()来显示,直到全部学生显示完毕,最后指针指回头结点,停止操作并返回主菜单。case 2: /显示全部信息 system(cls); cout学生信息n学号 姓名 性别(male/fe
10、male) 语文 英语 数学 年n; for(j=0;jdisplay(); coutc2; switch(c2) case 1:case 2:case 3:default: goto lab2图2.3 信息显示图6case3计算平均成绩,输入需查询学生的学号,在for循环中用if语句及指针来搜寻与之匹配的信息,如果存在则通过函数getsum()取总成绩,再计算出平均成绩并用指针pj-display()输出,否则给出错误提示信息并返回主菜单返回主菜单后。case 3:/计算平均成绩lab4: system(cls); coutendlendl; coutttt*计算平均成绩*endlendl;
11、 coutxh; for(j=0;jgetnum()=xh)double sum,ave; sum=pj-getsum(); ave=sum/3; cout学号 姓名 语文 英语 数学 平均成绩endl; coutgetnum() getname() getch() geten() getma() aveendl; else cout此学生不存在,请重新输入!endl;goto lab4; 注:这里的lab4为了便于返回重新查询设的标签,与goto lab4结合起来用。图2.4查询成绩图7case4为删除学生,可以按照姓名或者学号删除,当管理员输入相应选择后,程序对应先通过查找记录,再对对应对
12、象信息做删除,同样采用for循环跟if语句,每删除一个学生变量i就进行自减运算,是对象个数及时得到改正,最后指针指向头结点。按照学号删除的代码如下:int xuehao;coutxuehao;for(j=0;jgetnum()=xuehao) for(int del=j;deli;del+) pdel=pdel+1;i-;cout n成功删除!n;coutc3;switch(c3)case 1:case 2:case 3:default: goto lab2;图2.5 删除信息1图8case5是按年级输出学生,管理员选择所需年级后,用指针变量pj定位在年级号id所匹配的第一个对象处,接着执行d
13、isplay函数显示信息,j+后继续查找,用ji保证指针不超出范围(i作为变量统计学生录入个数)。case 5:/按年级输出学生信息 system(cls); coutttt*按年级输出学生信息* endlendl; cout1.按一年级生输出学生信息endl; cout2.按二年级生输出学生信息endlendl; coutc5; switch(c5) case 1: cout学号 姓名 性别 语文 英语 数学 年龄endl; for(j=0;jgetid()=1) pj-display(); coutc5; switch(c5) case 1:case 2:case 3:default: g
14、oto lab2; case 2: cout学号 姓名 性别 语文 英语 数学 年龄endl; for(j=0;jgetid()=2) pj-display(); coutc5; switch(c5) case 1:case 2:case 3:default: goto lab2; default: coutn输入错误!n; break; coutc5; switch(c5) case 1:case 2:case 3:default: goto lab2; 图2.6 1年级输出图9case6按性别输出,也同样指针pj指向对象的函数getsex()取性别来与“female”或“male”比较,相
15、等则调用display函数输出学生信息。界面如下: 图2.7 性别输出图10case7按姓名检索信息,管理员输入查询姓名后,系统利用类指针,从头开始pi-getname()=xingm(存放输入姓名的变量)查找配对的对象,如果if语句返回真值则执行display函数,接着switch接收任何数字返回主菜单,最后指针指向头结点。case 7: system(cls); coutxingm; for(j=0;jgetname()=xingm)pj-display(); coutc7; switch(c7)case 1:case 2:case 3:default: goto lab2;11case8
16、按总分升序排序,使用for循环用指针变量pci指向对象的成员函数getsum()取总分,将第一个对象依次和其他对象的比较,若前者总分大于后者,则通过两个中间变量htp和ztp把二者的学号与总分对换,以此类推直到排序完成。接着用haoj、zongj输出信息。case 8:/按总分排序 int ci; for(ci=0;cigetnum(); zongci=pci-getsum(); for(n=0;ni;n+) for(m=n+1;mzongm) htp=haom; haom=haon; haon=htp; ztp=zongm; zongm=zongn; zongn=ztp; system(cl
17、s); coutendlendl; coutttt*按总分排序* endlendl; cout学生学号 总分n; for(j=0;ji;j+) couthaoj zongjendl; coutc8; switch(c8) case 1:case 2:case 3:default: goto lab2; 图2.8 总分排序图12case9退出程序,用system(cls)清屏,break语句跳出。至此整个程序运行即switch语句结束。最后,由于main函数定义为int型,要记得加上return 0语句。而程序中使用了输入输出流iostream、string类型等,头文件应该包括:#includ
18、e#include#include#include#includeusing namespace std;这其中每个case后要加上break语句以便终止switch语句的执行,另外在一些经常需要跳转到的地方如主菜单处设为标签lab,之后使用goto语句即可跳转至此处。3.各模块功能及主要模块的流程图l 3.1 各模块功能 1.整个程序中构造了一个学生基类,它应该包括学生的共有属性,而两个年级学生作为派生类,可以从基类中继承共有的成员,并在此基础上增加了年级的特性。其中学生基类中的函数如表1:表3.1 基类模块表Studentgetid()取年级号,用于识别一二年级set()在派生类中调用,录
19、入信息display()在派生类中调用,显示信息getnum()取学号getname()取姓名getsum()取成绩总分getsex()取性别getch()取语文成绩geten()取英语成绩getma()取数学成绩getborth()取出生时间该程序采用的是类类型来处理学生的所有基本信息。通过对设计要求的分析构造基类Student,信息中应包含的学号、姓名、性别等就作为数据成员,而派生类一二年级学生继承了基类的一些属性,如姓名、学号等,但由于所处的年级不同,需要增加id号来识别年级。而且它应该根据选择自动生成,不需要人为的录入。所以getid()、set()、display()三个函数分别加上
20、关键字virtual,使其成为纯虚函数,留待派生类定义调用同名函数却能实现不同的功能,这就体现了C+的多态性,既用不着重载函数,也能通过指针去调用派生类对象中的成员函数。另外增加构造函数Student(),并对其数据成员进行赋初值,但id不用赋值,留待派生类分别进行定义。而其余的8个函数则是用来取对象的数据。代码如下:class Studentpublic:int id; /一二年级识别int num;string name;string sex;double ch,en,ma; /成绩int borth;int age; Student(); virtual int getid()=0; /
21、一二年级识别 virtual void set()=0; /纯虚函数,在派生类中调用 virtual void display()=0;int getnum(); /取学号string getname(); /取姓名 double getsum(); /取总成绩 string getsex(); /取性别 double getch(); /取各科成绩 double geten(); double getma(); int getborth();Student:Student() /基类构造num=0; name=”No name; ch=0;en=0;ma=0; borth=1900; int
22、 Student:getnum()/取学号return num;string Student:getname()return name;string Student:getsex()return sex;double Student:getsum()return ch+en+ma;double Student:getch()return ch;double Student:geten()return en;double Student:getma()return ma;int Student:getborth()return borth;2.而在派生类中我分别定义了五个函数,主要是要体现录入、
23、显示功能和重载,模块如表3.2:表3.2 学生1类模块表Student1getid()取id=1,为一年级学生 set()录入一年级学生信息display()显示一年级学生信息ostream& operator(istream&,Student1&)一年级学生类中重载输入符表3.3 学生2类模块表Student2getid()取id=2,为二年级学生 set()录入二年级学生信息 display()显示二年级学生信息ostream& operator(istream&,Student2&)二年级学生类中重载输入符两个派生类需采用公用派生,这样便于调用基类中的函数,以及为当中的重载输入输出符的友
24、元函数做准备。前三个函数分别调用了基类中的纯虚函数,并加以定义。首先在派生类的构造函数Student1()中定义id为1,二年级类Student2的为2,通过函数getid()取值;其次函数set()、display()实现了录入和显示的功能。后两个函数是对输入输出符的重载作为友元函数,这是因为在输入信息时,会不小心引入或者需要有空格,重载就是要允许空格的存在,添加记录时使用。Student1代码如下:class Student1:public Student /一年级学生类public: int id; /一年级生识别 Student1(); /Student1构造 int getid();
25、 /一年级生识别 void set(); void display(); friend ostream& operator(istream&,Student1&);void Student1:set() /录入信息函数cout输入一年级生信息nnumnamesex chenmaborth;Student1:Student1()/Student1构造id=1;int Student1:getid()return id;void Student1:display() /显示信息coutn一年级生:nid num name sex ch en ma 2009-borth endl;/一年级生类中重载
26、输入输出符ostream& operator(ostream& out, Student1& stu)outstu.id stu.num stu.name stu.sex stu.ch stu.en stu.ma stu.age (istream& in, Student1& stu) instu.numstu.namestu.sexstu.chstu.enstu.mastu.borth; return in;l 3.2 主要流程图1程序运行,管理员进入登录界面,需输入密码。后台通过其密码与数据库中的比较,通过验证后方可进入主菜单界面,否则重新输入,共有三次机会,之后结束程序。流程图如下所示:
27、是开始密码进入主菜单s=3结束否是否图3.1 登录流程图2当从主菜单中选择要进行的操作后,分别进入子界面,比如录入信息界面,操作流程图如下所示:否是开始选择1录入一年级生选择2结束否是录入一年级生返回图3.2 录入流程图4.软件调试分析l 4.1 错误分析 整个的代码编写和程序运行的过程中,我遇到了很多困难,一开始会心烦气躁,不想往下写。但在调试解决了一个个错误之后,我学习到很多东西。主要出现的错误如下:1起初对派生类的概念没有搞清楚,基类中的函数无法调用,在将其改为虚函数之后,问题解决了;2输入密码验证时,设置最多能登录三次,否则结束运行,但是却出现无法跳出循环的情况,经过检查后发现,for
28、语句一直执行返回操作,应在密码验证超过三次之后加上输出提示“已登录三次,请退出!”及结束语句“return 0”;3.由于主函数过长,导致“”没有划分清楚,结果提示文件没有结束,在添加之后解决了这一问题;4.最初是在Word文档中编写代码,使用了中文的标点符号,到了VC+无法运行,认识到:原来任何一个细小的问题都会牵连整个程序,所以任何方面都要仔仔细细,不能粗心大意。l 4.2 系统特点及缺点系统最终基本实现一个小型学生管理系统的主要要求,它代替了人工作业的复杂繁琐和易错,体现数字化的方便高效。每一步操作系统都会给出提示,能够记录学生的重要信息,并及时实现增添、删除、修改、查询等功能,而平均成
29、绩等能自动计算准确。当输入错误时,系统提示并允许重新更改,凸显了人性化。同时,系统还是暴露了许多缺点。首先,界面不美观,缺乏特点;另外异常处理效果差,强制退出会导致资料丢失;而网络功能的欠缺,使其只能在单片机上运行,无法实现资源共享;数据安全仍然没有得到完善的解决,单一的密码识别无法做到万无一失,用户权限应该有更好的控制措施。这些都需要在今后的运行调试中去慢慢改进,结合更多的新技术。5.结语经过一个月的努力,我的课程设计任务终于完成了。在这次设计中我不但温故了以前学过的知识,更学到了很多新的知识。对对象这个概念有了比较全面的认识和理解;对学生信息管理系统开发的基本框架和基本设计方法有了比较深入
30、的理解;对页面的布局、美化有了新的认识;同时对Visual C+ 6.0的应用变得更熟练了;通过本次课程的分析和设计,对如何进行需求分析、系统结构搭建等也有了一些更深的理解和体会。在整个设计过程中,也出现过很多的问题,在不断学习的过程中我体会到:a设计是一个不断学习新鲜事物的过程,从设计初的摸不着头脑到最后能够顺利完成,我体会到在实践中学习的重要性。首先必须掌握好课本上的理论体系,打牢知识基础,最重要的是能够学以致用,在设计过程中体现C+的思想及用途。 b由于前期工作的不彻底,对系统的需求分析的要求认识不够清楚,使得后续的工作不得不经常返回去修改模块功能和个别代码。使我体会到在设计中的每一步的
31、重要性,如果上一个步骤不能很好的完成,在后续的设计将会付出几倍的代价。c设计过程中,由于要实现某些功能,互联网帮了我的大忙。网络资源是一个丰富的共享体系,我通过在CSDN论坛上提出问题得到了很多热心网友的帮助,使我在很多地方少走了很多的弯路。d.程序设计是一个漫长而琐碎的过程,有的时候仅仅因为一个标点符号或者数据类型,就会让整个程序无法运行。所以设计需要我们耐心严谨的态度,从最初的模块设计、流程图分析就要小心翼翼,代码完成后还需要仔细检查和完善。e由于开始的设计思路不是很清晰,后期时间有比较紧,导致主函数繁多复杂,没有把各函数提出来,通过调用来实现,所以整个程序代码不太清晰明了,在以后的学习中要注意这个问题。最后,整个过程是在同学和老师的帮助指导下完成的,要特别感谢徐老师和同学的付出!参考文献1 潭浩强.C+面向对象程序设计.清华大学出版社,2008.32 Robert L.Kruse,Alexander J.Ryba .C+数据结构与程序设计.清华大学出版社, 2004.113 梁普选.Visual C+程序设计与实践.清华大学出版社&北京交通大学出版社,2005.84 郑莉,董渊.C+ 语言程序设计(第2版).清华大学出版社,2001.5 吕凤翥.C+语言基础教程.清华大学出版社,1999.