#include<vector>
#include<iostream>
#include<map>
#include<bits/stdc++.h>
#include<fstream>
#include<algorithm>
using namespace std;
class Time
{
private:
int year,month,day;
public:
Time(int x,int y,int z):year(x),month(y),day(z){};
Time(){year=2018,month=1,day=1;}
int getyear(){return year;}
int getmonth(){return month;}
int getday(){return day;}
void setyear(int year){this->year=year;}
void setmonth(int month){this->month=month;}
void setday(int day){this->day=day;}
bool operator<(const Time &d2)const
{
return year!=d2.year?year<d2.year:month!=d2.month?month<d2.month:day<d2.day;
}
friend istream& operator>>(istream &is,Time &t);
friend ostream& operator<<(ostream &os,const Time &t);
friend Time operator+(Time m,int i);
void display();
};
Time operator+(Time m,int i)
{
m.month=m.month+i;
if(m.month+i>12)
{
m.month=m.month-12;
m.year++;
}
return m;
}
istream& operator>>(istream &is,Time &t)
{
is>>t.year;
is>>t.month;
is>>t.day;
return is;
}
ostream& operator<<(ostream &os,const Time &t)
{
os<<t.year<<" ";
os<<t.month<<" ";
os<<t.day<<" ";
return os;
}
void Time::display()
{
cout<<year<<" "<<month<<" "<<day<<endl;
}
class Record
{
private:
int id;
Time begin;
Time end;
int sh;
int xj;
int state;
public:
Record(){};
Record(int i,Time s,int h)
{
id=i;
begin=s;
sh=h;
if(s.getmonth()+2>12)
{
Time x(s.getyear()+1,s.getmonth()-12,s.getday());
end=x;
}
else
{
Time x(s.getyear(),s.getmonth()+2,s.getday());
end=x;
}
xj=0;
state=0;
}
int getid(){return id;}
int getsh(){return sh;}
int getxj(){return xj;}
int getstate(){return state;}
Time getbegin(){return begin;}
Time getend(){return end;}
void setid(int id){this->id=id;}
void setsh(int sh){this->sh=sh;}
void setxj(){xj=1;}
void setstate(int state){this->state=state;}
void setbegin(Time begin){this->begin=begin;}
void setend();
friend istream &operator>>(istream &is,Record &t);
friend ostream &operator<<(ostream &os,const Record &t);
};
istream &operator>>(istream&is,Record &t)
{
if(t.id==-1)
return is;
is>>t.id;
is>>t.begin;
is>>t.end;
is>>t.sh;
is>>t.xj;
is>>t.state;
return is;
}
ostream &operator<<(ostream&os,const Record &t)
{
os<<t.id<<" ";
os<<t.begin<<" ";
os<<t.end<<" ";
os<<t.sh<<" ";
os<<t.xj<<" ";
os<<t.state<<endl;
return os;
}
void Record::setend()
{
Time e;
if(end.getmonth()+1>12)
e=Time(end.getyear()+1,end.getmonth()-12,end.getday());
else
e=Time(end.getyear(),end.getmonth()+1,end.getday());
end=e;
}
class Book
{
private:
int sh;
string title;
string press;
int date;
int num;
int jc;
vector<Record>v1;
vector<Record>::iterator it1;
multimap<int,int>m1;
multimap<int,int>::iterator mit1;
int record_num;
public:
Book(int a,string b,string c,int d,int e,int f):sh(a),title(b),press(c),date(d),num(e),jc(f){};
Book(){record_num=0;};
string gettitle(){return title;}
int getsh(){return sh;}
string getpress(){return press;}
int getdate(){return date;}
int getnum(){return num;}
int getjc(){return jc;}
void settitle(string title){this->title=title;}
void setsh(int sh){this->sh=sh;}
void setpress(string press){this->press=press;}
void setdate(int date){this->date=date;}
void setnum(int num){this->num=num;}
void setjc(int jc){this->jc=jc;}
void addRecord1(Record r1);
void dispRecord1();
void deleteRecord1(int no);
int search1(int no);
void putRecord();
void display();
vector<Record>getRecord(){return v1;}
friend istream &operator>>(istream &in,Book &b);
friend ostream &operator<<(ostream &out,Book &b);
};
void Book::display()
{
cout<<"书号:"<<sh<<" "<<"书名:"<<title<<" "<<"出版社:"<<press<<" "<<"出版日期:"<<date<<" "<<"图书数量:"<<num<<" "<<"借出数量:"<<jc<<endl;
}
istream &operator>>(istream &in,Book &b)
{
in>>b.sh;
if(b.sh==-1)
return in;
in>>b.title;
in>>b.press;
in>>b.date;
in>>b.num;
in>>b.jc;
return in;
}
ostream &operator<<(ostream &out,Book &b)
{
out<<b.sh<<" "<<b.title<<" "<<b.press<<" "<<b.date<<" "<<b.num<<" "<<b.jc<<" "<<b.record_num<<" ";
for(int i=0;i<b.record_num;i++)
out<<b.v1[i];
return out;
}
void Book::addRecord1(Record r1)
{
r1.setstate(1);
v1.push_back(r1);
record_num++;
int i=v1.size();
m1.insert(make_pair(r1.getid(),i-1));
Book b;
b.setjc(b.getjc()+1);
}
void Book::dispRecord1()
{
if(v1.size()!=0)
for(it1=v1.begin();it1!=v1.end();it1++)
{
cout<<*it1;
}
else
cout<<"没有记录";
}
int Book::search1(int no)
{
mit1=m1.find(no);
if(mit1!=m1.end())
return mit1->second;
else
return -1;
}
void Book::deleteRecord1(int no)
{
int i;
i=search1(no);
if(i!=-1)
{
v1[i].setstate(0);
}
}
void Book::putRecord()
{
Record r;
while(cin>>r)
{
if(r.getid()==0)
break;
v1.push_back(r);
}
}
class User
{
int id;
string name;
int wj;
vector<Record>v2;
vector<Record>::iterator it2;
multimap<int,int>m2;
multimap<int,int>::iterator mit2;
public:
User(){wj=0;};
User(int i,string a)
{
id=i;
name=a;
}
int getid(){return id;}
string getname(){return name;}
int getwj(){return wj;}
void setid(int id){this->id=id;}
void setname(string name){this->name=name;}
void setwj(int wj){this->wj=wj;}
vector<Record>getrecord(){return v2;}
void addRecord2(Record r2);
void dispRecord2();
int search2(int s);
void deleteRecord2(int s);
friend istream &operator>>(istream &in,User &x);
friend ostream &operator<<(ostream &os,const User &x);
bool operator==(User u)
{
return this->id==u.getid()?1:0;
}
};
istream &operator>>(istream &in,User&x)
{
in>>x.id;
if(x.id==-1)
return in;
in>>x.name;
in>>x.wj;
return in;
}
ostream &operator<<(ostream &os,const User&x)
{
os<<x.id<<" ";
os<<x.name<<" ";
os<<x.wj<<endl;
return os;
}
void User::addRecord2(Record r2)
{
r2.setstate(1);
v2.push_back(r2);
int i=v2.size();
m2.insert(make_pair(r2.getsh(),i-1));
}
void User::deleteRecord2(int s)
{
int i;
i=search2(s);
if(i!=-1)
{
v2[i].setstate(0);
}
}
void User::dispRecord2()
{
if(v2.size()!=0)
for(it2=v2.begin();it2!=v2.end();it2++)
{
cout<<*it2;
}
else
cout<<"没有记录";
}
int User::search2(int s)
{
mit2=m2.find(s);
if(mit2!=m2.end())
return mit2->second;
else
return -1;
}
class Client
{
private:
vector<Book>v5;
vector<Book>::iterator it5;
multimap<int,int>m5;
multimap<int,int>::iterator mit5;
User u;
public:
Client()
{
zr3();
zr4();
}
~Client()
{
bc3();
bc4();
}
void zr3();
void zr4();
void bc3();
void bc4();
void borrow();
void back();
int search5(int h);
};
int Client::search5(int h)
{
mit5=m5.find(h);
if(mit5!=m5.end())
{
return mit5->second;
}
else
return -1;
}
void Client::borrow()
{
int h;
Time t;
Book b;
cout<<"书号:";
cin>>h;
cout<<"年月日:";
cin>>t;
int a=search5(h);
if(u.getwj()==0&&v5[a].getnum()>=v5[a].getjc())
{
v5[a].setjc(v5[a].getjc()+1);
Record r(u.getid(),t,h);
v5[a].addRecord1(r);
u.addRecord2(r);
cout<<"Borrowing books successfully";
}
else
cout<<"Borrowing books failed";
}
void Client::back()
{
int h;
cout<<"书号:";
cin>>h;
int a=search5(h);
v5[a].setjc(v5[a].getjc()-1);
v5[a].deleteRecord1(u.getid());
u.deleteRecord2(h);
cout<<"Book return success";
}
void Client::zr3()
{
Book b;
int i;
ifstream infile("d:\\20171764book.txt",ios::in);
if(!infile)
{
return;
}
v5.clear();
m5.clear();
while(infile>>b)
{
v5.push_back(b);
int i=v5.size();
m5.insert(make_pair(b.getsh(),i-1));
}
}
void Client::zr4()
{
int id;
cout<<"学号:";
cin>>id;
User u;
int i;
ifstream infile("d:\\20171764stu.txt",ios::in);
if(!infile)
return;
while(infile>>u)
{
if(u.getid()==id)
this->u=u;
}
infile.close();
}
void Client::bc3()
{
ofstream outfile("d:\\20171764book.txt",ios::out);
if(!outfile)
{
return ;
}
for(it5=v5.begin();it5!=v5.end();it5++)
{
outfile<<*it5;
}
outfile.close();
}
void Client::bc4()
{
vector<User>v;
vector<User>::iterator it;
User u1;
ifstream infile("d:\\20171764stu.txt",ios::in);
if(!infile)
return ;
while(infile>>u1)
{
if(u1==this->u)
u1=this->u;
v.push_back(u1);
}
infile.close();
ofstream outfile("d:\\20171764stu.txt",ios::out);
if(!outfile)
return;
for(it=v.begin();it!=v.end();it++)
outfile<<*it;
outfile.close();
}
class Manage
{
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;
public:
Manage(){zr1(),zr2();}
~Manage(){bc1(),bc2();}
void addBook();
void dispBook();
int search3(int h);
void deleteBook();
void addUser();
void dispUser();
int search4(int h);
void deleteUser();
void zr1();
void zr2();
void bc1();
void bc2();
};
void Manage::zr1()
{
Book b;
int i;
ifstream infile("d:\\20171764book.txt",ios::in);
if(!infile)
return;
v3.clear();
m3.clear();
i=0;
while(infile>>b)
{
v3.push_back(b);
m3.insert(make_pair(b.getsh(),i-1));
i++;
}
infile.close();
}
void Manage::zr2()
{
User u;
int i;
ifstream infile("d:\\20171764stu.txt",ios::in);
if(!infile)
return;
v4.clear();
m4.clear();
i=0;
while(infile>>u)
{
v4.push_back(u);
m4.insert(make_pair(u.getid(),i-1));
i++;
}
infile.close();
}
void Manage::bc1()
{
ofstream outfile("d:\\20171764book.txt",ios::out);
if(!outfile)
return;
for(it3=v3.begin();it3!=v3.end();it3++)
outfile<<*it3;
outfile.close();
}
void Manage::bc2()
{
ofstream outfile("d:\\20171764stu.txt",ios::out);
if(!outfile)
return;
for(it4=v4.begin();it4!=v4.end();it4++)
outfile<<*it4;
outfile.close();
}
int Manage::search3(int h)
{
mit3=m3.find(h);
if(mit3!=m3.end())
{
return mit3->second;
}
else
{
return -1;
}
}
void Manage::deleteBook()
{
int h;
cin>>h;
int i=search3(h);
if(i!=-1)
{
it3=v3.begin()+i;
m3.erase(m3.find(h));
v3.erase(it3);
}
}
void Manage::addBook()
{
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));
}
}
void Manage::addUser()
{
User u;
int i;
while(1)
{
cin>>u;
if(u.getid()==-1)
break;
v4.push_back(u);
i=v4.size();
m4.insert(make_pair(u.getid(),i-1));
}
}
int Manage::search4(int h)
{
mit4=m4.find(h);
if(mit4!=m4.end())
return mit4->second;
else
{
return -1;
}
}
void Manage::deleteUser()
{
int h;
cin>>h;
int i=search4(h);
if(i!=-1)
{
it4=v4.begin()+i;
m4.erase(m4.find(h));
v4.erase(it4);
}
}
void Manage::dispBook()
{
for(it3=v3.begin();it3!=v3.end();it3++)
cout<<*it3;
}
void Manage::dispUser()
{
for(it4=v4.begin();it4!=v4.end();it4++)
cout<<*it4;
}
int main()
{
Client c;
c.back();
/*Manage m;
m.addUser();
m.dispBook();
m.dispUser();
m.deleteBook();
m.deleteUser();
*/
}
这是我第一次打的比较完整的代码,刚开始的时候,感觉非常的难,并没有什么思路,但是通过好几天的学习、研究、借鉴,我终于完成了这个代码;
这个代码实现的功能有:增加用户,增加图书,删除用户,删除图书,借书,还书且能够增加借书还书记录
这个代码还有待改进,还有我很多需要学习的地方,这只能证明我现在的水平,我会更加的努力,争取做得更好。
完成了这个代码让我学到了挺多,知道了完成一个程序的基本过程,使自己对所学知识更能够熟练的运用,也学到了之前并不会的知识;
文件的读入和写入是新学的知识,我还需要在这方面在下点功夫,另外向量的运用以及maltimap的使用我也需要再练习。
加油。