图书管理系统总结
图书管理系统包括:时间类,记录类,数据类,操作类
时间类:时间类起了一个铺垫的作用,因为记录类,数据类和操作类里面需要调用时间类,比如记录类里面的图书的借阅日期,还书日期,数据类里面的图书的出版日期
记录类:作用是用于用户借书时,生成借阅记录
数据类:数据类包括两部分,一是图书数据类,用来写图书的信息;二是用户数据类,用来写用户的信息
操作类:操作类也包括两部分,一是管理员操作类,包括管理员对图书和用户的操作;二是用户操作类,用户的操作包括借书还书两部分
时间类(包括构造函数,get函数,set函数,运算符的重载)
class Time
{
//时间类
int year;
int month;
int day;
public:
Time()
{
year=month=day=0;
}
Time(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
friend istream &operator>>(istream &input,Time &x)
{
input>>x.year>>x.month>>x.day;
return input;
}
friend ostream &operator<<(ostream &output,const Time &x)
{
output<<x.year<<" "<<x.month<<" "<<x.day;
return output;
}
int getYear()
{
return year;
}
int getMonth()
{
return month;
}
int getDay()
{
return day;
}
void setYear(int y)
{
year=y;
}
void setMonth(int m)
{
month=m;
}
void setDay(int d)
{
day=d;
}
//重载<操作符
bool operator<(const Time &x){//如果时间t1<t2 return 1 else return 0
if(year<x.year){return true;}
else if(year==x.year){
if(month<x.month){return true;}
else if(month==x.month){
if(day<x.day){return true;}
else return false;
}
else return false;
}
else return false;
}
//重载=操作符
void operator=(const Time &y){
year=y.year;
month=y.month;
day=y.day;
}
};
记录类
class Record
{
//图书的借阅记录类
string name;//用户的姓名
int no;//用户的学号
string title;//图书的题目
int number;//图书的编号
string author;//图书的作者
string press;//图书的出版日期
Time t1;//借书日期
Time t2;//还书日期
bool xj;//定义一个布尔变量,来判断用户是否有续借
bool wj;//判断是否违纪
bool state;
public:
Record()
{
}
Record(string na,int n,string t,int nu,string au,string p,Time x1)
{
name=na;
no=n;
title=t;
number=nu;
author=au;
press=p;
t1=x1;
if(x1.getMonth()+2>12)
{
Time x2(x1.getYear()+1,x1.getMonth()-10,x1.getDay());
t2=x2;
}
else
{
Time x2(x1.getYear(),x1.getMonth()+2,x1.getDay());
t2=x2;
}
xj=0;
wj=0;
state=0;
}
string getName()
{
return name;
}
int getNo()
{
return no;
}
string getTitle()
{
return title;
}
int getNumber()
{
return number;
}
string getAuthor()
{
return author;
}
string getPress()
{
return press;
}
Time getT1()
{
return t1;
}
Time getT2()
{
return t2;
}
bool getXj()
{
return xj;
}
bool getWj()
{
return wj;
}
bool getState()
{
return state;
}
void setName(string x)
{
name=x;
}
void setNo(int g)
{
no=g;
}
void setTitle(string x)
{
title=x;
}
void setNumber(int x)
{
number=x;
}
void setAuthor(string x)
{
author=x;
}
void setPress(string x)
{
press=x;
}
void setT1(Time x)
{
t1=x;
}
void setT2(Time y)
{
if(t1.getMonth()+2>12)
{
Time y(t1.getYear()+1,t1.getMonth()-10,t1.getDay());
t2=y;
}
else
{
Time y(t1.getYear(),t1.getMonth()+2,t1.getDay());
t2=y;
}
}
void setXj(bool m)
{
xj=m;
}
void setWj(bool x)
{
wj=x;
}
void setState(bool y)
{
state=y;
}
friend istream &operator>>(istream &input,Record &x)
{
input>>x.name>>x.no>>x.title>>x.number>>x.author>>x.press>>x.t1>>x.t2>>x.xj>>x.wj>>x.state;
return input;
}
friend ostream &operator<<(ostream&output,const Record &x)
{
output<<x.name<<" "<<x.no<<" "<<x.title<<" "<<x.number<<" "<<x.author<<" "<<x.press<<" "<<x.t1<<" "<<x.t2<<" "<<x.xj<<" "<<x.wj<<" "<<x.state<<endl;
}
};
数据类
图书数据类
class BookData
{
//图书数据类
int number;//图书的编号
string author;//图书的作者
string title;//书名
string press;//出版社
Time t1;//图书的出版日期
int sum;//该类图书的的总册数
int borrow;//该类图书的总借阅册数
int num;//借阅记录条数
vector<Record> s;
vector<Record>::iterator st1;
multimap<string,int>m1;//按书名查询
multimap<string,int>::iterator mit1;
multimap<int,int>m2;//按书的编号查询
multimap<int,int>::iterator mit2;
public:
BookData()
{
}
BookData(int na,string au,string ti,string p,Time x,int s,int bor,int nn)
{
number=na;
author=au;
title=ti;
press=p;
t1=x;
sum=s;
borrow=bor;
num=nn;
}
friend istream &operator>>(istream &input,BookData &x)
{
input>>x.number>>x.author>>x.title>>x.press>>x.t1>>x.sum>>x.borrow>>x.num;
return input;
}
friend ostream &operator<<(ostream &output,BookData &x)
{
output<<x.number<<" "<<x.author<<" "<<x.title<<" "<<x.press<<" "<<x.t1<<" "<<x.sum<<" "<<x.borrow<<" "<<x.num<<endl;
if(x.getNum()!=0)
for(int i=0;i<x.getNum();i++)
output<<x.s[i];
return output;
}
int getNumber()
{
return number;
}
string getAuthor()
{
return author;
}
string getTitle()
{
return title;
}
string getPress()
{
return press;
}
Time getT1()
{
return t1;
}
int getSum()
{
return sum;
}
int getBorrow()
{
return borrow;
}
int getNum()
{
return num;
}
vector<Record> getRecord()
{
return s;
}
void setNumber(int na)
{
number=na;
}
void setAuthor(string au)
{
author=au;
}
void setTitle(string ti)
{
title=ti;
}
void setPress(string p)
{
press=p;
}
void setT1(Time x)
{
t1=x;
}
void setSum(int s)
{
sum=s;
}
void setBorrow(int bor)
{
borrow=bor;
}
void setNum(int nn)
{
num=nn;
}
void addRecord(Record r);
void displayRecord();
void deleteRecord(string x);
void deleteRecord(int nu);
int queryByTitle(string x);//按图书的题目进行查询
void display();
int queryByNumber(int nu);//按图书的编号进行查询
void modify(string x);
void modify(int nu);
void clear1();
void putRecord();
void putRecord1();
};
void BookData::display()
{
cout<<"图书的编号"<<":"<<number<<endl;
cout<<"图书的作者"<<":"<<author<<endl;
cout<<"图书的名字"<<":"<<title<<endl;
cout<<"图书的出版社"<<":"<<press<<endl;
cout<<"图书的出版日期"<<":"<<t1<<endl;
cout<<"图书的总册数"<<":"<<sum<<endl;
cout<<"图书的借阅册数"<<":"<<borrow<<endl;
}
void BookData::addRecord(Record r)
{
r.setState(1);//1代表该借阅记录是借书的,0代表还书
s.push_back(r);
int i=s.size();
//m1.insert(make_pair(r.getTitle(),i-1));
m2.insert(make_pair(r.getNumber(),i-1));
}
void BookData::displayRecord()
{
if(s.size()!=0)
{
for(st1=s.begin();st1!=s.end();st1++)
cout<<*st1;
}
else
{
cout<<"No Record"<<endl;
}
}
void BookData::clear1()
{
s.clear();
}
int BookData::queryByTitle(string title)
{
mit1=m1.find(title);
if(mit1!=m1.end())
return mit1->second;
else
return -1;
}
int BookData::queryByNumber(int number)
{
mit2=m2.find(number);
if(mit2!=m2.end())
return mit2->second;
else
return -1;
}
void BookData::modify(int number)
{
int i=queryByNumber(number);
if(s[i].getXj()==0)
{
s[i].setXj(1);
//s[i].setT2();
}
}
void BookData::modify(string title)
{
int i=queryByTitle(title);
if(s[i].getXj()==0)
{
s[i].setXj(1);
//s[i].setT2();
}
}
void BookData::deleteRecord(int number)
{
int i;
i=queryByNumber(number);
if(i!=-1)
{
s[i].setState(0);
}
}
void BookData::deleteRecord(string title)
{
int i;
i=queryByTitle(title);
if(i!=-1)
{
s[i].setState(0);
}
}
void BookData::putRecord()
{
Record r;
while(cin>>r)
{
if(r.getTitle()=="end")
break;
s.push_back(r);
}
}
void BookData::putRecord1()
{
Record r;
while(cin>>r)
{
if(r.getNumber()==0)
break;
s.push_back(r);
}
}
用户数据类
class UserData
{
//用户数据类
string name;//用户姓名
int no;//用户的学号
int sum;//用户的最大借阅册数
int a;//用户目前借的册数
bool wj;//判断是否违纪
int num;//借阅记录条数
vector<Record> v;//借阅记录
vector<Record>::iterator k;
multimap<int,int>m3;
multimap<int,int>::iterator mit3;
public:
UserData()
{
wj=0;
num=0;
}
UserData(string na,int n,int s,int x,bool y,int nn)
{
name=na;
no=n;
sum=s;
a=x;
wj=y;
num=nn;
}
string getName()
{
return name;
}
int getNo()
{
return no;
}
int getSum()
{
return sum;
}
int getA()
{
return a;
}
int getWj()
{
return wj;
}
int getNum()
{
return num;
}
vector<Record>getRecord()
{
return v;
}
void setName(string na)
{
name=na;
}
void setNo(int n)
{
no=n;
}
void setSum(int s)
{
sum=s;
}
void setA(int x)
{
a=x;
}
void setWj(int y)
{
wj=y;
}
void setNum(int nn)
{
num=nn;
}
void setRecord(Record x)
{
int i;
v[i]=x;
}
void addRecord1(Record x);//增加一条借阅记录
void displayRecord1();
int queryByNo(int a);//按用户的学号查询用户的信息
void deleteRecord1(int a);
void modify(int a);
void wrong(Time x);
void change();
void clear2();
void operator=(UserData&u)
{
name=u.getName();
no=u.getNo();
sum=u.getSum();
a=u.getA();
num=u.getNum();
wj=u.getWj();
v=u.getRecord();
}
bool operator==(UserData u)
{
return this->no==u.getNo()?1:0;
}
friend istream &operator>>(istream &input,UserData &x)
{
input>>x.name>>x.no>>x.sum>>x.a>>x.wj>>x.num;
return input;
}
friend ostream &operator<<(ostream &output,UserData &x)
{
output<<x.name<<" ";
output<<x.no<<" ";
output<<x.sum<<" ";
output<<x.a<<" ";
output<<x.wj<<" ";
output<<x.num<<endl;
if(x.getNum()!=0)
for(int i=0;i<x.getNum();i++)
output<<x.v[i];
return output;
}
};
void UserData::addRecord1(Record x)
{
x.setState(1);
v.push_back(x);
int i=v.size();
m3.insert(make_pair(x.getNumber(),i-1));
}
void UserData::displayRecord1()
{
if(v.size()!=0)
for(k=v.begin();k!=v.end();k++)
cout<<*k;
else
cout<<"No Record"<<endl;
}
void UserData::clear2()
{
v.clear();
}
int UserData::queryByNo(int z)
{
mit3=m3.find(z);
if(mit3!=m3.end())
return mit3->second;
else
return -1;
}
void UserData::deleteRecord1(int z)
{
int i;
i=queryByNo(z);
if(i!=-1)
{
v[i].setState(0);
}
}
void UserData::wrong(Time x)
{
setWj(0);
for(int i=0;i<v.size();i++)
if(v[i].getT2()<x&&v[i].getState()==1)
{
setWj(1);
break;
}
}
void UserData::modify(int z)
{
int i=queryByNo(z);
if(v[i].getXj()==0)
{
v[i].setXj(1);
}
}
操作类
用户操作类
用户的操作包括查询功能和还书功能
class UserOp
{
//用户操作类
UserData u1;
vector<BookData> b;
vector<BookData>::iterator d;
multimap<int,int> m5;//用户按图书编号查询
multimap<int,int>::iterator mit5;
public:
UserOp()
{
load3();
load4();
}
~UserOp()
{
save3();
save4();
}
//void queryByTitle(string title);//按书名查询图书
//void queryByNo(int no);//按图书的编号查询
void load3();
void save3();
void load4();
void save4();
int search2(int z);
void queryBookData();
void borrow();
void back();
//void clear();
void change();//续借
};
void UserOp::save3()
{
ofstream outfile("E:\\20177412book.txt",ios::out);
if(!outfile)
{
return;
}
for(d=b.begin();d!=b.end();d++)
{
outfile<<*d;
}
outfile.close();
}
void UserOp::load3()
{
BookData a;
int c;
ifstream infile("E:\\20177412book.txt",ios::in);
if(!infile)
{
return;
}
b.clear();
m5.clear();
while(infile>>a)
{
if(a.getNum()!=0)
for(int i=0;i<a.getNum();i++)
{
Record r3;
infile>>r3;
a.addRecord(r3);
}
b.push_back(a);
int c=b.size();
m5.insert(make_pair(a.getNumber(),c-1));
a.clear1();
}
infile.close();
}
void UserOp::load4()
{
int no;
cin>>no;
UserData u2;
int i;
ifstream infile("E:\\20177412stu.txt",ios::in);
if(!infile)
{
return;
}
while(infile>>u2)
{
if(u2.getNum()!=0)
for(int i=0;i<u2.getNum();i++)
{
Record r4;
infile>>r4;
u2.addRecord1(r4);
}
if(u2.getNo()==no)
this->u1=u2;
u2.clear2();
}
infile.close();
}
void UserOp::save4()
{
vector<UserData>v;
vector<UserData>::iterator it;
UserData u2;
ifstream infile("E:\\20177412stu.txt",ios::in);
if(!infile)
return;
while(infile>>u2)
{
if(u2.getNum()!=0)
for(int i=0;i<u2.getNum();i++)
{
Record r5;
infile>>r5;
u2.addRecord1(r5);
}
if(u2==this->u1)
u2=this->u1;
v.push_back(u2);
u2.clear2();
}
infile.close();
ofstream outfile("E:\\20177412stu.txt",ios::out);
if(!outfile)
return;
for( it=v.begin();it!=v.end();it++)
{outfile<<*it;}
outfile.close();
}
int UserOp::search2(int z)
{
mit5=m5.find(z);
if(mit5!=m5.end())
{
return mit5->second;
}
else
return -1;
}
void UserOp::queryBookData()
{
int z;
cin>>z;
int i=search2(z);
if(i!=-1)
b[i].display();
}
void UserOp::borrow()
{
string h;//用户的姓名
string ti;
int nu;
int no;
string au;
string pre;
Time x;
cin>>no>>h>>ti>>nu>>au>>pre>>x;
int a=search2(nu);
u1.wrong(x);
if(u1.getWj()==0 && u1.getA()<u1.getSum())
{
b[a].setBorrow(b[a].getBorrow()+1);
b[a].setNum(b[a].getNum()+1);
u1.setA(u1.getA()+1);
u1.setNum(u1.getNum()+1);
Record r(h,no,ti,nu,au,pre,x);
b[a].addRecord(r);
// save3();
u1.addRecord1(r);
//save4();
}
}
void UserOp::back()
{
int z,no;
cin>>z;
int a=search2(z);
b[a].setBorrow(b[a].getBorrow()-1);
u1.setA(u1.getA()-1);
b[a].deleteRecord(u1.getNo());
u1.deleteRecord1(z);
}
void UserOp::change()
{
int z;
cin>>z;
int a=search2(z);
b[a].modify(z);
}
管理员操作类
管理员操作包括增加信息和增加用户
class ManagerOp
{ //管理员操作类;
public:
vector<BookData>p; //图书集合对象;
vector<BookData>::iterator it1;
//multimap<string,int> m3;//管理员按书名查询
//multimap<string,int>::iterator mit3;
multimap<int,int> m4;//管理员按图书的编号查询
multimap<int,int>::iterator mit4;
//管理员对用户的查询
vector<UserData>u; //学生集合对象;
vector<UserData>::iterator it2;
//管理员对图书的查询
multimap<int,int> m6;//管理员按用户的学号对用户的信息进行查询
multimap<int,int>::iterator mit6;
ManagerOp()
{}
~ManagerOp()
{
save1();
save2();
}
void addBookData();
void displayBookData();
int search1(int z);
void queryByNumber();
void modifyBookData();
void deleteBookData();
void addUserData();
void displayUserData();
int search6(int n);
void queryByNo();
void modifyUserData();
void deleteUserData();
void load1();
void load2();
void save1();
void save2();
};
void ManagerOp::save1()
{
ofstream outfile("E:\\20177412book.txt",ios::out);
if(!outfile)
return;
for(it1=p.begin();it1!=p.end();it1++)
{
outfile<<*it1;
}
outfile.close();
}
void ManagerOp::save2()
{
ofstream outfile("E:\\20177412stu.txt",ios::out);
if(!outfile)
return;
for(it2=u.begin();it2!=u.end();it2++)
{
outfile<<*it2;
}
outfile.close();
}
void ManagerOp::addBookData()
{
BookData bb;
int i;
cin>>bb;
//if(bb.getNumber()==-1) break;
p.push_back(bb);
i=p.size();
m4.insert(make_pair(bb.getNumber(),i-1));
cout<<"添加成功!\n\n";
}
void ManagerOp::displayBookData()
{
for(it1=p.begin();it1!=p.end();++it1)
cout<<*it1;
}
void ManagerOp::addUserData()
{
UserData m;
int i;
cin>>m;
//if(m.getName()=="-1") break;
u.push_back(m);
i=u.size();
m6.insert(make_pair(m.getNo(),i-1));
cout<<"添加成功!\n\n";
}
void ManagerOp::displayUserData()
{
for(it2=u.begin();it2!=u.end();++it2)
cout<<*it2;
}
int ManagerOp::search6(int nn)
{
mit6=m6.find(nn);
if(mit6!=m6.end())
{
return mit6->second;
}
else
return -1;
}
个人心得:
上次ATM系统,这次的图书管理系统对于我们刚刚学习计算机的同学来说,都是一个巨大的挑战,因为以前完全没有接触过这部分,比如说文件的读写,load函数,save函数刚开始我完全不懂,慢慢才了解到load函数是读文件,save函数是写存文件。这个图书馆系统我写了好长时间,而且也改了很多次,因为写的不是这不完整就是那不完整,总会有一些问题,比如管理员的增加功能(增加用户和图书),第一次写的时候,一次就只能增加一条信息,第二次写的时候又出现了错误,增加信息是无限循环,总之,出现了很多错误,来来回回改了无数次,写这个图书馆写了将近一个月吧,在这一个月里,我学到很多知识,也学会如何去写一个完整的系统,写系统时应该注意什么。
我们在写系统时,一定要有一个清晰的思路,不能没有构思,直接就去写代码;写系统我们还要有严谨的逻辑思维,比如图书管理系统,我们再设计的时候,系统还应该有良好的封装性,设置管理员与用户的最多登录次数,从而使该系统更加完美。
生活中我们也会遇到很多挑战,就像我们写这个图书管理系统,就是一个很大的挑战我们都要去勇敢的迎接挑战,写代码过程中,我们也会遇到很多问题,我们应该去慢慢解决,不是后退,因为只有我们练得多了,解决的问题多了,才会有掌握写代码的技巧。我们也要相信自己,对自己有自信,还应该多花时间去学好我们的专业课。