数据类:
基础类:读者最大借书量、最长借书时间(按天计算)。这两个都是类成员;
日前类:包括年月日,重载输入运算符时,要进行数据的合法性检验;重载输出运算符时,按照“年/月/日”形式输出,重载+运算符;
借阅记录类:包括日期、书号、读者学号、类型(借出/还回/续借)、图书类型(基础/文学休闲/专业);
读者类:学号、姓名、专业、班级、已借图书数量、借阅记录向量;
图书类∶书号、书名、作者、出版社、出版日期、图书类型(基础/文学休闲/专业)、馆藏总量、在馆数量、借阅记录向量;
操作类:
数据成员:图书/学生/借阅记录向量;
成员函数:对图书进行文件读写、在图书向量内完成对图书基本信息的增删查改;
对学生进行文件读写、在学生向量内完成对学生基本信息的增删查改;借阅记录的管理和统计功能后续添加;
作业要求:
程序能够正常运行,数据文件要经过多次运行测试,每次运行,内容要有相应的变化。数据用真实的,不要出现张三、李四这样的名字,数据不要在记事本中添加,一起通过程序搞定。
#include<bits/stdc++.h>
#include<iostream>
#include<fstream>
#include<vector>
#include<map>
using namespace std;
string iType1[4]={"","Lend","Return","Renew"};//操作类型:借出,还回,续借
string BookType1[4]={"","Basics","LiteraryLeisure","Professional"};//图书类型:基础,文学休闲,专业
//日前类:包括年月日,重载输入运算符时,要进行数据的合法性检验;重载输出运算符时,按照“年/月/日”形式输出;重载+运算符;
class date
{
int year;
int month;
int day;
friend ostream& operator<<(ostream& out, date& d);
public:
date(int year,int month,int day);
date();
int GetYear(){return this->year;};
void SetYear(int year){this->year=year;};
int GetMonth(){return this->month;};
void SetMonth(int month){this->month=month;};
int GetDay(){return this->day;};
void SetDay(int day){this->day=day;};
bool operator==(const date& d)
{
if(d.day==this->day&&d.month==this->month&&d.year==this->year)
{
return true;
}else return false;
};
};
date::date(int year,int month,int day)
{
this->year=year;
this->month=month;
this->day=day;
}
date::date()
{
this->year=0;
this->month=0;
this->day=0;
}
ostream& operator<<(ostream& out,date& d)
{
if(d.year>=2000&&d.year<=2022&&d.month>=1&&d.month<=12)
{
if((d.month==1||d.month==3||d.month==5||d.month==7||d.month==8||d.month==10||d.month==12)&&(d.day>=1&&d.day<=31))
{
out<<d.year<<"/"<<d.month<<"/"<<d.day;
}else if((d.month==4||d.month==6||d.month==9||d.month==11)&&d.day>=1&&d.day<=30)
{
out<<d.year<<"/"<<d.month<<"/"<<d.day;
}
else if(d.month==2)
{
if(((d.year%4==0&&d.year%100!=0)||(d.year%400==0))&&(d.day>=1&&d.year<=29))
{
out<<d.year<<"/"<<d.month<<"/"<<d.day;
}
else if(d.day>=1&&d.day<=28)
{
out<<d.year<<"/"<<d.month<<"/"<<d.day;
}
else out<<"Date input error!";
}
else out<<"Date input error!";
}
else out<<"Date input error!";
return out;
}
//借阅记录类:包括日期、书号、读者学号、类型(借出/还回/续借)、图书类型(基础/文学休闲/专业);
class BorrowingRecord
{
date d;
string BookNum;
string ID;
string iType2;
int iType3;
string BookType2;
int BookType3;
friend ostream& operator<<(ostream& out, BorrowingRecord& br);
public:
BorrowingRecord(date d,string BookNum,string ID,int iType2,int BookType2);
BorrowingRecord();
date GetDate(){return this->d;};
void SetDate(date d){this->d=d;};
string GetBookNum(){return this->BookNum;};
void SetBookNum(string BookNum){this->BookNum=BookNum;};
string GetID(){return this->ID;};
void SetID(string ID){this->ID=ID;};
string GetiType2(){return this->iType2;};
void SetiType2(string iType2){this->iType2=iType2;};
string GetBookType2(){return this->BookType2;};
void SetBookType2(string BookType2){this->BookType2=BookType2;};
bool operator==(const BorrowingRecord& br)
{
if(this->d==br.d&&this->BookNum==br.BookNum&&this->ID==br.ID&&this->iType2==br.iType2&&this->BookType2==br.BookType2)
{
return true;
}else return false;
};
};
BorrowingRecord::BorrowingRecord(date d,string BookNum,string ID,int iType3,int BookType3)
{
this->d=d;
this->BookNum=BookNum;
this->ID=ID;
this->iType2=iType1[iType3];
this->BookType2=BookType1[BookType3];
}
BorrowingRecord::BorrowingRecord()
{
this->d=d;
this->BookNum="";
this->ID="";
this->iType2=iType1[0];
this->BookType2=BookType1[0];
}
ostream& operator<<(ostream& out,BorrowingRecord& br)
{
out<<"BorDate:"<<br.d<<" BorBookNum:"<<br.BookNum<<" BorReaderID:"<<br.ID<<" BorType:"<<br.iType2<<" BorBookType:"<<br.BookType2;
return out;
}
//读者类:学号、姓名、专业、班级、已借图书数量、借阅记录向量;
class Reader
{
string ID;
string name;
string major;
string Class;
int borSum;
vector<BorrowingRecord> v;
friend ostream& operator<<(ostream& out, Reader& br);
public:
Reader(string ID,string name,string major,string Class,int borSum,vector<BorrowingRecord> v);
bool operator==(const Reader& r)
{
if(this->ID==r.ID&&this->name==r.name&&this->major==r.major&&this->Class==r.Class&&this->borSum==r.borSum&&this->v==r.v)
{
return true;
}else return false;
};
};
Reader::Reader(string ID,string name,string major,string Class,int borSum,vector<BorrowingRecord> v)
{
this->ID=ID;
this->name=name;
this->major=major;
this->Class=Class;
this->borSum=borSum;
this->v=v;
}
ostream& operator<<(ostream& out,Reader& r)
{
out<<"ReaderID:"<<r.ID<<" ReaderName:"<<r.name<<" ReaderMajor:"<<r.major<<" ReaderClass:"<<" ReaderBorSum:"<<r.borSum<<endl;
for(vector<BorrowingRecord>::iterator it=r.v.begin();it!=r.v.end();it++)
{
cout<<(*it)<<endl;
}
return out;
}
//图书类:书号、书名、作者、出版社、出版日期、图书类型(基础/文学休闲/专业)、馆藏总量、在馆数量、借阅记录向量;
class Books
{
string bookNum;
string bookName;
string bookAuthor;
string press;
date pressDate;
string BookType2;
int BookType3=0;
int sum=100;
int sumNow=25;
vector<BorrowingRecord> v;
friend ostream& operator<<(ostream& out, Books& bk);
public:
Books(string bookNum,string bookName,string bookAuthor,string press,date pressDate,int BookType3,int sum,int sunNow,vector<BorrowingRecord> v);
bool operator==(const Books& bk)
{
if(this->bookNum==bk.bookNum&&this->bookName==bk.bookName&&this->bookAuthor==bk.bookAuthor&&this->BookType2==bk.BookType2
&&this->BookType3==bk.BookType3&&this->sum==bk.sum&&this->sumNow==bk.sumNow&&this->v==bk.v)
{
return true;
}else return false;
};
};
Books::Books(string bookNum,string bookName,string bookAuthor,string press,date pressDate,int BookType3,int sum,int sunNow,vector<BorrowingRecord> v)
{
this->bookNum=bookNum;
this->bookName=bookName;
this->bookAuthor=bookAuthor;
this->press=press;
this->pressDate=pressDate;
this->BookType2=BookType1[BookType3];
this->sum=sum;
this->sumNow=sumNow;
this->v=v;
}
ostream& operator<<(ostream& out,Books& bk)
{
out<<"BooksNum:"<<bk.bookNum<<" BooksName:"<<bk.bookName<<" BooksAuthor:"<<bk.bookAuthor<<" BooksPress:"<<bk.press<<" BooksPressDate:"<<bk.pressDate
<<" BooksType:"<<bk.BookType2<<" BooksSum:"<<bk.sum<<" BooksSumNow:"<<bk.sumNow<<endl;
for(vector<BorrowingRecord>::iterator it=bk.v.begin();it!=bk.v.end();it++)
{
cout<<(*it)<<endl;
}
return out;
}
//日期类按照日期升序排序
class comapreDate
{
public://仿函数
bool operator()(date a1,date a2)
{
if(a1.GetYear()==a2.GetYear())
{
if(a1.GetMonth()==a2.GetMonth())
{
return a1.GetDay()<a2.GetDay();
}
else return a1.GetMonth()<a2.GetMonth();
}
else return a1.GetYear()<a2.GetYear();
}
};
//字符串按照字典序排序
class compareString
{
public://仿函数
bool operator()(string a1,string a2)
{
return a1<a2;
}
};
//操作类
class operation
{
vector<Books> vbk;//图书类
vector<Reader> vr;//读者类
vector<BorrowingRecord> vbr;//借阅记录类
multimap<string,int,compareString> mbk1;//图书类:按书号查找
multimap<date,int,comapreDate> mbk2;//图书类:按日期查找
multimap<string,int,compareString> mbk3;//图书类:按学号查找
multimap<string,int,compareString> mbk4;//图书类:按类型查找
multimap<string,int,compareString> mbk5;//图书类:按图书类型查找
// multimap<string,int,compareString> mr1;//读者类:按学号查找
// multimap<date,int,comapreDate> mr2;//读者类:按日期查找
//
// multimap<string,int,compareString> mbr1;//借阅记录类:按字符串查找
// multimap<date,int,comapreDate> mbr2;//借阅记录类:按日期查找
public:
operation(vector<Books>& vbk,vector<Reader>& vr,vector<BorrowingRecord>& vbr)
{
this->vbk=vbk;this->vr=vr;this->vbr=vbr;
};
void BooksAdd(BorrowingRecord br1,Reader r1,Books bk1);//图书类:增加一条数据
void BookDelete(BorrowingRecord br1,Reader r1,Books bk1);//图书类:删除一条数据
void BooksUpdate();//图书类:修改一条数据
void BooksQueryStr(string BookNum);//图书类:查询符合要求的数据,按照字符串
void BooksQueryDate(date d);//图书类:查询符合要求的数据,按照日期
void BooksOs();//图书类:写入文件
void BooksIs();//图书类:读出文件
void ReaderOs();//读者类:写入文件
void ReaderIs();//读者类:读出文件
void BorrowingRecordOs();//借阅记录类:写入文件
void BorrowingRecordIs();//借阅记录类:读出文件
};
void operation::BooksAdd(BorrowingRecord br1,Reader r1,Books bk1)
{
int i;
this->vbr.push_back(br1);
this->vr.push_back(r1);
this->vbk.push_back(bk1);
i=vbr.size();
mbk1.insert(make_pair(br1.GetBookNum(),i-1));//书号
mbk2.insert(make_pair(br1.GetDate(),i-1));//时间
mbk3.insert(make_pair(br1.GetID(),i-1));//学号
mbk4.insert(make_pair(br1.GetiType2(),i-1));//类型
mbk3.insert(make_pair(br1.GetBookType2(),i-1));//图书类型
}
void operation::BookDelete(BorrowingRecord br1,Reader r1,Books bk1)
{
for(vector<BorrowingRecord>::iterator it=this->vbr.begin();it!=this->vbr.end();it++)
{
if((*it)==br1) vbr.erase(it,++it);
}
for(vector<Reader>::iterator it=this->vr.begin();it!=this->vr.end();it++)
{
if((*it)==r1) vr.erase(it,++it);
}
for(vector<Books>::iterator it=this->vbk.begin();it!=this->vbk.end();it++)
{
if((*it)==bk1) vbk.erase(it,++it);
}
multimap<string,int,compareString>::iterator it1=mbk1.find(br1.GetBookNum());
if(it1!=this->mbk1.end())
{
mbk1.erase(it1,++it1);
}
multimap<date,int,comapreDate>::iterator it2=mbk2.find(br1.GetDate());
if(it2!=this->mbk2.end())
{
mbk2.erase(it2,++it2);
}
multimap<string,int,compareString>::iterator it3=mbk3.find(br1.GetID());
if(it3!=this->mbk3.end())
{
mbk3.erase(it3,++it3);
}
multimap<string,int,compareString>::iterator it4=mbk4.find(br1.GetiType2());
if(it4!=this->mbk4.end())
{
mbk4.erase(it4,++it4);
}
multimap<string,int,compareString>::iterator it5=mbk5.find(br1.GetBookType2());
if(it5!=this->mbk5.end())
{
mbk5.erase(it5,++it5);
}
}
void operation::BooksQueryStr(string BookNum)
{
multimap<string,int,compareString>::iterator it1=mbk1.find(BookNum);
int x=0;
if(it1!=this->mbk1.end())
{
x=(*it1).second;
cout<<vbr[x]<<endl;
}
}
void operation::BooksQueryDate(date d)
{
multimap<date,int,comapreDate>::iterator it2=mbk2.find(d);
int x=0;
if(it2!=this->mbk2.end())
{
x=(*it2).second;
cout<<vbr[x]<<endl;
}
}
void operation::BooksOs()
{
ofstream ofs;
ofs.open("Books.txt",ios::out);
for(vector<Books>::iterator it=this->vbk.begin();it!=this->vbk.end();it++)
{
ofs<<(*it)<<endl;
}
}
void operation::BooksIs()
{
ifstream ifs;
ifs.open("Books.txt", ios::in);
if (!ifs.is_open())
{
cout << "文件打开失败" << endl;
return;
}
char c;
while ((c = ifs.get()) != EOF)
{
cout << c;
}
ifs.close();
}
void operation::ReaderOs()
{
ofstream ofs;
ofs.open("Reader.txt",ios::out);
for(vector<Reader>::iterator it=this->vr.begin();it!=this->vr.end();it++)
{
ofs<<(*it)<<endl;
}
}
void operation::ReaderIs()
{
ifstream ifs;
ifs.open("Reader.txt", ios::in);
if (!ifs.is_open())
{
cout << "文件打开失败" << endl;
return;
}
char c;
while ((c = ifs.get()) != EOF)
{
cout << c;
}
ifs.close();
}
void operation::BorrowingRecordOs()
{
ofstream ofs;
ofs.open("BorrowingRecord.txt",ios::out);
for(vector<BorrowingRecord>::iterator it=this->vbr.begin();it!=this->vbr.end();it++)
{
ofs<<(*it)<<endl;
}
}
void operation::BorrowingRecordIs()
{
ifstream ifs;
ifs.open("BorrowingRecord.txt", ios::in);
if (!ifs.is_open())
{
cout << "文件打开失败" << endl;
return;
}
char c;
while ((c = ifs.get()) != EOF)
{
cout << c;
}
ifs.close();
}
int main()
{
//第一人借计算机书记录
date d01(2020,11,28);
BorrowingRecord br01(d01,"123","1",1,3);
date d02(2021,9,15);
BorrowingRecord br02(d02,"123","1",2,3);
vector<BorrowingRecord> v11;
v11.push_back(br01);
v11.push_back(br02);
//第二人借计算机书记录
date d11(2021,10,1);
BorrowingRecord br11(d11,"123","2",1,3);
date d12(2022,3,15);
BorrowingRecord br12(d12,"123","2",2,3);
vector<BorrowingRecord> v12;
v12.push_back(br11);
v12.push_back(br12);
//计算机书总借书记录
vector<BorrowingRecord> v01;
v01.push_back(br01);
v01.push_back(br02);
v01.push_back(br11);
v01.push_back(br12);
//计算机书读者记录
Reader r01("1","张伟","计算机科学与技术","计算机4班",2,v11);
Reader r02("2","李华","材料化学","材料2班",2,v12);
vector<Reader> vr01;
vr01.push_back(r01);
vr01.push_back(r02);
//图书类记录
date d03(2017,6,25);
Books bk01("123","C++程序设计","林伟健","电子工业出版社",d03,3,100,20,v01);
vector<Books> vbk01;
vbk01.push_back(bk01);
//操作类
operation op(vbk01,vr01,v01);
date md01(2022,4,22);
BorrowingRecord mbr01(md01,"456","3",1,3);
vector<BorrowingRecord> mv11;
mv11.push_back(mbr01);
Reader mr01("3","胡聆儿","土木工程","土木3班",2,mv11);
date mb02(2015,11,11);
Books mbk01("456","土木工程设计","林贝贝","高等教育出版社",mb02,2,50,20,mv11);
//vbk01.push_back(mbk01);
op.BooksAdd(mbr01,mr01,mbk01);
// for(vector<Books>::iterator it=vbk01.begin();it!=vbk01.end();it++)
// {
// cout<<(*it)<<endl;
// }
//
// for(vector<Reader>::iterator it=vr01.begin();it!=vr01.end();it++)
// {
// cout<<(*it)<<endl;
// }
//
// for(vector<BorrowingRecord>::iterator it=v01.begin();it!=v01.end();it++)
// {
// cout<<(*it)<<endl;
// }
op.BooksOs();
op.BooksIs();
cout<<endl;
op.ReaderOs();
op.ReaderIs();
cout<<endl;
op.BorrowingRecordOs();
op.BorrowingRecordIs();
}