代码如下:
//该程序用code::block打开有中文乱码的问题。现提供一种解决方案,以供参考。
/*
1.修改源文件保存编码:设置->编辑器,在using this encoding框中选择As default encoding,然后点击最下方确定
2.修改编译器对源文件解释编码格式和生成执行文件执行时候采用的编码格式:设置->编译器和调试器,
在编译器设置中选中下方的其他选项,复制粘贴下列编码解释格式(二选一即可)到前面说的其他选项下方的空白框中
-finput-charset=GBk
-fexec-charset=GBk
或
-finput-charset=UTF-8
-fexec-charset=UTF-8
最后点击下方确定即可。
*/
#include <iostream>
#include <fstream>
#include <cstdio>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
class Time
{
int year,month,day;
public:
Time(int y,int m,int d)
{
year = y,month = m,day = d;
}
Time()
{
}
friend istream&operator>>(istream&in,Time&);
friend ostream&operator<<(ostream&out,Time&);
void setTime(int y,int m,int d)
{
year = y,month = m,day = d;
}
int getYear()
{
return year;
}
int getMonth()
{
return month;
}
int getDay()
{
return day;
}
bool operator<(const Time&t)const
{
return year!=t.year?year<t.year:month!=t.month?month<t.month:day<t.day;
}
};
istream&operator>>(istream&in,Time &date)
{
in>>date.year>>date.month>>date.day;
return in;
}
ostream&operator<<(ostream&out,Time &date)
{
out<<date.year<<" "<<date.month<<" "<<date.day;
return out;
}
class Record
{
int no;//学号
int ID;//书号
Time start;//借书时间
Time end;//还书时间
bool renew;//是否续借
public:
Record(int id,int sh,Time t)
{
no=id;
start=t;
ID=sh;
switch(t.getMonth())
{
case 7:
{
if(t.getDay()==31)
end=Time(t.getYear(),t.getMonth()+2,t.getDay()-1);
else
end=Time(t.getYear(),t.getMonth()+2,t.getDay());
break;
}
case 11:
{
end=Time(t.getYear()+1,t.getMonth()-10,t.getDay());
break;
}
case 12:
{
switch(t.getDay())
{
case 29:
case 30:
case 31:
{
end=Time(t.getYear()+1,3,t.getDay()-28);
break;
}
default:
end=Time(t.getYear()+1,t.getMonth()-10,t.getDay());
}
break;
}
default:
end=Time(t.getYear(),t.getMonth()+2,t.getDay());
}
renew=0;
}
Record()
{
}
friend istream&operator>>(istream&input,Record&);
friend ostream&operator<<(ostream&out,Record&);
void setStart(Time s)
{
start = s;
}
void setEnd()
{
switch(end.getMonth())
{
case 1:
{
switch(end.getDay())
{
case 29:
case 30:
case 31:
{
end=Time(end.getYear(),3,end.getDay()-28);
break;
}
default:
end=Time(end.getYear(),end.getMonth()+1,end.getDay());
}
break;
}
case 3:
case 5:
case 8:
case 10:
{
if(end.getDay()==31)
end=Time(end.getYear(),end.getMonth()+1,end.getDay()-1);
else
end=Time(end.getYear(),end.getMonth()+1,end.getDay());
break;
}
case 12:
{
end=Time(end.getYear()+1,1,end.getDay());
break;
}
default:
end=Time(end.getYear(),end.getMonth()+1,end.getDay());
}
}
void setRenew()
{
renew=1;
}
void setRecord(int id,int sh,Time s,Time e,bool re)
{
no = id,ID=sh,start = s,end = e,renew = re;
}
int getNo()
{
return no;
}
Time getStart()
{
return start;
}
Time getEnd()
{
return end;
}
bool getRenew()
{
return renew;
}
int getID()
{
return ID;
}
};
istream&operator>>(istream&in,Record&R)
{
in>>R.ID>>R.no>>R.start>>R.end>>R.renew;
return in;
}
ostream&operator<<(ostream&out,Record&R)
{
out<<R.ID<<" "<<R.no<<" "<<R.start<<" "<<R.end<<" "<<R.renew;
return out;
}
class BaseR
{
protected:
int num;//记录数目
vector<Record>r;//借阅记录
vector<Record>::iterator it;
multimap<int,int>mm;
multimap<int,int>::iterator mmi;
public:
void setNum(int n)
{
num=n;
}
int getNum()
{
return num;
}
void recordClear()
{
r.clear();
}
void mmClear()
{
mm.clear();
}
void addRecord(Record);
void displayRecord();
};
void BaseR::addRecord(Record R)
{
r.push_back(R);
}
void BaseR::displayRecord()
{
if(r.size())
for(it=r.begin(); it!=r.end(); it++)
cout<<*it<<endl;
else
cout<<"无记录!"<<endl;
}
class Book : public BaseR
{
int ID;//书号
string name;//书名
string author;//作者
bool renew;//是否续借
int sum;//总册数
int rest;//可借本数
multimap<int,int>mm;//按学号查找
multimap<int,int>::iterator mmi;
public:
Book(int sh,string sm,string a,int s,int r):ID(sh),name(sm),author(a),sum(s),rest(r)
{
}
Book()
{
}
friend istream&operator>>(istream&in,Book&);
friend ostream&operator<<(ostream&out,Book&);
void setBook(int sh,string sm,string a,int s,int r)
{
ID = sh,name = sm,author = a,sum = s,rest = r;
}
string getName()
{
return name;
}
bool getRenew()
{
return renew;
}
int getID()
{
return ID;
}
string getAuthor()
{
return author;
}
int getSum()
{
return sum;
}
void setRest(int r)
{
rest=r;
}
int getRest()
{
return rest;
}
void setMM(Record R,int i)
{
mm.insert(make_pair(R.getNo(),i));
}
int searchNo(int);
void modify(int);
};
istream&operator>>(istream&in,Book&B)
{
in>>B.ID;
if(B.ID==-1)
return in;
in>>B.name>>B.author>>B.sum>>B.rest>>B.num;
return in;
}
ostream&operator<<(ostream&out,Book&B)
{
out<<B.ID<<" "<<B.name<<" "<<B.author<<" "<<B.sum<<" "<<B.rest<<" "<<B.num;
if(B.r.size())
for(B.it=B.r.begin(); B.it!=B.r.end(); B.it++)
out<<endl<<*(B.it);
return out;
}
int Book::searchNo(int no)
{
mmi=mm.find(no);
if(mmi!=mm.end())
return mmi->second;
else
return -1;
}
void Book::modify(int no)
{
int i=searchNo(no);
if(i!=-1&&!r[i].getRenew())
{
r[i].setRenew();
r[i].setEnd();
}
}
struct cmp1
{
string str;
cmp1(string s)
{
str = s;
}
bool operator()(Book&b)
{
return(b.getName().find(str)!=string::npos);
}
};
struct cmp2
{
string str;
cmp2(string s)
{
str = s;
}
bool operator()(Book&b)
{
return(b.getAuthor().find(str)!=string::npos);
}
};
class User : public BaseR
{
int no;//学号
string code;//秘密
string name;//姓名
bool type;//类型
int borrow;//当前借阅
int biggest;//最大借阅
bool violate;//是否违规
multimap<int,int>mm;
multimap<int,int>::iterator mmi;
public:
User(int id,string pw,bool t,string nm,int bo,int bi,bool v)
{
no=id,code=pw,name=nm,type=t,borrow=bo,biggest=bi,violate=v;
}
User()
{
}
friend istream&operator>>(istream&in,User&);
friend ostream&operator<<(ostream&out,User&);
void setNo(int id)
{
no=id;
}
int getNo()
{
return no;
}
void setCode()
{
string pw;
cout<<"修改密码"<<endl;
cin>>pw;
code=pw;
}
string getCode()
{
return code;
}
bool getType()
{
return type;
}
void setType(bool t)
{
type=t;
}
void setName(string nm)
{
name = nm;
}
string getName()
{
return name;
}
void setBorrow(int b)
{
borrow = b;
}
int getBorrow()
{
return borrow;
}
void setBiggest(int b)
{
biggest = b;
}
int getBiggest()
{
return biggest;
}
bool getViolate()
{
return violate;
}
void setMM(Record R,int i)
{
mm.insert(make_pair(R.getID(),i));
}
vector<Record>getRecord()
{
return r;
}
void operator=(User&u)
{
no=u.getNo();
code=u.getCode();
type=u.getType();
name=u.getName();
biggest=u.getBiggest();
borrow=u.getBorrow();
violate=u.getViolate();
num=u.getNum();
r=u.getRecord();
}
bool operator==(User &u)const
{
return this->no==u.getNo()?1:0;
}
int searchBook(int);
void modify(int);
};
istream&operator>>(istream&in,User&u)
{
in>>u.no;
if(u.no==-1)
return in;
in>>u.code>>u.type;
if(!u.type)
return in;
in>>u.name>>u.borrow>>u.biggest>>u.violate>>u.num;
return in;
}
ostream&operator<<(ostream&out,User&u)
{
out<<u.no<<" "<<u.code<<" "<<u.type;
if(!u.type)
return out;
out<<" "<<u.name<<" "<<u.borrow<<" "<<u.biggest<<" "<<u.violate<<" "<<u.num;
if(u.getNum())
for(int i=0; i<u.getNum(); i++)
out<<endl<<u.r[i];
return out;
}
int User::searchBook(int ID)
{
mmi=mm.find(ID);
if(mmi!=mm.end())
return mmi->second;
else
return -1;
}
void User::modify(int ID)
{
int i=searchBook(ID);
if(i!=-1&&!r[i].getRenew())
{
r[i].setRenew();
r[i].setEnd();
}
}
class BaseData
{
protected:
vector <User> u;
vector<User>::iterator it;
multimap<int,int>mm;//按学号查找
multimap<int,int>::iterator mmi;
vector <Book> b;
vector<Book>::iterator it1;
multimap<int,int>mm3;//按书号查找
multimap<int,int>::iterator mmi3;
public:
BaseData()
{
loadStu();
loadBook();
}
void loadStu();
void saveStu();
void loadBook();
void saveBook();
int searchStu(int);
int searchBook(int);
virtual void logIn()
{
}
virtual ~BaseData()
{
//saveStu();
//saveBook();
}
};
void BaseData::loadStu()
{
User U;
Record r;
int i=0;
ifstream infile("20171820stu.txt",ios::in);
if(!infile)
return;
u.clear();
mm.clear();
U.mmClear();
while(infile>>U)
{
if(U.getType()&&U.getNum())
for(int i=0; i<U.getNum(); i++)
{
infile>>r;
U.addRecord(r);
U.setMM(r,i);
}
u.push_back(U);
U.recordClear();
mm.insert(make_pair(U.getNo(),i));
i++;
}
infile.close();
}
//从文件读入图书数据
void BaseData::loadBook()
{
Book B;
Record r;
int i=0;
ifstream infile("20171820book.txt",ios::in);
if(!infile)
return;
b.clear();
mm3.clear();
B.mmClear();
while(infile>>B)
{
if(B.getNum())
for(int j=0; j<B.getNum(); j++)
{
//cout<<"laod"<<B.getNum()<<endl;
infile>>r;
//cout<<"load"<<r<<endl;
B.addRecord(r);
B.setMM(r,j);
}
b.push_back(B);
B.recordClear();
mm3.insert(make_pair(B.getID(),i));
i++;
}
infile.close();
}
void BaseData::saveStu()
{
ofstream outfile("20171820stu.txt",ios::out);
if(!outfile)
return ;
for(it=u.begin(); it!=u.end(); it++)
{
outfile<<*it;
outfile<<endl;
}
outfile.close();
}
//将图书数据写到文件
void BaseData::saveBook()
{
ofstream outfile("20171820book.txt",ios::out);
if(!outfile)
return;
for(it1=b.begin(); it1!=b.end(); it1++)
{
outfile<<*it1;
outfile<<endl;
}
outfile.close();
}
int BaseData::searchStu(int no)
{
mmi=mm.find(no);
if(mmi!=mm.end())
{
return mmi->second;
}
else
return -1;
}
int BaseData::searchBook(int ID)
{
mmi3=mm3.find(ID);
if(mmi3!=mm3.end())
{
return mmi3->second;
}
else
return -1;
}
class Administrator:public BaseData
{
public:
Administrator()
{
loadStu();
loadBook();
}
void addStu();
void deleStu();
void queryStu();
void changeStu();
void displayAllStu();
void addBook();
void deleBook();
void queryBook();
void changeBook();
void displayAllBook();
~Administrator()
{
saveStu();
saveBook();
}
};
void Administrator::addStu()
{
User u1;
int i;
cout<<"请添加用户信息,-1结束添加"<<endl;
while(cin>>u1)
{
if(u1.getNo()==-1)
break;
u.push_back(u1);
i=u.size();
mm.insert(make_pair(u1.getNo(),i-1));
}
}
void Administrator::deleStu()
{
int no;
while(1)
{
cout<<"请输入所删除用户的学号,-1结束删除"<<endl;
cin>>no;
if(no==-1)
break;
int i=searchStu(no);
if(i!=-1)
{
it=u.begin()+i;
mm.erase(mm.find(no));
u.erase(it);
}
else
cout<<"输入学号有误,请重新输入"<<endl;
}
}
void Administrator::queryStu()
{
int no;
while(1)
{
cout<<"请输入所查询用户的学号,-1结束查询"<<endl;
cin>>no;
if(no==-1)
break;
int i=searchStu(no);
if(i!=-1)
cout<<u[i]<<endl;
else
cout<<"输入学号有误,请重新输入"<<endl;
}
}
void Administrator::changeStu()
{
User u1;
int no;
while(1)
{
cout<<"请输入所修改用户的学号"<<endl;
cin>>no;
if(no==-1)
break;
int i=searchStu(no);
if(i!=-1)
{
cout<<"请输入所修改用户的信息,-1结束修改"<<endl;
cin>>u1;
u[i]=u1;
}
else
cout<<"输入学号有误,请重新输入"<<endl;
}
}
void Administrator::displayAllStu()
{
for(it=u.begin(); it!=u.end(); it++)
cout<<*it<<endl;
}
void Administrator::addBook()
{
Book B;
int i;
cout<<"请添加图书信息,-1结束添加"<<endl;
while(cin>>B)
{
if(B.getID()==-1)
break;
b.push_back(B);
i=b.size();
mm3.insert(make_pair(B.getID(),i-1));
cout<<"请添加图书信息,-1结束添加"<<endl;
}
}
void Administrator::deleBook()
{
int ID;
while(1)
{
cout<<"请输入所删除图书的书号,-1结束删除"<<endl;
cin>>ID;
if(ID==-1)
break;
int i=searchBook(ID);
if(i!=-1)
{
it1=b.begin()+i;
mm3.erase(mm3.find(ID));
b.erase(it1);
}
else
cout<<"输入书号有误,请重新输入"<<endl;
}
}
void Administrator::queryBook()
{
int ID;
while(1)
{
cout<<"请输入所查询图书的书号,-1结束查询"<<endl;
cin>>ID;
if(ID==-1)
break;
int i=searchBook(ID);
if(i!=-1)
cout<<b[i]<<endl;
else
cout<<"输入书号有误,请重新输入"<<endl;
}
}
void Administrator::changeBook()
{
Book B;
int ID;
while(1)
{
cout<<"请输入所修改图书的书号"<<endl;
cin>>ID;
if(ID==-1)
break;
int i=searchBook(ID);
if(i!=-1)
{
cout<<"请输入所修改图书的信息,-1结束修改"<<endl;
cin>>B;
b[i]=B;
}
else
cout<<"输入书号有误,请重新输入"<<endl;
}
}
void Administrator::displayAllBook()
{
for(it1=b.begin(); it1!=b.end(); it1++)
cout<<*it1<<endl;
}
class Client:public BaseData
{
User u;
Time t;//当前时间
multimap<string,Book>mm1;//按书名查找
multimap<string,Book>::iterator mm1i;
multimap<string,Book>mm2;//按作者查找
multimap<string,Book>::iterator mm2i;
public:
Client(int no,Time d)
{
loadStu(no);
loadBook();
t=d;
}
void loadStu(int);
void saveStu();
void loadBook();
void searchName();//按书名查找
void searchAuthor();//按作者查找
void borrow();//借阅图书
void back();//还书
void renew();//续借
~Client()
{
saveStu();
saveBook();
}
};
//从文件读入用户数据
void Client::loadStu(int no)
{
ifstream infile("20171820stu.txt",ios::in);
if(!infile)
return;
u.mmClear();
while(infile>>u)
{
if(u.getType()&&u.getNum())
for(int i=0; i<u.getNum(); i++)
{
//cout<<"LOAD"<<u.getNum()<<endl;
Record r;
infile>>r;
//cout<<"LOAD"<<r<<endl;
u.addRecord(r);
u.setMM(r,i);
}
if(no==u.getNo())
{
this->u=u;
break;
}
u.recordClear();
}
infile.close();
}
//从文件读入图书数据
void Client::loadBook()
{
Book B;
Record r;
int i=0;
ifstream infile("20171820book.txt",ios::in);
if(!infile)
return;
b.clear();
B.mmClear();
mm1.clear();
mm2.clear();
mm3.clear();
while(infile>>B)
{
if(B.getNum())
for(int j=0; j<B.getNum(); j++)
{
//cout<<"laod"<<B.getNum()<<endl;
infile>>r;
//cout<<"load"<<r<<endl;
B.addRecord(r);
B.setMM(r,j);
}
b.push_back(B);
B.recordClear();
mm1.insert(make_pair(B.getName(),B));
mm2.insert(make_pair(B.getAuthor(),B));
mm3.insert(make_pair(B.getID(),i));
i++;
}
infile.close();
}
//将用户数据写到文件
void Client::saveStu()
{
vector<User>v;
vector<User>::iterator it;
User u1;
ifstream infile("20171820stu.txt",ios::in);
if(!infile)
return;
while(infile>>u1)
{
if(u1.getType()&&u1.getNum())
for(int i=0; i<u1.getNum(); i++)
{
//cout<<"SAVE"<<u1.getNum()<<endl;
Record r;
infile>>r;
//cout<<"SAVE"<<r<<endl;
u1.addRecord(r);
}
if(u1==this->u)
u1=this->u;
v.push_back(u1);
u1.recordClear();
}
infile.close();
ofstream outfile("20171820stu.txt",ios::out);
if(!outfile)
return;
for(it=v.begin(); it!=v.end(); it++)
{
//cout<<*it<<endl;
outfile<<*it;
outfile<<endl;
}
outfile.close();
}
//按书名查找
void Client::searchName()
{
string s;
cout<<"请输入所查询的书名,end结束查询"<<endl;
while(cin>>s)
{
if(s=="end")
break;
it1 = find_if(b.begin(),b.end(),cmp1(s));
if(it1!=b.end())
while(it1!=b.end())
{
if(s=="end")
break;
cout<<b[it1-b.begin()]<<endl;
it1 = find_if(it1+1,b.end(),cmp1(s));
}
else cout<<"无此图书!"<<endl;
cout<<"请输入所查询的书名,end结束查询"<<endl;
}
}
//按作者查找
void Client::searchAuthor()
{
string s;
cout<<"请输入所查询的作者名,end结束查询"<<endl;
while(cin>>s)
{
if(s=="end")
break;
it1 = find_if(b.begin(),b.end(),cmp2(s));
if(it1!=b.end())
while(it1!=b.end())
{
cout<<b[it1-b.begin()]<<endl;
it1 = find_if(it1+1,b.end(),cmp2(s));
}
else cout<<"无相关作者图书"<<endl;
cout<<"请输入所查询的作者名,end结束查询"<<endl;
}
}
void Client::borrow()
{
int s,sh,i;
cout<<"请输入借阅本数"<<endl;
cin>>s;
while(s)
{
cout<<"请输入所借书书号"<<endl;
cin>>sh;
i=searchBook(sh);
if(!u.getViolate())
{
if(u.getBorrow()<u.getBiggest())
{
if(i!=-1)
{
if(b[i].getRest())
{
b[i].setRest(b[i].getRest()-1);
u.setBorrow(u.getBorrow()+1);
Record r(u.getNo(),sh,t);
b[i].setNum(b[i].getNum()+1);
u.setNum(u.getNum()+1);
b[i].addRecord(r);
u.addRecord(r);
--s;
//b[i].displayRecord();
//u.displayRecord();
}
else
cout<<"该书已借出"<<endl;
}
else
cout<<"无此图书"<<endl;
}
else
{
cout<<"借阅数已达上限,无法继续借书"<<endl;
break;
}
}
else
{
cout<<"有违纪行为,无法借书"<<endl;
break;
}
}
}
void Client::back()
{
int sh,s,i;
cout<<"请输入还书本数"<<endl;
cin>>s;
while(s)
{
cout<<"请输入所还书书号"<<endl;
cin>>sh;
i=searchBook(sh);
if(i!=-1)
{
if(u.searchBook(sh)!=-1)
{
b[i].setRest(b[i].getRest()+1);
u.setBorrow(u.getBorrow()-1);
--s;
}
else
cout<<"未借此书,请确认书号"<<endl;
}
else
cout<<"输入书号有误,请重新输入"<<endl;
}
}
void Client::renew()
{
int sh,s;
cout<<"请输入续借本数"<<endl;
cin>>s;
while(s)
{
cout<<"请输入所续借书号"<<endl;
cin>>sh;
int i=searchBook(sh);
if(i!=-1)
{
b[i].modify(u.getNo());
u.modify(sh);
--s;
}
else cout<<"无此图书"<<endl;
}
}
class CheckIn:public BaseData
{
public:
void logIn()
{
int id,i;
string pw;
cout<<"请输入账号和密码"<<endl;
while(cin>>id>>pw)
{
i=searchStu(id);
if(i!=-1)
{
if(u[i].getCode()==pw)
{
if(u[i].getType())
{
cout<<"欢迎用户登陆"<<endl;
u[i].setCode();
Time t;
cout<<"请输入当前时间"<<endl;
cin>>t;
Client c1(id,t);
c1.searchName();
c1.searchAuthor();
c1.borrow();
c1.back();
c1.renew();
break;
}
else
{
cout<<"欢迎管理员登陆"<<endl;
Administrator a;
a.addStu();
a.displayAllStu();
a.queryStu();
a.changeStu();
a.deleStu();
a.displayAllStu();
a.addBook();
a.displayAllBook();
a.queryBook();
a.changeBook();
a.deleBook();
a.displayAllBook();
break;
}
}
else
cout<<"密码错误,请重新账号和密码输入"<<endl;
}
else
cout<<"账号错误,请重新账号和密码输入"<<endl;
}
}
};
int main()
{
BaseData *B;
CheckIn c;
B=&c;
B->logIn();
return 0;
}