设计思路
图书管理包括两个方面的操作,管理员和用户(即学生)的操作, 管理员可以对书籍和用户都进行增删查改,而用户只能对自己修改,对图书查找,实现基本的借书,还书,查书的各项功能。
设计方案(思路具体化&&基础改进版)
时间类 Time
数据:
//年月日
int year;
int month;
int day;
//函数
get&set函数
构造函数(有参和无惨)
友元函数重载输入输出流
重载小于号(里面包括小于等于号)
书籍类 Book
//数据:
string title;//书名
int number;//编号
Time date;//出版日期
string writer;//作者
int price;//价格
int num;//剩余个数
//函数
get&set函数
构造函数(有参和无惨)
友元函数重载输入输出流
修改剩余个数函数
void modifyNum(int n)
{
num=num-n;
}
用户记录类 RecrodUser
//数据:
Time date;//时间
BookUser book;//书籍
string type;//借阅类型
//int num;//借阅几本
//函数
构造函数(基本数据类型,和类的包涵构造函数)
无参构造函数
get&set函数
重载输入输出流
管理员记录类 RecrodManager
//数据:
string name;//借阅人姓名
Time date;//借阅时间
BookUser book;//借阅书籍
string type;//借阅类型
//int num;//借阅几本本书
string type1;//是否还书
//函数
构造函数(基本数据类型,和类的包涵构造函数)
无参构造函数
get&set函数
重载输入输出流
用户类 User
//数据:
string name;//姓名
string mima;//密码
vector<RecrodUser> u;
//函数
有参构造函数(无交易数据)
无参构造函数
复制构造函数
重载输入输出流
void add()函数,增加交易记录
void disRecordUser(int i)函数,显示一条用户交易记录
void disALLRecordUser()函数,显示所有用户交易记录
void queryUserTime(Time t1,Time t2)函数,查询指定时间段的交易记录
void queryType(steing s)函数,查询指定交易类型的交易记录
管理员类 Manager
//数据:
string mName;
string Mmima;
vector<RecrodManager> m;
//函数
有参构造函数(无交易数据)
无参构造函数
复制构造函数
重载输入输出流
void add()函数,增加交易记录
void disRecordManager(int i)函数,显示一条管理员交易记录
void disALLRecordManager()函数,显示所有管理员交易记录
void queryManagerTime(Time t1,Time t2)函数,查询指定时间段的交易记录
void queryType(steing s)函数,查询指定交易类型的交易记录
操作类 Oper
//数据:
vector<BookManager> book;//表示图书储存
User u;
Manager m;
//函数
get&set函数;
有参构造函数(基础数据和类数据)
无参构造数据
重载输入输出流函数
sort1函数,将馆藏图书按照图书名字典序排序
sort2函数,将馆藏图书按照编号排序
addBook函数,增加图书馆书籍(还书时和储存书用)
borrow函数,借书
send函数,归还书
queryString函数(按照图书名查询是否有书,剩余几本)
queryNum函数(按照图书编号查询是否有书,剩余几本)
checkquery 查询个人借阅资料
display,显示用户信息//包含交易记录
queryUserTime(Time t1,Time t2)函数,查询指定时间段的交易记录
queryTypeUser(steing s)函数,查询指定交易类型的交易记录
queryManagerTime(Time t1,Time t2)函数,查询指定时间段的交易记录
queryTypeManager(steing s)函数,查询指定交易类型的交易记录
方案改进
将操作类分离开,分别建立用户操作类和管理员操作类。
建立用户和图书可以共同的使用的记录类,数据成员包含,操作人员(管理员/用户
),被操作书籍信息,操作时间等。
还可已将用户和管理员类中相同功能的函数,或者函数名相同的函数,提取出来,建立基类,并在基类中使用虚函数(完全虚函数),减少代码量&&优化代码。
同时还可以将用户操作类和管理员操作类中的相同数据成员与成员函数建立基类,使用继承法,继续优化代码,让代码变得简洁。
规范函数的名称,更改函数的上下位置关系,让代码变得更加易懂。
出现的问题&&解决
最大的问题就是操作记录的正常同步,存在向量的类想采用自己写复制构造函数的方式深复制,避免出现数据丢失的问题。
调整重载运算符的数输出格式,以确保文件可以重复读写。
知识收获&&感悟
第一次完全放弃使用数组,使用vector(动态数组)的方式储存,和multimap的查找方式,代码比以前简洁、规范和易懂,理解明白里push_back、insert、erase、find等的具体实现方法,发现了push_back()输入时要写深复制的复制构造函数,等等新知识
使用STL里面的全局函数对一些数据进行操作,简化手动编写代码。
每写一个新的程序时,都会又新的知识收获,这一次我就是学会了STL常用功能的基础使用。
代码实现: