圖書館管理系統心得體會
圖書管理系統的感想
對於這個系統在操作的過程中出錯最多的地方是檔案的操作,就是檔案的讀入和讀出總是出現問題,問題在於以下兩點:
一是在過載輸入流輸出流運算子的時候出現了錯誤,即輸入和輸出的格式是不相同的,下面是正確的程式碼:
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;
}