《面向对象程序设计》课程设计-学生成绩管理系统.doc_第1页
《面向对象程序设计》课程设计-学生成绩管理系统.doc_第2页
《面向对象程序设计》课程设计-学生成绩管理系统.doc_第3页
《面向对象程序设计》课程设计-学生成绩管理系统.doc_第4页
《面向对象程序设计》课程设计-学生成绩管理系统.doc_第5页
免费预览已结束,剩余13页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象程序设计课程设计09计应1 09821122 谢燕清一 课题设计内容、具备的功能(一)设计内容1.性质 本课程是学生在学习完程序设计基础、面向对象程序设计课程后,为提高学生使用面向对象的语言解决实际问题的能力设置的一门实践性课程,是计算机科学与技术专业计算机应用方向的必修课。2.目的 本课程实验教学的目的是:1) 使学生通过实践环节深入理解和掌握课堂教学内容,进一步加深理解面向对象的基本理论,掌握基本方法、基本技术。2) 通过设计一个功能比较完整的,有实际应用价值的应用软件,使学生了解采用面向对象技术开发软件的全部过程,掌握采用面向对象技术开发软件的方法。提高学生使用面向对象方法,和面向对象的语言解决实际问题的能力。3) 通过本课程设计,为后续数据库系统原理与应用数据结构编译原理等课程打下扎实的专业基础。3.任务 学生成绩管理系统,系统存储以下信息:1) 学生基本信息和成绩;2) 学生的人数。4.要求1) 根据题目要求,对问题进行需求调查和分析,识别类和对象,合理设计类和对象;2) 合理设计程序结构,系统各项功能要求在函数中实现。在主函数中设计菜单,通过菜单调用这个函数;3) 输入输出要求由提取运算符和插入运算符的重载函数实现;公用过程尽可能设计成函数或函数模板;4) 设计过程中必须考虑程序的健壮性,在关键的地方必须要有容错处理。(二)具备的功能系统功能:1.系统初始化 包括上述文件的创建和读取(二进制或ascii文件);2.增加学生 新增加学生信息和成绩;3.删除学生 根据学号删除相应学生信息;4查询 根据学号,查询相应学生信息;5.排序 根据学生学号、姓名、成绩对学生信息排序,并显示;6.修改 修改指定学号的学生数据。二 模块(函数)的划分、各模块(函数)的功能、采用的自定义的数据类型(一) 模块(函数)的划分1.类的定义:student.h1) 定义抽象类personprotected: int id; /学号char name10; /姓名public:virtual bool operator运算符重载virtual bool operator=(person &)=0; /=运算符重载2) 定义派生数据类student,基类为person类。private:int score4; /成绩void swapdata(student *); /交换数据public:student(int =0,char* =null,int* =null); /构造函数bool operator运算符重载bool operator=(person &); /=运算符重载friend ofstream& operator(ofstream&,student*); /(ifstream&,student*); /运算符重载从文件输入friend ostream_withassign& operator(ostream_withassign&,student*);/(istream_withassign&,student*);/运算 符重载从键盘输入friend class list; /list为友元类3) 定义设计结点类nodeprivate: student *stup; /指向学生对象指针node *prev,*next; /指向前后结点指针public:node(); /构造函数node(student *); /构造函数node(node &); /复制构造函数node(); /析构函数friend class list; /list为友元类4)定义带有头结点链表类list,私有数据成员为node *head,*tail分别,指向链表头尾:private:void initlist(); /初始化函数public:list(); /构造函数list(); /析构函数void clearlist(); /清空链表node *findid(int &); /根据学号寻找学生所在结点void insert(node *); /插入一个学生node *createnode(student *); /建立一个学生结点void add(); /增加一个学生void update(); /修改学生成绩void delete(); /删除一个学生void query(); /查找一个学生void sortid(); /按学号排序void sortscore(); /按学生总成绩排序void savebin(); /以二进制形式保存数据void printlist(); /显示链表void printtitle(); /显示标题void printone(student *); /显示一个学生数据2.student类的实现:student.cpp3.node类的实现:node.cpp4.list类的实现:list.cpp5.主函数:main.cpp(二) 各模块(函数)的功能1.实现类和函数声明;2.实现派生类student的各函数;3.实现结点类node的各函数;4.实现结点类list的各函数。程序结束运行前,调用savebin()函数以二进制形式保存学生数据到文件student.dat中;5. 设计主函数。主函数中显示功能菜单,通过菜单调用类的成员函数实现系统各项功能。(三) 采用自定义的数据类型自定义的数据类型:student.h#ifndef studata_h#define studata_h#includeint getid();class list;class person /抽象类protected:int id;char name10;public:virtual bool operator=(person &)=0;class student:public personint score4;void swapdata(student *);public:student(int =0,char* =null,int* =null);bool operator=(person &);friend ofstream& operator(ifstream&,student*);friend ostream_withassign& operator(istream_withassign&,student*);friend class list;class nodestudent *stup;node *prev,*next;public:node();node(student *);node(node &);node();friend class list;class listnode *head,*tail;void initlist();public:list();list();void clearlist();node *findid(int &);void insert(node *);node *createnode(student *);void add();void update();void delete();void query();void sortid();void sortscore();void savebin();void printlist();void printtitle();void printone(student *);#endif三 程序运行流程图开始输入选项输入选项!=end保存数据savebin()增加学生、修改成绩、删除学生、查询数据、显示数据、按学号排序、按总成绩排序注:在主函数中,输入选项,判断是否等于end,如等于end则保存数据;如不等于则实行switch中增加学生、修改成绩、删除学生、查询数据、显示数据、按学号排序、按总成绩排序。开始增加学生学号是否相同抛出异常显示链表保存数据结束注:增加学生,判断学号是否有相同,有相同是抛出异常,无相同则继续增加,并显示链表、保存数据。开始显示链表修改数据是否存在抛出异常修改并显示列表是否存在抛出异常是否删除最后一个结点nodep-next-prev=nodep-prev;nodep-prev-next=nodep-next;nodep-prev-next=nodep-next;tail=nodep-prev删除结点并显示剩余链表删除学生结束查询学生是否存在抛出异常显示列表按学号排序按总成绩排序注:运行程序,先实现链表数据,再按执行。修改成绩:输入学号,判断是否存在,存在则对该学生的成绩进行修改;不存在则抛出异常。删除学生:输入学号,判断是否存在,存在则继续判断要求删除的学生的结点所在位置,根据学生的结点所在位置不同,做不同的操作;不存在则抛出异常。查询数据:输入学号,判断是否存在,存在则显示该学生信息;不存在则抛出异常。显示数据:显示链表中所有的数据。按学号排序:比较学号大小,学号小的在前,大的在后。按总成绩排序:比较总成绩大小,总成绩大的在前,总成绩小的在后。四 程序设计过程、调试过程中所用的测试用例、测试方法,程序运行的结果(一) 程序设计过程1. student.cpp中所要设计的程序:bool student:operator (person & per) return score3=(person & per) return score3=(student&)per).score3; /学生设计void student:swapdata(student * stup) /学生数据交换(学生设计) student t=*this; *this=*stup; *stup=t;ofstream & operator(ofstream & out,student * stup) /运算符重载输出至文件 out.write(char *)stup,sizeof(student); /学生设计 return out;ostream_withassign & operator(ostream_withassign& out,student* stup) /运算符重载输出至标准文件 int i; /学生设计 outidtname t; for(i=0;i4;i+) outscoreit; outstup-score3=0; for(i=0;i3;i+) coutscorenodep-stup-scorei; nodep-stup-score3+=nodep-stup-scorei; printtitle(); printone(nodep-stup);void list:delete() /删除一个学生/ student * stup; /学生设计 node * nodep; int id=getid(); if(nodep=findid(id)=null) throw(1); if(tail!=nodep) nodep-next-prev=nodep-prev; /删除中间的结点 nodep-prev-next=nodep-next; else nodep-prev-next=nodep-next; /删除最后一个结点 tail=nodep-prev; delete nodep; printlist();void list:query() /查询学生数据/ student * stup; /学生设计 node *nodep; int id=getid(); if(nodep=findid(id)=null) throw(1); printtitle(); printone(nodep-stup);void list:insert(node * nodep) /在链表尾插入一个学生 tail-next =nodep; /学生设计 nodep-prev=tail; tail=nodep; void list:sortscore() /按总成绩排序 node * nodef,*nodel=tail; /学生设计 if(head!=tail) while(head-next!=nodel) nodef=head-next; while(nodef!=nodel) if(*(nodef-stup)next-stup) nodef-stup-swapdata(nodef-next-stup); nodef=nodef-next; nodel=nodel-prev; printlist(); void list:savebin() /链表数据保存在二进制文件 node *nodep=head-next; /学生设计 ofstream outstudent; if(head!=tail) outstudent.open(student.dat,ios:binary); while(nodep) outstudentstup; nodep=nodep-next; outstudent.close();void list:printlist() /显示链表中数据 node* nodep=head-next; if(head!=tail) printtitle(); /学生设计 while(nodep!=null) printone(nodep-stup); nodep=nodep-next; else coutno studentendl; 4. main.cpp中要设计的程序:case update: /修改学生成绩 try /学生设计 ls.update(); catch(int) coutwrong!this score is nullendl; break;case delete: /删除一个学生 try /学生设计 ls.delete(); catch(int) coutwrong!this student is nullendl; break;case query: /查询一个学生数据 try /学生设计 ls.query(); catch(int) coutwrong!this data is nullendl; break;case sortscore: /根据总成绩排序 ls.sortscore(); /学生设计(二) 调试过程中所用的测试用例1. 自动生成测试函数:无须手工编辑测试代码,建立、编辑测试用例在测试用例编辑器中进行。2. 测试用例可视化编辑: 使用测试用例编辑器建立、编辑测试用例,vu自动生成代码,通常只须填入输入输出的数值。3. 测试用例可用点操作符访问成员变量,还可以用同样的语法调用成员函数。 (三) 测试方法源程序编制完成后,首先由c+编译程序build编译成.obj文件,再由连接程序连接成可执行文件。在编译时,如果源程序存在语法错误(errors),则系统不允许连接,直到改正了所有的语法错误后,才能进行连接。另外,在编译时还可能存在另一类错误,即警告性错误(warnings),这类错误一般不影响程序的连接。选择编译菜单(build)对编译好的源程序进行编译,若程序编译没有发现错误,则该窗口显示“”,这是可以进行程序的连接;若编译后存在语法错误或警告,该窗口中则显示两类错误的个数,并列出相应的错误位置和原因。改正编译期错误的方法和一般原则为:1. 改正错误是一般从第一个错误开始,然后依次高正后续的错误。因为前面错误的出现,往往会导致编译系统在编译时错位,把本来正确的语句认为是错的,也可能把某些语句的错误掩盖掉。所以当改正当前的错误后,可能会使错误量减少很多,也可能增加很多;2. 根据情况,每改正一个或几个错误后,应重新编译一下,然后再从第一个错误进行改错,知道所有错误都被 改正过来。实践中发现,往往很小的程序在执行时也会出现错误。当一个程序可以被连接成功,但执行时却存在不正常现象,如不能得到预期的运行结果或出现死机等,而一下子很难熬出出错原因时,可以采取单步跟踪执行命令。单步跟踪执行命令:单步跟踪执行程序,能够清楚地看到程序的一步步执行过程,从而判断源程序的执行流程是否与事先设计的流程一致,从中发现造成死循环或死机的原因所在。程序调试完毕,或想取消程序的调试状态回到编辑状态,可以选择集成环境调试(debug),即能够达到目的。(四) 程序运行的结果程序运行后的菜单显示“1:add student”界面“2:update student”界面“3:delete student”界面“4:query student”界面“5:display student”界面“6:sort student by no”界面“7:sort student by score”界面 “8:保存数据”界面五 在课程设计中遇到的问题和解决的方法,还没有能解决的问题(一)遇到的问题:1. 设计删除一个学生的程序后,在程序运行过程中,删除了所有学生的信息,仅显示标题,没有其他学生的信息?同时在删除学生时,若删除最后一个学生,则出现提示终止程序?答:(1)删除一个学生,不是指仅仅删除这个学生,还包括删除结点。(2)在设计删除结点的同时,还要考虑删除的是中间的结点还是最后一个结点,即ifelse对应,根据删除结点位置的不同设计相应的程序才行。2. 在修改学生成绩和查询学生数据设计程序过程中,在编译后显示无错误,但有警告,但在继续运行程序中,修改学生成绩和查询学生数据不能执行?答:编译后无错误即可运行程序,但若想正确执行程序,则需要修改源程序,直至源程序既无错误又无警告才能实现程序的正常运行及显示结果。3. 数据交换如何设计?答:void student:swapdata(student * stup) /学生数据交换student t=*this;*this=*stup;*stup=t;要实现swap数据交换,一定要定义一个中间量。这里要求对*this指针的灵活使用。4总成绩比较大小,为什么编译后显示score无定义?答:若直接写per.score3,则显示无定义。因为score在person类里没定义,它是定义在student类中的,所以要写成(student&)per).score3才能保证编译无错误。5插入运算符重载输出至标准文件的程序设计?答: ostream_withassign& operator(ostream_withassign& out,student* stup) /运算符重载输出至标准文件 int i; outidtname t; for(i=0;i4;i+) outscoreit;outendl; return out; 使程序运行后显示的标题是:id name score1 score2 score3 score(二)

温馨提示

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

评论

0/150

提交评论