版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象程序设计课程设计报告专 业: 姓 名: 学 号: 指导教师: 二o一一 年 九 月 日一、课程设计问题描述设计完成一套学生成绩管理系统,要求能够实现学生成绩管理的基本功能,包括:学生成绩的键盘录入、学生成绩的条件输出、学生成绩的条件抽取、学生成绩的条件排序、条件修改。其中具体设计内容如下:(1)从键盘输入学生基本信息(学号、姓名、英语成绩、高数成绩),计算每个学生的平均成绩,并将数据存入文件student.txt文件中。(2)按如下格式输出大于等于平均成绩的学生信息: 学号 姓名 英语 高数 平均成绩(3)将两门可课都不及格的学生信息抽取出来,另存入文件bat.txt中。(4)提供按学
2、号进行查询的功能。(5)尽可能使用运算符重载以简化操作。(6)使用多文件结构和菜单操作,并考虑相应的操作权限。二、课程设计目的和要求:经过一学期对面向对象程序设计的初步学习,对于面向对象程序设计有了一定的编程基础,为更好地理解和掌握面向对象程序设计,将通过为期一周的上机实践编程,运用面向对象程序设计完成课程设计编程任务的同时,补充和完善面向对象程序设计的相关知识。三、系统环境(包括硬件环境和软件环境)无。四、程序设计思想描述首先明确这是一个学生成绩管理系统,那么这个系统应该具备管理学生成绩的基本功能。同时考虑到使用对象的不同,应考虑到权限方面的相应开放,为简便用户操作以及个人能力限制将采用文字
3、菜单模式。1、成绩管理系统成绩(中心)学生(以学生为管理对象)学生属性和方法。*学生类 属性包括:学号、姓名、英语成绩、高数成绩、平均成绩、名次(以链表的当前位置为计)。*学生类 方法包括:构造函数、析构函数、设置函数、修改函数以及获取相应属性的函数。2、操作权限教师教师特权。*教师特权 包括:成绩录入、条件抽取、条件修改、排序以及删除。操作权限学生普通权限。*教师与学生共同权限 包括:条件查询。3、操作菜单:(一级菜单)1、教师(需要帐号验证),2、学生,0、退出系统(二级菜单)1.1、成绩录入,1.2、查询,1.3、成绩修改,1.4排序,1.5、查看数据,1.6、删除1.0、返回上一层菜单
4、(三级菜单)1.1.1、单个录入,1.1.2、批量录入,1.1.0、返回上一层菜单(三级菜单)1.2.1、学号查询,1.2.2、范围查询、1.2.3、不及格查询(两门都低于60分)(包含保存功能),1.2.0、返回上一层菜单(三级菜单)1.3.1、英语成绩修改,1.3.2、高数成绩修改,1.3.0、返回上一层菜单(三级菜单)1.4.1、平均分成绩排序,1.4.2、英语成绩排序,1.4.3、高数成绩排序,1.4.4、学号排序,1.4.0、返回上一层菜单(三级菜单)1.6.1、按学号删除,1.6.2、按姓名删除,1.6.0、返回上一层菜单(二级菜单)2.1、个人查询,2.2、相近查询,2.0、返回
5、上一层菜单(三级菜单)2.2.1、平均分相近查询,2.2.2、英语相近查询,2.2.3、高数相近查询,2.2.0、返回上一层菜单几点说明:1、在进入二级菜单时先从文件中读取数据,若没有数据则只能允许选择教师工作模式。2、进入教师工作模式需要验证码,设置密码为123456,目前不支持密码修改。3、将所有功能函数设计模块化,提高代码利用率。4、利用模块化的功能函数,可以实现函数间的相互调用,实现菜单工作模式,大大降低编程难度,同时因为目前绝大多数电脑的cpu、内存等资源的性能比早期的计算机有了很大地提高,完全可以满足合理的函数调用。5、为实现学生成绩的排序功能,将采取链表的工作方式,同时利用此模式
6、实现其他功能。6、学生属性中的学号与姓名将采用字符窜变量来标记以应对不同的学号和姓名模式。五、程序结构(包括类设计、主程序设计及流程图)学生类的设计:属性:学号、姓名、英语成绩、高数成绩、平均成绩、排名、指针域方法:学号、姓名、英语成绩、高数成绩相应的修改函数,获取属性的相关函数,构造及析构函数。链表类的设计:属性:链表头、链表长度、链表是否排序、当前结点在链表中的排名。方法:增加结点的函数,按学号、英语成绩、高数成绩排序、查询的函数,保存链表的函数,读取数据的函数,以学号、姓名删除结点的函数,获取排名的函数,获取属性值的相关函数。几点说明:1、 将链表类作为学生类的友元类可以实现在链表方法中
7、操作学生类,降低编程难度。2、 关于主程序的设计,由于采用的是菜单操作模式,关键在于功能的模块化,也就是类相关功能的实现,故主程序的设计将会相对简单,只要安排好相应函数之间的调用即可实现相应的功能。3、 关于流程图,采用上述菜单功能即可实现所有流程的切换,以下将给出工作时的菜单流程。六、程序测试案例一级菜单教师二级菜单(有数据)教师二级菜单(无数据)学生二级菜单增加结点菜单查询菜单排序菜单修改菜单删除菜单相近查询菜单七、设计中遇到的问题及解决方案1、为了解决菜单的返回及流程的衔接,我采用了函数调用的方法。2、为了解决由于学号和姓名不同形式造成的影响,我采用了字符串变量的方法来记录相关的信息,同
8、时借用字符串中的方法find_first_of()来检查菜单选择的输入是否正确,这点也可以应用到输入姓名和学号时进行检查。3、在进行不及格同学的信息收集的时候,为了避免影响到链表,同时又需要利用现成的链表方法来操作,所以采用重新定义一个链表对象来装载收集到的信息。4、在对链表的结点进行排序的时候,为简化操作,定义一个空白结点,插入链表头部,在操作完毕后对空白结点给予删除。5、为了达到权限的控制问题,采用了密码验证的简单方法,而为了实现密码验证则是采用了字符串变量的比较。八、程序源代码见附录。九、总结和体会经过一周的课程设计训练,个人的编程能力得到了很好的考验,同时也对软件开发的过程有了一个大致
9、的了解。一周的设计学习,我发现,软件开发前的需求分析是至关重要的,需求分析的深浅往往能决定一个软件的好坏。尽管在开始编程之前,本人花了一个早上的时间来构思分析,但在后期的开发设计中,仍然发现功能缺陷,为此还是花费了不少功夫来修修补补,而在此工程中,往往会出现一些贯穿整个程序的问题,而这种缺陷往往是致命的,除了尽可能修补之外,有时候往往需要重新构思,不论是前者还是后者,这都无异于重新编写程序,而这往往容易削弱个人的编程兴致,而这也是一个十分负面的影响,由此可见,软件开发前的需求分析不论是对自己还是对程序都是至关重要的,这点在团队协作中尤其得到体现。或许个人开发软件的时候容易产生边写边想,便想边写
10、的习惯,而这也是受需求分析好坏的影响。同时,在完成课程设计的基本要求,但为了提升自己的能力,磨练自己,对自己提出了相对较高的要求,要求自己开发出功能较完善的程序,而这次的课程设计也基本达到了自己的要求,相对而言还是比较满意的。以此同时,我强烈感觉到所学的知识实在是有限,而此次的课程设计无非是把有限的知识加以利用罢了。十、参考文献(按“作者,书名,出版社,出版时间”格式逐一列出,如下:)1 、陈波 吉根林c语言程序设计教程 中国铁道出版社 2010年2 、谭浩强 c+程序设计 清华大学出版社 2010附录stdafx.h#include#include#include#includeiomani
11、pusing namespace std;extern class link; /引用性声明/定义一个学生类class studentpublic:friend link;student();student(string cnum,string cname,float cenglish,float cmath);int changenum(); /修改学号,修改成功返回1int changename(); /修改姓名,修改成功返回1int changeenglish(); /修改英语,修改成功返回1int changemath(); /修改高数,修改成功返回1int changedouble(
12、); /同时修改英语,高数,修改成功返回1int getrank(); /获取当前排名,失败返回0student * getnext(); /获取下一个对象地址string getnum(); /获取当前对象学号string getname(); /获取当前对象姓名float getaverage(); /获取当前对象平均分float getenglish(); /获取当前对象英语成绩float getmath(); /获取当前对象高数成绩student(); /创建析构函数private:string num; /学号string name; /姓名float english; /英语成绩f
13、loat math; /高数成绩float average; /平均成绩int rank; /排名(以平均分为准)student* next; /结点指针域;/定义一个链表类class linkpublic:link();int addone(); /增加一个结点,头部插入法int addmore(int n); /增加多个结点int sortbyaverage(); /排序结点(平均分),降序为准(冒泡排序)int sortbyenglish(); /排序结点(英语)int sortbymath(); /排序结点(高数)int sortbynum(); /排序结点(学号),以升序排列stud
14、ent * searchbynum(); /查找结点(学号),查找成功返回查找对象student * searchbyname(); /查找结点(姓名),查找成功返回查找对象,采用链表遍历查找int savelink(); /保存链表,成功返回1int savebat(); /保存不及格学生信息int readlink(); /读取链表int getlen(); /计算链表长度int delbynum(); /删除结点,通过学号,删除成功返回1int delbyname(); /删除结点,通过姓名,删除成功返回1void showone(student* p); /显示结点,此处用运算符重载v
15、oid showlink(student* p); /显示链表int getrankbyaverage(); /经排序后获取平均分排名,排名成功返回1int getrankbyenglish(); /经排序后获取英语排名,排名成功返回1int getrankbymath(); /经排序后获取高数排名,排名成功返回1void searchbat(); /搜索两门都不及格学生float getallaverage(); /计算获取平均分的平均分float getenglishaverage(); /计算获取英语平均分float getmathaverage(); /计算获取高数平均分link();
16、 /创建析构函数student* head; /定义一个链表头private:int flag; /标记当前结点的位置int len; /当前链表长度int sortflag; /检查是否已经排序,0表示未排序;/定义菜单选项void thirdmenu(); /三级菜单void secondmenu_t(); /教师二级菜单void secondmenu_s(); /学生二级菜单void firstmenu( link &link ); /一级菜单void menu( link &link );/操作菜单界面void greet(); /问候界面void checkid( link &lin
17、k); /验证身份,默认密码123456void thirdmenu_add( link &link ); /教师三级菜单void thirdmenu_sort( link &link );void thirdmenu_change( link &link );void thirdmenu_changebynum( link &link );void thirdmenu_changebyname( link &link );void thirdmenu_changebymath( link &link );void thirdmenu_changebyenglish( link &link )
18、;void thirdmenu_sortbynum( link &link );void thirdmenu_sortbymath( link &link );void thirdmenu_sortbyenglish( link &link );void thirdmenu_sortbyaverage( link &link );void thirdmenu_search( link &link );void thirdmenu_addone( link &link ); /三级菜单,单个录入void thirdmenu_addmore( link &link ); /三级菜单,批量录入voi
19、d thirdmenu_searchbynum( link &link ); /三级菜单,学号查询void thirdmenu_searchbyrank( link &link );void thirdmenu_searchbad( link &link );void secondmenu_t( link &link ); /教师二级菜单void secondmenu_ssearchone( link &link );void secondmenu_ssearchnear( link &link );void thirdmenu_searchmathnear( link &link );voi
20、d thirdmenu_searchenglishnear( link &link );void thirdmenu_searchaveragenear( link &link );void secondmenu_s( link &link ); /学生二级菜单void thirdmenu_searchbat( link &link );void thirdmenu_changebydouble( link &link );void fourthmenu_rankofaverage( link &link );void fourthmenu_rankofenglish( link &link
21、);void fourthmenu_rankofmath( link &link );void thirdmenu_del( link &link );void thirdmenu_delbynum( link &link );void thirdmenu_delbyname( link &link );stdafx.cpp#include stdafx.hstatic int id=0; /定义一个全局变量来记录是否经过身份验证static int read=0; /定义一个全巨变量来记录是否读取过student.txt中的数据/student 类的实现student:student() e
22、nglish=0; math=0; average=0; rank=0; next=null; student:student(string cnum,string cname,float cenglish,float cmath):num(cnum),name(cname),english(cenglish),math(cmath)average=(english+math)/2; /平均数在输出时注意格式rank=0;next=null;int student:changenum() /修改学号,修改成功返回1string cnum;coutcnum;if( num = cnum )ret
23、urn 0;num=cnum;return 1;int student:changename() /修改姓名,修改成功返回1string cname;coutcname;if( name = cname )return 0;name=cname;return 1;int student:changeenglish() /修改英语,修改成功返回1float cenglish;coutcenglish;if( english = cenglish )return 0;english=cenglish;return 1;int student:changemath() /修改高数,修改成功返回1fl
24、oat cmath;coutcmath;if( math = cmath )return 0;math=cmath;return 1;int student:changedouble() /同时修改英语,高数,修改成功返回1if( changeenglish() & changemath() )return 1;return 0;int student:getrank() /获取当前排名,失败返回0return rank;student * student:getnext() /获取下一个对象地址return next;float student:getaverage() /获取当前对象平均分
25、return average;float student:getenglish() /获取当前对象英语成绩return english;float student:getmath() /获取当前对象高数成绩return math;string student:getnum() /获取当前对象学号return num;string student:getname() /获取当前对象姓名return name;student:student() /创建析构函数/link 类的实现link:link() head=null; flag=0; len=0; sortflag=1; int link:a
26、ddone() /增加一个结点,头部插入法float cenglish=0,cmath=0;string cnum,cname;student* p;coutcnum;cincname;cincenglish;cincmath;p=new student(cnum,cname,cenglish,cmath);p-next=head;head=p;sortflag=0; /链表被改动,未排序getlen();cout数据录入成功!endl;return len;int link:addmore(int n) /增加多个结点for(int i=0;in;i+)cout第i+1个n;addone()
27、;sortflag=0; /链表被改动,未排序getlen();cout成功录入n个学生数据!next=head;head=p;student *pcurrent,*pbefore,*pafter;for(int i=1,n=0;inext;pafter=pcurrent-next;while( n!=0 ) /用n 来判断比较停止位置if( pcurrent-average average )pbefore-next=pcurrent-next;pcurrent-next=pafter-next;pafter-next=pcurrent;pbefore=pbefore-next;/交换完后会
28、出现pcurrent 与 pafter 位置倒换pafter=pcurrent-next;/此时应该纠正elsepbefore=pbefore-next;/没有交换则平行迁移指针pcurrent=pcurrent-next;pafter=pafter-next;n-;head=head-next;/delete p; /此结点如何删除?sortflag=1; /链表被排序return len;int link:sortbyenglish() /排序结点(英语)getlen();student *p=new student(); /定义一个空白结点,插入链表以简化排序操作,此结点不计入 len
29、中。p-next=head;head=p;student *pcurrent,*pbefore,*pafter;for(int i=1,n=0;inext;pafter=pcurrent-next;while( n!=0 )/用n 来判断比较停止位置if( pcurrent-english english )pbefore-next=pcurrent-next;pcurrent-next=pafter-next;pafter-next=pcurrent;pbefore=pbefore-next;/交换完后会出现pcurrent 与 pafter 位置倒换pafter=pcurrent-next
30、;/此时应该纠正elsepbefore=pbefore-next;/没有交换则平行迁移指针pcurrent=pcurrent-next;pafter=pafter-next;n-;head=head-next;/delete p; /此结点如何删除?sortflag=1; /链表被排序return len;int link:sortbymath() /排序结点(高数)getlen();student *p=new student(); /定义一个空白结点,插入链表以简化排序操作,此结点不计入 len 中。p-next=head;head=p;student *pcurrent,*pbefore
31、,*pafter;for(int i=1,n=0;inext;pafter=pcurrent-next;while( n!=0 ) /用n 来判断比较停止位置if( pcurrent-math math )pbefore-next=pcurrent-next;pcurrent-next=pafter-next;pafter-next=pcurrent;pbefore=pbefore-next;/交换完后会出现pcurrent 与 pafter 位置倒换pafter=pcurrent-next;/此时应该纠正elsepbefore=pbefore-next;/没有交换则平行迁移指针pcurren
32、t=pcurrent-next;pafter=pafter-next;n-;head=head-next;/delete p; /此结点如何删除?sortflag=1; /链表被排序return len;int link:sortbynum() /排序结点(学号),以升序排列getlen();student *p=new student(); /定义一个空白结点,插入链表以简化排序操作,此结点不计入 len 中。p-next=head;head=p;student *pcurrent,*pbefore,*pafter;for(int i=1,n=0;inext;pafter=pcurrent-
33、next;while( n!=0 )/用n 来判断比较停止位置if( pcurrent-num pafter-num )pbefore-next=pcurrent-next;pcurrent-next=pafter-next;pafter-next=pcurrent;pbefore=pbefore-next;/交换完后会出现pcurrent 与 pafter 位置倒换pafter=pcurrent-next;/此时应该纠正elsepbefore=pbefore-next;/没有交换则平行迁移指针pcurrent=pcurrent-next;pafter=pafter-next;n-;head=
34、head-next;/delete p; /此结点如何删除?sortflag=1; /链表被排序return len;student * link:searchbynum() /查找结点(学号),查找成功返回查找对象string cnum;coutcnum;student *p=head;while( p-num != cnum )p=p-next;if( p = null )cout未找到!endl;return null;cout成功找到!endl;showone(p);return p;student * link:searchbyname() /查找结点(姓名),查找成功返回查找对象,
35、采用链表遍历查找string cname;coutcname;student *p=head;while( p-name != cname )p=p-next;if( p=null )cout未找到!endl;return null;cout成功找到!endl;showone(p);return p;int link:savelink() /保存链表,成功返回1ofstream outfile(student.txt,ios:out);if( ! outfile ) cout无法打开student.txt文件或不存在该文件,系统退出!endl;system( pause );exit( 0 )
36、;student *p=head;while( p != null )outfilenum name english mathnext;outfile.close();cout数据成功保持!endl;return 1;int link:savebat() /保存链表,成功返回1ofstream outfile(bat.txt,ios:out);if( ! outfile ) cout无法打开student.txt文件或不存在该文件,系统退出!endl;system( pause );exit( 0 );student *p=head;while( p != null )outfilenum n
37、ame english math averagenext;outfile.close();return 1;int link:readlink() /读取链表ifstream infile(student.txt,ios:in);if( ! infile ) cout无法打开student.txt文件或无法建立该文件,系统退出!cnum;infilecname;infilecenglish;infilecmath;if( cnum.length() = 0 & cname.length() = 0)break;p=new student(cnum,cname,cenglish,cmath);p
38、-next=head;head=p;cenglish=0,cmath=0; /读完后初始化,避免影响下一次阅读infile.close();if( head = null ) /没有读取数据时,head 指向 nullcout没有数据可导入endl;/没有数据导入,read可以不标记为1return 0;elsecout成功导入数据next;return len;int link:delbynum() /删除结点,通过学号,删除成功返回1student *p=searchbynum(),*help;if( p = null )cout删除失败!next = null ) /空结点特殊处理hel
39、p=head;while( help-next-next != null)help=help-next;help-next=null;delete p;cout成功删除!next;*help=*p;help-next=p-next;delete p;cout成功删除!endl;getlen();return 1;int link:delbyname() /删除结点,通过姓名,删除成功返回1student *p=searchbyname(),*help;if( p = null )cout删除失败!next = null ) /空结点特殊处理help=head;while( help-next-
40、next != null)help=help-next;help-next=null;delete p;cout成功删除!next;*help=*p;help-next=p-next;delete p;cout成功删除!endl;getlen();return 1;void link:showone(student* p) /显示结点,此处用运算符重载if( p != null )coutrank != 0 )cout 排名endl;elsecoutendl;coutsetiosflags( ios:left ); /格式化输出coutsetw( 10 )numsetw( 10 )namesetw( 10 )englishsetw( 10 )mathsetw( 10 )average;if( p-rank=0 )coutendl;elsecoutsetw( 10 )rankendl;elsecout没有数据可供输出!endl;void link:showlink(student* p) /显示链表if( p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 妇产科护理学产程图解课件
- 柚皮苷提取技术创新-洞察分析
- 信息安全政策经济-洞察分析
- 护士长护理工作亮点汇报
- 新型材料在炼油设备中的应用案例-洞察分析
- 叶绿体基因组变异分析-洞察分析
- 数字营销合伙人合同协议书
- 商业广场人行道彩色混凝土施工方案
- 医院弱电工程质量控制方案
- 水产养殖水质监测与管理-洞察分析
- 2024年度风力发电项目设计施工承包合同2篇
- 量子计算与区块链
- 食品质量安全法律法规培训
- 国开2024年秋《休闲农业概论》形考任务1-4答案
- 2024年教师资格考试高级中学面试生物试题与参考答案
- 年终总结数据对比分析图表
- 2024-2025学年统编版初二上学期期末历史试卷及答案指导
- 一对一教学管理制度
- 工业固体废弃物的资源化处理
- 一年级数学计算题专项练习1000题集锦
- 2024年2024年离婚协议书模板电子版
评论
0/150
提交评论