出现过的问题以及解决办法分析
注意定义时间的时候,要加上重载运算符 <
bool operator<(const Time&t)const
{
return year!=t.year?year<t.year:month!=t.month?month<t.month:day<t.day;
}
以上用于判断还书时间是否超时,先从年判断,如果年相同就对月进行判断。。。
此处用到三目运算符 ?:
用记录类记录基本信息,用于后面的文件记录写入、记录Book类和User类 的附带基本信息
为便于后面操作,将借还书和续借定义为int类型
class Record
{
int uid,bid;//用户学号和所借书的书号
Time st;
Time et;//默认et为应该还书的时间
int xj;//1表示已经续借过,0时还未续借
int zt;//1时已经还书,0时未还书
class Book
{
int id; //书号
string name; //书名
string address;//出版社
Time cbt; //出版日期
int sum,jie; //总册数和借出数
int i;
public:
vector<Record>v1;
vector<Record>::iterator it1;
multimap<int,int>m1;
multimap<int,int>::iterator m1;
注意此处定义的字符,后面要与相应的vector和multimap对应,否则会出现文件无法读入,或程序停止运行的问题
对于用multimap储存信息要按照<>中定义的对应类型变量形式储存
如:multimap<string,int> 就要在<>中存入一个stringe类型和一个int类型的信息
添加信息时
void Manager::addUser(User u)
{
int x;
x=u.getId();
mit3=m3.find(x);
if(mit3!=m3.end()){cout<<"该用户已存在"<<endl;}
else
{
cout<<"添加用户成功"<<endl;
int i;
v3.push_back(u);
i=v3.size();
m3.insert(make_pair(u.getId(),i-1));
}
}
在查找信
息的时候会用到 multimap的基本操作find()
在找到相应信息后,可以直接用cout对应的vector中存储的信息
void Manager::searchU(int x)
{
mit3=m3.find(x);
if(mit3!=m3.end())
{
cout<<"found"<<endl;
cout<<v3[mit3->second]<<endl;
}
else cout<<"not found"<<endl;
}
关于锁定用户可以用在读入文件时定义一个带参数的load()
并判断该用户是否为数据文件中存在的用户
如:
Userop(int x) {load1();load2(x);}
void Userop::load2(int x)
{
User u;
ifstream infile("d:\\20177411stu.txt",ios::in);
if(!infile) return;
while(infile>>u)
{
v6.push_back(u);
int i=v6.size();
m6.insert(make_pair(u.getId(),i-1));
if(x==u.getId())
{
this->u=u;
}
}
infile.close();
}
借书操作,需要更改在数据文件中保存的关于借书数量,馆藏数,读者借书数量,以及读者是否续借等相关信息并读入到数据文件中
void Userop::borrowBook(int x,Time t)
{
mit5=m5.find(x);
int i,jie,sum;
i=mit5->second;
jie=v5[i].getJie();
sum=v5[i].getSum();
if(u.getwj()==0&&jie<sum&&u.getNowb()<u.getMostb()&&mit5!=m5.end())
{
Record r(u.getId(),v5[i].getId(),t);
u.addRecord(r);
mit6=m6.find(u.getId());
v6[mit6->second].addRecord(r);
v5[i].addRecord(r);
u.setNowb(u.getNowb()+1);
v6[mit6->second].setNowb(u.getNowb());
v5[i].setJie(jie+1);
cout<<"借书成功"<<endl;
}
else cout<<"借书失败"<<endl;
}
还书操作,将借书操作时所涉及到的数据依次更改,并读入到数据文件中
void Userop::returnBook(int x)
{
mit5=m5.find(x);
int flag=0;
int i=mit5->second;
if(u.v2.size()!=0)
{
for(int i=0;i<u.v2.size();i++)
{
if(x==u.v2[i].getBid())
flag=1;
}
}
if(mit5!=m5.end()&&flag==1)
{
u.setNowb(u.getNowb()-1);
mit6=m6.find(u.getId());
v6[mit6->second].setNowb(u.getNowb());
v5[i].setJie(v5[i].getJie()-1);
v5[i].mit1=v5[i].m1.find(u.getId());
v5[i].v1[v5[i].mit1->second].setZt(1);
u.mit2=u.m2.find(x);
u.v2[u.mit2->second].setZt(1);
int j=mit6->second;
v6[j].mit2=v6[j].m2.find(x);
v6[j].v2[v6[j].mit2->second].setZt(1);
cout<<"还书成功"<<endl;
}
else cout<<"还书失败"<<endl;
}