设计思路
基本功能为增删查改,实现文件的读和写,使用STL以及vector。
将一个系统分为用户和管理员两大类:
对于用户,分为用户数据类和用户操作类:
在用户数据类中只有借阅记录的向量。
在用户操作类中只有书的向量而没有用户的向量,主要功能为查书、借书、还书、续借。
在管理员中又分为管理图书和管理用户:
管理图书的操作为:增加图书,删除图书,查询图书。
管理用户的操作为:增加用户、删除用户、查询用户。
另外还有时间类,借阅记录类以及图书信息类。
时间类:包含年月日,主要功能为判断时间大小为后面对书的操作是否违规做准备。
借阅记录类:其中包含的数据成员主要是学号、书号、借阅时间、归还时间、是否续借、是否在借。
图书信息类:包含的数据成员为书号、书名、图书总量、出版社、借阅数目、出版日期、借阅记录条数等。该类中应当含有借阅记录向量。另外要写增加借阅记录、删除借阅记录、查找借阅记录的功能代码,为后面管理员和用户的操作做准备。
遇到的问题
如何将生成的借阅记录推到图书和用户向量中去。
为什么当一次运行后文件中的数据就消失了。
运行中会出现程序崩溃的情况。
4、构建时出现很多错误,但这些错误标记的行并没有错误。
在图书和用户中增加了一个数据成员为借阅记录的条数,新书和新用户借阅记录条数为0,每次借书都生成一条借阅记录,并同时将该书和该用户的借阅记录条数加一,再把该条借阅记录推进该图书和该用户信息下面
load()没有写好导致文件中的数据不能及时更新。
越界是崩溃的一个原因,还有一次是因为复制构造函数写错了导致程序崩溃,修改后就能正常运行了。
找了很长时间才终于发现原来出现这种错误是因为某个地方少写了“;”、“(”、“)”等等符号或者在某个地方不小心写上了字母。而且错误的地方不在提示的错误行中。所以写程序时一定一定要细心,否则真的会浪费很长时间。
总结收获
滚雪球法是写系统的正确方法,一点一点增加功能完善功能,而不是写出所有的功能后再调试(错误多到改不过来)。另外写系统重要的是组织数据,使用STL以及vector。很多地方可以使用模板,当写过一个系统后,其中的一些功能比如增删查改都可以在其他系统中用到。所以自己要试着写系统试着使用STL的一些函数并熟悉这些函数。实践是学习的最好方法。
代码实现
#include<iostream>
#include<fstream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
//时间类
class Date{
public:
//无参构造函数
Date()
{
year=0;
month=0;
day=0;
}
//有参构造函数
Date(int y,int m,int d):year(y),month(m),day(d){}
//get&set函数
int getYear(){return year;}
int getMonth(){return month;}
int getDay(){return day;}
void setYear(int y){year=y;}
void setMonth(int m){month=m;}
void setDay(int d){day=d;}
void setDate(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
void display();//显示函数
//重载"<"比较日期大小
bool operator<(const Date&d)const
{
return year!=d.year?year<d.year:month!=d.month?month<d.month:day<d.day;}
//重载输入输出流
friend ostream&operator<<(ostream&out,const Date&d);//整体输出Date对象数据
friend istream&operator>>(istream&in,Date&d);//整体输入Date对象数据
//重载赋值运算符
Date&operator=(const Date&d){
year=d.year;
month=d.month;
day=d.day;
}
private:
int year;
int month;
int day;
};
//显示函数
void Date::display()
{
cout<<year<<" "<<month<<" "<<day<<endl;
}
//重载输入输出流
ostream&operator<<(ostream&out,const Date&d)
{
out<<d.year<<" "<<d.month<<" "<<d.day;
return out;
}
istream&operator>>(istream&in,Date&d)
{
in>>d.year>>d.month>>d.day;
return in;
}
//借阅记录类
class Record{
public:
//无参构造函数
Record(){}
//有参构造函数
Record(int nu,Date beg,int n)
{
num=nu;
begin=beg;
number=n;
if(beg.getMonth()+2>12)
{
Date e(beg.getYear()+1,beg.getMonth()-10,beg.getDay());
end=e;
}
else
{
Date e(beg.getYear(),beg.getMonth()+2,beg.getDay());
end=e;
}
renew=0;
state=0;
}
//get&set函数
int getNum(){return num;}//得到学号
int getNumber(){return number;}//得到书号
int getRenew(){return renew;}//是否续借
int getState(){return state;}//是否归还
Date getBegin(){return begin;}//得到借阅时间
Date getEnd(){return end;}//得到还书时间
void setRenew(){renew=1;}//将renew置为1(当前为续借)
void setEnd();//设置还书时间
void setState(int n){state=n;}//设置书的状态
//重载输入输出流
friend istream&operator>>(istream&in,Record&r);//整体输入Record对象数据
friend ostream&operator<<(ostream&out,Record&r);//整体输出Record对象数据
//重载赋值运算符
Record&operator=(const Record&r)
{
num=r.num;
renew=r.renew;
begin=r.begin;
end=r.end;
number=r.number;
state=r.state;
}
private:
int num;
int renew;//是否续借,0为否1为是
Date begin;//借阅时间
Date end;//归还时间
int number;//书号
int state;//=1在借,=0已还
};
//从上一次借的归还时间起往后加两个月
void Record::setEnd()
{
Date e;
if(end.getMonth()+2>12)
e=Date(end.getYear()+1,end.getMonth()-10,end.getDay());
else
e=Date(end.getYear(),end.getMonth()+2,end.getDay());
end=e;
}
//重载输入输出流
istream&operator>>(istream&in,Record&r)
{ in>>r.num;
if(r.num==-1)
return in;
in>>r.begin>>r.number>>r.end>>r.renew>>r.state;
return in;
}
ostream&operator<<(ostream&out,Record&r)
{
out<<r.num<<" "<<r.begin<<" "<<r.number<<" "<<r.end<<" "<<r.renew<<" "<< r.state<<endl;
return out;
}
struct cmp7
{
int num;
cmp7(int n){num=n;}
bool operator()(Record&r)
{
return (r.getNum()==num);
}
};
//图书信息类
class Book{
int number;//书号
string title;//书名
int sum;//图书总量
string press;//出版社
int jc;//j借阅数目
Date date;//出版日期
int no;//借阅记录个数
vector<Record>v1;//借阅记录信息
vector<Record>::iterator it1;
multimap<int,int>m1;//按学号查找借阅记录
multimap<int,int>::iterator mit1;
public:
//无参构造函数,初始化数据成员
Book(){}
//有参构造函数
//Book(int n,string ti,int s,string p,int j,Date d):number(n),title(ti),sum(s),press(p),jc(j),date(d){}
vector<Record>getRecord()
{
return v1;
}
//get&set函数
int getNumber(){return number;}
string getTitle(){return title;}//书名
int getSum(){return sum;}//书号
int getNo(){return no;}
string getPress(){return press;}//出版社
Date getDate(){return date;}
int getJc(){return jc;}
void setSum(int s){sum=s;}//书号
void setJc(int j){jc=j;}
void setNo(int n){no=n;}
void operator=(Book&b){
number=b.number;
title=b.title;
sum=b.sum;
press=b.press;
jc=b.jc;
date=b.date;
no=b.no;
v1=b.getRecord();
}
//重载输入输出流函数
friend istream&operator>>(istream&in,Book&b);
friend ostream&operator<<(ostream&out,Book&b);
void addRecord1(Record r1);//增加借阅记录
void displayRecord1();//显示所有的借阅记录
void deleteRecord1(int num);//删除借阅记录,并非真正删除原记录
int search1(int num);//按学号查找借阅记录
void display();//显示图书信息
void modify(int num);
void addR1(Record r1);
void clear1();
};
//显示图书信息
void Book::display()
{
cout<<number<<" "<<title<<" "<<press<<endl;
date.display();
}
//重载输入输出流
istream&operator>>(istream&in,Book&b)
{in>>b.number;
if(b.number==-1)
return in;
in>>b.title>>b.sum>>b.press>>b.jc>>b.date>>b.no;
return in;
}
ostream&operator<<(ostream&out,Book&b)
{
out<<b.number<<" "<<b.title<<" "<<b.sum<<" "<<b.press<<" "<<b.jc<<" "<<b.date<<" "<<b.no<<endl;
if(b.getNo()!=0)
for(int i=0;i<b.getNo();i++)
out<<b.v1[i];
return out;
}
//管理员操作时增加借阅记录
void Book::addR1(Record r1)
{
v1.push_back(r1);
int i=v1.size();
m1.insert(make_pair(r1.getNum(),i-1));
}
//用户操作时生成借阅记录
void Book::addRecord1(Record r1)
{
r1.setState(1);//图书被借
v1.push_back(r1);
int i=v1.size();
m1.insert(make_pair(r1.getNum(),i-1));
}
//显示所有的借阅记录
void Book::displayRecord1()
{
if(v1.size()!=0)
for(it1=v1.begin();it1!=v1.end();it1++)
cout<<*it1;
else
cout<<"no record!"<<endl;
}
//按学号查找借阅记录
int Book::search1(int num)
{
mit1=m1.find(num);
if(mit1!=m1.end())
{
return mit1->second;
}
else
return -1;
}
//修改renew以及还书日期
void Book::modify(int num)
{
int i=search1(num);
if(v1[i].getRenew()==0)
{v1[i].setRenew();//借阅记录中将renew改为1(续借)
v1[i].setEnd();//设置还书日期
}
}
//“删除记录”(将归还的图书状态置为已还)
void Book::deleteRecord1(int num)
{
it1=find_if(v1.begin(),v1.end(),cmp7(num));
while(it1!=v1.end())
{
v1[it1-v1.begin()].setState(0);
it1=find_if(it1+1,v1.end(),cmp7(num));
}}
//清除
void Book::clear1()
{
v1.clear();
}
struct cmp1
{
int number;
cmp1(int n){number=n;}
bool operator()(Record&r)
{
return (r.getNumber()==number);
}
};
//用户数据类
class User{
public:
User()
{
wj=0;//用户起初无违纪记录
no=0;//用户起初无借阅记录
}
User(int nu,string nam,int n,int wj1,int no1)
{
num=nu;
name=nam;
max=10;
now=n;
wj=wj1;
no=no1;
}
//复制构造函数
//User(const User&u):num(u.num),name(u.name),max(u.max),now(u.now),wj(u.wj),no(u.no){}
//重载输入输出流
friend istream&operator>>(istream&in,User&u);
friend ostream&operator<<(ostream&out,User&u);
//get&set函数
string getName(){return name;}
int getNum(){return num;}
int getMax(){return max;}
int getNow(){return now;}
int getWj(){return wj;}
int getNo(){return no;}
void setName(int n){name=n;}
void setNum(int n){num=n;}
void setMax(int m){max=m;}
void setNow(int n){now=n;}
void setWj(int w){wj=w;}
void setNo(int n){no=n;}
vector<Record>getRecord()
{
return v2;
}
void addRecord2(Record r2);//增加借阅记录
void dispRecord2();//输出所有的借阅记录
int search2(int number);//按书号查找借阅记录
int search6(int number);//按书号查找借阅记录并输出
void display();//显示用户信息
void deleteRecord2(int number);//”删除“借阅记录
void modify(int number);
void judge(Date t);//判断是否超时未还图书并修改违纪状况
void clear2();
void addR2(Record r);
void operator=(User&u)
{
num=u.getNum();
name=u.getName();
max=u.getMax();
now=u.getNow();
wj=u.getWj();
no=u.getNo();
v2=u.getRecord();
}
//如果学号是当前用户返回1否则返回0
bool operator==(User u)
{
return this->num==u.getNum()?1:0;
}
private:
vector<Record>v2;//借阅记录信息
vector<Record>::iterator it2;
multimap<int,int>m2;
multimap<int,int>::iterator mit2;
string name;//姓名
int num;//学号
int max;//最大借书量
int now;//当前借书量
int wj;//是否违纪
int no;
};
//重载输入输出流整体输入用户信息
istream&operator>>(istream&in,User&u)
{
in>>u.num;
if(u.num==-1)
return in;
in>>u.name>>u.max>>u.now>>u.wj>>u.no;
return in;
}
ostream&operator<<(ostream&out,User&u)
{
out<<u.num<<" "<<u.name<<" "<<u.max<<" "<<u.now<<" "<<u.wj<<" "<<u.no<<endl;
if(u.getNo()!=0)//有借阅记录
for(int i=0;i<u.getNo();i++)
out<<u.v2[i];
return out;
}
//管理员增加借阅记录
void User::addR2(Record r2)
{
v2.push_back(r2);
int i=v2.size();
m2.insert(make_pair(r2.getNumber(),i-1));
}
//用户借书时生成借阅记录
void User::addRecord2(Record r2)
{r2.setState(1);
v2.push_back(r2);
int i=v2.size();
m2.insert(make_pair(r2.getNumber(),i-1));
}
//输出所有的借阅记录
void User::dispRecord2()
{if(v2.size()!=0)
for(it2=v2.begin();it2!=v2.end();it2++)
cout<<*it2;
else
cout<<"No Record!"<<endl;
}
//显示用户信息
void User::display()
{
cout<<num<<" "<<name<<" "<<max<<" "<<now<<" "<<wj<<" "<<no<<endl;
}
//按书号查找借阅记录
int User::search2(int number)
{
mit2=m2.find(number);
if(mit2!=m2.end())
return mit2->second;
else
return -1;
}
//按书号查找借阅记录并输出
int User::search6(int number)
{
it2=find_if(v2.begin(),v2.end(),cmp1(number));
while(it2!=v2.end())
{
cout<<"found"<<endl;
cout<<v2[it2-v2.begin()]<<endl;
it2=find_if(it2+1,v2.end(),cmp1(number));
}}
//"删除"借阅记录
void User::deleteRecord2(int number)
{
it2=find_if(v2.begin(),v2.end(),cmp1(number));
while(it2!=v2.end())
{
v2[it2-v2.begin()].setState(0);
it2=find_if(it2+1,v2.end(),cmp1(number));
}}
//判断是否超时未还图书并修改违纪状况
void User::judge(Date t)
{ setWj(0);
for(int i=0;i<v2.size();i++)
if(t<v2[i].getEnd()&&v2[i].getState()==1)
{setWj(1);
break;
}
}
//修改renew以及还书日期
void User::modify(int number)
{
int i=search2(number);
if(v2[i].getRenew()==0)
{
v2[i].setRenew();
v2[i].setEnd();
}
}
void User::clear2()
{
v2.clear();
}
struct cmp3
{
int number;
cmp3(int n){number=n;}
bool operator()(Book&b)
{
return (b.getNumber()==number);
}
};
struct cmp4
{
int num;
cmp4(int n){num=n;}
bool operator()(User&u)
{
return (u.getNum()==num);
}
};
//管理类
class Operator{
public:
Operator()
{
load1();//构造函数从文件读数据
load2();//构造函数从文件读数据
}
~Operator()
{
save1();//析构函数写数据到文件
save2();//析构函数写数据到文件
}
void load1();//读文件操作
void load2();//读文件操作
void save1();//写文件操作
void save2();//写文件操作
void addBook();//新书上架
void deleteBook();//旧书下架
void displayAllBook();//输出所有的图书
int search3(int number);//按书号查书
int search7(int number);//按书号查书并输出
void modifyBook();//修改图书数目
void addUser();//增加用户
void deleteUser();//删除用户
void dispUser();//显示所有的用户
int search4(int num);//按学号查找用户
int search8(int num);//按学号查找用户并输出
void queryByNum();//按学号查找用户信息
void queryByNumber();//按书号查书
void modifyUser();//修改用户最大借书量
private:
vector<Book>v3;//图书信息
vector<Book>::iterator it3;
multimap<int,int>m3;//按书号查书
multimap<int,int>::iterator mit3;
vector<User>v4;//用户信息
vector<User>::iterator it4;
multimap<int,int>m4;
multimap<int,int>::iterator mit4;
};
//从文件读入数据到集合对象
void Operator::load1()
{
Book b;
int i;
ifstream infile("D:\\20171793book.txt",ios::in);
if(!infile)
{ return;}
v3.clear();
m3.clear();
i=0;
while(infile>>b)
{v3.push_back(b);
m3.insert(make_pair(b.getNumber(),i-1));
i++;
}
infile.close();
}
//从文件读入数据到集合对象
void Operator::load2()
{
User u;
int i;
ifstream infile("D:\\20171793stu.txt",ios::in);//数据文件在d盘根目录下
if(!infile)
return;
v4.clear();
m4.clear();
i=0;
while(infile>>u)
{
v4.push_back(u);
m4.insert(make_pair(u.getNum(),i));
i++;
}
infile.close();
}
//写文件
void Operator::save1()
{
ofstream outfile("D:\\20171793book.txt",ios::out);
if(!outfile)
return ;
for(it3=v3.begin();it3!=v3.end();it3++)
{
outfile<<*it3;
}
outfile.close();
}
//写文件
void Operator::save2()
{
ofstream outfile("D:\\20171793stu.txt",ios::out);
if(!outfile)
return;
for(it4=v4.begin();it4!=v4.end();it4++)
{
outfile<<*it4;
}
outfile.close();
}
//新书上架
void Operator::addBook()
{
Book b;
int i;
while(1)
{cout<<"请输入增加图书的图书信息,输入-1结束增加图书操作:"<<endl;
cout<<"书号、书名、图书数目、出版社、借出数目、出版日期、借阅记录条数"<<endl;
cin>>b;
if(b.getNumber()==-1)
break;
if(b.getNo()!=0)
for(int i=0;i<b.getNo();i++)
{
Record r;
cout<<"请输入该书的借阅记录:"<<endl;
cout<<"学号、借阅时间、书号、还书时间、是否续借(1为续借否则为0)、是否在借 "<<endl;
cin>>r;
b.addR1(r);
}
v3.push_back(b);
i=v3.size();
m3.insert(make_pair(b.getNumber(),i-1));
b.clear1();
cout<<"新书上架成功!"<<endl;
}
}
//按书号查书
int Operator::search3(int number)
{
mit3=m3.find(number);
if(mit3!=m3.end())
{
return mit3->second;
}
else
return -1;
}
//按书号查书
void Operator::queryByNumber()
{
int number;
cout<<"请输入要查询的图书的书号:"<<endl;
cin>>number;
int i=search3(number);
cout<<v3[i];
}
//旧书下架
void Operator::deleteBook()
{
int number;
cout<<"请输入要下架的图书书号,输入-1结束下架:"<<endl;
cin>>number;
int i=search3(number);
if(i!=-1)
{
it3=v3.begin()+i;
m3.erase(m3.find(number));
v3.erase(it3);
cout<<"旧书下架成功!"<<endl;
}
}
//按书号查书并输出
int Operator::search7(int number)
{
it3=find_if(v3.begin(),v3.end(),cmp3(number));
if(it3!=v3.end())
{
cout<<"found"<<endl;
cout<<v3[it3-v3.begin()]<<endl;
it3=find_if(it3+1,v3.end(),cmp3(number));
}
else
cout<<"not found!"<<endl;
}
//按书号修改图书数目
void Operator::modifyBook()
{
int number;
cout<<"请输入要修改数目的图书的书号:"<<endl;
cin>>number;
int i=search3(number);
int sum;
cout<<"请输入修改后的图书数目:"<<endl;
cin>>sum;
v3[i].setSum(sum);
}
//输出所有的图书
void Operator::displayAllBook()
{
for(it3=v3.begin();it3!=v3.end();it3++)
cout<<*it3<<endl;
}
//增加用户
void Operator::addUser()
{
User u;
int i;
while(1)
{cout<<"请输入用户信息,按-1结束增加用户操作"<<endl;
cout<<"学号、姓名、最大借书量、已借书量、是否违纪(违纪填1否则为0),借阅记录条数"<<endl;
cin>>u;
if(u.getNum()==-1)
break;
if(u.getNo()!=0)
for(int i=0;i<u.getNo();i++)
{
Record r;
cout<<"请输入该用户的借阅记录:"<<endl;
cout<<"学号、借阅时间、书号、还书时间、是否续借(1为续借否则为0)、是否在借 "<<endl;
cin>>r;
u.addR2(r);
}
v4.push_back(u);
i=v4.size();
m4.insert(make_pair(u.getNum(),i-1));
u.clear2();
cout<<"用户增加成功!"<<endl;
}
}
//按学号查找用户
int Operator::search4(int num)
{
mit4=m4.find(num);
if(mit4!=m4.end())
{
return mit4->second;
}
else
return -1;
}
//按学号查找用户并输出用户信息
int Operator::search8(int num)
{
it4=find_if(v4.begin(),v4.end(),cmp4(num));
if(it4!=v4.end())
{
cout<<"found"<<endl;
cout<<v4[it4-v4.begin()]<<endl;
it4=find_if(it4+1,v4.end(),cmp4(num));
}
else
cout<<"not found!"<<endl;
}
//按学号查找用户信息
void Operator::queryByNum()
{
int num;
cout<<"请输入学号进行查找:"<<endl;
cin>>num;
int i=search4(num);
cout<<v4[i];
}
//删除用户
void Operator::deleteUser()
{
int num;
cout<<"请输入要删除的用户的学号:"<<endl;
cin>>num;
int i=search4(num);
if(i!=-1)
{
it4=v4.begin()+i;
m4.erase(m4.find(num));
v4.erase(it4);
cout<<"删除用户成功!"<<endl;
}
}
//按学号修改用户最大借书量
void Operator::modifyUser()
{
int num;
cout<<"请输入要修改的用户学号:"<<endl;
cin>>num;
int i=search4(num);
int m;
cout<<"请输入修改后的最大借书量:"<<endl;
cin>>m;
v4[i].setMax(m);
cout<<"修改成功!"<<endl;
}
//显示所有的用户信息
void Operator::dispUser()
{
for( it4=v4.begin();it4!=v4.end();++it4)
cout<<*it4;
}
struct cmp5
{
int number;
cmp5(int n){number=n;}
bool operator()(Book&b)
{
return (b.getNumber()==number);
}
};
struct cmp6
{
string title;
cmp6(string t){title=t;}
bool operator()(Book&b)
{
return (b.getTitle().find(title)!=string::npos);
}
};
//用户操作类
class UserOp
{
public:
UserOp()
{
load3();//构造函数从文件读数据
load4();//构造函数从文件读数据
}
~UserOp()
{
save3();
save4();
}
void load3();//读文件操作
void save3();//写文件操作
void load4();//读文件操作
void save4();//写文件操作
int search5(int number);//按书号查书
int search9(int number);//按书号查书并输出图书信息
void queryByNumber();//按书号查书并输出图书信息
void displayAllBook();//输出所有的图书
void borrow();//借书
void back();//还书
void Renew();//续借
private:
vector<Book>v5;//图书信息
vector<Book>::iterator it5;
multimap<int,int>m5;
multimap<int,int>::iterator mit5;
User u;
Book b;
};
//从文件读入数据到集合对象
void UserOp::load3()
{
Book b;
int i;
ifstream infile("D:\\20171793book.txt",ios::in);//数据文件在d盘根目录下
if(!infile)
{ return;}
v5.clear();
m5.clear();
i=0;
while(infile>>b)
{
if(b.getNo()!=0)
for(int i=0;i<b.getNo();i++)
{
Record r3;
infile>>r3;
b.addR1(r3);
}
v5.push_back(b);
m5.insert(make_pair(b.getNumber(),i-1));
i++;
b.clear1();
}
infile.close();
}
//从文件读入数据到集合对象
void UserOp::load4()
{int num;
cout<<"请输入用户学号:"<<endl;
cin>>num;
User u1;
int i;
ifstream infile("D:\\20171793stu.txt",ios::in);
if(!infile)
return;
while(infile>>u1)
{
if(u1.getNo()!=0)
for(int i=0;i<u1.getNo();i++)
{
Record r4;
infile>>r4;
u1.addR2(r4);
}
if(u1.getNum()==num)
this->u=u1;
u1.clear2();
}
infile.close();
}
//写文件
void UserOp::save3()
{
ofstream outfile("D:\\20171793book.txt",ios::out);
if(!outfile)
{
return ;}
for(it5=v5.begin();it5!=v5.end();it5++)
{
outfile<<*it5;
}
outfile.close();
}
//写文件
void UserOp::save4()
{vector<User>v;
vector<User>::iterator it;
User u1;
ifstream infile("D:\\20171793stu.txt",ios::in);
if(!infile)
return ;
while(infile>>u1)
{//cout<<u<<endl;
if(u1.getNo()!=0)
for(int i=0;i<u1.getNo();i++)
{
Record r5;
infile>>r5;
u1.addR2(r5);
}
if(u1==this->u)
u1=this->u;
v.push_back(u1);
u1.clear2();
}
infile.close();
ofstream outfile("D:\\20171793stu.txt",ios::out);
if(!outfile)
return;
for(it=v.begin();it!=v.end();it++)
outfile<<*it;
outfile.close();
}
//按书号查书
int UserOp::search5(int number)
{
mit5=m5.find(number);
if(mit5!=m5.end())
{
return mit5->second;
}
else
return -1;
}
//按书号查书并输出
int UserOp::search9(int number)
{
it5=find_if(v5.begin(),v5.end(),cmp5(number));
if(it5!=v5.end())
{
cout<<"found"<<endl;
cout<<v5[it5-v5.begin()]<<endl;
it5=find_if(it5+1,v5.end(),cmp5(number));
}
}
//输出所有的图书
void UserOp::displayAllBook()
{
for(it5=v5.begin();it5!=v5.end();it5++)
cout<<*it5<<endl;
}
//按书号查书并输出图书信息
void UserOp::queryByNumber()
{int number;
cout<<"请输入要查询图书的书号:"<<endl;
cin>>number;
int i=search5(number);
if(i!=-1)
v5[i+1].display();
}
//借书
void UserOp::borrow()
{
int number;
Date t;
cout<<"请输入要借的图书书号:"<<endl;
cin>>number;
cout<<"请输入借阅时间:"<<endl;
cin>>t;
int i=search5(number)+1;
u.judge(t);
for(it5=v5.begin();it5!=v5.end();it5++)
{
if(it5->getNumber()==number&&u.getWj()==0&&u.getNow()<u.getMax())
{
v5[i].setJc(v5[i].getJc()+1);//图书借出数目加一
u.setNow(u.getNow()+1);//用户目前借书量加一
v5[i].setNo(v5[i].getNo()+1);//借阅记录增加一条
u.setNo(u.getNo()+1);
Record r(u.getNum(),t,number);
v5[i].addRecord1(r);
u.addRecord2(r);
//cout<<u.getNo();
//输出所有的借阅记录
//u.dispRecord2();
cout<<"借阅成功!"<<endl;
}
}}
//还书
void UserOp::back()
{//借阅记录不增加,只是将借阅记录中该书的state(在借)改为0(已还),用户的目前借书量以及该书的借出量均减一
Date t;
int number;
cout<<"请输入要还的图书书号:"<<endl;
cin>>number;
cout<<"请输入还书时间:"<<endl;
cin>>t;
t.setMonth(t.getMonth()-2);
int i=search5(number)+1;
for(it5=v5.begin();it5!=v5.end();it5++)
{
if(it5->getNumber()==number&&u.getWj()==0&&u.getNow()<u.getMax())
{
v5[i].setJc(v5[i].getJc()-1);//图书借出数目减一
u.setNow(u.getNow()-1);//用户目前借书量减一
//v5[i].setNo(v5[i].getNo()+1);//借阅记录增加一条
//u.setNo(u.getNo()+1);//借阅记录增加一条
// Record r(u.getNum(),t,number);
//v5[i].addRecord1(r);
//u.addRecord2(r);
v5[i].deleteRecord1(u.getNum());//“删除”借阅记录
u.deleteRecord2(number);//“删除”借阅记录
cout<<"还书成功!"<<endl;
}}}
//续借
void UserOp::Renew()
//用户目前的借书量不变,且续借的图书的借出数量不变。
{ Date t;
int number;
cout<<"请输入要续借的图书书号:"<<endl;
cin>>number;
cout<<"请输入续阅时间:"<<endl;
cin>>t;
int i=search5(number)+1;
u.judge(t);//判断是否违纪(超期未还)
for(it5=v5.begin();it5!=v5.end();it5++)
{
if(it5->getNumber()==number&&u.getWj()==0&&u.getNow()<u.getMax())
{
v5[i].setNo(v5[i].getNo()+1);//借阅记录增加一条
u.setNo(u.getNo()+1);//借阅记录增加一条
Record r(u.getNum(),t,number);//生成一条借阅记录
r.setRenew();//将借阅记录中的renew改为1(当前为续借)
v5[i].addRecord1(r);
u.addRecord2(r);
//cout<<u.getNo();
cout<<"续借成功!"<<endl;
}
}}
int main()
{
//测试Date类
/*
Date d1(2018,6,1),d2(2018,6,2);
d1.display();
d2.display();
Date d3;
d3=d1;
cout<<d3;
Date d4;
cin>>d4;
cout<<d4;
*/
//测试记录类
/*
Record r1;
cin>>r1;
cout<<r1;
*/
//测试图书信息类
/*
Book b1;
Record r2;
cin>>r2;
b1.addRecord1(r2);
b1.displayRecord1();
b1.deleteRecord1(20171793);
b1.displayRecord1();
Date d2(1998,10,3);
Book book1(30,"围城",1,"人民出版社",0,d2);
book1.display();
Book book2;
book2=book1;
book2.display();
Book book3;
cin>>book3;
book3.display();
cout<<book3;
*/
//测试用户数据类
/*
Date d1(2018,6,1),d2(2018,6,2);
Record r1;
cin>>r1;
Record r2;
cin>>r2;
User user1(20171793,"孔藤",0);
user1.addRecord2(r1);//只测试,不实现该功能,借阅记录自动生成
user1.addRecord2(r2);
user1.dispRecord2();//输出所有的借阅记录
user1.search6(1);//按书号查找借阅记录并输出
User user2;
user2=user1;
user2.display();
cout<<user2;
user1.deleteRecord2(1);
user1.dispRecord2();//输出所有的借阅记录
*/
//测试管理类
//Date t1(2018,6,1);
//Operator o1;
//o1.addBook();//新书上架
//o1.addUser();//增加用户
//o1.deleteUser();//删除用户
//o1.deleteBook();//旧书下架?????实现不了功能
//o1.modifyBook();//修改图书总数???实现不了功能
/*
o1.displayAllBook();//输出所有的图书
o1.displayAllBook();//输出所有的图书
o1.search7(1);//按书号查书并输出
o1.search7(20);//按书号查书并输出
o1.modifyUser();//修改用户最大借书量
o1.queryByNum();//按学号查找用户信息
o1.search8(20171700);//按学号查找用户并输出
o1.search8(20172019);//按学号查找用户并输出
o1.dispUser();//显示所有的用户
*/
//测试用户操作类
UserOp u1;
//u1.borrow();//借书
//u1.back();//还书
u1.Renew();//续借
//u1.displayAllBook();//显示所有的图书
/*
u1.queryByNumber();//按书号查书并输出图书信息
u1.search9(1);//按书号查书并输出图书信息
*/
return 0;
}