一 代码
#include<bits/stdc++.h>
using namespace std;
class BookTime
{
int year,month,day;
public:
BookTime()
{
int year=month=day=0;
}
BookTime(int y,int m,int d):year(y),month(m),day(d){};
int getYear(){return year;}
void setYear(int a){year=a;}
int getMonth(){return month;}
void setMonth(int b){month=b;}
int getDay(){return day;}
void setDay(int c){day=c;}
bool operator<(const BookTime&d)const
{
return year!=d.year?year<d.year:month!=d.month?month<d.month:day<d.day;
}
void display();
friend ostream&operator<<(ostream&os,BookTime&d);
friend istream&operator>>(istream&is,BookTime&d);
};
void BookTime::display()
{
cout<<year<<" "<<month<<" "<<day<<endl;
}
ostream&operator<<(ostream&os,BookTime&d)
{
os<<d.year<<" ";
os<<d.month<<" ";
os<<d.day<<" ";
return os;
}
istream&operator>>(istream&is,BookTime&d)
{
is>>d.year>>d.month>>d.day;
return is;
}
class Record
{
int id;//书号
int number;//学号
int state;//借书,还书状态,0借,1未借
BookTime start;//借书时间
BookTime end;//还书时间
//bool reborrow;//续借,
public:
Record(int i,BookTime s,int n):number(i),start(s),id(n)
{if(s.getMonth()+2>12) {BookTime d(s.getYear()+1,s.getMonth()-10,s.getDay());end=d;}
else {BookTime d(s.getYear(),s.getMonth()+2,s.getDay());end=d;}
state=0;
}
Record()
{
BookTime start(0,0,0);
BookTime end(0,0,0);
id=0;
number = 0;
//reborrow = 0;
}
int getState(){return state;}
int getNumber(){return number;}
int getId(){return id;}
//int getReborrow(){return reborrow;}
BookTime getstart(){return start;}
BookTime getend(){return end;}
//void setReborrow(){reborrow=1;}
void setState(bool n){state=n;}
void setNumber(int a){number=a;}
void setId(int b){id=b;}
void setStart(BookTime t){start=t;}
void setEnd()
{
BookTime e;
if(end.getMonth()+1>12)
e=BookTime(end.getYear()+1,end.getMonth()+1,end.getDay());
else e=BookTime(end.getYear()+1,end.getMonth(),end.getDay());end=e;
}
Record (BookTime t1,BookTime t2);
friend istream&operator>>(istream&is,Record&r);
friend ostream&operator<<(ostream&os,Record&r);
};
istream&operator>>(istream&is,Record&r)
{
is>>r.number>>r.start>>r.id>>r.end>>r.state;
return is;
}
ostream&operator<<(ostream&os,Record&r)
{
os<<r.number<<" ";
os<<r.start<<" ";
os<<r.id<<" ";
os<<r.end<<" ";
os<<r.state<<endl;
return os;
}
class RecordJ//基类
{
protected:
int n;
vector<Record>v1;
vector<Record>::iterator it1;
multimap<int,int>map1;
multimap<int,int>::iterator mit1;
public:
void setN(int a){n=a;}
vector<Record>getRecord(){return v1;}
void addRecord(Record r1)
{
n+=1;
r1.setState(0);
v1.push_back(r1);
int i=v1.size();
map1.insert(make_pair(r1.getNumber(),i-1));
}
int searchRecord(int no)
{
mit1=map1.find(no);
if(mit1!=map1.end())
return mit1->second;
else return -1;
}
void deleteRecord(int no)
{
int i;
i=searchRecord(no);
if(i!=-1) {v1[i].setState(0);}
}
int getState(int no,int id)
{
for(int b=0;b<n;b++)
{
if(v1[b].getState()==0&&v1[b].getNumber()==no&&v1[b].getId()==id) return 1;
}
return 0;
}
void setState(int no,int id)
{
for(int b=0;b<n;b++)
{
if(v1[b].getState()==0&&v1[b].getNumber()==no&&v1[b].getId()==id) v1[b].setState(1);
}
}
};
class BookInformation:public RecordJ
{
string bname;//书名
int id;//书号
string author;//作者
string publish;//出版社
BookTime issue;//发行时间
int sum;//每类书总数
int left;//剩余量
public:
BookInformation()
{
id=sum=n=left=0;
}
BookInformation(int i,string c,string m,string d,BookTime e,int s,int l):id(i),bname(c),author(m),publish(d),issue(e),sum(s),left(l){n=0;}
string getbname(){return bname;}
int getId(){return id;}
string getAuthor(){return author;}
string getPublish(){return publish;}
int getsum(){return sum;}
BookTime getIssue(){return issue;}
int getN(){return n;}
int getleft(){return left;}
int getborrow(){return sum-left;}
void setSum(int h){sum=h;}
//void setborrow(int i){borrow=i;}
void setleft(int i){left=i;}
void setBname(string a){bname=a;}
void setAuthor(string b){author=b;}
void setPublish(string d){publish=d;}
void setIssue(BookTime t){issue=t;}
void setN(int i){n=i;}
void display(){cout<<id<<" "<<bname<<" "<<author<<" "<<publish<<" "<<issue;}
friend ostream &operator <<(ostream&os,BookInformation&d);
friend istream &operator >>(istream&is,BookInformation&d);
bool operator<(const BookInformation &d2)const{return id<d2.id;}
};
istream &operator>>(istream&is,BookInformation&d)
{ is>>d.id;
if(d.id==-1)
return is;
is>>d.bname>>d.author>>d.publish>>d.issue>>d.sum>>d.left>>d.n;
Record r1;
for(int a=0;a<d.n;a++)
{
is>>r1;
d.v1.push_back(r1);
}
return is;
}
ostream &operator <<(ostream&os,BookInformation&d)
{
os<<d.id<<" ";
os<<d.bname<<" ";
os<<d.author<<" ";
os<<d.publish<<" ";
os<<d.issue<<" ";
os<<d.sum<<" ";
os<<d.left<<" ";
os<<d.n<<endl;
for(int a=0;a<d.n;a++)
{
os<<d.v1[a]<<endl;
}
return os;
}
class Student:public RecordJ
{ string name;
int number;
string major;
int borrows;//可以借书的总数
int nowborrows;//当前借书数
public:
Student()
{borrows=nowborrows=0;
}
Student(int i,string na,string a):number(i),name(na),major(a){borrows=nowborrows=n=0;}
void setNumber(int i){number=i;}
int getNumber(){return number;}
void setName(string na){name=na;}
string getName(){return name;}
void setBorrows(int m){borrows=m;}
int getBorrows(){return borrows;}
void setNowborrows(int cb){nowborrows=cb;}
int getNowborrows(){return nowborrows;}
int getN(){return n;}
void setN(int i){n=i;}
string getMajor(){return major;}
string setMajor(int b){major=b;}
friend istream&operator>>(istream&is,Student&s);
friend ostream&operator<<(ostream&os,Student&s);
void operator=(Student&s)
{
number=s.getNumber();
name=s.getName();
major=s.getMajor();
borrows=s.getBorrows();
nowborrows=s.getNowborrows();
n=s.getN();
v1=s.getRecord();
}
bool operator==(Student s)const
{
return this->number==s.getNumber()?1:0;
}
};
istream&operator>>(istream&is,Student&s)
{
is>>s.number;
if(s.number==-1)
return is;
is>>s.name>>s.major>>s.nowborrows>>s.borrows>>s.n;
Record r1;
for(int a=0;a<s.n;a++)
{
is>>r1;
s.v1.push_back(r1);
}
return is;
}
ostream&operator<<(ostream&os,Student&s)
{
os<<s.number<<" ";
os<<s.name<<" ";
os<<s.major<<" ";
os<<s.nowborrows<<" ";
os<<s.borrows<<" ";
os<<s.n<<endl;
if(s.getN()!=0)
for(int i=0; i<s.getN(); i++)
os<<endl<<s.v1[i];
return os;
}
class Manage
{ vector <BookInformation> b1;
vector<BookInformation>::iterator it1;
multimap<int,int>m1;//按书号
multimap<int,int>::iterator mit1;
vector <Student>b2;
vector<Student>::iterator it2;
multimap<int,int>m2;//按学号查找
multimap<int,int>::iterator mit2;
public:
Manage(){loadStudent();loadBookInformation();}
~Manage(){saveStudent();saveBookInformation();}
void loadStudent();
void saveStudent();
void loadBookInformation();
void saveBookInformation();
//int searchStu(int);
void addStudent();
void dispAllStudent();
void addBookInformation();
void dispAllBookInformation();
};
void Manage::loadStudent()
{
Student s;
int i=0;
ifstream infile("D:\\20171831.stu.txt",ios::in);
if(!infile)
return;
b2.clear();
m2.clear();
while(infile>>s)
{
b2.push_back(s);
m2.insert(make_pair(s.getNumber(),i));
i++;
}
infile.close();
}
void Manage::loadBookInformation()
{
BookInformation B;
int i=0;
ifstream infile("D:\\20171831.book.txt",ios::in);
if(!infile)
return;
b1.clear();
m1.clear();
while(infile>>B)
{
b1.push_back(B);
m1.insert(make_pair(B.getId(),i));
i++;
}
infile.close();
}
void Manage::saveStudent()
{
ofstream outfile("D:\\20171831.stu.txt",ios::out);
if(!outfile)
return ;
for(it2=b2.begin(); it2!=b2.end(); it2++)
{
outfile<<*it2;
}
outfile.close();
}
void Manage::saveBookInformation()
{
ofstream outfile("D:\\20171831.book.txt",ios::out);
if(!outfile)
return;
for(it1=b1.begin(); it1!=b1.end(); it1++)
{
outfile<<*it1;
}
outfile.close();
}
void Manage::addBookInformation()
{
BookInformation B;
int i;
while(1)
{ cin>>B;
if(B.getId()==-1)
break;
b1.push_back(B);
i=b1.size();
m1.insert(make_pair(B.getId(),i-1));
}
}
void Manage::dispAllBookInformation()
{
for(it1=b1.begin();it1!=b1.end();it1++)
cout<<*it1;
}
void Manage::addStudent()
{
Student s;
int i;
while(1)
{cin>>s;
if(s.getNumber()==-1)
break;
b2.push_back(s);
i=b2.size();
m2.insert(make_pair(s.getNumber(),i-1));
}
}
void Manage::dispAllStudent()
{
for(it2=b2.begin();it2!=b2.end();it2++)
cout<<*it2;
}
class Client
{
Student s;
BookTime t;
vector<BookInformation>b3;
vector<BookInformation>::iterator it3;
multimap<int,int>m3;//按书号查找
multimap<int,int>::iterator mit3;
vector<Student>b4;
vector<Student>::iterator it4;
multimap<int,Student>m4;//避免学号错误,重新输入,还是存一遍方便验证
multimap<int,Student>::iterator mit4;
public:
Client(int no)
{loadStudent();
loadBookInformation();
while(proveStudent(no)!=1)
{
cout<<"非法用户,请重输\n";
cin>>no;
}
}
~Client(){saveBookInformation();saveStudent();}
void loadStudent();
void saveStudent();
void loadBookInformation();
void saveBookInformation();
int proveStudent(int a);
void borrow();
void back();
void dispAllBookInformation();
void display();
int searchBookInformation(int s);
};
void Client::loadStudent()
{
ifstream infile("D:\\20171831.stu.txt",ios::in);
if(!infile)
return;
m4.clear();
int i=0;
while(infile>>s)
{
b4.push_back(s);
m4.insert(make_pair(s.getNumber(),s));
i++;
}
infile.close();
}
void Client::loadBookInformation()
{
BookInformation B;
ifstream infile("D:\\20171831.book.txt",ios::in);
if(!infile)
return;
b3.clear();
m3.clear();
int i=0;
while(infile>>B)
{
b3.push_back(B);
m3.insert(make_pair(B.getId(),i));
i++;
}
infile.close();
}
int Client::proveStudent(int a)
{
mit4=m4.find(a);
if(mit4!=m4.end())
{
s=mit4->second;
return 1;
}
else return 0;
}
void Client::saveStudent()
{ ofstream outfile("D:\\20171831.stu.txt",ios::out);
if(!outfile)
return;
for(it4=b4.begin(); it4!=b4.end(); it4++)
{if(*it4==s)
*it4=this->s;
outfile<<*it4;}
outfile.close();
}
void Client::saveBookInformation()
{
ofstream outfile("D:\\20171831.book.txt",ios::out);
if(!outfile)
return;
for(it3=b3.begin(); it3!=b3.end(); it3++)
{
outfile<<*it3;
}
outfile.close();
}
int Client::searchBookInformation(int s)
{
mit3=m3.find(s);
if(mit3!=m3.end())
{
return mit3->second;
}
else
return -1;
}
void Client::borrow()
{
int id;
BookTime t;
cout<<"请输入书号:";
cin>>id;
cout<<"请输入借书时间:";
cin>>t;
int i=searchBookInformation(id);
if(i!=-1&&s.getNowborrows()>0&&b3[i].getleft()>0)
{
b3[i].setleft(b3[i].getleft()-1);
s.setNowborrows(s.getNowborrows()-1);
Record r(s.getNumber(),t,id);
b3[i].addRecord(r);
s.addRecord(r);
}
}
void Client::back()
{ int id;
cout<<"请输入书号:";
cin>>id;
int i=searchBookInformation(id);
if(b3[i].getState(s.getNumber(),id)==1)
{s.setState(s.getNumber(),id);
b3[i].setState(s.getNumber(),id);
b3[i].setleft(b3[i].getleft()+1);
s.setNowborrows(s.getNowborrows()+1);}
}
void Client::dispAllBookInformation()
{
if(b3.size()!=0)
for(it3=b3.begin();it3!=b3.end();it3++)
cout<<*it3;
}
void Client::display()
{
cout<<s;//输出当前学生的信息
}
int main()
{
/*
Manage m;
m.addBookInformation();
m.dispAllBookInformation();
m.addStudent();
m.dispAllStudent();
*/
int i;
cin>>i;
Client c(i);
c.back();
c.dispAllBookInformation();
c.display();
return 0;
}
二 心得
首先这个系统我做了很多遍,之前的那几遍都是不符合老师的要求,这一遍才符合了老师的要求,因为书籍和读者都有一些基本信息,他们有相似之处,所以我写了一个基类,然后通过继承调用基类的信息。收获主要是对STL的理解以积极对文件操作的掌握,通过使用STL和文件操作,这个系统实现了对用户和图书的增加功能,以及借书还书,这些数据的变化在相应的txt中会显示出来 。具体功能的实现见源码。