个人博客地址:https://travis1024.github.io/
简单文件数据库-模拟图书馆管理系统
1. 问题描述
编写一个程序模拟图书管理系统。用户分为管理员和读者两类,分别显示不同文本格式菜单,通过菜单项对应数字进行选择。读者菜单包括借书、还书、查询等功能。管理员菜单包括图书和读者信息录入、修改和删除。图书信息至少应包括:编号、书名、数量,读者信息至少应包括:编号、姓名、所借图书。可根据图书名称或编号进行图书信息查询,可查询某本书现在被哪些读者借走,命令行参数如下:Libsim –a(-u) xxxx
第一个参数为可执行程序名称;第二个参数为用户身份,-a表示管理员,-u表示读者;第三个参数为用户名。
2. 问题分析
-
文件需要对数据信息进行存储,我们应该考虑怎么样对txt文件进行设计才能让数据文件尽可能全面且简洁;
-
如何对txt文件进行写入,读取或者修改;
-
在对程序进行设计时我们还需要考虑程序结构,在保证程序完整性,功能完整性的同时,还尽可能应该保证程序结构逻辑的可读性;
-
系统与读者和管理员的交互,而且读者与管理员的部分功能是类型,我们可不可以将类似的功能合在一起,以避免代码的冗余,这是在设计之初需要考虑的问题。
3. 处理方法设计(算法步骤)
-
首先是结构体和类采用哪种实现方式的选择:
C++中的类和结构体都可以继承,struct可以继承class,同样class也可以继承struct;C++中的类和结构体都可以封装,两者都可以包含成员变量和成员方法,都可以具有构造函数和析构函数。C++中的类和结构体都可以多态,允许成员函数是虚函数可以多态;C++中的类和结构体都具有访问控制,都可以用public、protected、private修饰其成员变量和成员方法。C++中的类和结构体都是按指传递的。另外,都可以同过彼此的方式初始化。
而struct和class之间最本质的一个区别就是默认的访问控制: struct默认的数据访问控制是public的,而class默认的成员变量访问控制是private的。在继承方面,struct可以继承class,class同样可以继承struct。但是,struct默认是public继承,class默认是private继承。也就是说,在不指定继承方式时,struct是public继承父类的,class是private继承父类的,无论父类是class还是struct。
综上并根据c++的特性,以及出于对后续程序设计的便捷性,可移植性,代码的可读性考虑,我决定采用类实现本程序的功能。 -
经过初步设计,需要建立了四个txt文档,以存储相应的数据:
(1)BookList.txt书籍id,书籍名称,总数量,可借阅数量;
(2)Manager.txt管理员id,管理员密码,管理员姓名;
(3)Reader.txt读者id,读者密码,读者姓名;
(4)ReaderInfoRecord借阅者id,借阅图书名称,借阅数量; 其中,有关读者姓名,管理员姓名,读者名称这三个字段,在进行输入时支持使用空格,为使读取方便,在对有空格的名称进行存储时,已将空格转换成下划线;
-
需要建立7个类,以实现相应的功能:
- BookInfo类:其面向BookList.txt,用来实现书籍信息的读取,录入或者修改;
- ReaderInfo类:其面向ReaderInfoRecord.txt,用来实现对借阅记录信息的读取,录入,修改或者删除;
- ManagerPassword类:其面向Manager.txt,用来实现对管理员信息的读取,以及登陆信息的验证;
- ReaderPassword类,其面向Reader.txt,用来实现对读者信息的读取,以及登录信息的验证;
- Commonfunction类:在此类中,作为Reader类和Manager类的父类,实现两个子类共同需要的功能;
- Reader类,继承Commonfunction类,除此在此类中实现读者独有的功能;
- Manager类:继承Commonfunction类,除此在此类中实现管理员独有的功能;
-
管理员功能:

-
读者功能
-
主要函数功能说明:
(1)UpdataMap()
程序在对读者id和姓名对应,管理员id和姓名对应时采用map数组以简化对txt文件的操作;此函数功能是在更改名字时更新map数组;
(2)Login_Judge()
登陆判断,检测id和密码是否正确;
(3)ReadData()
打开相应的txt文件,读取数据函数;
(4)WriteBookInfo()
打开txt文件,追加读写,不会覆盖掉之前的所有信息;
(5)Update_BookFreeNumber()
更新书籍剩余的可借阅数量,在借阅书籍或者还书时,更新BookList.txt文件的数量信息;
(6)JudgeRepeat()
在增加信息时,判断id(书籍或者读者)是否在txt文件中已经存在;
(7)Deal_Black()
判断名称中是否存在空格,如果存在将空格替换成下划线;
(8)RemoveBlack()
在对txt文件进行操作后,可能出现空白行的情况,造成文件空间的浪费,此函数功能即为删除文件中的空白行;
4.测试数据设计
-
管理员:
1)增加图书信息
2)更改图书信息
3)删除图书信息
4)查询图书馆中所有书籍的信息
5)增加读者信息
6)更改读者信息
7)删除读者信息
8)查询所有注册过的读者信息
9)读者借阅书籍(增加借阅记录)
10)修改读者借阅信息(修改借阅记录)
11)读者退还书籍(删除借阅记录)
12)查询所有的借阅记录
13)退出系统 -
读者:
1)借阅图书
2)退还图书
3)查看所有书籍的信息
4)修改个人信息
5)退出系统
5.测试结果分析
-
管理员
(1)增加图书信息


(2)更改图书信息


(3)删除图书信息

(4)查询图书馆中所有书籍的信息


(5)增加读者信息

(6)更改读者信息


(7)删除读者信息

(8)查询所有注册过的读者信息

(9)读者借阅书籍(增加借阅记录)

(10)修改读者借阅信息(修改借阅记录)

(11)读者退还书籍(删除借阅记录)

(12)查询所有的借阅记录

-
读者
(1)借阅图书

(2)退还图书

(3)查看所有书籍信息

(4)修改个人信息

6.程序结构






