资源描述
刘杨&李虎乘&刘杨&李虎乘&刘杨&李虎乘&刘杨&李虎乘&刘杨&李虎乘&刘杨&李虎乘&刘杨&李虎乘&刘杨&李虎乘北京邮电大学课程设计报告 刘杨 李虎乘We are the best!课程设计名称学生信息管理系统学 院理学院指导教师谷勇浩班 级班内序号学 号学生姓名成绩2010214102510212653李虎乘20102141022310212670刘杨课程设计内容教学目的:1、进一步掌握利用C+进行类的定义和操作方法;2、进一步掌握类的继承和派生方法;3、进一步理解虚函数和多态;4、综合利用上述知识,学习设计并编写面向对象的C+简单应用程序;5、培养学生团结协作的能力。基本内容:用C+语言编写学生信息管理系统。实验方法:在DEV C+环境下编写代码并排查语法错误和运行错误。团队分工:李虎乘负责节点、链表、增加、查找、删除、更改函数的编写;刘杨负责主函数、输入输出流、输出函数、现实帮助函数的编写。其余工作均有参与。 学生课程设计报告(附页)课程设计成绩评定遵照实践教学大纲并根据以下四方面综合评定成绩:1、课程设计目的任务明确,选题符合教学要求,份量及难易程度2、团队分工是否恰当与合理3、综合运用所学知识,提高分析问题、解决问题及实践动手能力的效果4、是否认真、独立完成属于自己的课程设计内容,课程设计报告是否思路清晰、文字通顺、书写规范评语: 成绩:指导教师签名: 年 月 日注:评语要体现每个学生的工作情况,可以加页。第一章 需求分析1. 课程设计性质和目的第二章 使用说明和程序流程图1 系统总框图.2. 使用手册3.第三章 程序设计1. 每个模块的设计分析及功能描述2. 函数和重要参数及其说明. 第四章 总结附件:源代码第一章、需求分析一、设计目的1、进一步掌握利用C+进行类的定义和操作方法;2、进一步掌握类的继承和派生方法;3、进一步理解虚函数和多态;4、综合利用上述知识,学习设计并编写面向对象的C+简单应用程序;5、培养学生团结协作的能力。掌握一般类的定义、测试、封装、数据隐藏、继承及多态等概念,掌握面向对象程序设计的基本概念和基本方法,掌握 C+语言的基本语法和基本内容,并能运用C+语言进行基本的面向对象程序设计,并且通过综合课程设计,提高实践动手技能,培养独立分析分析问题和解决问题的能力。第二章、系统总框图开始界面主要提示菜单界面增加学生信息删除学生信息输出学生信息显示帮助界面修改学生信息结束二、使用手册1、输入输出的形式本系统是一个学生成绩管理系统,采用DEV 编译器作为开发环境,这个环境是我们在学习C+时使用的平台。输入数据类型主要是char、int、float等数据类型,输入内容包括:班级、学号、姓名、性别、语文成绩、数学成绩等数据。显示内容包括:班级、学号、姓名、平均分等数据。2、程序的实现功能用户运行程序后进入系统主界面,在主界面用户可以输入所有学生的数据并保存到文件中,也可以读取文件中已有的学生数据。本系统同时只能对一个数据文件进行相关操作,不能同时打开多个数据文件,其类似于单用户操作系统。当用户读取学生数据后可对其进行显示,插入,删除,修改,计算平均分等相关操作。用户在操作过程中可随时对当前文件进行保存到文件操作,以防止修改的数据丢失。3、操作演示 、增加学生信息进入开始界面以后,输入数字 1 ,即可进入“增加学生信息功能” 然后,依照程序提示的格式,逐个输入该学生的信息,每个类别的信息以回车为间隔。完成输入以后,结束功能,回归指令界面。如果还需要增加,只需重复以上操作即可。、输出学生信息进入指令界面以后,输入数字 2 ,进入输出学生信息功能:本系统提供的输出功能除包括对已经输入的学生基本信息以外,还自动附带对总分的计算并输出、对平均分的计算并输出。详情可参考上图。如果学生信息为空,即尚未输入任何学生信息数据,则会提示“没有学生信息”。、查找学生信息进入指令界面以后,输入数字 3 ,即可进入“查找学生信息”功能:查找时,输入要查找对象的学号进行操作,按回车确认输入: 如果输入的信息有误(无法匹配),则会提示“没有符合条件的学生”。、删除学生信息 同样地,输入学生学号,进行匹配,匹配失败则会提示“没有符合条件的学生”。成功,则会删除该对象的信息。、修改学生信息 进入指令界面以后,输入数字 5 ,即可进入“修改学生信息”功能。输入学生学号进行对象确认。同样地,参照输入学生信息时的方式,进行信息重新输入。倘若修改时输入的学号无法在已经录入的学生信息中找到匹配的,则会提示“没有找到符合条件的学生”。、显示帮助信息表格用于帮助现实提示表格。在指令界面下,键入数字7即可进入该功能。第三章、程序设计一、每个模块的设计分析及功能描述1 main.cpp主函数,用于实现对提示界面及对函数的操作。2 appcommand.hAppcommand的头文件。外部声明appcommand类,实现对以下函数的的声明:增加学生信息函数: addInform();输出学生信息函数: outputInformList();查找学生信息函数:searchInform();删除学生信息函数:deleteInform();更改学生信息函数:modifyInform();显示帮助函数:showHelp();3 Listnode.hListnode的头文件。外部声明Listnode类,实现单链表的生成及岁单链表操作的声明,4 inform.hInform的头文件。外部声明inform类,实现对学生信息的存储。5 achieve.hAchieve的头文件。外部声明achieve类,实现对计算学生总分与平均分的函数的声明。6 appcommand.cppAppcommand的源文件。定义appcommand类,实现对头文件中声明函数的的定义。7 Listnode.cppListnode的源文件。定义Listnode类,实现对单链表的具体操作等。8 inform.cppInform的源文件。定义inform类,实现对学生信息的存储的操作。9 achieve.cppAchieve源头文件。定义achieve类,实现对计算学生总分与平均分的函数的具体定义(该函数在查找中课体现)。二、文件所定义的函数及其说明一 、main1.int main()函数:主函数,用于产生主操作界面及提示用户进行操作。二 、ppcommand1.addInform()函数:增加学生信息函数,用于增加学生信息。在主操作页面中输入1调用。2.outputInformList()函数:输出学生信息函数,用于输出学生信息。在主操作页面中输入2调用3. searchInform()函数: 查找学生信息函数,用于查找学生信息。在主操作页面中输入3调用4. deleteInform()函数: 删除学生信息函数,用于删除学生信息。在主操作页面中输入4调用5. modifyInform()函数;修改学生信息函数,用于修改学生信息。在主操作页面输入5调用6. showHelp()函数;显示主页面,在主操作页面输入5调用。 三、achieve1. getTotalScore()函数:用于计算学生的总分,可以在查找学生信息的同时显示学生总分。 其中对输入输出函数进行重载2. getAvgScore()函数用于计算学生的平均分,可以在查找学生信息的同时显示学生平均分。其中对输入输出函数进行重载三、重要参数说明1 addInform()函数:尾指针:*pTail , 头指针: *pHead2 outputInformList()函数:指针变量 *p3 searchInform()函数:指针变量 *p4 deleteInform()函数:指针变量 *p,指针变量 *q5 modifyInform()函数:指针变量*found,指针变量 *p;第四章、总结一、语法错误1、语句的最后忘记了加上“;”,使程序发生错误。2、把“”写反,以及字符与字符串的操作问题,这些是比较简单的错误,很容易分辨出来,并改正之。3、函数的返回值问题,也是比较容易找出并解决的问题。二、逻辑错误1、数据的输入与读出,刚开始对数据的操作不太明白,一致不能很好的操作,其中最大的问题是对输入输出流的控制、重载问题,通过“输出” 将数据从系统中读出,可是在使用过程中总是出现读出错误,出现乱码。2、内存的分配问题,这也是困惑了我好久的问题。对于我们初学者来说对内存的分配和释放问题是比较抽象和模糊的难题,本来使用链表的方式存储数据,然而待到排序时出现了交换数据困难的问题,以及分配空间繁琐释放空间不及时的问题,造成空间浪费使得程序运行效率低的问题。因此最后采用了顺序存储记录的方式,这样就能改变前述问题。3、对最后的菜单进行编写时,刚开始只能单次循环,然后直接跳出菜单,后来我们进行商量讨论,运用循环语句的嵌套写出了完整的菜单系统。三、心得与体会2、课程设计经验和体会一个多月的课程设计,虽然有些疲劳和困倦,但带给我们很多的收获。C+已经学了一个学年了,有许多知识都存在似懂非懂的现象,这种现象通过实际的上机操作,已经减少了许多。对这些知识也有了更深的理解和很好的掌握。也有很多理论上说得过去的代码,但到了实际操作,却是行不通的。这种困惑,有许多已经通过实际操作解决了,并能够深刻认识,但也有很多没有明白。只能避过这些方法,换方法实现。在课程设计之前,因为有了综合实验的经验与教训,明白了写代码这一步是非常重要的,因为当你把代码输入电脑,并用编译器将其运行,发现通过不了,再来检查找出问题,这是一件非常辛苦的事情,也很浪费时间。于是在课程设计的时候,我们花了数天的时间来规划与写代码,将要实现的内容分析清楚,才把代码输入电脑。我们从中发现,写程序应该先找到该程序中的核心地方,用多种方法来实现该核心,这才可能避免等到发现逻辑上或者编译器不支持上的错误,才来想补救的措施,这样花费时间在想补救措施是很不值得的。此次任务的完成,也体现出同学之间的团结精神。实践是检验真理的唯一标准。没有实践,就不会发现和深刻体会它的真实所在。只有通过检验的真理,在自己的心里,才会认可它的真实性。面向对象程序设计的完成,使我们懂得了真理的重要性,理论和实际的相结合,才能真正把握所学和所掌握的知识。此外,此次程序设计课,也增添了我们对计算机编程的兴趣与爱好,可以说,这是一次非凡的经历! 刘杨 李虎乘 2011年11月于北京邮电大学附件:程序源代码_main.cpp_#include #include #include #include appcommands.husing namespace std;class ListNode;ListNode *pHead;int main()pHead = NULL;showHelp();cout 请输入命令. n)if (n = 1)addInform();else if (n = 2)outputInformList();else if (n = 3)searchInform();else if (n = 4)deleteInform();else if (n = 5)modifyInform();else if (n = 6)return 0;else if (n = 7)showHelp();elsecout 无效命令 endl;cout 请输入命令. endl;/ 没有显示释放链表占用的内存,进程结束时由操作系统回收内存system(pause);return 0;_listnode.h_#ifndef LISTNODE_H#define LISTNODE_H#include Inform.hclass ListNode/ ListNode 类指对节点和单链表的操作 public:ListNode(Inform &data);ListNode();Inform &GetData(void);/获取信息 void SetData(Inform inform);/用于修改数据和next ListNode *GetNext(void) const;/下一个节点的指针 void SetNext(ListNode *node);/ 设置下一结点 Inform _data;/liform里面的具体对象 ListNode *_next;#endif_listnode.cpp_#include ListNode.h/对函数的定义 ListNode:ListNode(Inform &data)/对 : _data(data), _next(NULL)Inform &ListNode:GetData(void)/对getdate函数的定义 return _data;void ListNode:SetData(Inform inform) _data=inform ;/指针设置 ListNode *ListNode:GetNext(void) const/指针后移 return _next;void ListNode:SetNext(ListNode * node)/ _next = node;ListNode:ListNode()/析构函数 _inform.h_#ifndef INFORM_H#define INFORM_H#include #include #include achieve.husing namespace std;class Informpublic:/输出(流)的重载(统一格式输出学生信息)friend ostream &operator(istream &input, Inform &t);public:Inform(void);/学生信息的初始化,拷贝构造函数使用编译器合成的版本/Inform(Inform &d);/ 析构函数Inform();/学生信息的匹配判断(所有信息都匹配)/int operator=(const Inform &d);/查找学生的某项信息s是否匹配/int operator=(char *s);/查找学生的某项信息t是否不匹配/int operator!=(char *t);/学生信息赋值操作/Inform &operator=(Inform &d);public: / 数据成员/学号string number;/身份证号string id;/姓名string name;/性别string sex;/成绩(第一步基本信息中无此变量)achieve ach;/电话号码string phonenumber;/寝室号string roomnumber;#endif_inform.cpp_#include Inform.hInform:Inform()Inform:Inform(void)ostream &operator(ostream &output, const Inform &t)/输出(流)的重载(统一格式输出学生信息) ,使可以在inform类上使用iostream output 身份证: t.id , /t是output(重载操作符) 的形参 姓名: t.name , 学号: t.number , 电话: t.phonenumber , 寝室: t.roomnumber , 性别: t.sex , (istream &input, Inform &t)input t.id t.name t.number t.phonenumber t.roomnumber t.sex t.ach;if (!input)/ 输入无效,重置状态t = Inform();return input;_appcommands.h_/ 应用程序的命令/ 增加学生信息void addInform();/ 输出学生信息void outputInformList();/ 查找学生信息void searchInform();/ 删除学生信息void deleteInform();/ 更改学生信息void modifyInform();/ 显示帮助void showHelp();_appcommands.app_#include #include achieve.h#include Inform.h#include ListNode.h#include extern ListNode *pHead;/表示phead是在外部定义的 ListNode *pHeadbefore;/ 增加学生信息void addInform()/增加学生信息 cout 增加学生信息,格式为:身份证,姓名,学号,电话,寝室号,性别,语文分数,数学分数 inform;if (cin)/ 判断是否输入成功if (!pHead)/判断phead指针是否为null ,如果是null 则继续运行 pHead = new ListNode(inform);/listnode为链表的新节点 else/如果phead不为空 ListNode *pTail = pHead;while(pTail-GetNext() != NULL)/getnext为listnode的成员函数,作用为取得下一个节点 pTail = pTail-GetNext();/指向尾结点的指针向后移动 / 找到尾部节点,加到队尾 pTail-SetNext(new ListNode(inform);/把新节点挂到链表尾 / 输出学生信息void outputInformList()cout 输出学生信息 endl;if (!pHead) /判断phead指针是否为null ,如果是null 则输出没有学生信息 cout 没有学生信息 endl;return;/表示函数结束 ListNode *p = pHead;/ while(p)/判断p ,如果p不为null则继续 coutGetData()GetNext(); /指针向后 / 查找学生信息void searchInform()if (!pHead)/判断phead指针是否为null ,如果是null 则输出没有学生信息 cout 没有学生信息 endl;return;cout 查找学生信息,请输入学号 input;if(cin)ListNode *p = pHead;while (p)/判断p ,如果p不为null则继续 if (p-GetData().number = input)coutGetData()endl;cout总分; cout_data.ach.getTotalScore()endl;cout平均分; cout_data.ach.getAvgScore()GetNext();cin.clear();/ 清除标准输入的错误(如果有)void deleteInform()/ 删除学生信息cout 删除学生信息,请输入学号 input;if(cin)ListNode *p = pHead; ListNode *q = pHeadbefore ;while (p)/判断p ,如果p不为null则继续 if (p-GetData().number = input) q=p-GetNext(); delete p; p=q; break; / 向后走q=p;p=p-GetNext();cin.clear();/ 清除标准输入的错误(如果有)void modifyInform()cout 更改学生信息,请输入学号 input;ListNode *found = NULL;if(cin)/输入正确 ListNode *p = pHead;while (p)if (p-GetData().number = input)found = p;break;p = p-GetNext();/ 向后走/ 清除标准输入的错误(如果有)cin.clear();if (found)cout 修改 GetData().number 的信息,格式为:身份证,姓名,电话,寝室号,性别,语文分数,数学分数 inform.id inform.name inform.phonenumber inform.roomnumber inform.sex inform.ach;if (cin)/ 输入成功found-SetData(inform);elsecout 没有找到符合条件的学生记录 endl;void showHelp()/ 显示帮助 cout * endl; cout欢迎您使用学生成绩管理系统 * endl; cout * * * endl; cout * 1: 增加学生信息 * endl; cout * 2: 输出学生信息 * endl; cout * 3: 查找学生信息 * endl; cout * 4: 删除学生信息 * endl; cout * 5: 更改学生信息 * endl; cout * 6: 退出系统 * endl; cout * 7: 显示此帮助 * endl; cout * * endl; cout * * endl; cout * endl; cout请你选择操作(1-7):endl; _achieve.h_#ifndef ACHIEVE_H#define ACHIEVE_H#include using namespace std;class achievefriend istream &operator(istream &in, achieve &obj);friend ostream &operator(ostream &out, const achieve &obj);/重载输入输出,否则不响应 public:achieve(void);achieve(void);/ 获取总分double getTotalScore();/ 获取平均分double getAvgScore();double yu_wen;/ 语文double shu_xue;/ 数学;#endif_achieve.cpp_#include achieve.hachieve:achieve(void): yu_wen(0.0), shu_xue(0.0) /构造函数 ,将分数初始为0分 achieve:achieve(void)/析构函数 double achieve:getTotalScore()return yu_wen + shu_xue;/计算总分 double achieve:getAvgScore()const int subjectCount = 2;return getTotalScore() / subjectCount;/计算平均分 cout(istream &in, achieve &obj)/ 重载输入操作符 in obj.yu_wen obj.shu_xue;/ if (!in)/判断输入数字是否有效 ,若不空,则继续执行 obj = achieve();/ 输入无效,重置状态return in;ostream &operator(ostream &out, const achieve &obj)out 语文: obj.yu_wen , /重载输入输出操作符 数学: obj.shu_xue;return out;/返回第一个形参的引用 _完_29
展开阅读全文