图书管理系统的感想
对于这个系统在操作的过程中出错最多的地方是文件的操作,就是文件的读入和读出总是出现问题,问题在于以下两点:
一是在重载输入流输出流运算符的时候出现了错误,即输入和输出的格式是不相同的,下面是正确的代码:
istream&operator>>(istream&is,Record&r)
{
is>>r.no>>r.t1>>r.name>>r.type>>r.xujie;
return is;
}
ostream&operator<<(ostream&os,Record&r)
{
int a,b,c;
int w;
if(r.xujie==1){
a=r.t1.getDay();
c=r.t1.getYear();
b=r.t1.getMonth()+4;
if(b>=13) {b=b-12;c+=1;}
}
if(r.xujie==2)
{ a=r.t1.getDay();
c=r.t1.getYear();
b=r.t1.getMonth()+2;
if(b>=13) {b=b-12;c+=1;}
}
Time t3(c,b,a);
os<<r.no<<" ";
os<<r.t1<<" ";
os<<r.name<<" ";
os<<r.type<<" ";
os<<r.xujie<<" ";
//os<<t3<<" ";
return os;
}
也就是说,在重载的过程中要保证输入和输出的格式保持一致;
第二点,是加一个识别的控制符,控制输入图书信息和记录,让系统能够识别你输入的是记录,还是图书信息,同样用户也是这样,也要加一个控制符来区别用户信息和借阅记录,这样系统也就可以正确的识别出来,我的方法是,加一个number,也就是借阅的总量,让系统在输入的时候,可以依照for循环来向系统里输入借阅记录,具体代码如下:
istream&operator>>(istream&is,Book&b)
{
is>>b.number>>b.name>>b.kind>>b.auther>>b.gross>>b.alive>>b.price>>b.lishi;
b.r1.clear();
for(int u=0;u<b.lishi;u++)
{
Record r;
int i;
{
is>>r;
//if(r.getNo()==0) break;
b.r1.push_back(r);
i=b.r1.size();
b.r2.insert(make_pair(r.getName(),i-1));
}
}
return is;
}
学生类的是这样:
istream&operator>>(istream&is,Student&e1)
{
is>>e1.no>>e1.name>>e1.allow>>e1.broke>>e1.number;
Record x;
int i;
e1.m1.clear();
if(e1.number!=0)
{
for(int a=0;a<e1.number;a++)
{
is>>x;
if(x.getNo()==0) break;
e1.m1.push_back(x);
i=e1.m1.size();
e1.m2.insert(make_pair(x.getName(),i-1));
}
}
return is;
}
ostream&operator<<(ostream&os,Student&e1)
{
os<<e1.no<<" ";
os<<e1.name<<" ";
os<<e1.allow<<" ";
os<<e1.broke<<" ";
os<<e1.number<<" ";
os<<endl;
if(e1.number!=0)
{ int i;
for(i=0;i<e1.number;i++)
{
os<<e1.m1[i]<<endl;
}
}
return os;
}
对于这个系统,是分成两个部分一个是用户操作类,另一个是管理员操作类
对于用户类应该有查书,借书还书,查看自己的借阅记录几个功能,
借书:
voidStudentop::jieshu(string name)
{
int i,o,p;
i=getYear();
o=getMonth();
p=getDay();
Time t1(i,o,p);
int u;
int h=search4(name);
cout<<b1[h];
int g=b1[h].getAlive();
int d=s1.getAllow();
int r=s1.getBroke();
if(g==0) cout<<"Notenough!"<<endl;
else
{ if(d==0) cout<<"youcan't"<<endl;
if(r!=0) cout<<"youcan't"<<endl;
else{
cout<<"Are yourenew?"<<endl;
cin>>u;
//b1[h].setAlive(g-1);
//s1.setAllow(d-1);
Recordz(s1.getNo(),t1,name,"jieshu",u);
b1[h].addRecord(z);
s1.add(z);
cout<<"success!"<<endl;
}
}
}
查书需要先进行几个前提处理,这本书的库存是否够,自己是否有不良借阅记录,自己借书的上限是否已经达到,满足条件即可实现借书功能。
还书:
voidStudentop::huanshu(string name)
{
int u1;
int i,o,p;
i=getYear();
o=getMonth();
p=getDay();
Time t2(i,o,p);
int u=search4(name);
int w=b1[u].getAlive();
int d=s1.getAllow();
cout<<"WasRenewed?"<<endl;
cin>>u1;
Recordf(s1.getNo(),t2,name,"huanshu",u1);
//b1[u].setAlive(w+1);
//s1.setAllow(d+1);
b1[u].addRecord(f);
s1.add(f);
}
还书时候需要搜寻这本书之前的借阅记录,一一对应起来之后就可以,修改可借数量即可。
最后,是查询功能,这个地方在写的时候,会出现查询的信息不一一对应的情况,要加一个clear(),具体实现如下:
istream&operator>>(istream&is,Student&e1)
{
is>>e1.no>>e1.name>>e1.allow>>e1.broke>>e1.number;
Record x;
int i;
e1.m1.clear();
if(e1.number!=0)
{
for(int a=0;a<e1.number;a++)
{
is>>x;
if(x.getNo()==0) break;
e1.m1.push_back(x);
i=e1.m1.size();
e1.m2.insert(make_pair(x.getName(),i-1));
}
}
return is;
}
加一个clear()函数可以把建立的临时对象及时更新,避免查询时出现错误,
图书信息也是这样:
istream&operator>>(istream&is,Book&b)
{
is>>b.number>>b.name>>b.kind>>b.auther>>b.gross>>b.alive>>b.price>>b.lishi;
b.r1.clear();
for(int u=0;u<b.lishi;u++)
{
Record r;
int i;
{
is>>r;
//if(r.getNo()==0) break;
b.r1.push_back(r);
i=b.r1.size();
b.r2.insert(make_pair(r.getName(),i-1));
}
}
return is;
}