和搭档搞了很久很久的一个大作业,对当时大一的我产生了极大的冲击,还记得当时写到了凌晨3点。。。
源码链接:https://gitee.com/jolin-pan/code
题目:H大学图书馆
一、 问题描述
H大学图书馆
H大学图书馆邀请你建立一个图书馆信息管理系统。请使用面向对象思想完成该问题,具体要求如下:
一、设计一款文字式交互的图书管理系统;
二、图书馆必须支持至少10000册书存储,并且可动态增长(未来书目会增多,不能是固定的)
三、图书信息包含:
l 题名
l ISBN/ISSN
l 作者
l 分类号(分类规则自定,要求有三级分类,可参考中图分类法)
四、图书馆系统提供两种用户模式,请为他们设计不同的用户类:
1)管理员模式:
l 系统最初提供一个默认的管理员账户以及默认密码;
l 管理员具备以下功能:
Ø 可以使用管理员账号登录
Ø 支持对学校用户的账号进行基本管理,添加、删除学校用户默认账号和密码,默认账号为学号/教师编号,密码为123456;恢复学校用户默认密码;
Ø 管理员可以对图书信息进行修改
Ø 管理员可以增加、删除、搜索图书
2)学校用户模式(学校用户超过5千人):
l 学校用户可以通过账号和密码登录,账号为学号/教师编号,密码为123456;
l 学校用户可以修改自己的密码
l 学校用户可以搜索图书
l 学校用户可以借、还图书
l 学校用户可以查看自己的借阅记录
五、设计图书馆类,包含馆藏图书列表、用户列表等成员,可维护馆藏记录、在馆记录、用户借阅记录等。
六、图书馆系统提供根据任一信息的搜索图书功能:
l 题名,精确查找到书
l ISBN/ISSN,精确查找到书
l 作者,模糊查找到该作者所有书,字典序排序
l 分类号,三级分类,每一级分类均可模糊查找到书,字典序排序,按页显示;如,N 自然科学总论——TP 自动化技术、计算机技术——TP3 计算机技术。
在以上每一级时,均会出现该级所有数目,字典排序,按页显示;
不明白意思的同学,可以自行登入学校图书馆系统,进入搜索书目功能中,点击分类导航选项,然后进入每级分类的页面看看
l 搜索不考察性能,仅考察功能
七、加分项(总分不超过100分)
(1)支持大数据,比如书籍记录突破百万,用户数量突破万级规模;
(2)贴近实际的图书馆管理系统,新增若干功能等;
(3)实现文件的创建、读、写等操作;
(4)考虑用户体验,如使用方便度等;
(5)搜索时性能考察,调查、思考、设计加强搜索性能的方式,此项仅适合学有余力的同学;
八、完成进度建议和自查评分
1、第一阶段,需要完成一万的图书存储;该功能需要至少设计并完成图书类与图书馆系统类的相关部分(包括相关实验报告、代码和测试);
2、第二阶段,完成两种用户模式,欠搜索功能(包括相关实验报告、代码和测试);
3、第三阶段,搜索功能(包括相关实验报告、代码和测试);知识点:文件、排序。
二、 分析设计
- 主体结构设计:用vector声明动态结构体数组books,实现动态存储图书。
用stringstream、push_back将文件读入数组,用fstream头文件下的指令实现对txt的读写和修改,分文件定义各显示函数和功能函数,在main函数中调用各文件中的显示函数和功能函数,实现图书管理系统的基本功能。
-
数据结构定义: 大量的学生账户,书籍信息用vector向量储存并用fstream写入txt。
-
函数设计:用函数和return将不同功能的函数整合到一起实现各函数的交互,共同支撑系统各个功能的实现。
几个核心函数的设计方法:
Displayzhuye函数,类型 void,通过cout语句和for循环实现输出主页菜单的功能。
例如:
storebook函数:类型void ,通过文件输入流将书籍存入txt,并实现动态增长。
如图:
Displaybooks函数:类型int,用sum=books.size()得出书籍数量,用for循环输出books[i]的相关信息。
如图:
NameSearch函数(搜索图书):类型int, 搜索图书(尤其注意分好几册的,名字一样但本质上不是同一本,也要统计数目并输出)
如图:
三、输入输出测试
1、主界面
Part 1 学生部分
1.登录界面
2.图书列表(截取部分)
3.搜索图书
(1)书名搜索
(2)ISBN码搜索
(3)作者搜索
(4)分类号搜索(分别为一级、二级、三级查询)
一级:
二级:
三级:
4.借阅图书
5.借阅记录
6.归还图书
7.修改密码
Part 2 管理员部分
1.登录界面
2.增加图书
3.删除图书
4.修改图书
5.增加用户(判断账号不存在才能添加)
6.删除用户(判断账号存在才能删除)
7.重置密码(判断账号存在才能重置密码)
四.总结与反思
一开始我们对如何存储图书毫无头绪(第一个任务就卡死了),花了一周多的时间在找方法存储图书上,问了很多人,共得到了vector、fstream、MySQL三种方法,我们分别了解了一点后,选择用vector和fstream,然后对这两个知识点进行更深入的学习,最终实现书籍的存储和动态增长。
后来我们发现storebook()和storeAccount()后的cin都失效了,我们上网搜索才知道要使用cin.clear()和cin.sync()使cin恢复正常。
初次写搜索函数时,忽略了书名、ISBN、作者会有重复的情况,后来才后知后觉赶忙补上,只能说想的还不够周到。
始我们对如何存储图书毫无头绪(第一个任务就卡死了),花了一周多的时间在找方法存储图书上,问了很多人,共得到了vector、fstream、MySQL三种方法,我们分别了解了一点后,选择用vector和fstream,然后对这两个知识点进行更深入的学习,最终实现书籍的存储和动态增长。
后来我们发现storebook()和storeAccount()后的cin都失效了,我们上网搜索才知道要使用cin.clear()和cin.sync()使cin恢复正常。
初次写搜索函数时,忽略了书名、ISBN、作者会有重复的情况,后来才后知后觉赶忙补上,只能说想的还不够周到。
考虑到用户会输错,在代码中多处增加了输入不正确指令返回初始界面的情况,以及用户想要取消操作,又给每步操作增加了确定选择。