c++数据结构 链表操作 学生管理系统



《c++数据结构 链表操作 学生管理系统》由会员分享,可在线阅读,更多相关《c++数据结构 链表操作 学生管理系统(29页珍藏版)》请在装配图网上搜索。
1、刘杨&李虎乘&刘杨&李虎乘&刘杨&李虎乘&刘杨&李虎乘&刘杨&李虎乘&刘杨&李虎乘&刘杨&李虎乘&刘杨&李虎乘 北京邮电大学课程设计报告 刘杨 李虎乘 We are the best! 课程设计 名称 学生信息管理系统 学 院 理学院 指导教师 谷勇浩 班 级 班内序号 学 号 学生姓名 成绩 2010214102 5 10212653 李虎乘 2010214102 23 10212670 刘杨 课 程 设 计 内 容 教学目的:1、进一步掌握利用C++进行类的定义
2、和操作方法; 2、进一步掌握类的继承和派生方法; 3、进一步理解虚函数和多态; 4、综合利用上述知识,学习设计并编写面向对象的 C++简单应用程序; 5、培养学生团结协作的能力。 基本内容:用C++语言编写学生信息管理系统。 实验方法:在DEV C++环境下编写代码并排查语法错误和运行错误。 团队分工:李虎乘负责节点、链表、增加、查找、删除、更改函数的编写;刘杨负责主函数、输入输出流、输出函数、现实帮助函数的编写。其余工作均有参与。 学生 课程设计 报告 (附页) 课 程 设 计 成 绩 评 定 遵照实践教学大纲并根据以下四
3、方面综合评定成绩: 1、课程设计目的任务明确,选题符合教学要求,份量及难易程度 2、团队分工是否恰当与合理 3、综合运用所学知识,提高分析问题、解决问题及实践动手能力的效果 4、是否认真、独立完成属于自己的课程设计内容,课程设计报告是否思路清晰、文字通顺、书写规范 评语: 成绩: 指导教师签名: 年 月 日 注:评语要体现每个学生的工作情况,可以加页。 第一章 需求分析 1. 课程设计性质和目的……………………………………………………… 第二章 使用说明和程序流程图 1.
4、 系统总框图…………………………………………………………………. 2. 使用手册…………………………………………………………………… 3. 第三章 程序设计 1. 每个模块的设计分析及功能描述……………………………………………… 2. 函数和重要参数及其说明……………….……………………………………. 第四章 总结 附件:源代码 第一章、需求分析 一、设计目的 1、进一步掌握利用C++进行类的定义和操作方法; 2、进一步掌握类的继承和派生方法; 3、进一步理解虚函数和多态; 4、综合利用上述知识,学习设计并编写
5、面向对象的C++简单应用程序; 5、培养学生团结协作的能力。 掌握一般类的定义、测试、封装、数据隐藏、继承及多态等概念,掌握面向对象程序设计的基本概念和基本方法,掌握 C++语言的基本语法和基本内容,并能运用C++语言进行基本的面向对象程序设计,并且通过综合课程设计,提高实践动手技能,培养独立分析分析问题和解决问题的能力。 第二章、系统总框图 开始界面 主要提示菜单界面 增加学生信息 删除学生信息 输出学生信息 显示帮助界面 修改学生信息 结束 二、使用手册 1、输入输出的形式 本系统是一
6、个学生成绩管理系统,采用DEV 编译器作为开发环境,这个环境是我们在学习C++时使用的平台。输入数据类型主要是char、int、float等数据类型,输入内容包括:班级、学号、姓名、性别、语文成绩、数学成绩等数据。显示内容包括:班级、学号、姓名、平均分等数据。 2、程序的实现功能 用户运行程序后进入系统主界面,在主界面用户可以输入所有学生的数据并保存到文件中,也可以读取文件中已有的学生数据。本系统同时只能对一个数据文件进行相关操作,不能同时打开多个数据文件,其类似于单用户操作系统。 当用户读取学生数据后可对其进行显示,插入,删除,修改,计算平均分等相关操作。用户在操作过程中可随时对当前文
7、件进行保存到文件操作,以防止修改的数据丢失。 3、操作演示 ⑴、增加学生信息进入开始界面以后,输入数字 1 ,即可进入“增加学生信息功能” 然后,依照程序提示的格式,逐个输入该学生的信息,每个类别的信息以回车为间隔。 完成输入以后,结束功能,回归指令界面。 如果还需要增加,只需重复以上操作即可。 ⑵、输出学生信息 进入指令界面以后,输入数字 2 ,进入输出学生信息功能: 本系统提供的输出功能除包括对已经输入的学生基本信息以外,还自动附带对总分的计算并输出、对平均分的计算并输出。详情可参考上图。 如果学生信息为空,即尚未输
8、入任何学生信息数据,则会提示“没有学生信息”。 ⑶、查找学生信息 进入指令界面以后,输入数字 3 ,即可进入“查找学生信息”功能: 查找时,输入要查找对象的学号进行操作,按回车确认输入: 如果输入的信息有误(无法匹配),则会提示“没有符合条件的学生”。 ⑷、删除学生信息 同样地,输入学生学号,进行匹配,匹配失败则会提示“没有符合条件的学生”。成功,则会删除该对象的信息。 ⑸、修改学生信息 进入指令界面以后,输入数字 5 ,即可进入“修改学生信息”功能。输入学生学号进行对象确认。同样地,参照输入学
9、生信息时的方式,进行信息重新输入。 倘若修改时输入的学号无法在已经录入的学生信息中找到匹配的,则会提示“没有找到符合条件的学生”。 ⑺、显示帮助信息表格 用于帮助现实提示表格。在指令界面下,键入数字7即可进入该功能。 第三章、程序设计 一、每个模块的设计分析及功能描述 1 main.cpp 主函数,用于实现对提示界面及对函数的操作。 2 appcommand.h Appcommand的头文件。外部声明appcommand类,实现对以下函数的的声明: 增加学生信息函数: addInform(); 输出学生信息函数: outputInformLi
10、st(); 查找学生信息函数:searchInform(); 删除学生信息函数:deleteInform(); 更改学生信息函数:modifyInform(); 显示帮助函数:showHelp(); 3 Listnode.h Listnode的头文件。外部声明Listnode类,实现单链表的生成及岁单链表操作的声明, 4 inform.h Inform的头文件。外部声明inform类,实现对学生信息的存储。 5 achieve.h Achieve的头文件。外部声明achieve类,实现对计算学生总分与平均分的函数的声明。 6 appcommand.cpp Appcomm
11、and的源文件。定义appcommand类,实现对头文件中声明函数的的定义。 7 Listnode.cpp Listnode的源文件。定义Listnode类,实现对单链表的具体操作等。 8 inform.cpp Inform的源文件。定义inform类,实现对学生信息的存储的操作。 9 achieve.cpp Achieve源头文件。定义achieve类,实现对计算学生总分与平均分的函数的具体定义(该函数在查找中课体现)。 二、文件所定义的函数及其说明 一 、main 1.int main()函数: 主函数,用于产生主操作界面及提示用户进行操作。 二 、ppcom
12、mand 1.addInform()函数: 增加学生信息函数,用于增加学生信息。在主操作页面中输入1调用。 2.outputInformList()函数: 输出学生信息函数,用于输出学生信息。在主操作页面中输入2调用 3. searchInform()函数: 查找学生信息函数,用于查找学生信息。在主操作页面中输入3调用 4. deleteInform()函数: 删除学生信息函数,用于删除学生信息。在主操作页面中输入4调用 5. modifyInform()函数; 修改学生信息函数,用于修改学生信息。在主操作页面输入5调用
13、 6. showHelp()函数; 显示主页面,在主操作页面输入5调用。 三、achieve 1. getTotalScore()函数: 用于计算学生的总分,可以在查找学生信息的同时显示学生总分。 其中对输入输出函数进行重载 2. getAvgScore()函数 用于计算学生的平均分,可以在查找学生信息的同时显示学生平均分。 其中对输入输出函数进行重载 三、重要参数说明 1 addInform()函数:尾指针:*pTail , 头指针: *pHead 2 outputInformList()函数:指针变量 *p 3 sear
14、chInform()函数:指针变量 *p 4 deleteInform()函数:指针变量 *p,指针变量 *q 5 modifyInform()函数:指针变量*found,指针变量 *p; 第四章、总结 一、语法错误 1、语句的最后忘记了加上“;”,使程序发生错误。 2、把“<<”与“>>”写反,以及字符与字符串的操作问题,这些是比较简单的错误,很容易分辨出来,并改正之。 3、函数的返回值问题,也是比较容易找出并解决的问题。 二、逻辑错误 1、数据的输入与读出,刚开始对数据的操作不太明白,一致不能很好的操作,其中最大的问题是对输入输出流的控制、重载问题,通过“
15、输出” 将数据从系统中读出,可是在使用过程中总是出现读出错误,出现乱码。 2、内存的分配问题,这也是困惑了我好久的问题。对于我们初学者来说对内存的分配和释放问题是比较抽象和模糊的难题,本来使用链表的方式存储数据,然而待到排序时出现了交换数据困难的问题,以及分配空间繁琐释放空间不及时的问题,造成空间浪费使得程序运行效率低的问题。因此最后采用了顺序存储记录的方式,这样就能改变前述问题。 3、对最后的菜单进行编写时,刚开始只能单次循环,然后直接跳出菜单,后来我们进行商量讨论,运用循环语句的嵌套写出了完整的菜单系统。 三、心得与体会 2、课程设计经验和体会 一个多月的课程设计,虽然有些疲劳和
16、困倦,但带给我们很多的收获。C++已经学了一个学年了,有许多知识都存在似懂非懂的现象,这种现象通过实际的上机操作,已经减少了许多。对这些知识也有了更深的理解和很好的掌握。也有很多理论上说得过去的代码,但到了实际操作,却是行不通的。这种困惑,有许多已经通过实际操作解决了,并能够深刻认识,但也有很多没有明白。只能避过这些方法,换方法实现。在课程设计之前,因为有了综合实验的经验与教训,明白了写代码这一步是非常重要的,因为当你把代码输入电脑,并用编译器将其运行,发现通过不了,再来检查找出问题,这是一件非常辛苦的事情,也很浪费时间。于是在课程设计的时候,我们花了数天的时间来规划与写代码,将要实现的内容分
17、析清楚,才把代码输入电脑。我们从中发现,写程序应该先找到该程序中的核心地方,用多种方法来实现该核心,这才可能避免等到发现逻辑上或者编译器不支持上的错误,才来想补救的措施,这样花费时间在想补救措施是很不值得的。此次任务的完成,也体现出同学之间的团结精神。实践是检验真理的唯一标准。没有实践,就不会发现和深刻体会它的真实所在。只有通过检验的真理,在自己的心里,才会认可它的真实性。面向对象程序设计的完成,使我们懂得了真理的重要性,理论和实际的相结合,才能真正把握所学和所掌握的知识。此外,此次程序设计课,也增添了我们对计算机编程的兴趣与爱好,可以说,这是一次非凡的经历!
18、 刘杨 李虎乘
2011年11月
于北京邮电大学
附件:程序源代码
__________________main.cpp____________________
#include
19、de "appcommands.h" using namespace std; class ListNode; ListNode *pHead; int main() { pHead = NULL; showHelp(); cout << "请输入命令..." << endl; int n;//接收用户输入的命令 while (cin >> n) { if (n == 1) { addInform(); } else if (n == 2) { outputInformList()
20、; } 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(); } else { cout << "无效命令" << endl; } c
21、out << "请输入命令..." << endl; } // 没有显示释放链表占用的内存,进程结束时由操作系统回收内存 system("pause"); return 0; } __________________listnode.h___________________#ifndef LISTNODE_H #define LISTNODE_H #include "Inform.h" class ListNode// ListNode 类指对节点和单链表的操作 { public: ListNode(Inform &data
22、); ~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________
23、___________ #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(
24、void) const//指针后移
{
return _next;
}
void ListNode::SetNext(ListNode * node)//
{
_next = node;
}
ListNode::~ListNode()//析构函数
{
}
__________________inform.h___________________
#ifndef INFORM_H
#define INFORM_H
#include
25、h" using namespace std; class Inform { public: //输出(流)的重载(统一格式输出学生信息) friend ostream &operator<<(ostream &output, const Inform &t); //输入(流)的重载(统一格式输入学生信息) friend istream &operator>>(istream &input, Inform &t); public: Inform(void); ////学生信息的初始化,拷贝构造函数使用编译器合成的版本
26、//Inform(Inform &d); // 析构函数 ~Inform(); ////学生信息的匹配判断(所有信息都匹配) //int operator==(const Inform &d); // ////查找学生的某项信息s是否匹配 //int operator==(char *s); // ////查找学生的某项信息t是否不匹配 //int operator!=(char *t); ////学生信息赋值操作 //Inform &operator=(Inform &d); public: /
27、/ 数据成员 //学号 string number; //身份证号 string id; //姓名 string name; //性别 string sex; //成绩(第一步基本信息中无此变量) achieve ach; //电话号码 string phonenumber; //寝室号 string roomnumber; }; #endif ________________inform.cpp___________________ #include "Inf
28、orm.h" Inform::Inform() { } Inform::~Inform(void) { } ostream &operator<<(ostream &output, const Inform &t)//输出(流)的重载(统一格式输出学生信息) ,使可以在inform类上使用iostream { output << "身份证: " << t.id << ", "//t是output(重载操作符) 的形参 << "姓名: " << t.name << ", " << "学号: " << t.number << ",
29、" << "电话: " << t.phonenumber << ", " << "寝室: " << t.roomnumber << ", " << "性别: " << t.sex << ", " << t.ach; return output; } //输入(流)的重载(统一格式输入学生信息) istream &operator>>(istream &input, Inform &t) { input >> t.id >> t.name >> t.number >> t.phonenumber >> t
30、.roomnumber >> t.sex >> t.ach; if (!input) { // 输入无效,重置状态 t = Inform(); } return input; } ________________appcommands.h___________________ // 应用程序的命令 // 增加学生信息 void addInform(); // 输出学生信息 void outputInformList(); // 查找学生信息 void searchInform(); // 删除学生
31、信息
void deleteInform();
// 更改学生信息
void modifyInform();
// 显示帮助
void showHelp();
_______________appcommands.app__________________
#include
32、 ListNode *pHeadbefore; // 增加学生信息 void addInform()//增加学生信息 { cout << "增加学生信息,格式为:身份证,姓名,学号,电话,寝室号,性别,语文分数,数学分数" << endl; Inform inform; cin >> inform; if (cin)// 判断是否输入成功 { if (!pHead)//判断phead指针是否为null ,如果是null 则继续运行 { pHead = new ListNode(inform);//listnode为链表的新节点
33、 } else//如果phead不为空 { ListNode *pTail = pHead; while(pTail->GetNext() != NULL)//getnext为listnode的成员函数,作用为取得下一个节点 { pTail = pTail->GetNext();//指向尾结点的指针向后移动 }// 找到尾部节点,加到队尾 pTail->SetNext(new ListNode(inform));//把新节点挂到链表尾 } } } // 输出学生信息 void out
34、putInformList()
{
cout << "输出学生信息" << endl;
if (!pHead) //判断phead指针是否为null ,如果是null 则输出没有学生信息
{
cout << "没有学生信息" << endl;
return;//表示函数结束
}
ListNode *p = pHead;//
while(p)//判断p ,如果p不为null则继续
{
cout<
35、; //指针向后 } } // 查找学生信息 void searchInform() { if (!pHead)//判断phead指针是否为null ,如果是null 则输出没有学生信息 { cout << "没有学生信息" << endl; return; } cout << "查找学生信息,请输入学号" << endl; string input; cin >> input; if(cin) { ListNode *p = pHead; while (p)//判断p ,如果p不为null则继续
36、
{
if (p->GetData().number == input)
{
cout<
37、 void deleteInform()// 删除学生信息 { cout << "删除学生信息,请输入学号" << endl; string input; cin >> input; if(cin) { ListNode *p = pHead; ListNode *q = pHeadbefore ; while (p)//判断p ,如果p不为null则继续 { if (p->GetData().number == input) { q=p->GetNext();
38、 delete p; p=q; break; } // 向后走 q=p; p=p->GetNext(); } } cin.clear();// 清除标准输入的错误(如果有) } void modifyInform() { cout << "更改学生信息,请输入学号" << endl; string input; cin >> input; ListNode *found =
39、 NULL; if(cin)//输入正确 { ListNode *p = pHead; while (p) { if (p->GetData().number == input) { found = p; break; } p = p->GetNext(); // 向后走 } } // 清除标准输入的错误(如果有) cin.clear(); if (found) { cout << "修改" << found->GetData().number << "的信息,格
40、式为:身份证,姓名,电话,寝室号,性别,语文分数,数学分数" << endl;
Inform inform;
cin >> inform.id
>> inform.name
>> inform.phonenumber
>> inform.roomnumber
>> inform.sex
>> inform.ach;
if (cin) // 输入成功
{
found->SetData(inform);
}
}
else
{
cout << "没有找到符合条件的学生记录" < 41、
}
}
void showHelp()// 显示帮助
{ cout<<" *********************************************************** "< 42、
cout<<" * 1: 增加学生信息 * "< 43、 * "< 44、 * "< 45、_____________
#ifndef ACHIEVE_H
#define ACHIEVE_H
#include 46、);
// 获取总分
double getTotalScore();
// 获取平均分
double getAvgScore();
double yu_wen; // 语文
double shu_xue; // 数学
};
#endif
________________achieve.cpp__________________
#include "achieve.h"
achieve::achieve(void)
: yu_wen(0.0), shu_xue(0.0)
{
}//构造函数 ,将分 47、数初始为0分
achieve::~achieve(void)
{
}//析构函数
double achieve::getTotalScore()
{
return yu_wen + shu_xue;//计算总分
}
double achieve::getAvgScore()
{
const int subjectCount = 2;
return getTotalScore() / subjectCount;//计算平均分
cout<< getAvgScore();
}
//
istream &operator>> 48、(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
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。