0
点赞
收藏
分享

微信扫一扫

C++图书管理系统及相应文件的创建与输出

凶猛的小白兔 2022-04-29 阅读 68
c++

数据类:
基础类:读者最大借书量、最长借书时间(按天计算)。这两个都是类成员;
日前类:包括年月日,重载输入运算符时,要进行数据的合法性检验;重载输出运算符时,按照“年/月/日”形式输出,重载+运算符;
借阅记录类:包括日期、书号、读者学号、类型(借出/还回/续借)、图书类型(基础/文学休闲/专业);
读者类:学号、姓名、专业、班级、已借图书数量、借阅记录向量;
图书类∶书号、书名、作者、出版社、出版日期、图书类型(基础/文学休闲/专业)、馆藏总量、在馆数量、借阅记录向量;


操作类:
数据成员:图书/学生/借阅记录向量;
成员函数:对图书进行文件读写、在图书向量内完成对图书基本信息的增删查改;
对学生进行文件读写、在学生向量内完成对学生基本信息的增删查改;借阅记录的管理和统计功能后续添加;
作业要求:
程序能够正常运行,数据文件要经过多次运行测试,每次运行,内容要有相应的变化。数据用真实的,不要出现张三、李四这样的名字,数据不要在记事本中添加,一起通过程序搞定。

#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();


}
举报

相关推荐

0 条评论