图书管理系统要求实现图书的增加、删除、查询、记录更改以及借阅情况,那么,相应的操作类便要分为管理员操作类与用户操作类。
管理员操作类:实现图书基本信息的存入、读取以及借阅记录的调取,使用load和save实现图书基本信息的读取与存入,借阅记录的相关操作需要使用STL中vector及multimap。
用户操作类:实现用户基本信息的录入与读取,包括借书、还书、续借以及违纪情况,同样也要有借阅记录,某人什么时间借了某本书,还书时间,是否续借。那对于图书的查询,借阅记录的调取同样需要使用STL中的vector及multimap。
使用STL时要注意vector的元素可以是任意类型,但必须具备赋值与拷贝能力;multimap中的key及value可以是任意类型,但是不能直接改变元素的key。
这个系统仅简单实现了图书数据文件与用户数据文件的生成以及借阅记录的生成与显示,但是简单运用了STL,多少增加了一些了解,对类的使用也更加熟练,只是整体系统的编写还是有些欠缺,多加调试的过程中是有些崩溃啦。虽然系统并没有实现太多功能,但多少有练习到,以后应该会越写越好吧!
源代码:
#include<bits/stdc++.h>
using namespace std;
class Time
{
int year,month,day;
public:
Time(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
Time(){year=0;month=0;day=0;}
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&ti)const
{
return year!=ti.year?year<ti.year:month!=ti.month?month<ti.month:day<ti.day;
}
friend istream&operator>>(istream&is,Time&t);
friend ostream&operator<<(ostream&os,Time&t);
};
ostream&operator<<(ostream&os,Time&t)
{
os<<t.year<<"/";
os<<t.month<<"/";
os<<t.day;
return os;
}
istream&operator>>(istream&is,Time&t)
{
is>>t.year>>t.month>>t.day;
return is;
}
class Record
{
int id;//学生学号
int booknumber;//书号;
Time date1;//借书时间;
Time date2;//还书时间
int renew;//续借情况
int state;
public:
Record(int no,Time t,int sh)
{
id=no;
date1=t;
booknumber=sh;
if(t.getMonth()+2>12)
{
Time d2(t.getYear()+1,t.getMonth()-10,t.getDay());
date2=d2;
}
else
{
Time d2(t.getYear(),t.getMonth()+2,t.getDay());
date2=d2;
}
renew=0;
state=0;
}
Record(){}
int getId(){return id;}
int getBooknumber(){return booknumber;}
Time getDate1(){return date1;}
Time getDate2(){return date2;}
void setDate2();
void setRenew(){renew=1;}
int getRenew(){return renew;}
void setState(int s){state=s;}
int getState(){return state;}
friend ostream&operator<<(ostream&out,Record&R);
friend istream&operator>>(istream&inp,Record&R);
};
void Record::setDate2()
{
Time d;
if(date2.getMonth()+1>12)
d=Time(date2.getYear()+1,date2.getMonth()+1,date2.getDay());
else
d=Time(date2.getYear()+1,date2.getMonth(),date2.getDay());
date2=d;
}
istream&operator>>(istream&in,Record&R)
{
in>>R.id;
in>>R.booknumber;
in>>R.date1;
in>>R.date2;
in>>R.renew;
in>>R.state;
return in;
}
ostream&operator<<(ostream&out,Record&R)
{
out<<R.id<<" "<<R.booknumber<<" "<<R.date1<<" "<<R.date2<<" "<<R.renew<<" "<<R.state<<endl;
return out;
}
class Book
{
int booknumber;//书号
string bookname;//书名
string publish_house;//出版社
int publish_date;//出版日期
int sum;//总册数
int lend;//借出数目
int renumber;
vector<Record>v;
vector<Record>::iterator it;
multimap<int,int>m1;
multimap<int,int>::iterator mit1;
public:
Book(){renumber=0;}
vector<Record>getRecord(){return v;}
int getBooknumber(){return booknumber;}
string getBookname(){return bookname;}
string getPublish_house(){return publish_house;}
int getPublish_date(){return publish_date;}
void setSum(int s){sum=s;}
int getSum(){return sum;}
void setLend(int le){lend=le;}
int getLend(){return lend;}
void setRenumber(int re){renumber=re;}
int getRenumber(){return renumber;}
void addRecord1(Record r1);
void displayRecord1();
void add1(Record R1);
void deleteRecord1(int no);
int search1(int no);
void display();
void modify(int no);
void clear1();
friend istream&operator>>(istream&is,Book&bo);
friend ostream&operator<<(ostream&os,Book&bo);
};
void Book::display()
{
cout<<booknumber<<endl;
cout<<bookname<<endl;
cout<<publish_house<<endl;
cout<<publish_date<<endl;
}
istream&operator>>(istream&is,Book&bo)
{
is>>bo.booknumber;
if(bo.booknumber==-1)
return is;
is>>bo.bookname;
is>>bo.publish_house;
is>>bo.publish_date;
is>>bo.sum;
is>>bo.lend;
is>>bo.renumber;
return is;
}
ostream&operator<<(ostream&os,Book&bo)
{
os<<bo.booknumber<<" "<<bo.bookname<<" "<<bo.publish_house<<" "<<bo.publish_date<<" "<<bo.sum<<" "<<bo.lend<<" "<<bo.renumber<<endl;
if(bo.getRenumber()!=0)
for(int i=0;i<bo.getRenumber();i++)
os<<bo.v[i];
return os;
}
void Book::add1(Record R1)
{
v.push_back(R1);
int i=v.size();
m1.insert(make_pair(R1.getId(),i-1));
}
void Book::addRecord1(Record r1)
{
r1.setState(1);
v.push_back(r1);
int i=v.size();
m1.insert(make_pair(r1.getId(),i-1));
}
void Book::displayRecord1()
{
if(v.size()!=0)
for(it=v.begin();it!=v.end();it++)
cout<<*it;
else
cout<<"No Record!"<<endl;
}
void Book::clear1(){v.clear();}
int Book::search1(int no)
{
mit1=m1.find(no);
if(mit1!=m1.end())
return mit1->second;
else return -1;
}
void Book::modify(int no)
{
int i=search1(no);
if(v[i].getRenew()==0)
{
v[i].setRenew();
v[i].setDate2();
}
}
void Book::deleteRecord1(int no)
{
int i;
i=search1(no);
if(i!=-1)
v[i].setState(0);
}
class User
{
int id;//学号
string stuname;//学生姓名
string specialty;//专业
int classnum;//班级
int most_num;//最大借阅量
int pre_num;//当前借阅量
int violate;//违纪情况
int reloan;
vector<Record>v1;
vector<Record>::iterator it1;
multimap<int,int>m2;
multimap<int,int>::iterator mit2;
public:
User(){violate=0;reloan=10;}
int getId(){return id;}
void setStuname(string xm){stuname=xm;}
string getStuname(){return stuname;}
void setSpecialty(string zy){specialty=zy;}
string getSpecialty(){return specialty;}
void setClassnum(int bj){classnum=bj;}
int getClassnum(){return classnum;}
void setMost_num(int max){most_num=max;}
int getMost_num(){return most_num;}
void setPre_num(int pn){pre_num=pn;}
int getPre_num(){return pre_num;}
void setViolate(int v){violate=v;}
int getViolate(){return violate;}
void setReloan(int re){reloan=re;}
int getReloan(){return reloan;}
vector<Record>getRecord(){return v1;}
multimap<int,int>getMap(){return m2;}
void clear2();
void addRecord2(Record r2);
void dispRecord2();
void deleteRecord2(int sh);
void add2(Record R2);
int search2(int sh);
void modify(int sh);
void judge(Time t);
friend istream&operator>>(istream&is,User&U);
friend ostream&operator<<(ostream&os,User&U);
void operator=(User&u)
{
id=u.getId();
stuname=u.getStuname();
specialty=u.getSpecialty();
classnum=u.getClassnum();
most_num=u.getMost_num();
pre_num=u.getPre_num();
violate=u.getViolate();
reloan=u.getReloan();
v1=u.getRecord();
m2=u.getMap();
}
bool operator==(User u)
{
return this->id==u.getId()?1:0;
}
};
istream&operator>>(istream&is,User&U)
{
is>>U.id;
if(U.id==-1)
return is;
is>>U.stuname;
is>>U.specialty;
is>>U.classnum;
is>>U.most_num;
is>>U.pre_num;
is>>U.violate;
is>>U.reloan;
return is;
}
ostream&operator<<(ostream&os,User&U)
{
os<<U.id<<" "<<U.stuname<<" "<<U.specialty<<" "<<U.classnum<<" "<<U.most_num<<" "<<U.pre_num<<" "<<U.violate<<" "<<U.reloan<<endl;
if(U.getReloan()!=0)
for(int i=0;i<U.getReloan();i++)
os<<U.v1[i];
return os;
}
void User::add2(Record R2)
{
v1.push_back(R2);
int i=v1.size();
m2.insert(make_pair(R2.getBooknumber(),i-1));
}
void User::addRecord2(Record r2)
{
r2.setState(1);
v1.push_back(r2);
int i=v1.size();
m2.insert(make_pair(r2.getBooknumber(),i-1));
}
void User::dispRecord2()
{
if(v1.size()!=0)
for(it1=v1.begin();it1!=v1.end();it1++)
cout<<*it1;
else
cout<<"No Record!"<<endl;
}
int User::search2(int sh)
{
mit2=m2.find(sh);
if(mit2!=m2.end())
return mit2->second;
else
return -1;
}
void User::deleteRecord2(int sh)
{
int i;
i=search2(sh);
if(i!=-1)
{
v1[i].setState(0);
}
}
void User::judge(Time t)
{
setViolate(0);
for(int i=0;i<v1.size();i++)
if(v1[i].getDate2()<t&&v1[i].getState()==1)
{
setViolate(1);
break;
}
}
void User::modify(int sh)
{
int i=search2(sh);
if(v1[i].getRenew()==0)
{
v1[i].setRenew();
v1[i].setDate2();
}
}
void User::clear2()
{
v1.clear();
}
class KeeperOp
{
vector<Book>v2;
vector<Book>::iterator it2;
multimap<int,int>m3;
multimap<int,int>::iterator mit3;
vector<User>c1;
vector<User>::iterator it3;
multimap<int,int>m4;
multimap<int,int>::iterator mit4;
public:
KeeperOp()
{
}
~KeeperOp()
{
save1();
save2();
}
void addBook();
void dispBook();
int search3(int sh);
void queryByBooknumber();
void deleteBook();
void modifyBook();
void addUser();
void dispUser();
int search4(int h);
void queryById();
void deleteUser();
void modifyUser();
void load1();
void load2();
void save1();
void save2();
};
void KeeperOp::addBook()
{
Book bo;
int i;
while(cin>>bo)
{
if(bo.getBooknumber()==-1) break;
v2.push_back(bo);
i=v2.size();
m3.insert(make_pair(bo.getBooknumber(),i-1));
bo.clear1();
}
}
int KeeperOp::search3(int sh)
{
mit3=m3.find(sh);
if(mit3!=m3.end())
{
return mit3->second;
}
else return -1;
}
void KeeperOp::queryByBooknumber()
{
int sh;
cin>>sh;
int i=search3(sh);
cout<<v2[i];
}
void KeeperOp::deleteBook()
{
int sh;
cin>>sh;
int i=search3(sh);
if(i!=-1)
{
it2=v2.begin()+i;
m3.erase(m3.find(sh));
v2.erase(it2);
}
}
void KeeperOp::modifyBook()
{
int sh;
cin>>sh;
int i=search3(sh);
int n;
cin>>n;
v2[i].setSum(n);
}
void KeeperOp::dispBook()
{
for( it2=v2.begin();it2!=v2.end();++it2)
cout<<*it2;
}
void KeeperOp::addUser()
{
User ur;
int i;
while(cin>>ur)
{
if(ur.getId()==-1) break;
c1.push_back(ur);
i=c1.size();
m4.insert(make_pair(ur.getId(),i-1));
ur.clear2();
}
}
int KeeperOp::search4(int no)
{
mit4=m4.find(no);
if(mit4!=m4.end())
{
return mit4->second;
}
else return -1;
}
void KeeperOp::queryById()
{
int no;
cin>>no;
int i=search4(no);
cout<<c1[i];
}
void KeeperOp::deleteUser()
{
int no;
cin>>no;
int i=search4(no);
if(i!=-1)
{
it3=c1.begin()+i;
m4.erase(m4.find(no));
c1.erase(it3);
}
}
void KeeperOp::modifyUser()
{
int no;
cin>>no;
int i=search4(no);
int m;
cin>>m;
c1[i].setMost_num(m);
}
void KeeperOp::dispUser()
{
for( it3=c1.begin();it3!=c1.end();++it3)
cout<<*it3;
}
void KeeperOp::save1()
{
ofstream outfile("d:\\20171792Book.txt",ios::out);
if(!outfile)
return ;
for(it2=v2.begin();it2!=v2.end();it2++)
{
outfile<<*it2;
}
outfile.close();
}
void KeeperOp::save2()
{
ofstream outfile("d:\\20171792Stu.txt",ios::out);
if(!outfile)
return ;
for(it3=c1.begin();it3!=c1.end();it3++)
{
outfile<<*it3;
}
outfile.close();
}
class UserOp
{
vector<Book>v3;
vector<Book>::iterator it5;
multimap<int,int>m5;
multimap<int,int>::iterator mit5;
User U;
public:
UserOp()
{
load3();
load4();
}
~UserOp()
{
save3();
save4();
}
void load3();
void save3();
void load4();
void save4();
int search5(int sh);
void queryBook();
void borrow();
void huan();
void renew();
};
void UserOp::load3()
{
Book bo;
int i;
ifstream infile("d:\\20171792Book.txt",ios::in);
if(!infile)
{return;}
v3.clear();
m5.clear();
while(infile>>bo)
{
if(bo.getRenumber()!=0)
for(int i=0;i<bo.getRenumber();i++)
{
Record R2;
infile>>R2;
bo.add1(R2);
}
v3.push_back(bo);
int i=v3.size();
m5.insert(make_pair(bo.getBooknumber(),i-1));
bo.clear1();
}
infile.close();
}
void UserOp::save3()
{
ofstream outfile("d:\\20171792Book.txt",ios::out);
if(!outfile) return ;
for(it5=v3.begin();it5!=v3.end();it5++)
{
outfile<<*it5;
}
outfile.close();
}
void UserOp::load4()
{
int id;
cin>>id;
User u1;
int i;
ifstream infile("d:\\20171792stu.txt",ios::in);
if(!infile)
return;
while(infile>>u1)
{
if(u1.getReloan()!=0)
for(int i=0;i<u1.getReloan();i++)
{
Record R3;
infile>>R3;
u1.add2(R3);
}
if(u1.getId()==id)
this->U=u1;
u1.clear2();
}
infile.close();
}
void UserOp::save4()
{
vector<User>c2;
vector<User>::iterator it6;
User u2;
ifstream infile("d:\\20171792stu.txt",ios::in);
if(!infile)
return ;
while(infile>>u2)
{
if(u2.getReloan()!=0)
for(int i=0;i<u2.getReloan();i++)
{
Record R4;
infile>>R4;
u2.add2(R4);
}
if(u2==this->U)
u2=this->U;
c2.push_back(u2);
u2.clear2();
}
infile.close();
ofstream outfile("d:\\20171792stu.txt",ios::out);
if(!outfile)
return;
for(it6=c2.begin();it6!=c2.end();it6++)
outfile<<*it6;
outfile.close();
}
int UserOp::search5(int sh)
{
mit5=m5.find(sh);
if(mit5!=m5.end())
{
return mit5->second;
}
else
return -1;
}
void UserOp::queryBook()
{
int sh;
cin>>sh;
int i=search5(sh);
if(i!=-1)
v3[i].display();
}
void UserOp::borrow()
{
int sh,id;
Time t;
cin>>sh;
cin>>t;
int i=search5(sh);
U.judge(t);
if(U.getViolate()==0&&U.getPre_num()<U.getMost_num())
{
v3[i].setLend(v3[i].getLend()+1);
v3[i].setRenumber(v3[i].getRenumber()+1);
U.setPre_num(U.getPre_num()+1);
U.setReloan(U.getReloan()+1);
Record r(U.getId(),t,sh);
v3[i].addRecord1(r);
U.addRecord2(r);
}
}
void UserOp::huan()
{
int sh,id;
cin>>sh;
int i=search5(sh);
v3[i].setLend(v3[i].getLend()-1);
U.setPre_num(U.getPre_num()-1);
v3[i].deleteRecord1(U.getId());
U.deleteRecord2(sh);
}
void UserOp::renew()
{
int sh;
cin>>sh;
int i=search5(sh);
v3[i].modify(U.getId());
U.modify(sh);
}
int main()
{
//KeeperOp类测试
/* KeeperOp k;
k.addBook();
k.dispBook();
cout<<"-------------------------"<<endl;
k.addUser();
k.dispUser();
cout<<"*************************"<<endl;
return 0;
*/
//UserOp类测试;
UserOp u1;
u1.borrow();
u1.borrow();
u1.huan();
return 0;
}
运行管理员操作类,生成两个数据文件:
以文本形式存入D盘
图书数据文件:
用户数据文件:
2017828借两本书:
2017792借两本书,还一本书: