1. 主要功能
l 增加图书信息—管理员
l 增加用户信息—管理员
l 查询图书信息—用户、管理员
l 查询用户借阅信息—管理员
l 用户借阅图书、归还图书—用户
l 图书续借—用户
l 更改图书序号及最大图书量—管理员
l 删除图书信息—管理员
l 删除用户信息—管理员
l 清空系统全部信息—管理员
1. 时间类:定义年月日,包括构造函数、get&set函数、重载输入输出运算符。
intyear,month,day;
bool operator<(const Date&d);
friend ostream&operator<<(ostream&os,const Date &d);
friend istream&operator>>(istream&is,Date &d);
2. 记录类:定义学号、借书时间、书号、还书时间、是否还书。通过get&set函数、重载输入输出运算符以及将时间类数据成员包含进来实现功能。
int xh;(学号)
Date start;(借书时间)
int sh;(书号)
Date end;(还书时间)
int state;(未还书-0;已还书-1)
3. 记录集合基类:定义记录的数目、记录集合、map,在借阅时生成借阅记录,包含借书信息,是用户类和图书类的基类。
int number;
vector<Record> v1;
vector<Record> ::iterator it1;
multimap<int,int>m2;
multimap<int,int>::iteratormit2;
4. 图书派生类:定义书号、书名、作者、最大图书量、可借数量、借出数量等图书基本信息,利用add及delete区分图书的借阅及归还记录。重载输入输出运算符并设置,当输入-1时跳出记录。
int sh;
string sm;
string author;
int max;
int now;//图书库存量
multimap<int,int>m1;
multimap<int,int>::iterator mit1;
is>>b1.sh;
if(b1.sh==-1)
return is;
is>>b1.sm>>b1.author>>b1.max>>b1.now>>b1.number;
b1.v1.clear();
5. 用户记录派生类:定义学号、姓名、登陆密码、专业、最大借阅量以及初始借阅情况,与图书记录类类似。
int xh;
string xm;
string major;
string mima;
int max;
int now;
multimap<int,int>m1;
multimap<int,int>::iterator mit1;
6. 查询图书基类:为实现管理员及用户查询图书信息的功能,在该类中主要使用继承实现。
7. 数据类:定义账号、密码、登陆类型等。
int no; //账号;
string pwd; //密码;
int type; //1是管理员;0是用户;
8. 管理派生类:该类中包括person集合、图书集合、用户集合。利用load save函数实现文件的输入输出。管理员的功能,如清除、更改、查询、删除等,主要利用该类来定义实现。
利用load函数,载入图书、用户、person的记录。
voidManage::load1()
{
Book b;
int i;
ifstream infile("D:\\20171757book.txt",ios::in);
if(!infile)
{
return ;}
v3.clear();
m3.clear();
while(infile>>b)
{v3.push_back(b);
int i=v3.size();
m3.insert(make_pair(b.getSh(),i-1));
}infile.close();
}
利用save函数,在增加信息后,将增加的信息与原有的信息储存在相应TXT文件中。
voidManage::save1()
{
ofstreamoutfile("D:\\20171757book.txt",ios::out);
if(!outfile)
{
return ;}
for(it3=v3.begin();it3!=v3.end();it3++)
{
outfile<<*it3;
}
outfile.close();
}
9. 客户端操作派生类:该类实现用户借书、还书、续借等功能。并且该类必须在指定用户,即带参的情况下使用。
voidClient::save3()
{
ofstreamoutfile("D:\\20171757book.txt",ios::out);
if(!outfile)
{
return ;}
for(it3=v3.begin();it3!=v3.end();it3++)
{
outfile<<*it3;
}
outfile.close();
}
voidClient::load3()
{
Book b;
int i;
ifstreaminfile("D:\\20171757book.txt",ios::in);
if(!infile)
{
return ;}
v3.clear();
m3.clear();
while(infile>>b)
{v3.push_back(b);
int i=v3.size();
m3.insert(make_pair(b.getSh(),i-1));
}
infile.close();
}
10. 登陆类-父类:定义提取person中的账户信息,以person集合中的成员为数据成员,再应用load提取数据,并在person中进行查询,看是否有无该用户或管理员。
classCheckIn //登陆类;
{
public:
CheckIn(){load();}
void load();
virtual void login()=0; //纯虚函数;
protected:
vector<Person>pv;
vector<Person>::iterator pt;
multimap<int,int> mu; //按照账号查询;
multimap<int,int>::iterator muit;
};
11. 登陆类-子类:该部门应用多态,来实现在同一界面登陆用户或者管理员。并在person中进行查询,看是否有无该用户或管理员。
voidCheckIn::load()
{
Person p;
ifstream infile("D:\\Person.txt",ios::in);
if(!infile)
return;
pv.clear();
mu.clear();
int i=0;
while(infile>>p)
{
pv.push_back(p);
mu.insert(make_pair(p.getNo(),i));
i++;
}
infile.close();
}
12. Main主函数:包括提示句以及当状态为0时进入用户界面,状态为1时进入管理员界面。
int main()
{
cout<<"用户登录,请输入0;管理员登录,请输入1"<<endl;
int i;
cin>>i;
cout<<"请输入账号和密码"<<endl;
if(i==0)
{
UserCheckin u;
u.login();
}
if(i==1)
{
AdminCheckIn a;
a.login();
}
return 0;
通过这次对于图书管理系统的编程及设计,发现一个系统的编程是与一个个类、与一个个小的程序完全不同的。因为小的程序只需要一个或两三个类就可以实现,比较简单,而一个系统则需要各个类之间的关联,比如继承、多态等。
在系统编程之前,最重要的是,以一个使用者的角度和身份去思考,设计这个系统我希望使用哪些功能,又该如何去实现,是以怎样一个顺序和关系去实现,而这之后,才是再去思考,我可以用哪些学过的知识去完成。
本学期的内容较上学期难了一个层面,类的基本功能、继承、重载、多态、STL等内容,都是必须一个个掌握,而不能妄图拉下其中一个再去学习另外一个的,他们之间是一个循序渐进的过程,正如图书管理系统的设计,也是一个类调试完成之后,再去继续调试更深层次的下一个类的内容。