#include<bits/stdc++.h>
using namespace std;
class Date
{
int year,month,day;
public:
Date(int x,int y,int z):year(x),month(y),day(z) {}
Date() {year=0;month=0;day=0;}
int getYear() {return year;}
int getMonth() {return month;}
int getDay() {return day;}
void setYear(int x) {year=x;}
void setMonth(int y) {month=y;}
void setDay(int z) {day=z;}
bool operator <(const Date&d);
friend ostream &operator<<(ostream&os,const Date &d);
friend istream &operator>>(istream&is,Date &d);
};
bool Date::operator<(const Date&d)
{
year!=d.year?year<d.year:month!=d.month?month<d.month:day!=d.day;
}
ostream &operator<<(ostream &os,const Date&d)
{
os<<d.year<<" ";
os<<d.month<<" ";
os<<d.day;
return os;
}
istream&operator>>(istream&is,Date&d)
{
is>>d.year>>d.month>>d.day;
return is;
}
class Record
{
int xh;
Date start;
int sh;
Date end;
int state;//是否还书0未还1已还
public:
Record(int a5,Date a6,int a7,int a10):start(a6)
{
xh=a5;
sh=a7;
state=a10;
if (a6.getMonth()+2>12)
{
Date d(a6.getYear()+1,a6.getMonth()-10,a6.getDay());
end=d;
}
else
{
Dated(a6.getYear(),a6.getMonth()+2,a6.getDay());
end=d;
}
}
Record() {}
int getXh() {return xh;}
Date getStart() {return start;}
int getSh() {return sh;}
Date getEnd() {return end;}
int getState() {return state;}
void setXh(int a) {xh=a;}
void setStart(Date a1) {start=a1;}
void setSh(int a2) {sh=a2;}
void setEnd(Date a11) {end=a11;}
void setState(int a4) {state=a4;}
friend ostream&operator<<(ostream&os,const Record&r);
friendistream&operator>>(istream&is,Record&r);
};
ostream&operator<<(ostream&os,const Record&r)
{
os<<r.xh<<" ";
os<<r.start<<" ";
os<<r.sh<<" ";
os<<r.end<<" ";
os<<r.state;
return os;
}
istream&operator>>(istream&is,Record&r)
{
is>>r.xh>>r.start>>r.sh>>r.end>>r.state;
return is;
}
class Records
{
protected:
int number;
vector <Record> v1;
vector <Record> ::iterator it1;
multimap<int,int>m2;
multimap<int,int>::iterator mit2;//是否归还bool
public:
Records(){number=0;}
int getNumber(){return number;}
vector <Record> &getRecord(){return v1;}
multimap<int,int> & getM2(){return m2;}
multimap<int,int>getMap()
{
return m2;
}
void setNumber(int x){number=x;}
//无删除记录与增加记录Op,book类中和student类中这两个函数不同
void dispRecord();//所有记录
void disNobackRecord();//显示未还书记录
};
void Records::dispRecord()
{ if(number!=0)
{
for(int i=0;i<v1.size();++i)
cout<<v1[i]<<endl;
}
}
void Records::disNobackRecord()
{
if(m2.find(0)!=m2.end())
for(mit2=m2.lower_bound(0);mit2!=m2.upper_bound(0);++mit2)
cout<<v1[mit2->second]<<endl;
else cout<<"无记录"<<endl;
}
class Book:public Records
{
int sh;
string sm;
string author;
int max;//最大图数量
int now;//图书库存量
multimap<int,int>m1;
multimap<int,int>::iterator mit1;
public:
Book(int b1,string b2,string b3,int b4,int b5)
{ sh=b1;
sm=b2;
author=b3;
max=b4;
now=b5;
}
Book() { }
multimap<int,int>& getM1(){return m1;}
int getSh() {return sh;}
string getSm() {return sm;}
string getAuthor() {returnauthor;}
int getMax() {return max;}
int getNow() {return now;}
void setSh(int b6) {sh=b6;}
void setSm(string b7) {sm=b7;}
void setAuthor(string b8) {author=b8;}
void setMax(int b9) {max=b9;}
void setNow(int b10) {now=b10;}
friend ostream&operator<<(ostream&os,const Book&b1);
friend istream&operator>>(istream&is,Book&b1);
void addRecord(Record r1);
void deleteRecord(Record r1);
int search1(int no);
void display();
};
void Book::display()
{
cout<<sh<<" "<<sm<<""<<author<<" "<<max<<""<<now<<" "<<number<<endl;
}
int Book::search1(int no)//根据书号指针的变化,与查询,删除有关
{
mit1=m1.find(no);
if(mit1!=m1.end())//枚举使指针找到
return mit1->second;
else
return -1;
}
void Book::deleteRecord(Record r1)
{
r1.setState(1);
v1.push_back(r1);
int i=v1.size();
m1.insert(make_pair(r1.getSh(),i-1));
}
void Book::addRecord(Record r1)
{
r1.setState(0);
v1.push_back(r1);
int i=v1.size();
m1.insert(make_pair(r1.getSh(),i-1));
}
istream&operator>>(istream&is,Book&b1)
{
is>>b1.sh;
if(b1.sh==-1)
return is;
is>>b1.sm>>b1.author>>b1.max>>b1.now>>b1.number;
b1.v1.clear();
if(b1.number!=0)
{
for(int u=0;u<b1.number;u++)
{
Record r;
int i;
{
is>>r;
b1.v1.push_back(r);
i=b1.v1.size();
b1.m1.insert(make_pair(r.getXh(),i-1));
}
}
}
return is;
}
ostream&operator<<(ostream&os,constBook&b1)
{
os<<b1.sh;
os<<" "<<b1.sm;
os<<" "<<b1.author;
os<<" "<<b1.max;
os<<" "<<b1.now;
os<<" "<<b1.number;
os<<endl;
if(b1.number!=0)
{
int i;
for(i=0;i<b1.number;i++)
{
os<<b1.v1[i]<<endl;
}
}
return os;}
class User:public Records
{
int xh;
string xm;
string major;
string mima;
int max;
int now;
multimap<int,int>m1;
multimap<int,int>::iterator mit1;
public:
User(int b1,string b2,string b3,string m,int b4,int b5):xh(b1)
{
xm=b2;
major=b3;
max=b4;
now=b5;
mima=m;
}
User() {}
multimap<int,int>& getM2(){return m2;}
int getXh() {return xh;}
string getXm() {return xm;}
string getMajor() {return major;}
int getMax() {return max;}
int getNow() {return now;}
void setXh(int b6) {xh=b6;}
void setXm(string b7) {xm=b7;}
void setMajor(string b8) {major=b8;}
void setMax(int b9) {max=b9;}
void setNow(int b10) {now=b10;}
string getMima() {return mima;}
void setMima(string m) {mima=m;}
friend ostream&operator<<(ostream&os,const User&u1);
friend istream&operator>>(istream&is,User&u1);
void addRecord(Record r2);
void deleteRecord(Record r2);
int search2(int no);
void display();
void operator=(User&ty)
{
xh=ty.xh;
xm=ty.xm;
major=ty.major;
max=ty.max;
now=ty.now;
mima=ty.mima;
number=ty.number;
v1=ty.getRecord();
}
bool operator==(User u1)
{
return this->xh==u1.getXh()?1:0;
}
};
void User::display()
{
cout<<xh<<" "<<xm<<""<<mima<<" "<<major<<""<<max<<" "<<now<<""<<number<<endl;
}
int User::search2(int no)
{
mit2=m2.find(no);
if(mit2!=m2.end())
return mit2->second;
else
return -1;
}
void User::deleteRecord(Record r1)
{
r1.setState(1);
v1.push_back(r1);
int i=v1.size();
m2.insert(make_pair(r1.getXh(),i-1));
}
void User::addRecord(Record r2)
{
r2.setState(0);
v1.push_back(r2);
int i=v1.size();
m2.insert(make_pair(r2.getXh(),i-1));
}
istream&operator>>(istream&is,User&u1)
{
is>>u1.xh;
if(u1.xh==-1)
return is;
is>>u1.xm>>u1.mima>>u1.major>>u1.max>>u1.now>>u1.number;
Record x;
int i;
u1.v1.clear();
if(u1.number!=0)
{
for(int a=0;a<u1.number;a++)
{
is>>x;
u1.v1.push_back(x);
i=u1.v1.size();
u1.m2.insert(make_pair(x.getXh(),i-1));
}
}
return is;
}
ostream&operator<<(ostream&os,constUser&u1)
{
os<<u1.xh;
os<<" "<<u1.xm;
os<<" "<<u1.mima;
os<<" "<<u1.major;
os<<" "<<u1.max;
os<<" "<<u1.now;
os<<" "<<u1.number;
os<<endl;
if(u1.number!=0)
{
int i;
for(i=0;i<u1.number;i++)
{
os<<u1.v1[i]<<endl;
}
}
return os;
}
class queryBook
{
protected:
vector<Book>v3;
vector<Book>::iterator it3;
multimap<int,int> m3;
multimap<int,int>::iterator mit3;
public:
int search3(int h)
{
mit3=m3.find(h);
if(mit3!=m3.end())
{
return mit3->second;
}
else
return -1;
}
voidquery()
{ cout<<"请输入查询的书号"<<endl;
int h;
cin>>h;
int i=search3(h);
if(i!=-1)
{v3[i].display();}
cout<<"查询结束"<<endl;
}
};
class Person
{
int no; //账号;
string pwd; //密码;
int type; //=1是管理员;=0是用户 ;
public:
Person () {}
Person (int no1,string pwd1,int f)
{
no=no1;
pwd=pwd1;
type=f;
}
int getNo(){return no;}
string getPwd(){return pwd;}
int getType(){return type;}
friend ostream &operator<<(ostream&os,const Person &a)
{
os<<a.no<<" ";
os<<a.pwd<<" ";
os<<a.type<<endl;
return os;
}
friend istream &operator>>(istream&is,Person &b)
{
is>>b.no;
if(b.no==-1) return is;
is>>b.pwd;
is>>b.type;
return is;
}
};
class Manage:public queryBook
{
vector<User>v4;
vector<User>::iterator it4;
multimap<int,int> m4;
multimap<int,int>::iterator mit4;
vector<Person>v5;
vector<Person>::iterator it5;
multimap<int,int> m5;
multimap<int,int>::iterator mit5; //根据账号查找
public:
Manage()
{
load1();
load2();
load5();
}
~Manage()
{
save1();
save2();
save5();
}
void addBook();
void disBook();
void deleteBook();
void modifySh();
void modifyMax();
void addUser();
void disUser();
void deleteUser();
int search4(int h);
int search5(int h);
void queryUser();
void clearUser();
void clearBook();
void load1();
void load2();
void load5();
void save5();
void save1();
void save2();
};
int Manage::search5(int h)
{
mit5=m5.find(h);
if(mit5!=m5.end())
{
return mit5->second;
}
else
return -1;
}
void Manage::clearBook()
{
v3.clear();
}
void Manage::clearUser()
{
v4.clear();
v5.clear();
}
void Manage::modifySh()
{
cout<<"请输入要修改的书号"<<endl;
int h;
cin>>h;
int i=search3(h);
cout<<"请输入修改后的书号"<<endl;
int n;
cin>>n;
v3[i].setSh(n);
cout<<"修改结束"<<endl;
}
void Manage::modifyMax()
{
cout<<"请输入要修改最大图书数目的书号"<<endl;
int h;
cin>>h;
int i=search3(h);
cout<<"请输入修改后的图书最大数目"<<endl;
int n;
cin>>n;
v3[i].setMax(n);
cout<<"修改结束"<<endl;
}
void Manage::queryUser()
{ cout<<"请输入查询的学号"<<endl;
int h;
cin>>h;
int i=search4(h);
if(i!=-1)
cout<<v4[i];
cout<<"查询结束"<<endl;
}
int Manage::search4(int h)
{
mit4=m4.find(h);
if(mit4!=m4.end())
{
return mit4->second;
}
else
return -1;
}
void Manage::deleteUser()
{ cout<<"请输入删除的学号"<<endl;
int no;
cin>>no;
int i=search4(no);
if(i!=-1)
{it4=v4.begin()+i;
m4.erase(m4.find(no));
v4.erase(it4);
}
int y=search5(no);
if(y!=-1)
{it5=v5.begin()+y;
m5.erase(m5.find(no));
v5.erase(it5);
}
cout<<endl;
cout<<"删除结束";
}
void Manage::disUser()
{ cout<<"显示用户"<<endl;
for( it4=v4.begin();it4!=v4.end();++it4)
cout<<*it4;
}
void Manage::addUser()
{ cout<<"请输入增加学生信息,当学号为-1结束"<<endl;
User u;
int i;
while(1)
{cin>>u;
if(u.getXh()==-1)
break;
v4.push_back(u);
i=v4.size();
m4.insert(make_pair(u.getXh(),i-1));
Person p(u.getXh(),u.getMima(),0);
int o;
v5.push_back(p);
o=v5.size();
m5.insert(make_pair(p.getNo(),o-1));
}
cout<<endl;
cout<<"增加结束";
}
void Manage::addBook()
{ cout<<"请输入增加的图书信息,当书号为-1结束"<<endl;
Book b;
int i;
while(1)
{
cin>>b;
if(b.getSh()==-1)
break;
v3.push_back(b);
i=v3.size();
m3.insert(make_pair(b.getSh(),i-1));
}
cout<<endl;
cout<<"增加结束";
}
void Manage::disBook()
{
for(it3=v3.begin();it3!=v3.end();++it3)
cout<<*it3;
}
void Manage::deleteBook()
{ cout<<"请输入删除图书书号"<<endl;
int h;
cin>>h;
int i=search3(h);
if(i!=-1)
{it3=v3.begin()+i;
m3.erase(m3.find(h));
v3.erase(it3);
}
cout<<endl;
cout<<"删除结束";
}
void Manage::load1()
{
Book b;
int i;
ifstream infile("D:\\20171777book.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();
}
void Manage::load2()
{
User a;
int i;
ifstream infile("D:\\20171777stu.txt",ios::in);
if(!infile)
{
return ;}
v4.clear();
m4.clear();
while(infile>>a)
{v4.push_back(a);
int i=v4.size();
m4.insert(make_pair(a.getXh(),i-1));
}
infile.close();
}
void Manage::load5()
{
Person p;
int i;
ifstream infile("D:\\Person.txt",ios::in);
if(!infile)
{
return ;}
v5.clear();
m5.clear();
while(infile>>p)
{v5.push_back(p);
int i=v5.size();
m5.insert(make_pair(p.getNo(),i-1));
}
infile.close();
}
void Manage::save1()
{
ofstream outfile("D:\\20171777book.txt",ios::out);
if(!outfile)
{
return ;}
for(it3=v3.begin();it3!=v3.end();it3++)
{
outfile<<*it3;
}
outfile.close();
}
void Manage::save2()
{
ofstream outfile("D:\\20171777stu.txt",ios::out);
if(!outfile)
{
return ;}
for(it4=v4.begin();it4!=v4.end();it4++)
{
outfile<<*it4;
}
outfile.close();
}
void Manage::save5()
{
ofstream outfile("D:\\Person.txt",ios::out);
if(!outfile)
{
return ;}
for(it5=v5.begin();it5!=v5.end();it5++)
{
outfile<<*it5;
}
outfile.close();
}
class Client:public queryBook
{
User a;
public:
Client(int no) //必须代参
{
load3();
load4(no);
}
~Client()
{save3();
save4();
}
void load3();
void save3();
void load4(int no);
void save4();
void borrow();
void back();
void display();
};
void Client ::display()
{
cout<<a;
}
void Client::save3()
{
ofstream outfile("D:\\20171777book.txt",ios::out);
if(!outfile)
{
return ;}
for(it3=v3.begin();it3!=v3.end();it3++)
{
outfile<<*it3;
}
outfile.close();
}
void Client::load3()
{
Book b;
int i;
ifstream infile("D:\\20171777book.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();
}
void Client::load4(int no)
{
User a;
int i;
ifstream infile("D:\\20171777stu.txt",ios::in);
if(!infile)
{
return ;}
while(infile>>a)
{if(a.getXh()==no)
this->a=a;
}
infile.close();
}
void Client::save4()
{vector<User>v;
vector<User>::iterator it;
User u1;
ifstream infile("D:\\20171777stu.txt",ios::in);
if(!infile)
{
return ;}
while(infile>>u1)
{v.push_back(u1);}
infile.close();
ofstream outfile("D:\\20171777stu.txt",ios::out);
if(!outfile)
{
return;}
for(int i=0;i<v.size();i++)
if(v[i].getXh()==a.getXh())
{ v[i]=a;
outfile<<v[i]; }
else
outfile<<v[i];
outfile.close();
}
void Client::borrow()
{
int no;
int q,w,e;
int argc; char ** argv;
time_t temp;
struct tm *t;
time(&temp);
t= localtime(&temp);
q=t->tm_year+1900;
w=t->tm_mon+1;
e=t->tm_mday;
Date d1(q,w,e);
cout<<"请输入图书书号"<<endl;
int h;
cin>>h;
int b=search3(h);
if(a.getNow()<=a.getMax()&&a.getNow()>0)
{ int u=a.getNumber();
a.setNumber(u+1);
int k=v3[b].getNumber();
v3[b].setNumber(k+1);
v3[b].setNow(v3[b].getNow()-1); //剩余书本减一
a.setNow(a.getNow()-1);//可借书本数
Record r(a.getXh(),d1,h,0);
cout<<r;
v3[b].addRecord(r);
a.addRecord(r);
}
}
void Client::back()
{
int no;
int q,w,e;
int argc; char ** argv;
time_t temp;
struct tm *t;
time(&temp);
t= localtime(&temp);
q=t->tm_year+1900;
w=t->tm_mon+1;
e=t->tm_mday;
Date d1(q,w,e);
cout<<"请输入归还图书书号"<<endl;
int h;
cin>>h;
intb=search3(h);
intu=a.getNumber();
a.setNumber(u+1);
int k=v3[b].getNumber();
v3[b].setNumber(k+1);
v3[b].setNow(v3[b].getNow()+1);
a.setNow(a.getNow()+1);
Record r(a.getXh(),d1,h,1);
v3[b].deleteRecord(r);
a.deleteRecord(r);
}
class CheckIn //登陆类;
{
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;
};
void CheckIn::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();
}
class UserCheckin:public CheckIn
{
public:
void login()
{
int hao;
string mima;
cin>>hao>>mima;
if(mu.find(hao)!=mu.end())
{
multimap<int,int>::iteratormulow=mu.lower_bound(hao),muupp=mu.upper_bound(hao);
for(muit=mulow;muit!=muupp;muit++)
{
if(pv[muit->second].getPwd()==mima&&!pv[muit->second].getType())
{
cout<<"欢迎用户登陆"<<endl;
Client s1(hao);
//s1.display(); //显示用户信息
//s1.borrow(); //借书
//s1.borrow();
// s1.back(); //还书
s1.query(); //查询图书
}
}
}
}
};
class AdminCheckIn:public CheckIn
{
public:
void login()
{
int hao,flag;
string mima;
for(int i=0;i<3;i++)
{
cin>>hao>>mima;
if(mu.find(hao)!=mu.end())
{
multimap<int,int>::iteratormulow=mu.lower_bound(hao),muupp=mu.upper_bound(hao);
for(muit=mulow;muit!=muupp;muit++)
if(pv[muit->second].getPwd()==mima&&pv[muit->second].getType()==1)
{
cout<<"欢迎管理员登陆"<<endl;
Manage ma1;
// ma1.addBook(); //增
// ma1.addUser();
//ma1.clearBook(); //清空文件
// ma1.clearUser();
ma1.queryUser(); //查
ma1.query();
//ma1.deleteBook(); //删
ma1.deleteUser();
// ma1.modifySh(); //改
//ma1.modifyMax();
flag=1;
break;
}
}
if(flag==1) break;
if(i>=3) cout<<"非法的账号或密码";
}
}
};
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;
}