《面向对象程序设计》课程设计报告学生成绩管理系统

上传人:1666****666 文档编号:39522915 上传时间:2021-11-11 格式:DOC 页数:27 大小:488.03KB
收藏 版权申诉 举报 下载
《面向对象程序设计》课程设计报告学生成绩管理系统_第1页
第1页 / 共27页
《面向对象程序设计》课程设计报告学生成绩管理系统_第2页
第2页 / 共27页
《面向对象程序设计》课程设计报告学生成绩管理系统_第3页
第3页 / 共27页
资源描述:

《《面向对象程序设计》课程设计报告学生成绩管理系统》由会员分享,可在线阅读,更多相关《《面向对象程序设计》课程设计报告学生成绩管理系统(27页珍藏版)》请在装配图网上搜索。

1、Q面向对象程序设计课程设计报告专 业: 姓 名: 学 号: 指导教师: 二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#includeioman

11、ipusing 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; /英语成绩

13、float math; /高数成绩float average; /平均成绩int rank; /排名(以平均分为准)Student* next; /结点指针域;/定义一个链表类class Linkpublic:Link();int addone(); /增加一个结点,头部插入法int addmore(int n); /增加多个结点int sortByaverage(); /排序结点(平均分),降序为准(冒泡排序)int sortByenglish(); /排序结点(英语)int sortBymath(); /排序结点(高数)int sortBynum(); /排序结点(学号),以升序排列Stu

14、dent * searchBynum(); /查找结点(学号),查找成功返回查找对象Student * searchByname(); /查找结点(姓名),查找成功返回查找对象,采用链表遍历查找int savelink(); /保存链表,成功返回1int savebat(); /保存不及格学生信息int readlink(); /读取链表int getlen(); /计算链表长度int delBynum(); /删除结点,通过学号,删除成功返回1int delByname(); /删除结点,通过姓名,删除成功返回1void showone(Student* p); /显示结点,此处用运算符重载

15、void 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 &li

17、nk); /验证身份,默认密码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 ); /三级菜单,批量录入vo

19、id 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 );vo

20、id 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()

22、english=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 )re

23、turn 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() /修改高数,修改成功返回1f

24、loat 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:

26、addone() /增加一个结点,头部插入法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-nex

30、t;/此时应该纠正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,*pbefor

31、e,*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;/没有交换则平行迁移指针pcurre

32、nt=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

37、name 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);

38、p-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 ) /空结点特殊处理he

39、lp=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 )names

41、etw( 10 )englishsetw( 10 )mathsetw( 10 )average;if( p-rank=0 )coutendl;elsecoutsetw( 10 )rankendl;elsecout没有数据可供输出!endl;void Link:showlink(Student* p) /显示链表if( p != NULL )coutrank != 0 )cout 排名endl;elsecoutendl;coutsetiosflags( ios:left ); /格式化输出while( p != NULL )coutsetw( 10 )numsetw( 10 )namesetw(

42、 10 )englishsetw( 10 )mathsetw( 10 )average;if( p-rank=0 )coutendl;elsecoutsetw( 10 )ranknext;elsecout没有数据可供输出!rank=+n;p=p-next;return 1;int Link:getrankByenglish() /经排序后获取英语排名,排名成功返回1if( !sortByenglish() )return 0;Student * p=head;int n=0;while( p!=NULL )p-rank=+n;p=p-next;return 1;int Link:getrank

43、Bymath() /经排序后获取高数排名,排名成功返回1if( !sortBymath() )return 0;Student * p=head;int n=0;while( p!=NULL )p-rank=+n;p=p-next;return 1;void Link:searchbat() /搜索两门都不及格学生Link bat;Student *help=head;float cenglish=0,cmath=0;string cnum,cname;Student* p;while( help != NULL )if( help-english math num;cname=help-na

44、me;cenglish=help-english;cmath=help-math;p=new Student(cnum,cname,cenglish,cmath);p-next=bat.head;bat.head=p;help=help-next;bat.showlink( bat.head );bat.savebat();cout成功将不及格学生信息存入 bat.txtenglish;p=p-next;getlen();return all/len;float Link:getmathaverage() /计算获取高数平均分float all=0;Student *p=head;while(

45、 p != NULL )all+=p-math;p=p-next;getlen();return all/len;Link:Link() /创建析构函数/定义菜单选项void thirdmenu_add( Link &link ) /教师三级菜单/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.

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!