源码
#include<bits/stdc++.h>
using namespace std;
class Time
{
int year;
int month;
int day;
public:
Time(int y,int m,int d);
Time();
int setYear(int year)
{
this->year=year;
}
int getYear()
{
return year;
}
int setMonth(int month)
{
this->month=month;
}
int getMonth()
{
return month;
}
int setDay(int day)
{
this->day=day;
}
int getDay()
{
return day;
}
bool operator==(const Time&t)
{
if(year==t.year&&month==t.month&&day==t.day)
return true;
else
return false;
}
Time(const Time&t)
{
year=t.year;
month=t.month;
day=t.day;
}
friend ostream&operator <<(ostream&os,const Time &t);
friend istream&operator>>(istream&is,Time &t);
void dispTime();
};
Time::Time(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
Time::Time ()
{
year=month=day=0;
}
ostream&operator<<(ostream&os,const Time &t)
{
os<<t.year<<"/"<<t.month<<"/"<<t.day<<" ";
return os;
}
istream&operator>>(istream&is,Time& t)
{
is>>t.year>>t.month>>t.day;
return is;
}
void Time::dispTime()
{
cout<<year<<"/"<<month<<"/"<<day;
}
class Record
{
string name;
string sname;
int num;
int xuehao;
int state;
Time start;
Time end;
public:
Record(string sna,int n,string na,int xue,Time s):start(s)//用户借阅记录
{
sname=sna;
num=n;
name=na;
xuehao=xue;
}
Record():start(0,0,0)
{
sname="null";
num=0;
name="null";
xuehao=0;
}
void setState(int state)
{
this->state=state;
}
void setStart(Time start)
{
this->start=start;
}
Time getStart()
{
return start;
}
void setEnd(Time end)
{
this->end=end;
}
Time getEnd()
{
return end;
}
void setName(string name)
{
this->name=name;
}
string getName()
{
return name;
}
void setSname(string sname)
{
this->sname=sname;
}
string getSname()
{
return sname;
}
int setXuehao(int xuehao)
{
this->xuehao=xuehao;
}
int getXuehao()
{
return xuehao;
}
int setNum(int num)
{
this->num=num;
}
int getNum()
{
return num;
}
Record(const Record&r)
{
name=r.name;
sname=r.sname;
num=r.num;
xuehao=r.xuehao;
start=r.start;
end=r.end;
}
friend ostream &operator<<(ostream&os,const Record&r);
friend istream&operator>>(istream&is,Record &r);
};
ostream&operator<<(ostream&os,const Record &r)
{
os<<r.sname<<" "<<r.num<<" "<<r.name<<" "<<r.xuehao<<" "<<r.start<<" ";
return os;
}
istream&operator>>(istream&is,Record &r)
{
is>>r.sname>>r.num>>r.name>>r.xuehao>>r.start;
return is;
}
class Book
{
string sname;
int num;
int lend;
int sum;
vector<Record>v1;
vector<Record>::iterator it1;
multimap<int,int>m1;
multimap<int,int>::iterator mit1;
public:
Book(string sna,int n,int l,int s);
//Book(string sna,int n);
Book();
vector<Record>getRecord()
{
return v1;
}
void setSname(string sname)
{
this->sname=sname;
}
string getSname()
{
return sname;
}
int setNum(int num)
{
this->num=num;
}
int getNum()
{
return num;
}
int setLend(int lend)
{
this->lend=lend;
}
int getLend()
{
return lend;
}
int setSum(int sum)
{
this->sum=sum;
}
int getSum()
{
return sum;
}
friend ostream&operator<<(ostream&os,const Book&b);
friend istream&operator>>(istream&is,Book&b);
void addRecord1(Record r);
void dispRecord1();
int search1(int num);
void display();
void deleteRecord1(int num);
void modify1(int num);
void putRecord();
bool operator==(Book&b)
{
if(sname==b.sname&&num==b.num&&lend==b.lend&&sum==b.sum)
{
return true;
}
else
return false;
}
};
Book::Book(string sna,int n,int l,int s)
{
sname=sna;
num=n;
lend=l;
sum=s;
}
/*
Book::Book(string sna,int n)
{
sname=sna;
num=n;
}
*/
Book::Book()
{
sname="0";
num=lend=sum=0;
}
void Book::display()
{
cout<<num<<" "<<sname<<" "<<lend<<" "<<sum<<endl;
}
void Book::deleteRecord1(int num)
{
int i;
i=search1(num);
if(i!=-1)
{
v1[i].setState(0);
}
}
ostream&operator<<(ostream&os,const Book&b)
{
os<<" "<<b.num<<" "<<b.sname<<" "<<b.lend<<" "<<b.sum<<" "<<endl;
return os;
}
istream&operator>>(istream&is,Book&b)
{
is>>b.num;
if(b.num==-1)
return is;
is>>b.sname>>b.lend>>b.sum;
}
void Book::addRecord1(Record r)
{
int i;
i=v1.size();
v1.push_back(r);
m1.insert(make_pair(r.getXuehao(),i-1));
}
void Book::dispRecord1()
{
if(v1.size()!=0)
{
for(it1=v1.begin();it1!=v1.end();it1++)
cout<<*it1;
}
else
cout<<"无记录"<<endl;
}
int Book::search1(int num)
{
mit1=m1.find(num);
if(mit1!=m1.end())
{
return mit1->second;
}
else
return -1;
}
void Book::putRecord()
{
Record r;
while(cin>>r)
{
if(r.getXuehao()==0)
break;
v1.push_back(r);
}
}
void Book::modify1(int num)
{
if(num!=0)
{
sum=sum-1;
lend=lend+1;
}
}
class User
{
string name;
int xuehao;
int max;
int yet;
vector<Record>v2;
vector<Record>::iterator it2;
multimap<int ,int>m2;
multimap<int,int>::iterator mit2;
public:
User(string na,int xue,int y);
User();
void setName(string name)
{
this->name=name;
}
string getName()
{
return name;
}
int setXuehao(int xuehao)
{
this->xuehao=xuehao;
}
int getXuehao()
{
return xuehao;
}
int setYet(int yet)
{
this->yet=yet;
}
int getYet()
{
return yet;
}
int setMax(int max)
{
this->max=max;
}
int getMax()
{
return max;
}
void addRecord2(Record r);
void dispRecord2();
int search2(int xuehao);
void modify2(int Xuehao);
void deleteRecord2(int xuehao);
friend ostream&operator<<(ostream&os,const User&u);
friend istream&operator>>(istream&is,User&u);
void operator=(User&u)
{
name=u.name;
xuehao=u.xuehao;
yet=u.yet;
max=u.max;
}
bool operator==(User &u)
{
return this->xuehao==u.getXuehao()?1:0;
}
};
User::User(string na,int xue,int y)
{
name=na;
xuehao=xue;
yet=y;;
max=10;
}
User::User()
{
name="0";
xuehao=yet=0;
max=10;
}
void User::addRecord2(Record r)
{
int i;
i=v2.size();
v2.push_back(r);
m2.insert(make_pair(r.getXuehao(),i-1));
}
void User::dispRecord2()
{
if(v2.size()!=0)
{
for(it2=v2.begin();it2!=v2.end();it2++)
cout<<*it2;
}
else
cout<<"无记录"<<endl;
}
void User::deleteRecord2(int xuehao)
{
int i=search2(xuehao);
if(i!=-1)
{
v2[i].setState(0);
}
}
int User::search2(int xuehao)
{
mit2=m2.find(xuehao);
if(mit2!=m2.end())
{
cout<<"find";
return mit2->second;
}
else
return -1;
}
void User::modify2(int Xuehao)
{
yet=yet+1;
}
ostream&operator<<(ostream&os,const User&u)
{
os<<u.name<<" "<<u.xuehao<<" "<<u.yet<<" "<<u.max<<endl;
return os;
}
istream&operator>>(istream&is,User&u)
{
is>>u.xuehao;
if(u.xuehao==-1)
return is;
is>>u.name>>u.yet>>u.max;
return is;
}
class Manger
{
vector<Book>v3;
vector<Book>::iterator it3;
multimap<int,int>m3;
multimap<int,int>::iterator mit3;
vector<User>v4;
vector<User>::iterator it4;
multimap<int,int>m4;
multimap<int,int>::iterator mit4;
public:
Manger()
{
}
~Manger()
{
save1();
save2();
}
void addBook();
void dispBook();
void queryByBook();
void deleteBook();
int search3(int num);
void modifyBook();
void addUser();
void dispUser();
void queryByUser();
int search4(int xuehao);
void deleteUser();
void modifyUser();
void load1();
void load2();
void save1();
void save2();
};
/*void Manger::load1()
{
Book b;
int i;
ifstream infile("d:\\20171799book.txt",ios::in);
if(!infile)
{
return;
}
v3.clear();
m3.clear();
i=0;
while(infile>>b)
{
v3.push_back(b);
m3.insert(make_pair(b.getNum(),i-1));
i++;
}
infile.close();
}*/
void Manger::save1()
{
ofstream outfile("d:\\20171799book.txt",ios::out);
if(!outfile)
return;
for(it3=v3.begin();it3!=v3.end();it3++)
{
outfile<<*it3;
}
outfile.close();
}
/*void Manger::load2()
{
User u;
int i;
ifstream infile("d:\\20171799stu.txt",ios::in);
if(!infile)
return ;
v4.clear();
m4.clear();
i=0;
while(infile>>u)
{
v4.push_back(u);
m4.insert(make_pair(u.getXuehao(),i-1));
i++;
}
}*/
void Manger::save2()
{
ofstream outfile("d:\\20171799stu.txt",ios::out);
if(!outfile)
return ;
for(it4=v4.begin();it4!=v4.end();it4++)
{
outfile<<*it4;
}
outfile.close();
}
void Manger::addBook()
{
Book b;
int i;
cout<<"请按照书号,书名,借出数,总数,输入图书信息:"<<endl;
while(cin>>b)
{
if(b.getNum()==-1)
break;
else
{v3.push_back(b);
i=v3.size();
m3.insert(make_pair(b.getNum(),i-1));
}
}}
void Manger::dispBook()
{
for(it3=v3.begin();it3!=v3.end();it3++)
{
cout<<*it3<<endl;
}
}
int Manger::search3(int num)
{
mit3=m3.find(num);
if(mit3!=m3.end())
{
return mit3->second;
}
else
return -1;
}
void Manger::queryByBook()
{
int num;
cout<<"请输入书号:"<<endl;
cin>>num;
int i=search3(num);
cout<<v3[i]<<endl;
}
void Manger::deleteBook()
{
int num;
cout<<"请输入书号:"<<endl;
cin>>num;
int i=search3(num);
if(i!=-1)
{
it3=v3.begin()+i;
m3.erase(m3.find(num));
v3.erase(it3);
}
}
void Manger::addUser()
{
User u;
int i;
cout<<"请按照学号,姓名,已借书数,最多可借书数,输入信息:"<<endl;
while(cin>>u)
{
if(u.getXuehao()==-1)
break;
else
{
v4.push_back(u);
i=v4.size();
m4.insert(make_pair(u.getXuehao(),i-1));
}
}
}
void Manger::dispUser()
{
for(it4=v4.begin();it4!=v4.end();it4++)
cout<<*it4;
}
int Manger::search4(int xuehao)
{
mit4=m4.find(xuehao);
if(mit4!=m4.end())
{
return mit4->second;
}
}
void Manger::queryByUser()
{
int xuehao;
cout<<"请输入学号:"<<endl;
cin>>xuehao;
int i=search4(xuehao);
cout<<v4[i]<<endl;
}
void Manger::deleteUser()
{
int xuehao;
cout<<"请输入学号"<<endl;
cin>>xuehao;
int i=search4(xuehao);
if(i!=-1)
{
it4=v4.begin()+i;
m4.erase(m4.find(xuehao));
v4.erase(it4);
}
}
class UserOp
{
vector<Book>v5;
vector<Book>::iterator it5;
multimap<int,int>m5;
multimap<int,int>::iterator mit5;
User u;
public:
UserOp()
{
load3();
load4();
}
~UserOp()
{
save3();
save4();
}
int search5(int num);
void queryByNum();
void borrow();
void back();
void load3();
void load4();
void save3();
void save4();
};
void UserOp::load3()
{
Book b;
int i;
ifstream infile("d:\\20171799book.txt",ios::in);
if(!infile)
{return;
}
v5.clear();
m5.clear();
while(infile>>b)
{v5.push_back(b);
int i=v5.size();
m5.insert(make_pair(b.getNum(),i-1));
}
infile.close();
}
void UserOp::load4()
{
int xuehao;
cout<<"请输入学号:"<<endl;
cin>>xuehao;
User u;
int i;
ifstream infile("d:\\20171799stu.txt",ios::in);
if(!infile)
return;
while(infile>>u)
{if(u.getXuehao()==xuehao)
this->u=u;
}
infile.close();
}
void UserOp::save3()
{
ofstream outfile("d:\\20171799book.txt",ios::out);
if(!outfile)
{
return ;}
for(it5=v5.begin();it5!=v5.end();it5++)
{
outfile<<*it5;
}
outfile.close();
}
void UserOp::save4()
{
vector<User>v;
vector<User>::iterator it;
User u1;
ifstream infile("d:\\20171799stu.txt",ios::in);
if(!infile)
return ;
while(infile>>u1)
{
if(u1==this->u)
u1=this->u;
v.push_back(u1);
}
infile.close();
ofstream outfile("d:\\20171799stu.txt",ios::out);
if(!outfile)
return;
for(it=v.begin();it!=v.end();it++)
outfile<<*it;
outfile.close();
}
int UserOp::search5(int num)
{
mit5=m5.find(num);
if(mit5!=m5.end())
return mit5->second;
else
return -1;
}
void UserOp::queryByNum()
{
int num;
cout<<"请输入书号:"<<endl;
cin>>num;
int i=search5(num);
if(i!=-1)
cout<<v5[i]<<endl;
}
void UserOp::borrow()
{
cout<<"请输入书号,书名:"<<endl;
string sname;
int num;
cin>>num>>sname;
cout<<"请输入时间:"<<endl;
Time t;
cin>>t;
int i=search5(num);
if(u.getYet()<u.getMax())
{
Record r(sname,num,u.getName(),u.getXuehao(),t);
v5[i].addRecord1(r);
u.addRecord2(r);
}
}
void UserOp::back()
{
int num;
string sname;
cout<<"请输入书号,书名:"<<endl;
cin>>num>>sname;
int i=search5(num);
v5[i].setLend(v5[i].getLend()-1);
u.setYet(u.getYet()-1);
v5[i].deleteRecord1(u.getXuehao());
u.deleteRecord2(num);
}
int main()
{
//时间类测试
//Time t1(2017,1,3);
//t1.dispTime();
//int year,month,day;
//cin>>year>>month>>day;
//Time t2(year,month,day);
//t2.dispTime();
//记录类测试
//Record r1;
//cin>>r1;
//cout<<r1;
//书籍测试
//Book b("gaoshu",1,12,30);
//b.display();
//Record r;
// cin>>r;
//b.addRecord1(r);
// b.dispRecord1();
//b.search1(1);
//管理员测试
Manger m;
m.addBook();
//m.dispBook();
m.addUser();
//m.queryByBook();
// m.queryByUser();
//m.search4(20171799);
//用户测试
UserOp u;
//u.search5(2);
u.borrow();
u.back();
}
常见错误及改正
-
重载输入输出流时,必须是友元函数
-
重载输出流时,要用const限定自定义的对象;
-
对象的调用是对象.数据成员 的形式
-
重载输入输出流后数据可以一次性输入多个;
-
再输入数据时,先定义一下什么情况下输入停止,以免输入时出现无法停止输入的现象
-
重载完输入输出运算符之后,便可以用cin,cout来整体输入输出一个对象;
例如:时间类的重载输入输出
class Time
{
int year;
int month;
int day;
public:
friend ostream&operator<<(ostream&os,const Time&t);
friend istream&operator>>(istream&is,Time&t);
};
ostream&operator<<(ostream&os,constTime&t)
{
os<<t.year<<”“<<t.month<<” “<<t.day;
return os;
}
istream&operator>>(istream&is,Time&t)
{
is>>t.year;
if(year==-1)
return is;
else
is>>t.month>>t.day;
}
-
重载==时用的是bool类型
例如:
bool Time::operator==(const Time&t)
{
if(year==t.year&&month==t.month&day==t.day)
return true;
else
return false;
}
-
重载赋值运算符判断用户;
在写的过程中,记录类只用重载输出不用重载输入,因为再接输的过程中,一条记录总是接着就能自动生成,而不是人为输入的记录,删除记录时,不能清除记录,只是借书记录中的状态改为已还书。
-
用户只能对图书进行查找的功能,同时用户也可以自己查看自己的借书信息,借书记录
5、管理员既可以管理图书,也可以管理用户。最开始的时候,所有的图书信息和用户信息都是需要统一先输入到文件中,(自动生成文件,不是人为的将数据信息记录到记事本上的),然后再在这个文件的基础上进行读写文件的操作体积其他的增删查改功能;
-
在文件的生成过程中,路径一定要写正确;
-
输入信息时,要按照重载输入流的顺序输入信息;
-
如果数据较多,可以现在Word文件中保存一下数据,用的时候直接复制粘贴
-
每次一个类的数据信息输入结束后,都要输入-1结束这个类的输入;
-
管理员可以对图书和用户进行增删查改等功能
-
用户操作端实现对图书的查找,借阅,还书,查询借阅记录;
-
用户操作端的数据成员只有一个用户操作,也就是只定义一个用户对象;
-
用户操作类的构造函数在写的时候可以是直接带着姓名和时间的构造函数,因为用户的姓名和时间都是确定的,也就是在一开始借书的时候就有的;
此次学习心得
-
通过这次的图书管理系统,我对STL标准库的一些函数的用法有了更深刻的了解和认识,很多函数可以在这个系统中使用,
-
Vector相当于一个动态的数组,可以存放任意类型的数据,在查找时需要使用迭代器查找,每一个vector都需要跟着一个multimap,同样,multimap在查找数据时也是需要使用迭代器,
-
调试代码时要一点一点的测试
源码
常见错误及改正
-
重载输入输出流时,必须是友元函数
-
重载输出流时,要用const限定自定义的对象;
-
对象的调用是对象.数据成员 的形式
-
重载输入输出流后数据可以一次性输入多个;
-
再输入数据时,先定义一下什么情况下输入停止,以免输入时出现无法停止输入的现象
-
重载完输入输出运算符之后,便可以用cin,cout来整体输入输出一个对象;
例如:时间类的重载输入输出
class Time
{
int year;
int month;
int day;
public:
friend ostream&operator<<(ostream&os,const Time&t);
friend istream&operator>>(istream&is,Time&t);
};
ostream&operator<<(ostream&os,constTime&t)
{
os<<t.year<<”“<<t.month<<” “<<t.day;
return os;
}
istream&operator>>(istream&is,Time&t)
{
is>>t.year;
if(year==-1)
return is;
else
is>>t.month>>t.day;
}
-
重载==时用的是bool类型
例如:
bool Time::operator==(const Time&t)
{
if(year==t.year&&month==t.month&day==t.day)
return true;
else
return false;
}
-
重载赋值运算符判断用户;
在写的过程中,记录类只用重载输出不用重载输入,因为再接输的过程中,一条记录总是接着就能自动生成,而不是人为输入的记录,删除记录时,不能清除记录,只是借书记录中的状态改为已还书。
-
用户只能对图书进行查找的功能,同时用户也可以自己查看自己的借书信息,借书记录
5、管理员既可以管理图书,也可以管理用户。最开始的时候,所有的图书信息和用户信息都是需要统一先输入到文件中,(自动生成文件,不是人为的将数据信息记录到记事本上的),然后再在这个文件的基础上进行读写文件的操作体积其他的增删查改功能;
-
在文件的生成过程中,路径一定要写正确;
-
输入信息时,要按照重载输入流的顺序输入信息;
-
如果数据较多,可以现在Word文件中保存一下数据,用的时候直接复制粘贴
-
每次一个类的数据信息输入结束后,都要输入-1结束这个类的输入;
-
管理员可以对图书和用户进行增删查改等功能
-
用户操作端实现对图书的查找,借阅,还书,查询借阅记录;
-
用户操作端的数据成员只有一个用户操作,也就是只定义一个用户对象;
-
用户操作类的构造函数在写的时候可以是直接带着姓名和时间的构造函数,因为用户的姓名和时间都是确定的,也就是在一开始借书的时候就有的;
此次学习心得
-
通过这次的图书管理系统,我对STL标准库的一些函数的用法有了更深刻的了解和认识,很多函数可以在这个系统中使用,
-
Vector相当于一个动态的数组,可以存放任意类型的数据,在查找时需要使用迭代器查找,每一个vector都需要跟着一个multimap,同样,multimap在查找数据时也是需要使用迭代器,
-
调试代码时要一点一点的测试