# 基于C++的学生生活系统设计与实现
# 一 需求分析
需要设计并实现如下场景:在那山的那边,湖的那边,有一所学校,学校里有一幢宿舍楼,宿舍楼有若干层,每一层有若干房间 ,一群学生快乐地生活在这里。他们每天可做的事情有:
- 换宿舍,从一个房间搬到另一个房间
- 退学,亦即搬出宿舍楼
- 入学,亦即搬入宿舍楼
- 吃饭,吃饭会增加体重,花费金钱
- 学习,学习会消耗体重,增加魅力(注:学习是唯一可以直接提升魅力值的活动,这个养成游戏的价值导向还是蛮正确的)
- 化妆(女生独有),化妆会花费金钱,提升容貌
- 运动(男生独有),运动会消耗体重,增加健康(注:体重、容貌、健康与魅力之间存在一定的转化关系)
- 谈恋爱,学生可以向其他的某个学生提出恋爱请求,被求爱的学生依据二者魅力值之差按照某种概率答应对方的求爱请求,从而建立双方的恋爱关系
- 分手,处于恋爱关系的两个学生中的任何一方都可以提出分手,依据二者魅力值之差按照某种概率分手成功,从而断开二者之间的恋爱关系
此外,宿舍楼还可进行扩建,亦即增加楼层,增加某层的房间数,以及增加某个房间可容纳的人数(不考虑这种任意增加的物理可能性),经过一段时间的生活后可对学生的状态信息进行查询。
# 二 系统架构设计
系统功能模块如下图所示:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/1ca4742bd6ff38025caf9cfe5af6e67c.writebug)
# 三 程序设计思路
按照功能模块将程序分为初始化模块、读取执行活动指令模块以及查询模块。
## 3.1 初始化模块
要从sample\_config.txt文件读取初始配置,并且将数据保存为全局变量从而可供所有文件使用,该文件内容在各个文件中都能使用到;从dispatch.txt文件读取初始宿舍的具体信息,并且建立最初的宿舍。
## 3.2 读取执行活动指令模块
文件读取方面,首先用文件流的方式读取,并且都使用split函数将指令分解成vector\<string\>,然后通过比较字符串判断指令的格式以及翻译指令内容,然后根据指令调用对应的功能函数。
对各种指令和功能进行分析,可以归纳出主要有两个具体的对象进行活动:学生和宿舍,因此需要分别构造Student类和Dorm类并且对活动结果进行记录。
学生从事吃饭、学习、恋爱活动。学生自身具有名字、性别、魅力值等属性,但是根据性别的差异有不同的特殊属性,因此用类的继承即可记录共有的属性值以及各自特有的属性值;学生从事的吃饭、学习等活动应作为类的成员函数进行实现,才更加符合对象独自完成的活动,而且吃饭、学习虽是公有活动,但是具体的实现方法根据性别会有不同,因此将这些共有的活动用虚函数在Student类中声明,并且在派生类中根据性别调用特有的实现方法;因学生的性别不同而导致的活动实现差异通过Student抽象基类指针统一调用,在具体的派生类中则分别实现其具体的活动过程;恋爱活动为多对象的活动,因此作为全局函数来实现;所有的活动都会引起一些属性的改变,只需根据规则或者公式进而实现即可。
宿舍则主要进行入学、退学、搬宿舍、改变楼层等活动。首先是宿舍的结构,用结构体ROOM表示房间,其中包含人员、容量、性别(不能男女混住,因此需要有性别区别)等具体信息,再用vector\<ROOM\>表示一层楼,再嵌套一层vector表示一幢宿舍;其次改变楼层的活动add可以用重载的方法使得在增加楼层、房间、床位的函数实现上简化编写,在增加楼层等时需要按初始值初始化房间;入学等人员的活动则是对宿舍内部的信息进行修改,将这些活动设计为Dorm的成员函数更为妥当;由于需要存储所有具体的学生对象,在Dorm类中声明为共有成员变量可以使Dorm类与Student类的关联更为紧密,并且用映射的方法可以使学生对象得到共享,并且方便了查询;入学、退学、搬宿舍则是对学生对象的修改和房间信息的修改,需要两个地方同时修改,而且内存的分配和回收也要注意。
## 3.3 查询模块
显示查询界面,通过输入序号选择查询,并且对屏幕进行适时的更新或者清屏;
调用查询函数,根据输入的指令调用相应的功能函数,并且在屏幕中输出查询的结果;
实现功能,找出属性值的最值以及范围查询可以通过将所有的Student类的指针用vector保存,再按属性的值得大小排序,则可求出最值,范围查询则直接遍历比较即可输出结果;倘若需要分性别查询,则分别建立男生vector和女生vector进行排序;对于学生具体信息可通过名字直接在map中找到对应的对象,查找房间号则可以按下标找到对应房间,最后输出查找结果即可。
# 四 详细设计
## 4.1 对象结构及功能
Student类作为抽象基类为男生和女生声明共同的成员变量和类成员函数来表示男女学生共有的属性以及学生个体的活动,例如:名字、性别、体重等共有的属性值,以及学习、吃饭等共有的学生活动。将共有的活动设计成虚函数是由于活动相同但是具体的实现不同,例如女生的魅力值的计算公式则与男生魅力值计算公式不同。
Girl类、Boy类通过继承Student类并且实现其所有虚函数从而实现学生活动得出可实例化的具体类,并且分别添加各自的特有属性:容貌值和健康值;引用了Student指针使得学生活动会根据具体Girl类或Boy类来进行函数的调用,实现多态。Girl类和Boy类中还添加实现了weight\_add()函数等私有函数,是为了使调用eat、study等学生活动函数时对于其它属性值的相应改变更为明显、直观,而且对学生活动的公式修改更为方便,直接修改增量函数即可。
Dorm类实现建立宿舍的结构,用vector的方式分别记录楼层、房间,每个房间则用结构体保存人名、宿舍人员性别以及容量;用map\<string, Student\*\>记录所有入住的学生,实现从名字映射到具体的学生,从而通过名字共享了学生数据,方便对学生信息进行修改,并且还方便了在宿舍进行搬宿舍等活动中一旦对学生进行了修改,在修改学生信息时可直接通过名字找到该学生对象并且修改房号或者查询;add成员函数分别重载实现了增加楼层、增加房间和增加床位;enrol、quit、move分别实现入学、退学、搬宿舍。
Init\_value.h中的命名空间变量是用于保存初始化配置信息,并且可供各个文件使用。
## 4.2 公有函数实现
Initial.h包含初始化的功能函数:initv,读入配置信息初始为Init_value中的配置信息赋值;inits,读入宿舍的初始人员信息构建宿舍,通过调用Dorm的enrol函数即可实现入学。
love.h的court和breakup分别实现求爱和分手功能,因为恋爱功能是两个对象,因此作为全局函数更为合适;通过公式计算出是否成功恋爱或者分手,从而对两个对象属性分别进行修改。
read.h则从instructions.txt文件读取指令,并且通过split和比较选择将读入的数据翻译为指令并且调用对应的指令函数,需要对指令的格式进行判断并且显示出异常的指令。
query.h包含了各种关于查询的显示和调用函数,首先对各个界面的内容进行显示,然后通过输入的内容对查询的内容进行具体选择查询,然后分别访问Student
精选_毕业设计_基于C++的学生生活系统设计与实现_完整源码
版权申诉
14 浏览量
2022-03-05
03:40:28
上传
评论
收藏 57KB ZIP 举报
工具盒子
- 粉丝: 60
- 资源: 1313
最新资源
- 基于opencv+yolov8实现目标追踪及驻留时长统计源码.zip
- 水稻病害基于Yolov8算法优化目标检测识别与AI辅助决策python源码+模型+使用说明.zip
- 海尔618算价表_七海5.20_16.00xlsx(1)(2).xlsx
- WebCrawler.scr
- 【计算机专业毕业设计】大学生就业信息管理系统设计源码.zip
- YOLO 数据集:8种路面缺陷病害检测【包含划分好的数据集、类别class文件、数据可视化脚本】
- JAVA实现Modbus RTU或Modbus TCPIP案例.zip
- 基于YOLOv8的FPS TPS AI自动锁定源码+使用步骤说明.zip
- JAVA实现Modbus RTU或Modbus TCPIP案例.zip
- 基于yolov8+streamlit的火灾检测部署源码+模型.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈