如今,老师要求的图书管理系统已经告一段落。
一开始规划,当时打算做一个管理系统,面对不同用户所开放的权限不同,管理员可以操作所有的操作,而学生只能进行部分操作。将学生图书 记录 都放在一个管理类进行操作。
每当一个学生进行借书还书时,自动生成记录放到向量里。
老师要求的是,每个学生和书籍各有一个记录,相当于将记录分开来,然后利用继承简化代码。同时,管理员端和学生端分开来,不能合并一起。为的是当一个学生登陆后,只能对自己的进行操作而不能对别人的账号进行操作。同时,登陆进去之后能连续的进行学生操作,而不用每当进行操作时必须登录验证。而且,这样有利于将学生的客户端封死。同时,针对每个用户或者说对于每本书的记录,都有利用价值。
在打代码时,确实会遇到很多问题。不过幸好通过网上查询,得以解决。
1.首先是vector容器中对象元素改变时
首先用的比较多是vector,和他的迭代器,应为每个学生所能借阅书的数量在不断地变化,所以每当借书或者还书的时候都需要这个数量的变化,但是在运行代码的过程中,总是莫名奇妙的出现错误。一开始用的是multimap来记录学生在向量的位置。因为vector中对象学生的数量改变时总是出错。上网搜原因也没有相关说明。后来没办法,重新建立一个multimap 让学号和这个学生可借阅的数量进行挂钩才能解决。
2.是关于vector中深复制和浅复制的问题
一开始定义时,系统默认提供一定的空间,但是!当这些空间不够用时,会发生有意思的操作。Vector先申请新的空间,然后将原有的对象复制到新的空间,然后释放掉原有的空间。
而在复制的时候。如果你的对象类型中,含有指针时,则需要深复制,而系统只提供浅复制,所以出错。
3.查询记录
用multimap将记录的关键词学生 图书 建立联系,方便查询。
但是当相关元素多的时候,会产生大量的multimap,不方便管理。
贴出代码
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
class Time//时间类 年月日时
{
protected:
int year,month,day,hour;
public:
Time()
{
year=month=day=hour=0;
}
Time(int year1,int month1,int day1,int hour1)
{
year=year1;
month=month1;
day=day1;
hour=hour1;
}
int setTime(int year1,int month1,int day1,int hour1)
{
year=year1;
month=month1;
day=day1;
hour=hour1;
}
int getyear()
{
return year;
}
int getmonth()
{
return month;
}
int getday()
{
return day;
}
int gethour()
{
return hour;
}
friend ostream &operator <<(ostream&os,const Time&t);
friend istream &operator >>(istream&is,Time &t);
};
ostream&operator<<(ostream&os,const Time&t)//重载输入输出
{
os<<t.year<<" "<<t.month<<""<<t.day<<" "<<t.hour<<endl;
return os;
}
istream &operator>>(istream&is,Time&t)
{
is>>t.year>>t.month>>t.day>>t.hour;
return is;
}
class abook//单本书的信息 书的名字 图书馆可以借阅数量
{
protected:
public:
int num;
string publish;
string writer;
string name;
abook()
{
num=0;
}
abook(string name1,int num1)
{
num=num1;
name=name1;
}
int getnum()
{
return num;
}
string getname()
{
return name;
}
int set(int num1,string name1)
{
num=num1;
name=name1;
}
friend ostream &operator <<(ostream&os,const abook&a);
friend istream &operator >>(istream&is,abook&a);
friend class book;
};
ostream &operator<<(ostream&os,const abook&a)//重载输入输出
{ os<<a.name<<" "<<a.publish<<" "<<a.writer;
//os<<a.name<<" "<<a.publish<<" "<<a.writer<<" "<<a.num;
//os<<a.name<<" "<<a.num<<endl;
return os;
}
istream &operator>>(istream&is,abook&a)
{
is>>a.name>>a.publish>>a.writer>>a.num;//书名 出版社 作者 数量
return is;
}
class book//总数的书
{
protected:
public:
vector<abook>b;//伐
vector<abook>::iterator bs;
//string type;
int num;
multimap<string,int>m1;
multimap<string,int>::iterator mit1,p1,p2;//指针 对应下标
multimap<string,int>m6;// 书和数量
multimap<string,int>::iterator mit6,m6p1,m6p2;
book()
{
num=0;
}
void addbook(abook b1);
void addbook();
int search1(string s);//找书
int search2(string s);
void display();
void displayabook(string s);
friend class op;
friend class abook;
int borrow(string bookname);
void re(string bookname);
};
int book::search2(string s)
{mit6=m6.find(s);
if(mit6!=m6.end())
{cout<<"已经有此图书"<<endl;
return 1;}
else {cout<<"已经添加新书";return0;}
}
void book::re(string bookname)
{
mit1=m1.find(bookname);
//b[mit1->second].num++;
}
int book::borrow(string bookname)
{
mit1=m1.find(bookname);
cout<<"find:"<<mit1->second<<endl;
//b[mit1->second].num--;
//cout<<"num--"<<endl;
return 0;
}
void book::displayabook(string s)//一本书的信息
{mit6=m6.find(s);
mit1=m1.find(s);
cout<<b[mit1->second-1]<<" 数量:"<<mit6->second<<endl;
}
void book::addbook(abook b1)//添加单本书
{if(search2(b1.name)==0)
{int i;
b.push_back(b1);
i=b.size();//统计数量
m1.insert(make_pair(b1.getname(),i));//配对
m6.insert(make_pair(b1.getname(),b1.num));}
else {mit6=m6.find(b1.name);mit6->second+=b1.num;
cout<<"书名:"<<b1.name<<" 数量:"<<mit6->second;}
}
void book::addbook()//添加好几本书
{
abook b1;
int i;
while(1)
{
cin>>b1;
if(b1.getname()=="end")break;
b.push_back(b1);
i=b.size();//统计数量
m1.insert(make_pair(b1.getname(),i));//配对
m6.insert(make_pair(b1.getname(),b1.num));
}
}
int book::search1(string s)
{mit6=m6.find(s);
if(mit6!=m6.end())
{displayabook(s);
return 1;}
else {cout<<"没找到啊";return0;}
//mit1=p1;
//cout<<mit1->first<<":"<<mit1->second<<endl;//输出书的名字 和配对的序号
/*p1=mit1.lower_bound(s);
p2=mit1.upper_bound(s);
for(mit1=p1;mit1!=p2;mit1++)
{
cout<<mit1->first<<":"<<mit1->second<<endl;
}*/
}
void book::display()//显示所有存入的书籍
{
for(bs=b.begin(); bs!=b.end(); bs++)
{mit6=m6.find(bs->name);
cout<<"书名:"<<*bs<<" 库存数量:"<<mit6->second<<endl;}
}
class student//学生类 学号 姓名 可借阅书籍数量
{
//protected:
public:
int no,num;
string mima;
string name;
student(const student&s1)
{
no=s1.no;
name=s1.name;
num=s1.num;
mima=s1.mima;
}
student()
{
no=0;
num=10;
}
student(int no1,string name1,string mima1)
{
no=no1;
name=name1;
num=10;
mima=mima1;
}
friend ostream &operator <<(ostream&os,conststudent&s);
friend istream &operator >>(ostream&is,student&s);
};
ostream&operator<<(ostream&os,const student&s)
{
os<<" "<<s.no<<""<<s.name<<" "<<s.mima<<endl;
return os;
}
istream&operator>>(istream&is,student&s)
{
is>>s.no>>s.name>>s.mima;
return is;
}
class record//单条记录 时间 学生 方式 书
{
protected:
public:
Time t;
student s;
abook a;
string type,bookname;
record(){;}
record(Time t1,student s1,string type1,abook a1)
{
t=t1;
s=s1;
a=a1;
type=type1;
}
record(Time t1,student s1,string type1,string bookname1)
{
t=t1;
s=s1;
type=type1;
bookname=bookname1;
}
friend ostream &operator<<(ostream&os,const record&r);
friend istream &operator>>(istream&is,record&r);
};
ostream&operator<<(ostream&os,const record&r)
{
os<<" "<<r.t<<" "<<r.s<<" "<<r.type<<" "<<r.bookname<<endl;
return os;
}
istream&operator>>(istream&is,record&r)
{
is>>r.t>>r.s>>r.type>>r.bookname;
return is;
}
class op
{
public:
vector<record>rr;//图书馆记录
vector<record>::iterator rrs;
//用书名 学号记录查找
vector<student>s;
vector<student>::iterator ss;
//multimap<string,int>m6;// 书和数量
//multimap<string,int>::iterator mit6,m6p1,m6p2;
multimap<int,int>m7;//学号 数量
multimap<int,int>::iterator mit7,m7p1,m7p2;
multimap<string,record>m2;//书名 记录
multimap<string,record>::iterator mit2,m2p1,m2p2;//指针
multimap<int,record>m3;//学号 记录
multimap<int,record>::iterator mit3,m3p1,m3p2;//指针
op()
{
;
}
book bop;
Time t1;
//学生类
multimap<int,student>m4;//学号 学生信息 查找学生
multimap<int,student>::iterator mit4,m4p1,m4p2;
multimap<int,int>m5;//学生在 s记录中所对应的下标
multimap<int,int>::iterator mit5,m5p1,m5p2;
void displayrecord();
int addrecord(record r1);
int borrowbook(student s1,abook a,Time t);
int borrowbook(int no);
int rebook(student s1,abook a,Time t);//未修改
int rebook(int no);
int addstudent(student s1);
int searchstudentbyno(int no1);//学号寻找学生
int searchrecordbybookname(string bookname);//书名寻找记录
int searchrecordbystudentno(int studentno);//学号寻找记录
//int match();
void bookload();//读文件
void booksave();
void studentload();//读取学生信息
//void studentload();
void recordsave();//写文件
void studentsave();//
int deletestudent(int no1);
int changestudent(int no1);
void displaystudent(); //void opborrow();
//friend ostream&operator<<(ostream&os,const op&op1);
void save();
friend class book;
};
void op::save()
{studentsave();
booksave();
}
//int match()
void op::booksave()
{
ofstream outfile("c:\\taxt\\20171827book.txt",ios::out);
if(!outfile) return;
for(bop.bs=bop.b.begin(); bop.bs!=bop.b.end(); bop.bs++)
{bop.mit6=bop.m6.find(bop.bs->name);
outfile<<*bop.bs<<""<<bop.mit6->second<<endl;
//cout<<*ss<<endl;
}
outfile<<"0 0 00"<<endl;
for(rrs=rr.begin(); rrs!=rr.end(); rrs++)
{
outfile<<*rrs<<endl;
//cout<<"*rrs"<<*rrs<<endl;
}
outfile.close();
}
void op::studentsave()
{
ofstream outfile("c:\\taxt\\20171827student.txt",ios::out);
if(!outfile) return;
for(ss=s.begin(); ss!=s.end(); ss++)
{
outfile<<*ss<<endl;
//cout<<*ss<<endl;
}
outfile<<"0 00"<<endl;
for(rrs=rr.begin(); rrs!=rr.end(); rrs++)
{
outfile<<*rrs<<endl;
//cout<<"*rrs"<<*rrs<<endl;
}
outfile.close();
}
void op::displaystudent()
{
for(ss=s.begin(); ss!=s.end(); ss++)
{mit7=m7.find(ss->no);
cout<<*ss<<" 当前可借阅数量:"<<mit7->second<<endl;}
}
int op::changestudent(int no1)
{mit4=m4.find(no1);if(mit4==m4.end()){cout<<"没有这个学生哦"<<endl;return0;}
cout<<"重新输入学生信息 输入修改后学号 姓名 密码"<<endl;
student s1;cin>>s1;
deletestudent(no1);
addstudent(s1);
//cout<<"核对信息"<<endl;
//searchstudentbyno(s1.no);
studentsave();
}
int op::deletestudent(int no1)
{mit4=m4.find(no1);if(mit4==m4.end()){cout<<"没有这个学生哦"<<endl;return0;}
//cout<<"删除学生信息"<<endl;
mit4=m4.find(no1);
m4.erase(mit4++);
mit7=m7.find(no1);
m7.erase(mit7++);
for(ss=s.begin();ss!=s.end();)
{int ming;ming=ss->no;
if(ming==no1)
{
ss=s.erase(ss);
cout<<"删除信息成功\n";
}
else
ss++;
}
studentsave();
}
void op::studentload()
{
student s1;record r1;
int i;
ifstreaminfile("c:\\taxt\\20171827student.txt",ios::in);
if(!infile)return;
s.clear();
m4.clear();
//string b="1";
while(infile>>s1)
{
//if(infile==0)infile>>b;
if(s1.no==0){//cout<<s1<<endl;
break;}
//{infile>>r1;addrecord(r1);}
s.push_back(s1);
i=s.size();
m4.insert(make_pair(s1.no,s1));
m5.insert(make_pair(s1.no,i));m7.insert(make_pair(s1.no,s1.num));
//else {infile>>r1;addrecord(r1); }
}
while(infile>>r1)
{//cout<<"r1"<<r1<<endl;
addrecord(r1);
}
//cout<<"studentload"<<endl;
infile.close();
}
/*s.push_back(s1);
i=s.size();
m4.insert(make_pair(s1.no,s1));
m5.insert(make_pair(s1.no,i));
m7.insert(make_pair(s1.no,s1.num));
void op::opborrow()
{student s1;Time t;string bookname;
cout<<"addstudent"<<endl;
cin>>s1;addstudent(s1);//学号 姓名
cout<<"borrow time bookname"<<endl;
cin>>t;
cin>>bookname;cout<<endl;
borrowbook(s1,bookname,t);recordsave();
}
void op::studentload()
{
student s1;
int i;
ifstreaminfile("c:\\taxt\\20171827student.txt",ios::in);
if(!infile)return;
s.clear();
m4.clear();
while(infile>>s1)
{//cout<<s1<<endl;
s.push_back(s1);
i=s.size();
m4.insert(make_pair(s1.no,s1));
m5.insert(make_pair(s1.no,i));
m7.insert(make_pair(s1.no,s1.num));
}//cout<<"studentload"<<endl;
infile.close();
}*/
void op::recordsave()
{
ofstream outfile("c:\\taxt\\damo.txt",ios::out);
if(!outfile) return;
for(rrs=rr.begin(); rrs!=rr.end(); rrs++)
{
outfile<<*rrs<<endl;
cout<<"*rrs"<<*rrs<<endl;
}
outfile.close();
}
void op::bookload()
{
//cout<<"bookload"<<endl;
abook a;record r1;
int i;
ifstream infile("c:\\taxt\\20171827book.txt",ios::in);//infile>>a;cout<<a<<endl;
if(!infile)return;
bop.b.clear();
bop.m1.clear();
/*m2.clear();
m3.clear();
m4.clear();
m5.clear();*/
while(infile>>a)
{if(a.name=="0")break;
bop.b.push_back(a);
i=bop.b.size();//cout<<"bookload-"<<i<<endl;
bop.m1.insert(make_pair(a.getname(),i));
bop.m6.insert(make_pair(a.getname(),a.num));
}
//while(infile>>r1)
//{
//addrecord(r1);
infile.close();//cout<<"bookloadclose"<<endl;
}
int op::rebook(int no)
{mit4=m4.find(no);if(mit4==m4.end()){cout<<"没有这个学生哦"<<endl;return0;}
cout<<"检验账户 输入密码"<<endl;
string mima2;Time t;string bookname;
cin>>mima2;students1=mit4->second;
if(mima2==s1.mima)
{cout<<"成功登陆 核对信息"<<s1<<endl;
cout<<"输入时间(年月日时)书的名字"<<endl;
cin>>t>>bookname;
cout<<endl;
}
else {cout<<"账户或密码错误 登陆失败 "<<endl;return 0;}
if(bop.search1(bookname)==0){cout<<"不存在此书"<<endl;return 0;}
string type="return";
record r(t,s1,type,bookname);
rr.push_back(r);
m2.insert(make_pair(bookname,r));
m3.insert(make_pair(s1.no,r));
mit5=m5.find(s1.no);
bop.mit6=bop.m6.find(bookname);
bop.mit6->second++;
mit7=m7.find(s1.no);
mit7->second++;
//s[mit5->second].num++;//学生的可借阅书的数量增加
save();
return 0;
}
int op::borrowbook(int no)
{mit4=m4.find(no);if(mit4==m4.end()){cout<<"没有这个学生哦"<<endl;return0;}cout<<"检验账户输入密码"<<endl;
string mima2;Time t;string bookname;
cin>>mima2;
student s1=mit4->second;
if(mima2==s1.mima)
{cout<<"成功登陆 核对信息"<<s1<<endl;
cout<<"输入时间(年月日时)书的名字"<<endl;
cin>>t>>bookname;
cout<<endl;
}
else {cout<<"账户或密码错误 登陆失败 "<<endl;return 0;}
if(bop.search1(bookname)==0){cout<<"不存在此书"<<endl;return 0;}
bop.mit6=bop.m6.find(bookname);
if(bop.mit6->second==0){cout<<"没书了啦 下次吧";return 0;}
stringtype="borrow";//cout<<"borrowbook."<<endl;
record r(t,s1,type,bookname);//形成一条记录 r
rr.push_back(r);//cout<<"push"<<endl;
m2.insert(make_pair(bookname,r));//形成图书 记录
m3.insert(make_pair(s1.no,r));//形成学号 记录 二叉树
//cout<<"make pair"<<endl;
bop.mit6=bop.m6.find(bookname);
bop.mit6->second--;
mit7=m7.find(s1.no);
mit7->second--;
mit5=m5.find(s1.no);
int n;
//n=mit5->second;
//s[mit5->second].num;//cout<<"num--"<<endl;//不能连续输入的问题节点
// bop.borrow(bookname);//cout<<"booknum--"<<endl;
save();return 0;
}
int op::searchrecordbystudentno(intstudentno)//学生学号连续记录查询
{mit4=m4.find(studentno);if(mit4==m4.end()){cout<<"没有这个学生哦"<<endl;return0;}
//mit3=m3.find(studentno);
m3p1=m3.lower_bound(studentno);
m3p2=m3.upper_bound(studentno);//<<mit3->first<<""<<
for(mit3=m3p1; mit3!=m3p2; mit3++)
cout<<mit3->second<<endl;
return 0;
}
int op::searchrecordbybookname(stringbookname)//书名记录连续查询
{
//cout<<"searchrecordbybookname"<<endl;
//mit2=m2.find(bookname);
bop.search1(bookname);
m2p1=m2.lower_bound(bookname);
m2p2=m2.upper_bound(bookname);//<<mit2->first<<""
for(mit2=m2p1; mit2!=m2p2; mit2++)
cout<<mit2->second<<endl;
return 0;
}
int op::addstudent(student s1)
{cout<<"添加学生"<<endl;
int i=s.size();
if(searchstudentbyno(s1.no)){cout<<endl<<"已经有这个学号了 以上是这个学号的信息"<<endl;return0;}
//cout<<"push"<<endl;
s.push_back(s1);
m4.insert(make_pair(s1.no,s1));//学号
//cout<<"m4 make_pair"<<endl;// xinxi
m5.insert(make_pair(s1.no,i));//学号 序号 i-1
m7.insert(make_pair(s1.no,s1.num));
studentsave();
return 0;
}
int op::searchstudentbyno(int no1)
{
mit4=m4.find(no1);mit7=m7.find(no1);
if(mit4!=m4.end())
{cout<<"Find the student"<<endl;
cout<<mit4->second<<"当前可借阅数量:"<<mit7->second<<endl;
return 1;
}
else {cout<<"Don't find the student"<<endl;return0;}
}
int op::rebook(student s1,abook a,Time t)//还书
{
cin>>s1>>a>>t;
string type="return";
record r(t,s1,type,a);//形成一条记录 r
rr.push_back(r);
m2.insert(make_pair(a.getname(),r));//形成图书 记录
m3.insert(make_pair(s1.no,r));//形成学号 记录 二叉树
mit5=m5.find(s1.no);
int n;
//n=mit5->second;
//s[mit5->second].num++;
bop.re(a.getname());
/* mit1=m1.find(a.getname());
b[mit1->second].num--;*/
return 0;
}
int op::borrowbook(student s1,abook a,Timet)
{
//cin>>s1>>a>>t;
string type="borrow";
record r(t,s1,type,a);//形成一条记录 r
rr.push_back(r);
m2.insert(make_pair(a.getname(),r));//形成图书 记录
m3.insert(make_pair(s1.no,r));//形成学号 记录 二叉树
mit5=m5.find(s1.no);
int n;
//n=mit5->second;
//s[mit5->second].num--;
bop.borrow(a.getname());
/* mit1=m1.find(a.getname());
b[mit1->second].num--;*/
return 0;
}
void op::displayrecord()
{
for(rrs=rr.begin(); rrs!=rr.end(); rrs++)
{
cout<<*rrs<<endl;
}
}
int op::addrecord(record r1)
{
rr.push_back(r1);
int i=rr.size();
m2.insert(make_pair(r1.bookname,r1));//书名记录
m3.insert(make_pair(r1.s.no,r1));//学号记录
return 0;
}
/*ostream&operator<<(ostream&os,constop&op1)
{
os<<endl;return os;
}*/
int main()
{
int booksnum=0;
string type,bookname;
int studentno;
abook a;
book b;
Time t;
//cin>>booksnum;
student s1;
op op1;
op1.bookload();
op1.studentload();
cout<<"已录入书籍信息"<<endl;
op1.bop.display();
cout<<"已录入学生信息"<<endl;
op1.displaystudent();cout<<endl<<endl;
cout<<"添加学生输入学生学号 姓名 密码"<<endl;
cin>>s1;
op1.addstudent(s1);
op1.displaystudent();
cout<<endl<<endl;
cout<<"添加学生输入学生学号 姓名 密码"<<endl;
cin>>s1;
op1.addstudent(s1);
op1.displaystudent();
cout<<endl<<endl;
cout<<"修改学生信息输入学号"<<endl;
cin>>studentno;
op1.changestudent(studentno);
op1.displaystudent();cout<<endl<<endl;
cout<<"修改学生信息输入学号"<<endl;
cin>>studentno;
op1.changestudent(studentno);
op1.displaystudent();cout<<endl<<endl;
cout<<"查询学生信息输入学号"<<endl;
cin>>studentno;
op1.searchstudentbyno(studentno);
cout<<endl<<endl;
cout<<"查询学生信息输入学号"<<endl;
cin>>studentno;
op1.searchstudentbyno(studentno);
cout<<endl<<endl;
cout<<"删除学生信息输入学号"<<endl;
cin>>studentno;
op1.deletestudent(studentno);
op1.displaystudent();cout<<endl<<endl;
cout<<"删除学生信息输入学号"<<endl;
cin>>studentno;
op1.deletestudent(studentno);
op1.displaystudent();cout<<endl<<endl;
cout<<"添加书籍输入书名 出版社 作者 数量"<<endl;
cin>>a;
op1.bop.addbook(a);op1.booksave();cout<<endl<<endl;
cout<<"添加书籍输入书名 出版社 作者 数量"<<endl;
cin>>a;
op1.bop.addbook(a);op1.booksave();cout<<endl<<endl;
cout<<"查询书籍信息输入书名"<<endl;
cin>>bookname;
op1.bop.search1(bookname);cout<<endl<<endl;
cout<<"查询书籍信息输入书名"<<endl;
cin>>bookname;
op1.bop.search1(bookname);cout<<endl<<endl;
cout<<"学生借书输入学号"<<endl;
cin>>studentno;
op1.borrowbook(studentno);cout<<endl;
cout<<"查询书籍信息输入书名"<<endl;
cin>>bookname;
op1.bop.search1(bookname);cout<<endl<<endl;
cout<<"学生借书输入学号"<<endl;
cin>>studentno;
op1.borrowbook(studentno);cout<<endl;
cout<<"查询书籍信息输入书名"<<endl;
cin>>bookname;
op1.bop.search1(bookname);cout<<endl<<endl;
cout<<"学生还书输入学号"<<endl;
cin>>studentno;
op1.rebook(studentno);cout<<endl;
cout<<"查询书籍信息输入书名"<<endl;
cin>>bookname;
op1.bop.search1(bookname);cout<<endl<<endl;
cout<<"学生还书输入学号"<<endl;
cin>>studentno;
op1.rebook(studentno);cout<<endl;
cout<<"查询书籍信息输入书名"<<endl;
cin>>bookname;
op1.bop.search1(bookname);cout<<endl<<endl;
cout<<"用书名搜寻记录输入书名"<<endl;
cin>>bookname;
cout<<endl;
op1.searchrecordbybookname(bookname);cout<<endl<<endl;
cout<<"用书名搜寻记录输入书名"<<endl;
cin>>bookname;
cout<<endl;
op1.searchrecordbybookname(bookname);cout<<endl<<endl;
cout<<"用学号搜索记录输入学号"<<endl;
cin>>studentno;
cout<<endl;
op1.searchrecordbystudentno(studentno);cout<<endl<<endl;
cout<<"用学号搜索记录 输入学号"<<endl;
cin>>studentno;
cout<<endl;
op1.searchrecordbystudentno(studentno);cout<<endl<<endl;
return 0;
}
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
class Time//时间类 年月日时
{
protected:
int year,month,day,hour;
public:
Time()
{
year=month=day=hour=0;
}
Time(int year1,int month1,int day1,int hour1)
{
year=year1;
month=month1;
day=day1;
hour=hour1;
}
int setTime(int year1,int month1,int day1,int hour1)
{
year=year1;
month=month1;
day=day1;
hour=hour1;
}
int getyear()
{
return year;
}
int getmonth()
{
return month;
}
int getday()
{
return day;
}
int gethour()
{
return hour;
}
friend ostream &operator <<(ostream&os,const Time&t);
friend istream &operator >>(istream&is,Time &t);
};
ostream&operator<<(ostream&os,const Time&t)//重载输入输出
{
os<<t.year<<" "<<t.month<<""<<t.day<<" "<<t.hour<<endl;
return os;
}
istream &operator>>(istream&is,Time&t)
{
is>>t.year>>t.month>>t.day>>t.hour;
return is;
}
class abook//单本书的信息 书的名字 图书馆可以借阅数量
{
protected:
public:
int num;
string publish;
string writer;
string name;
abook()
{
num=0;
}
abook(string name1,int num1)
{
num=num1;
name=name1;
}
int getnum()
{
return num;
}
string getname()
{
return name;
}
int set(int num1,string name1)
{
num=num1;
name=name1;
}
friend ostream &operator <<(ostream&os,const abook&a);
friend istream &operator >>(istream&is,abook&a);
friend class book;
};
ostream &operator<<(ostream&os,const abook&a)//重载输入输出
{ os<<a.name<<" "<<a.publish<<" "<<a.writer;
//os<<a.name<<" "<<a.publish<<" "<<a.writer<<" "<<a.num;
//os<<a.name<<" "<<a.num<<endl;
return os;
}
istream &operator>>(istream&is,abook&a)
{
is>>a.name>>a.publish>>a.writer>>a.num;//书名 出版社 作者 数量
return is;
}
class book//总数的书
{
protected:
public:
vector<abook>b;//伐
vector<abook>::iterator bs;
//string type;
int num;
multimap<string,int>m1;
multimap<string,int>::iterator mit1,p1,p2;//指针 对应下标
multimap<string,int>m6;// 书和数量
multimap<string,int>::iterator mit6,m6p1,m6p2;
book()
{
num=0;
}
void addbook(abook b1);
void addbook();
int search1(string s);//找书
int search2(string s);
void display();
void displayabook(string s);
friend class op;
friend class abook;
int borrow(string bookname);
void re(string bookname);
};
int book::search2(string s)
{mit6=m6.find(s);
if(mit6!=m6.end())
{cout<<"已经有此图书"<<endl;
return 1;}
else {cout<<"已经添加新书";return0;}
}
void book::re(string bookname)
{
mit1=m1.find(bookname);
//b[mit1->second].num++;
}
int book::borrow(string bookname)
{
mit1=m1.find(bookname);
cout<<"find:"<<mit1->second<<endl;
//b[mit1->second].num--;
//cout<<"num--"<<endl;
return 0;
}
void book::displayabook(string s)//一本书的信息
{mit6=m6.find(s);
mit1=m1.find(s);
cout<<b[mit1->second-1]<<" 数量:"<<mit6->second<<endl;
}
void book::addbook(abook b1)//添加单本书
{if(search2(b1.name)==0)
{int i;
b.push_back(b1);
i=b.size();//统计数量
m1.insert(make_pair(b1.getname(),i));//配对
m6.insert(make_pair(b1.getname(),b1.num));}
else {mit6=m6.find(b1.name);mit6->second+=b1.num;
cout<<"书名:"<<b1.name<<" 数量:"<<mit6->second;}
}
void book::addbook()//添加好几本书
{
abook b1;
int i;
while(1)
{
cin>>b1;
if(b1.getname()=="end")break;
b.push_back(b1);
i=b.size();//统计数量
m1.insert(make_pair(b1.getname(),i));//配对
m6.insert(make_pair(b1.getname(),b1.num));
}
}
int book::search1(string s)
{mit6=m6.find(s);
if(mit6!=m6.end())
{displayabook(s);
return 1;}
else {cout<<"没找到啊";return0;}
//mit1=p1;
//cout<<mit1->first<<":"<<mit1->second<<endl;//输出书的名字 和配对的序号
/*p1=mit1.lower_bound(s);
p2=mit1.upper_bound(s);
for(mit1=p1;mit1!=p2;mit1++)
{
cout<<mit1->first<<":"<<mit1->second<<endl;
}*/
}
void book::display()//显示所有存入的书籍
{
for(bs=b.begin(); bs!=b.end(); bs++)
{mit6=m6.find(bs->name);
cout<<"书名:"<<*bs<<" 库存数量:"<<mit6->second<<endl;}
}
class student//学生类 学号 姓名 可借阅书籍数量
{
//protected:
public:
int no,num;
string mima;
string name;
student(const student&s1)
{
no=s1.no;
name=s1.name;
num=s1.num;
mima=s1.mima;
}
student()
{
no=0;
num=10;
}
student(int no1,string name1,string mima1)
{
no=no1;
name=name1;
num=10;
mima=mima1;
}
friend ostream &operator <<(ostream&os,conststudent&s);
friend istream &operator >>(ostream&is,student&s);
};
ostream&operator<<(ostream&os,const student&s)
{
os<<" "<<s.no<<""<<s.name<<" "<<s.mima<<endl;
return os;
}
istream&operator>>(istream&is,student&s)
{
is>>s.no>>s.name>>s.mima;
return is;
}
class record//单条记录 时间 学生 方式 书
{
protected:
public:
Time t;
student s;
abook a;
string type,bookname;
record(){;}
record(Time t1,student s1,string type1,abook a1)
{
t=t1;
s=s1;
a=a1;
type=type1;
}
record(Time t1,student s1,string type1,string bookname1)
{
t=t1;
s=s1;
type=type1;
bookname=bookname1;
}
friend ostream &operator<<(ostream&os,const record&r);
friend istream &operator>>(istream&is,record&r);
};
ostream&operator<<(ostream&os,const record&r)
{
os<<" "<<r.t<<" "<<r.s<<" "<<r.type<<" "<<r.bookname<<endl;
return os;
}
istream&operator>>(istream&is,record&r)
{
is>>r.t>>r.s>>r.type>>r.bookname;
return is;
}
class op
{
public:
vector<record>rr;//图书馆记录
vector<record>::iterator rrs;
//用书名 学号记录查找
vector<student>s;
vector<student>::iterator ss;
//multimap<string,int>m6;// 书和数量
//multimap<string,int>::iterator mit6,m6p1,m6p2;
multimap<int,int>m7;//学号 数量
multimap<int,int>::iterator mit7,m7p1,m7p2;
multimap<string,record>m2;//书名 记录
multimap<string,record>::iterator mit2,m2p1,m2p2;//指针
multimap<int,record>m3;//学号 记录
multimap<int,record>::iterator mit3,m3p1,m3p2;//指针
op()
{
;
}
book bop;
Time t1;
//学生类
multimap<int,student>m4;//学号 学生信息 查找学生
multimap<int,student>::iterator mit4,m4p1,m4p2;
multimap<int,int>m5;//学生在 s记录中所对应的下标
multimap<int,int>::iterator mit5,m5p1,m5p2;
void displayrecord();
int addrecord(record r1);
int borrowbook(student s1,abook a,Time t);
int borrowbook(int no);
int rebook(student s1,abook a,Time t);//未修改
int rebook(int no);
int addstudent(student s1);
int searchstudentbyno(int no1);//学号寻找学生
int searchrecordbybookname(string bookname);//书名寻找记录
int searchrecordbystudentno(int studentno);//学号寻找记录
//int match();
void bookload();//读文件
void booksave();
void studentload();//读取学生信息
//void studentload();
void recordsave();//写文件
void studentsave();//
int deletestudent(int no1);
int changestudent(int no1);
void displaystudent(); //void opborrow();
//friend ostream&operator<<(ostream&os,const op&op1);
void save();
friend class book;
};
void op::save()
{studentsave();
booksave();
}
//int match()
void op::booksave()
{
ofstream outfile("c:\\taxt\\20171827book.txt",ios::out);
if(!outfile) return;
for(bop.bs=bop.b.begin(); bop.bs!=bop.b.end(); bop.bs++)
{bop.mit6=bop.m6.find(bop.bs->name);
outfile<<*bop.bs<<""<<bop.mit6->second<<endl;
//cout<<*ss<<endl;
}
outfile<<"0 0 00"<<endl;
for(rrs=rr.begin(); rrs!=rr.end(); rrs++)
{
outfile<<*rrs<<endl;
//cout<<"*rrs"<<*rrs<<endl;
}
outfile.close();
}
void op::studentsave()
{
ofstream outfile("c:\\taxt\\20171827student.txt",ios::out);
if(!outfile) return;
for(ss=s.begin(); ss!=s.end(); ss++)
{
outfile<<*ss<<endl;
//cout<<*ss<<endl;
}
outfile<<"0 00"<<endl;
for(rrs=rr.begin(); rrs!=rr.end(); rrs++)
{
outfile<<*rrs<<endl;
//cout<<"*rrs"<<*rrs<<endl;
}
outfile.close();
}
void op::displaystudent()
{
for(ss=s.begin(); ss!=s.end(); ss++)
{mit7=m7.find(ss->no);
cout<<*ss<<" 当前可借阅数量:"<<mit7->second<<endl;}
}
int op::changestudent(int no1)
{mit4=m4.find(no1);if(mit4==m4.end()){cout<<"没有这个学生哦"<<endl;return0;}
cout<<"重新输入学生信息 输入修改后学号 姓名 密码"<<endl;
student s1;cin>>s1;
deletestudent(no1);
addstudent(s1);
//cout<<"核对信息"<<endl;
//searchstudentbyno(s1.no);
studentsave();
}
int op::deletestudent(int no1)
{mit4=m4.find(no1);if(mit4==m4.end()){cout<<"没有这个学生哦"<<endl;return0;}
//cout<<"删除学生信息"<<endl;
mit4=m4.find(no1);
m4.erase(mit4++);
mit7=m7.find(no1);
m7.erase(mit7++);
for(ss=s.begin();ss!=s.end();)
{int ming;ming=ss->no;
if(ming==no1)
{
ss=s.erase(ss);
cout<<"删除信息成功\n";
}
else
ss++;
}
studentsave();
}
void op::studentload()
{
student s1;record r1;
int i;
ifstreaminfile("c:\\taxt\\20171827student.txt",ios::in);
if(!infile)return;
s.clear();
m4.clear();
//string b="1";
while(infile>>s1)
{
//if(infile==0)infile>>b;
if(s1.no==0){//cout<<s1<<endl;
break;}
//{infile>>r1;addrecord(r1);}
s.push_back(s1);
i=s.size();
m4.insert(make_pair(s1.no,s1));
m5.insert(make_pair(s1.no,i));m7.insert(make_pair(s1.no,s1.num));
//else {infile>>r1;addrecord(r1); }
}
while(infile>>r1)
{//cout<<"r1"<<r1<<endl;
addrecord(r1);
}
//cout<<"studentload"<<endl;
infile.close();
}
/*s.push_back(s1);
i=s.size();
m4.insert(make_pair(s1.no,s1));
m5.insert(make_pair(s1.no,i));
m7.insert(make_pair(s1.no,s1.num));
void op::opborrow()
{student s1;Time t;string bookname;
cout<<"addstudent"<<endl;
cin>>s1;addstudent(s1);//学号 姓名
cout<<"borrow time bookname"<<endl;
cin>>t;
cin>>bookname;cout<<endl;
borrowbook(s1,bookname,t);recordsave();
}
void op::studentload()
{
student s1;
int i;
ifstreaminfile("c:\\taxt\\20171827student.txt",ios::in);
if(!infile)return;
s.clear();
m4.clear();
while(infile>>s1)
{//cout<<s1<<endl;
s.push_back(s1);
i=s.size();
m4.insert(make_pair(s1.no,s1));
m5.insert(make_pair(s1.no,i));
m7.insert(make_pair(s1.no,s1.num));
}//cout<<"studentload"<<endl;
infile.close();
}*/
void op::recordsave()
{
ofstream outfile("c:\\taxt\\damo.txt",ios::out);
if(!outfile) return;
for(rrs=rr.begin(); rrs!=rr.end(); rrs++)
{
outfile<<*rrs<<endl;
cout<<"*rrs"<<*rrs<<endl;
}
outfile.close();
}
void op::bookload()
{
//cout<<"bookload"<<endl;
abook a;record r1;
int i;
ifstream infile("c:\\taxt\\20171827book.txt",ios::in);//infile>>a;cout<<a<<endl;
if(!infile)return;
bop.b.clear();
bop.m1.clear();
/*m2.clear();
m3.clear();
m4.clear();
m5.clear();*/
while(infile>>a)
{if(a.name=="0")break;
bop.b.push_back(a);
i=bop.b.size();//cout<<"bookload-"<<i<<endl;
bop.m1.insert(make_pair(a.getname(),i));
bop.m6.insert(make_pair(a.getname(),a.num));
}
//while(infile>>r1)
//{
//addrecord(r1);
infile.close();//cout<<"bookloadclose"<<endl;
}
int op::rebook(int no)
{mit4=m4.find(no);if(mit4==m4.end()){cout<<"没有这个学生哦"<<endl;return0;}
cout<<"检验账户 输入密码"<<endl;
string mima2;Time t;string bookname;
cin>>mima2;students1=mit4->second;
if(mima2==s1.mima)
{cout<<"成功登陆 核对信息"<<s1<<endl;
cout<<"输入时间(年月日时)书的名字"<<endl;
cin>>t>>bookname;
cout<<endl;
}
else {cout<<"账户或密码错误 登陆失败 "<<endl;return 0;}
if(bop.search1(bookname)==0){cout<<"不存在此书"<<endl;return 0;}
string type="return";
record r(t,s1,type,bookname);
rr.push_back(r);
m2.insert(make_pair(bookname,r));
m3.insert(make_pair(s1.no,r));
mit5=m5.find(s1.no);
bop.mit6=bop.m6.find(bookname);
bop.mit6->second++;
mit7=m7.find(s1.no);
mit7->second++;
//s[mit5->second].num++;//学生的可借阅书的数量增加
save();
return 0;
}
int op::borrowbook(int no)
{mit4=m4.find(no);if(mit4==m4.end()){cout<<"没有这个学生哦"<<endl;return0;}cout<<"检验账户输入密码"<<endl;
string mima2;Time t;string bookname;
cin>>mima2;
student s1=mit4->second;
if(mima2==s1.mima)
{cout<<"成功登陆 核对信息"<<s1<<endl;
cout<<"输入时间(年月日时)书的名字"<<endl;
cin>>t>>bookname;
cout<<endl;
}
else {cout<<"账户或密码错误 登陆失败 "<<endl;return 0;}
if(bop.search1(bookname)==0){cout<<"不存在此书"<<endl;return 0;}
bop.mit6=bop.m6.find(bookname);
if(bop.mit6->second==0){cout<<"没书了啦 下次吧";return 0;}
stringtype="borrow";//cout<<"borrowbook."<<endl;
record r(t,s1,type,bookname);//形成一条记录 r
rr.push_back(r);//cout<<"push"<<endl;
m2.insert(make_pair(bookname,r));//形成图书 记录
m3.insert(make_pair(s1.no,r));//形成学号 记录 二叉树
//cout<<"make pair"<<endl;
bop.mit6=bop.m6.find(bookname);
bop.mit6->second--;
mit7=m7.find(s1.no);
mit7->second--;
mit5=m5.find(s1.no);
int n;
//n=mit5->second;
//s[mit5->second].num;//cout<<"num--"<<endl;//不能连续输入的问题节点
// bop.borrow(bookname);//cout<<"booknum--"<<endl;
save();return 0;
}
int op::searchrecordbystudentno(intstudentno)//学生学号连续记录查询
{mit4=m4.find(studentno);if(mit4==m4.end()){cout<<"没有这个学生哦"<<endl;return0;}
//mit3=m3.find(studentno);
m3p1=m3.lower_bound(studentno);
m3p2=m3.upper_bound(studentno);//<<mit3->first<<""<<
for(mit3=m3p1; mit3!=m3p2; mit3++)
cout<<mit3->second<<endl;
return 0;
}
int op::searchrecordbybookname(stringbookname)//书名记录连续查询
{
//cout<<"searchrecordbybookname"<<endl;
//mit2=m2.find(bookname);
bop.search1(bookname);
m2p1=m2.lower_bound(bookname);
m2p2=m2.upper_bound(bookname);//<<mit2->first<<""
for(mit2=m2p1; mit2!=m2p2; mit2++)
cout<<mit2->second<<endl;
return 0;
}
int op::addstudent(student s1)
{cout<<"添加学生"<<endl;
int i=s.size();
if(searchstudentbyno(s1.no)){cout<<endl<<"已经有这个学号了 以上是这个学号的信息"<<endl;return0;}
//cout<<"push"<<endl;
s.push_back(s1);
m4.insert(make_pair(s1.no,s1));//学号
//cout<<"m4 make_pair"<<endl;// xinxi
m5.insert(make_pair(s1.no,i));//学号 序号 i-1
m7.insert(make_pair(s1.no,s1.num));
studentsave();
return 0;
}
int op::searchstudentbyno(int no1)
{
mit4=m4.find(no1);mit7=m7.find(no1);
if(mit4!=m4.end())
{cout<<"Find the student"<<endl;
cout<<mit4->second<<"当前可借阅数量:"<<mit7->second<<endl;
return 1;
}
else {cout<<"Don't find the student"<<endl;return0;}
}
int op::rebook(student s1,abook a,Time t)//还书
{
cin>>s1>>a>>t;
string type="return";
record r(t,s1,type,a);//形成一条记录 r
rr.push_back(r);
m2.insert(make_pair(a.getname(),r));//形成图书 记录
m3.insert(make_pair(s1.no,r));//形成学号 记录 二叉树
mit5=m5.find(s1.no);
int n;
//n=mit5->second;
//s[mit5->second].num++;
bop.re(a.getname());
/* mit1=m1.find(a.getname());
b[mit1->second].num--;*/
return 0;
}
int op::borrowbook(student s1,abook a,Timet)
{
//cin>>s1>>a>>t;
string type="borrow";
record r(t,s1,type,a);//形成一条记录 r
rr.push_back(r);
m2.insert(make_pair(a.getname(),r));//形成图书 记录
m3.insert(make_pair(s1.no,r));//形成学号 记录 二叉树
mit5=m5.find(s1.no);
int n;
//n=mit5->second;
//s[mit5->second].num--;
bop.borrow(a.getname());
/* mit1=m1.find(a.getname());
b[mit1->second].num--;*/
return 0;
}
void op::displayrecord()
{
for(rrs=rr.begin(); rrs!=rr.end(); rrs++)
{
cout<<*rrs<<endl;
}
}
int op::addrecord(record r1)
{
rr.push_back(r1);
int i=rr.size();
m2.insert(make_pair(r1.bookname,r1));//书名记录
m3.insert(make_pair(r1.s.no,r1));//学号记录
return 0;
}
/*ostream&operator<<(ostream&os,constop&op1)
{
os<<endl;return os;
}*/
int main()
{
int booksnum=0;
string type,bookname;
int studentno;
abook a;
book b;
Time t;
//cin>>booksnum;
student s1;
op op1;
op1.bookload();
op1.studentload();
cout<<"已录入书籍信息"<<endl;
op1.bop.display();
cout<<"已录入学生信息"<<endl;
op1.displaystudent();cout<<endl<<endl;
cout<<"添加学生输入学生学号 姓名 密码"<<endl;
cin>>s1;
op1.addstudent(s1);
op1.displaystudent();
cout<<endl<<endl;
cout<<"添加学生输入学生学号 姓名 密码"<<endl;
cin>>s1;
op1.addstudent(s1);
op1.displaystudent();
cout<<endl<<endl;
cout<<"修改学生信息输入学号"<<endl;
cin>>studentno;
op1.changestudent(studentno);
op1.displaystudent();cout<<endl<<endl;
cout<<"修改学生信息输入学号"<<endl;
cin>>studentno;
op1.changestudent(studentno);
op1.displaystudent();cout<<endl<<endl;
cout<<"查询学生信息输入学号"<<endl;
cin>>studentno;
op1.searchstudentbyno(studentno);
cout<<endl<<endl;
cout<<"查询学生信息输入学号"<<endl;
cin>>studentno;
op1.searchstudentbyno(studentno);
cout<<endl<<endl;
cout<<"删除学生信息输入学号"<<endl;
cin>>studentno;
op1.deletestudent(studentno);
op1.displaystudent();cout<<endl<<endl;
cout<<"删除学生信息输入学号"<<endl;
cin>>studentno;
op1.deletestudent(studentno);
op1.displaystudent();cout<<endl<<endl;
cout<<"添加书籍输入书名 出版社 作者 数量"<<endl;
cin>>a;
op1.bop.addbook(a);op1.booksave();cout<<endl<<endl;
cout<<"添加书籍输入书名 出版社 作者 数量"<<endl;
cin>>a;
op1.bop.addbook(a);op1.booksave();cout<<endl<<endl;
cout<<"查询书籍信息输入书名"<<endl;
cin>>bookname;
op1.bop.search1(bookname);cout<<endl<<endl;
cout<<"查询书籍信息输入书名"<<endl;
cin>>bookname;
op1.bop.search1(bookname);cout<<endl<<endl;
cout<<"学生借书输入学号"<<endl;
cin>>studentno;
op1.borrowbook(studentno);cout<<endl;
cout<<"查询书籍信息输入书名"<<endl;
cin>>bookname;
op1.bop.search1(bookname);cout<<endl<<endl;
cout<<"学生借书输入学号"<<endl;
cin>>studentno;
op1.borrowbook(studentno);cout<<endl;
cout<<"查询书籍信息输入书名"<<endl;
cin>>bookname;
op1.bop.search1(bookname);cout<<endl<<endl;
cout<<"学生还书输入学号"<<endl;
cin>>studentno;
op1.rebook(studentno);cout<<endl;
cout<<"查询书籍信息输入书名"<<endl;
cin>>bookname;
op1.bop.search1(bookname);cout<<endl<<endl;
cout<<"学生还书输入学号"<<endl;
cin>>studentno;
op1.rebook(studentno);cout<<endl;
cout<<"查询书籍信息输入书名"<<endl;
cin>>bookname;
op1.bop.search1(bookname);cout<<endl<<endl;
cout<<"用书名搜寻记录输入书名"<<endl;
cin>>bookname;
cout<<endl;
op1.searchrecordbybookname(bookname);cout<<endl<<endl;
cout<<"用书名搜寻记录输入书名"<<endl;
cin>>bookname;
cout<<endl;
op1.searchrecordbybookname(bookname);cout<<endl<<endl;
cout<<"用学号搜索记录输入学号"<<endl;
cin>>studentno;
cout<<endl;
op1.searchrecordbystudentno(studentno);cout<<endl<<endl;
cout<<"用学号搜索记录 输入学号"<<endl;
cin>>studentno;
cout<<endl;
op1.searchrecordbystudentno(studentno);cout<<endl<<endl;
return 0;
}