其他类与客户端相同
一、select类
包括所有的查询操作(
按书名、书号、出版社、出版日期查询图书;
按书名模糊查询图书;
按书名+作者、出版社+作者查询图书(组合查询);
输入起止出版日期,查询指定时间段出版的图书;
按书号查询图书借阅情况;
图书类型查询本人的借阅情况;)
class Select{
protected:
vector<Book>b1;
//vector<Reader>r1;
vector<Record>d1;
Date date;
Reader reader;
multimap<string,int>bookname;
multimap<string,int>booknumber;
multimap<string,int>bookpublisher;
multimap<string,int>bookpdate;
multimap<string,int>author;
multimap<string,int>RecordBN;
multimap<string,int>RecordSno;
multimap<string,int>RecordBT;
public:
Select(Date date,Reader reader);
~Select();
void SelectBookName();
void SelectBookNumber();
void SelectPublisher();
void SelectPDate();
void LikeBN();//模糊查询
void SelectBNA();//书名+作者查询
void SelectPA();//出版社+作者查询
void SelectSchedule(string d1,string d2);//指定时间段查询
void SelectBNRecord(string bn);//书号查询图书借阅情况
void SelectBTRecord(string bt);//图书类型查询借阅情况
};
Select::Select(Date date,Reader reader)
{
this->date=date;
this->reader=reader;
}
Select::~Select()
{}
void Select::SelectBookNumber()
{
string bn;
cin>>bn;
multimap<string,int>::iterator i;
i=booknumber.find(bn);
if(i==booknumber.end())
{
return;
}
else
{
cout<<b1[i->second]<<endl;
}
}
void Select::SelectBookName()
{
string bna;
cin>>bna;
multimap<string,int>::iterator i,j;
i=bookname.find(bna);
if(i==bookname.end())
{
return;
}
else
{
for(j=bookname.lower_bound(bna);j!=bookname.upper_bound(bna);j++)
{
cout<<b1[j->second]<<endl;
}
}
}
void Select::SelectPublisher()
{
string pb;
cin>>pb;
multimap<string,int>::iterator i,j;
for(j=bookpublisher.lower_bound(pb);j!=bookpublisher.upper_bound(pb);j++)
{
cout<<b1[j->second]<<endl;
}
}
void Select::SelectPDate()
{
string pd;
cin>>pd;
multimap<string,int>::iterator i,j;
i=bookpdate.find(pd);
for(j=bookpdate.lower_bound(pd);j!=bookpdate.upper_bound(pd);j++)
{
cout<<b1[j->second]<<endl;
}
}
class Find
{
private:
const string &f;
public:
Find(const string &fd):f(fd){}
bool operator()(const multimap<string,int>::value_type& pair)
{
int n=pair.first.find(f);
if(n!=pair.first.npos)
{
return true;
}
else
{
return false;
}
}
};
void Select::LikeBN()
{
string name;
cin>>name;
multimap<string,int>::iterator i,p,first;
first=bookname.begin();
for(p=bookname.begin();p!=bookname.end();p++)
{
i=find_if(first,bookname.end(),Find(name));
if(i==bookname.end())
return;
else{
cout<<b1[i->second]<<endl;
i++;
first=i;
}
}
}
//出版社+作者组合查找
void Select::SelectPA()
{
string Pub,Aut;
cin>>Pub>>Aut;
multiset<int> m1,m2;
multimap<string,int>::iterator s1,s2,j;
vector<int> m;
vector<int>::iterator p;
s1=bookpublisher.find(Pub);
if(s1!=bookpublisher.end())
{
for(j=bookpublisher.lower_bound(Pub);j!=bookpublisher.upper_bound(Pub);j++)
{
m1.insert(j->second);
}
}
s2=author.find(Aut);
if(s2!=author.end())
{
for(j=author.lower_bound(Aut);j!=author.upper_bound(Aut);j++)
{
m2.insert(j->second);
}
}
set_intersection(m1.begin(),m1.end(),m2.begin(),m2.end(),insert_iterator<vector<int> >(m,m.begin()));
for(p=m.begin();p!=m.end();p++)
{
cout<<b1[*p]<<endl;
}
}
//书名+作者组合查找
void Select::SelectBNA()
{
string Bn,Aut;
cin>>Bn>>Aut;
multiset<int>m1,m2;
multimap<string,int>::iterator s1,s2,j;
vector<int> m;
vector<int>::iterator p;
s1=bookname.find(Bn);
if(s1!=bookname.end())
{
for(j=bookname.lower_bound(Bn);j!=bookname.upper_bound(Bn);j++)
{
m1.insert(j->second);
}
}
s2=author.find(Aut);
if(s2!=author.end())
{
for(j=author.lower_bound(Aut);j!=author.upper_bound(Aut);j++)
{
m2.insert(j->second);
}
}
set_intersection(m1.begin(),m1.end(),m2.begin(),m2.end(),insert_iterator<vector<int> >(m,m.begin()));
for(p=m.begin();p!=m.end();p++)
{
cout<<b1[*p]<<endl;
}
}
void Select::SelectSchedule(string d1,string d2)
{
multimap<string,int>::iterator i;
for(i=bookpdate.lower_bound(d1);i!=bookpdate.upper_bound(d2);i++)
{
cout<<b1[i->second];
}
}
//按书号查询图书借阅情况;
void Select::SelectBNRecord(string bn)
{
multimap<string,int>::iterator i;
for(i=RecordBN.lower_bound(bn);i!=RecordBN.upper_bound(bn);i++)
{
cout<<d1[i->second];
}
}
//图书类型查询本人的借阅情况;
void Select::SelectBTRecord(string bt)
{
multimap<string,int>::iterator i,j;
i=RecordSno.find(reader.getSno());
if(i!=RecordSno.end())
{
for(j=RecordSno.begin();j!=RecordSno.end();j++)
{
if(d1[j->second].getBookType()==bt)
{
cout<<d1[j->second];
}
}
}
}
二、operate类(继承Select类)
包括其他的操作(借书、还书、续借操作)
注:继承类的构造函数的写法
operate(Date date,Reader reader):Select(date,reader)
{
this->date=date;
this->reader=reader;
BookRead();
RecordRead();
}
完整的操作类程序
class operate:public Select
{
public:
operate(Date date,Reader reader):Select(date,reader)
{
this->date=date;
this->reader=reader;
BookRead();
RecordRead();
}
~operate();
void BookRead();
void BookWrite();
void RecordRead();
void RecordWrite();
void BorrowBook(string bn);
void ReturnBook(string bn);
void ReBorrowBook(string bn);
};
operate::~operate()
{
BookWrite();
RecordWrite();
}
void operate::BookRead()
{ Book t;
int a,b;
ifstream in("D:\\book.txt");
if(!in)
{
return ;
}
while(!in.eof())
{
in>>t;
in>>a>>b;
t.setBookSum(a);
t.setBookIn(b);
b1.push_back(t);
bookname.insert(make_pair(t.getTitle(),b1.size()-1));
booknumber.insert(make_pair(t.getBookNumber(),b1.size()-1));
bookpdate.insert(make_pair(t.getPulishDate(),b1.size()-1));
bookpublisher.insert(make_pair(t.getPublisher(),b1.size()-1));
author.insert(make_pair(t.getAuthor(),b1.size()-1));
}
in.close();
}
void operate::BookWrite()
{
ofstream out("D:\\book.txt");
vector<Book>::iterator i;
for(i=b1.begin();i!=b1.end();i++)
{
out<<*i;
}
out.close();
}
void operate::RecordRead()
{ Record r;
ifstream in("D:\\record.txt");
if(!in)
{
return ;
}
while(in.eof())
{
in>>r;
d1.push_back(r);
RecordBN.insert(make_pair(r.getBookNumber(),d1.size()-1));
RecordSno.insert(make_pair(r.getSno(),d1.size()-1));
RecordBT.insert(make_pair(r.getBookType(),d1.size()-1));
}
in.close();
}
void operate::RecordWrite()
{
ofstream out("D:\\record.txt");
vector<Record>::iterator i;
for(i=d1.begin();i!=d1.end();i++)
{
out<<*i;
}
out.close();
}
//借书(输入书号,如果书库有这本书且本人借阅量不超限,办理借书手续(本人借书量加一、图书在库数量减一)
//对本人和书生成借阅记录);
void operate::BorrowBook(string bn)
{
multimap<string,int>::iterator i;
i=booknumber.find(bn);
if(i==booknumber.end())
return;
else{
if(b1[i->second].getBookIn()>0&&reader.getBorrowNumber()<Base::getBorrowNumberMax())
{
reader.setBorrowNumber(reader.getBorrowNumber()+1);
b1[i->second].setBookIn(b1[i->second].getBookIn()-1);
Date d=date+Base::getBorrowNumberMax();
Record r(d,bn,reader.getSno(),"借出",b1[i->second].getBookType());
d1.push_back(r);
RecordBN.insert(make_pair(r.getBookNumber(),d1.size()-1));
RecordSno.insert(make_pair(r.getSno(),d1.size()-1));
}
}
}
void operate::ReturnBook(string bn)
{
multimap<string,int>::iterator i;
i=booknumber.find(bn);
if(i==booknumber.end())
return;
else{
reader.setBorrowNumber(reader.getBorrowNumber()-1);
b1[i->second].setBookIn(b1[i->second].getBookIn()+1);
Record r(date,bn,reader.getSno(),"还回",b1[i->second].getBookType());
d1.push_back(r);
RecordBN.insert(make_pair(r.getBookNumber(),d1.size()-1));
RecordSno.insert(make_pair(r.getSno(),d1.size()-1));
}
}
void operate::ReBorrowBook(string bn)
{
multimap<string,int>::iterator i;
i=booknumber.find(bn);
if(i==booknumber.end())
return;
else{
Date d=date+Base::getBorrowNumberMax();
Record r(date,bn,reader.getSno(),"续借",b1[i->second].getBookType());
d1.push_back(r);
RecordBN.insert(make_pair(r.getBookNumber(),d1.size()-1));
RecordSno.insert(make_pair(r.getSno(),d1.size()-1));
}
}
int main()
{
//读者类:学号(常成员)、姓名、专业、班级、已借图书数量、借阅记录向量;
Reader r1("2018212405","潘佳雯","计算机","18-4",1);
Date d1(2020,5,5);
operate op1(d1,r1);
op1.SelectBookName();
op1.SelectBookNumber();
op1.SelectPublisher();
op1.SelectPDate();
op1.SelectBNA();//书名+作者
op1.SelectPA();//出版社+作者
op1.LikeBN();
op1.SelectSchedule("2002","2010");
op1.BorrowBook("0000");
op1.ReturnBook("0002");
cout<<endl;
op1.ReBorrowBook("0001");
op1.SelectBNRecord("0001");
cout<<endl;
op1.SelectBTRecord("专业");
}