图书馆管理系统---总结

一,实现目标

    对于用户,能够实现,查询书目,借书,续借,还书,查询当前在借书目

    对于管理员,能够实现,增加书目,查询书目,删除书目,改变书目信息;增加用户,查询用户,更改用户信息,删除用户

二,代码实现

#include<bits/stdc++.h>
using namespace std;

class Time//年月日
{
    int year;
    int month;
    int day;
public:
    Time();
    Time(int a,int b,int c);
    Time(const Time &);//fu zhi gou zao;
    Time& operator=(const Time &);//chong zai

    void addTime(Time x);//在某一时间的基础上,续借或者借书,应还时间自增两个月
    int getYear(){return year;}
    int getMonth(){return month;}
    int getDay(){return day;}
    bool operator <(const Time obj)const
    {  return year<obj.year?true:month<obj.month?true:day<obj.day?true:false;}

    friend ostream &operator<<(ostream &os,const Time &obj);
    friend istream &operator>>(istream &is,Time &obj);

//    friend ostream &operator<<(ostream &os,const stu_record &obj);
//    friend istream &operator>>(istream &is,stu_record &obj);
//    friend ostream &operator<<(ostream &os,const book_record &obj);
//    friend istream &operator>>(istream &is,book_record &obj);
};
Time::Time()
{
    year=month=day=0;
}
Time::Time(int a,int b,int c)
{
    year=a;
    month=b;
    day=c;
}
Time::Time(const Time & obj)
{
    year=obj.year;
    month=obj.month;
    day=obj.day;
}
Time &Time::operator=(const Time &obj)
{
    year=obj.year;
    month=obj.month;
    day=obj.day;
    return *this;
}
ostream &operator<<(ostream &os,const Time &obj)
{
    os<<obj.year<<" ";
    os<<obj.month<<" ";
    os<<obj.day;
    return os;
}
istream &operator>>(istream &is,Time &obj)
{
    is>>obj.year;
    is>>obj.month;
    is>>obj.day;
    return is;
}
void Time::addTime(Time x)
{
    if(x.month+2>12)
    {
        year=x.year+1;
        month=x.month+2-12;
        day=x.day;  //cout<<endl<<"x.month="<<x.month<<endl;
    }
    else
    {   year=x.year;
        month=x.month+2;
        day=x.day;
    }
}

class book_record//一本确切的书所经历过的一个人和事
{
    string stuName;//借书学生姓名
    int stuNum;//学生学号
    Time lendTime;//该书借出时间
    Time shouldBackTime;//应还时间
    Time realBackTime;//实际还书时间
public:
    book_record();
    book_record(string a,int b,Time c);//借书人姓名,学号,借书时间
    book_record(const book_record &);//复制构造函数
    book_record &operator=(const book_record &obj);

    void realBack(Time backT);

    string getStuName(){return stuName;}//借书学生姓名
    int getStuNum(){return stuNum;}//学生学号
    Time getLendTime(){return lendTime;}//该书借出时间
    Time getShouldBackTime(){return shouldBackTime;}
    Time getRealBackTime(){return realBackTime;}//实际还书时间

    friend ostream &operator<<(ostream &os,const book_record &obj);
    friend istream &operator>>(istream &is,book_record &obj);
};
book_record::book_record()
{
    stuName="sdau";//借书学生姓名
    stuNum=11111111;//学生学号
    //时间类的对象有其自己的初始值,不用初始化
}
book_record::book_record(string a,int b,Time c)
{
    stuName=a;//借书学生姓名
    stuNum=b;//学生学号
    lendTime=c;//该书借出时间
    shouldBackTime.addTime(c);//应还时间
}
book_record::book_record(const book_record & obj)//复制构造函数
{
    stuName=obj.stuName ;//借书学生姓名
    stuNum=obj.stuNum ;//学生学号
    lendTime=obj.lendTime ;//该书借出时间
    shouldBackTime=obj.shouldBackTime ;//应还时间
    realBackTime=obj.realBackTime ;//实际还书时间
}
book_record &book_record::operator=(const book_record &obj)
{
    stuName=obj.stuName ;//借书学生姓名
    stuNum=obj.stuNum ;//学生学号
    lendTime=obj.lendTime ;//该书借出时间
    shouldBackTime=obj.shouldBackTime ;//应还时间
    realBackTime=obj.realBackTime ;//实际还书时间
    return *this;
}
void book_record::realBack(Time backT)
{
    realBackTime=backT;
}
ostream &operator<<(ostream &os,const book_record &obj)
{
    os<<obj.stuName<<endl;
    os<<obj.stuNum<<endl;
    os<<obj.lendTime<<endl;
    os<<obj.shouldBackTime<<endl;
    os<<obj.realBackTime<<endl;
    return os;
}
istream &operator>>(istream &is,book_record &obj)
{
    is>>obj.stuName;
    is>>obj.stuNum;
    is>>obj.lendTime;
    is>>obj.shouldBackTime;
    is>>obj.realBackTime;
    return is;
}

class Book
{
    int allBookNum;//该书的总册数
    int outBookNum;
    int remainBookNum;

    string bookName;
    string bookNum;
    string press;

    int recos;//有多少条记录(包括隐藏的已还记录)

public:
    vector<book_record> record;
    vector<book_record>::iterator pv_br1,pv_br2;

    multimap<int,book_record> map1;//按学号查找
    multimap<int,book_record>::iterator pm_br1,pm_br2;

    Book();
    Book(int all,string bName,string bNum,string pre);
    Book(const Book &); //Book &operator=(const Book &);

    int getAllBookNum(){return allBookNum;}//该书的总册数
    int getOutBookNum(){return outBookNum;}
    int getRemainBookNum(){return remainBookNum;}
    string getBookName(){return bookName;}
    string getBookNum(){return bookNum;}
    string getPress(){return press;}
    int getRecos(){return recos;}

    void setBookNum(int all);//设置书的总册数(不可少于当前外借的数目)
    int setOutBookNum(int n){outBookNum+=n;}
    int setRemainBookNum(int n){remainBookNum+=n;}

    void addRecord(book_record r1){record.push_back(r1);}
    void addLendRecord(string name,int num,Time lend);
    void addBackRecord(int stuNum,Time t);

    friend ostream &operator<<(ostream &os,const Book &obj);
    friend istream &operator>>(istream &is,Book &obj);
};
Book::Book()
{
    allBookNum=0;
    outBookNum=0;
    remainBookNum=allBookNum-outBookNum;
    bookName="SDAU";
    bookNum="11111111";
    press="SDAU";
    recos=0;
}
Book::Book(int all,string bName,string bNum,string pre)
{
    allBookNum=all;
    outBookNum=0;//创建一本书时不能有外借的量;
    remainBookNum=all-outBookNum;
    bookName=bName;
    bookNum=bNum;
    press=pre;
    recos=0;//p_map=map1.begain();
}
Book::Book(const Book &obj)
{
    allBookNum=obj.allBookNum;
    outBookNum=obj.outBookNum;//创建一本书时不能有外借的量;
    remainBookNum=obj.remainBookNum;
    bookName=obj.bookName;
    bookNum=obj.bookNum;
    press=obj.press;
    recos=obj.recos;

    record=obj.record;
}
ostream &operator<<(ostream &os,const Book &obj)
{
    os<<obj.bookName<<endl;
    os<<obj.bookNum<<endl;
    os<<obj.press<<endl;
    os<<obj.allBookNum<<endl;
    os<<obj.outBookNum<<endl;
    os<<obj.remainBookNum<<endl;
    os<<obj.recos<<endl;
    if(obj.recos>0)
    for(int i=0;i<=obj.recos-1;i++)
    {
        os<<obj.record[i];
        os<<endl;
    }
    return os;
}
istream &operator>>(istream &is,Book &obj)
{
    is>>obj.bookName;
    is>>obj.bookNum;
    is>>obj.press;
    is>>obj.allBookNum;
    is>>obj.outBookNum;
    is>>obj.remainBookNum;
    is>>obj.recos;
    if(obj.recos>0)
    {
        book_record r1;
        for(int i=1;i<=obj.recos;i++)
        {
            //cout<<"i="<<i<<endl;
            is>>r1;
            obj.record.push_back(r1);
        }
    }
    return is;
}
void Book::setBookNum(int all)//设置书的总册数(不可少于当前外借的数目)
{
    if(all>=outBookNum)
    {
        allBookNum=all;//outBookNum=out;
        remainBookNum=all-outBookNum;
    }
}
void Book::addLendRecord(string Sname,int Snum,Time lend)
{
    book_record r1(Sname,Snum,lend);
    recos++;
    outBookNum++;//借出数目加一
    remainBookNum--;//剩余数目减一;
    record.push_back(r1);//增加一条记录//cout<<"r1="<<r1<<endl;
    map1.insert(make_pair(Snum,r1));//cout<<"recos="<<recos<<endl;//cout<<"record[0]="<<record[0]<<endl;
}
void Book::addBackRecord(int stuNum,Time t)
{
    pv_br1=record.begin();//在vector里按学号查找到该学生的记录
    pv_br2=record.end();
    for(pv_br1;pv_br1!=pv_br2;pv_br1++)
    {
        if(pv_br1->getStuNum()==stuNum)
        {
            pv_br1->realBack(t);//将vector中该学生对于这本书的操作添加还书时间
        }
    }
    pm_br1=map1.find(stuNum);//在map里按学号查找到该学生的记录

    for(int i=1;i<=map1.count(stuNum);i++)
    {
        pm_br1->second.realBack(t);//将这个学生所有关于这本书的借阅信息都隐藏
        pm_br1++;
    }
    pm_br1--;//找到最后一条操作

    book_record r1;
    r1=pm_br1->second;
    r1.realBack(t);//再添加一条正经的还书记录
    record.push_back(r1);
    recos++;
    map1.insert(make_pair(stuNum,r1));

    outBookNum--;//借出数目减一;
    remainBookNum++;
}


class stu_record//一个学生所经历过的书和事
{
    string bookName;//书名
    string bookNum;//书号
    string press;//出版社
    Time lendTime;//该学生借出时间
    Time shouldBackTime;//应还时间
    Time realBackTime;//实际还书时间
public:
    stu_record();
    stu_record(string book,string bookN,string pre, Time lend);//书名,书号,出版社,借书时间
    stu_record(const stu_record &);//复制构造函数

    int getYear(){if (realBackTime.getYear()==1)return 1;else return 0;}
    string getBookNum(){return bookNum;}
    string getBookName(){return bookName;}
    Time getLendTime(){return lendTime;}
    Time getShouldBackTime(){return shouldBackTime;}

    void realBack(Time backT);

    friend ostream &operator<<(ostream &os,const stu_record &obj);
    friend istream &operator>>(istream &is,stu_record &obj);
};
stu_record::stu_record()
{
    bookName="SDAU";
    bookNum="11111111";
    press="SDAU";
    Time a(0,0,0);
    lendTime=shouldBackTime=realBackTime=a;

}
stu_record::stu_record(string book,string bookN,string pre,Time lend)
{
    bookName=book;
    bookNum=bookN;
    press=pre;
    lendTime=lend;
    shouldBackTime.addTime(lendTime);
    Time a(0,0,0);
    realBackTime=a;
}
stu_record::stu_record(const stu_record & obj)//复制构造函数
{
    bookName=obj.bookName;//借书学生姓名
    bookNum=obj.bookNum;//书号
    press=obj.press;//出版社
    lendTime=obj.lendTime;//该书借出时间
    shouldBackTime=obj.shouldBackTime;//应还时间
    realBackTime=obj.realBackTime;//实际还书时间
}
void stu_record::realBack(Time backT)
{
    realBackTime=backT;
}
ostream &operator<<(ostream &os,const stu_record &obj)
{
    os<<obj.bookName<<endl;
    os<<obj.bookNum<<endl;
    os<<obj.press<<endl;
    os<<obj.lendTime<<endl;
    os<<obj.shouldBackTime<<endl;
    os<<obj.realBackTime<<endl;
    return os;
}
istream &operator>>(istream &is,stu_record &obj)
{
    is>>obj.bookName;
    is>>obj.bookNum;
    is>>obj.press;
    is>>obj.lendTime;
    is>>obj.shouldBackTime;
    is>>obj.realBackTime;
    return is;
}

class Student
{
    string stuName;//学生姓名
    int stuNum;//学号
    string stuClass;//班级

    int hadBookNum;//已有书的数目
    int mistake;//违规次数
    int maxBookNum;

    int recors;//操作次数
public:
    vector<stu_record> record;//学生操作记录
    vector<stu_record>::iterator pv_sr1,pv_sr2;

    multimap<string,stu_record> map_num;
    multimap<string,stu_record>::iterator pm_num;

    multimap<string,stu_record> map_name;
    multimap<string,stu_record>::iterator pm_name;

    Student();
    Student(string name,int num,string clas);

    int getRecors(){return recors;}
    string getStuName(){return stuName;}
    int getStuNum(){return stuNum;}
    int getHadBookNum(){return hadBookNum;};//已有书的数目
    int getMistake(){return mistake;};//违规次数
    int getMaxBookNum(){return maxBookNum;};

    void addRecord(stu_record r1){record.push_back(r1);}
    void lendBook(string bName,string bNum,string pre1,Time t1);
    void backBook_name(string bName,Time t1);
    void backBook_num(string bNum,Time t1);

    int setRecors(int n){recors+=n;}
    int setHadBookNum(int n){hadBookNum+=n;};//已有书的数目
    void setMaxBookNum(int x){maxBookNum=x;}
    void setMistake(int x){mistake+=x;}

    friend ostream &operator<<(ostream &os,const Student &obj);
    friend istream &operator>>(istream &is,Student &obj);
};
Student::Student()
{
    stuName="SDAU";//学生姓名
    stuNum=11111111;//学号int
    stuClass="00级00专业00班";//班级
    hadBookNum=0;//已有书的数目
    mistake=0;//违规次数
    recors=0;//操作次数
    maxBookNum=10;//默认可借10 本
}
Student::Student(string name,int num,string clas)
{
    stuName=name;//学生姓名
    stuNum=num;//学号int
    stuClass=clas;//班级
    hadBookNum=0;//已有书的数目
    mistake=0;//违规次数
    recors=0;//操作次数
    maxBookNum=10;//默认可借10 本
}
void Student::lendBook(string bName,string bNum,string pre1,Time t1)
{
    //Time t1(2018,6,4);
    stu_record r1(bName,bNum,pre1,t1);//记录数加一
    record.push_back(r1);
    recors++;//增加一条记录
    map_num.insert(make_pair(bNum,r1));
    map_name.insert(make_pair(bName,r1));  //两个map各加一
    hadBookNum++;  //当前借阅数目++;
}

void Student::backBook_name(string bName,Time t1)
{
    pv_sr1=record.begin();//在vector里按学号查找到该学生的记录
    pv_sr2=record.end();
    for(pv_sr1;pv_sr1!=pv_sr2;pv_sr1++)
    {
        if(pv_sr1->getBookName()==bName)
        {
            pv_sr1->realBack(t1);//将vector中该学生对于这本书的操作也隐藏
        }
    }

    pm_name=map_name.find(bName);//隐藏mapname中该学生对本书的操作隐藏
    for(int i=1;i<=map_name.count(bName);i++)
    {
        pm_name->second.realBack(t1);//将这个学生所有关于这本书的借阅信息都隐藏
        pm_name++;
    }
    pm_name--;//找到最后一条操作

    string num2;//隐藏mapnum中该学生对本书的操作隐藏
    num2=pm_name->second.getBookNum();
    pm_num=map_num.find(num2);
    for(int i=1;i<=map_num.count(num2);i++)
    {
        pm_num->second.realBack(t1);//将这个学生所有关于这本书的借阅信息都隐藏
        pm_num++;
    }
    pm_num--;//找到最后一条操作

    stu_record r1 ;//修改完以前的数据,增加新的记录;
    r1=pm_name->second;
    r1.realBack(t1);
    record.push_back(r1);
    recors++;
    map_name.insert(make_pair(bName,r1));
    map_num.insert(make_pair(pm_name->second.getBookNum(),r1));
    hadBookNum++;
}
void Student::backBook_num(string bNum,Time t1)
{

    pv_sr1=record.begin();//在vector里按学号查找到该学生的记录
    pv_sr2=record.end();
    for(pv_sr1;pv_sr1!=pv_sr2;pv_sr1++)
    {
        if(pv_sr1->getBookNum()==bNum)
        {
            pv_sr1->realBack(t1);//将vector中该学生对于这本书的操作也隐藏
        }
    }

    pm_num=map_num.find(bNum);
    for(int i=1;i<=map_num.count(bNum);i++)
    {
        pm_num->second.realBack(t1);//将这个学生所有关于这本书的借阅信息都隐藏
        pm_num++;
    }
    pm_num--;//找到最后一条操作

    string name2;
    name2=pm_num->second.getBookName();

    pm_name=map_name.find(name2);
    for(int i=1;i<=map_name.count(name2);i++)
    {
            pm_name->second.realBack(t1);//将这个学生所有关于这本书的借阅信息都隐藏
            pm_name++;
    }
    pm_name--;//找到最后一条操作

    stu_record r1 ;
    r1=pm_num->second;
    r1.realBack(t1);
    record.push_back(r1);
    recors++;
    map_num.insert(make_pair(bNum,r1));
    map_num.insert(make_pair(pm_num->second.getBookNum(),r1));

    hadBookNum--;
}
ostream &operator<<(ostream &os,const Student &obj)
{
    os<<obj.stuName<<endl;
    os<<obj.stuNum<<endl;
    os<<obj.stuClass<<endl;
    os<<obj.hadBookNum<<endl;
    os<<obj.maxBookNum<<endl;
    os<<obj.mistake<<endl;
    os<<obj.recors<<endl;
    if(obj.recors>0)
    for(int i=0;i<=obj.recors-1;i++)
    {
        os<<obj.record[i];
        os<<endl;
    }
    return os;
}
istream &operator>>(istream &is,Student &obj)
{
    is>>obj.stuName;
    is>>obj.stuNum;
    is>>obj.stuClass;
    is>>obj.hadBookNum;
    is>>obj.maxBookNum;
    is>>obj.mistake;
    is>>obj.recors;
    if(obj.recors>0)
    {
        stu_record sr1;
        for(int i=1;i<=obj.recors;i++)
        {
            is>>sr1;
            obj.record.push_back(sr1);
        }
    }
    return is;
}

class Manager
{
public:
    vector<Student> students;
    vector<Student>::iterator pv_S1,pv_S2;

    multimap<int,Student> map_stu;
    multimap<int,Student>::iterator pm_S1;


    vector<Book> books;
    vector<Book>::iterator pv_B1,pv_B2;

    multimap<string,Book> map_bookName;
    multimap<string,Book>::iterator pm_bName,pm1,pm2;

    multimap<string,Book> map_bookNum;
    multimap<string,Book>::iterator pm_bNum;


    Manager(){loadStu();loadBook();}
    ~Manager(){saveStu();saveBook();}
    void addStu(string sName,int sNum,string sClas);//创建一个用户需要基本信息
    void loadStu();//读入学生信息
    void saveStu();//将学生信息写入文件

    void addBook(int allNum,string bName,string bNum,string pre);//创建一本书;
    void loadBook();//读入书的信息
    void saveBook();//将书的信息写入文件
};
void Manager::addStu(string sName,int sNum,string sClas)//创建一个用户需要基本信息
{
    Student stu1(sName,sNum,sClas);
    students.push_back(stu1);
    map_stu.insert(make_pair(sNum,stu1));
}
void Manager::loadStu()//读入学生信息
{
//cout<<"1"<<endl;
    ifstream infile("student.txt",ios::in);//("d:\\Demo.txt",ios::in);//数据文件在d盘根目录下
    if(!infile)
    return ;
    students.clear();
    map_stu.clear();
    Student b;
    while(infile>>b)
    {
        Student B;
        B=b;//将除了记录之外的信息加入books数组
        if(B.getRecors()>0)//如果从文件得到了记录不为零
        {
            stu_record re;//创建一个记录类的对象
            for(int i=1;i<=B.getRecors();i++)
            {
                infile>>re;
                B.addRecord(re);
            }
        }
        students.push_back(B);
        map_stu.insert(make_pair(b.getStuNum(),B));
    }
    infile.close();
}
void Manager::saveStu()//将学生信息写入文件
{
    ofstream outfile("student.txt",ios::out);//数据文件在d盘根目录下
    if(!outfile)
    return;
    for(pv_S1=students.begin();pv_S1!=students.end();pv_S1++)
    {
        outfile<<*pv_S1;
    }
    outfile.close();
}

void Manager::addBook(int allNum,string bName,string bNum,string pre)//创建一本书;
{
    Book b1(allNum,bName,bNum,pre);
    books.push_back(b1);
    map_bookName.insert(make_pair(b1.getBookName(),b1));
    map_bookNum.insert(make_pair(b1.getBookNum(),b1));
}
void Manager::loadBook()//读入书的信息
{
    ifstream infile("book.txt",ios::in);//("d:\\Demo.txt",ios::in);//数据文件在d盘根目录下
    if(!infile)
    return ;
    books.clear();
    map_bookName.clear();
    map_bookNum.clear();
    Book b;
    while(infile>>b)
    {
        Book B;
        B=b;
        //books.push_back(b);//将除了记录之外的信息加入books数组
        if(B.getRecos()>0)//如果从文件得到了记录不为零
        {
            book_record re;//创建一个记录类的对象
            for(int i=1;i<=B.getRecos();i++)
            {
                infile>>re;
                B.addRecord(re);
            }
        }
cout<<B;
        books.push_back(B);
        map_bookNum.insert(make_pair(b.getBookNum(),B));
        map_bookName.insert(make_pair(b.getBookName(),B));
    }
    infile.close();
}
void Manager::saveBook()//将书的信息写入文件
{
    ofstream outfile("book.txt",ios::out);//数据文件在d盘根目录下
    if(!outfile)
    return;
    for(pv_B1=books.begin();pv_B1!=books.end();pv_B1++)
    {
        outfile<<*pv_B1;
    }
    outfile.close();
}


class StuClient
{
public:

    vector<Book> books;//学生只能查到在借的记录
    vector<Book>::iterator pb1,pb2;

    multimap<string,Book> map_bookName;
    multimap<string,Book>::iterator p_bookName,pm1,pm2;

    multimap<string,Book> map_bookNum;
    multimap<string,Book>::iterator p_bookNum;

    Student me;

    void lendBook(string bName,string bNum,string pre1,Time t1);
    void backBook_name(string bName,Time t1);
    void backBook_num(string bNum,Time t1);

    StuClient(int myNum);
    ~StuClient();
    void loadBook();
    void saveBook();
};
StuClient::StuClient(int myNum)
{
    loadBook();
    ifstream infile("student.txt",ios::in);//("d:\\Demo.txt",ios::in);//数据文件在d盘根目录下
    if(!infile)
    {
        return ;
    }
    Student b;
    while(infile>>b)
    {
        Student B;
        B=b;//books.push_back(b);//将除了记录之外的信息加入books数组
        if(B.getStuNum()==myNum)
        me=B;
    }
    infile.close();
}
StuClient::~StuClient()
{
    saveBook();
    vector<Student> students;
    vector<Student>::iterator pv1,pv2;
    ifstream infile("student.txt",ios::in);//("d:\\Demo.txt",ios::in);//数据文件在d盘根目录下

    if(!infile)
    {   return ;}
    Student b;
    while(infile>>b)
    {
        if(b.getStuNum()==me.getStuNum())
        {
            b=me;
        }
        students.push_back(b);
    }
    infile.close();
    ofstream outfile("student.txt",ios::out);//数据文件在d盘根目录下
    if(!outfile)
    return;
    for(pv1=students.begin();pv1!=students.end();pv1++)
    {
        outfile<<*pv1;
    }
    outfile.close();
}
void StuClient::loadBook()
{
    ifstream infile("book.txt",ios::in);//("d:\\Demo.txt",ios::in);//数据文件在d盘根目录下
    if(!infile)
    return ;
    books.clear();
    map_bookName.clear();
    map_bookNum.clear();
    Book b;
    while(infile>>b)
    {
        Book B;
        B=b;
        //books.push_back(b);//将除了记录之外的信息加入books数组
        if(B.getRecos()>0)//如果从文件得到了记录不为零
        {
            book_record re;//创建一个记录类的对象
            for(int i=1;i<=B.getRecos();i++)
            {
                infile>>re;
                B.addRecord(re);
            }
        }
        //cout<<B;
        books.push_back(B);
        map_bookNum.insert(make_pair(b.getBookNum(),B));
        map_bookName.insert(make_pair(b.getBookName(),B));
    }
    infile.close();
}
void StuClient::saveBook()
{
//cout<<"进入了savebook函数"<<endl;
    ofstream outfile("book.txt",ios::out);
    if(!outfile)
    return;
    for(pb1=books.begin();pb1!=books.end();pb1++)
    {
//cout<<"得到了一本书,为:"<<endl;
        outfile<<*pb1;
    }
    outfile.close();
}
void StuClient::lendBook(string bName,string bNum,string pre1,Time t1)
{
    if(me.getHadBookNum()<me.getMaxBookNum())//判断该学生是否可借
    {
        //对学生的记录
        me.lendBook(bName,bNum,pre1,t1);

        //对图书馆中的书也要添加该学生的记录,相应的数目也发生变化
        //找到该书位置
        pb1=books.begin();
        pb2=books.end();
        for(pb1;pb1!=pb2;pb1++)
        {
            if(pb1->getBookName()==bName)
            {
                pb1->addLendRecord(me.getStuName(),me.getStuNum(),t1);
                break;//弄完这本书就快跑
            }
        }
    }
    else
    {   if(me.getHadBookNum()==me.getMaxBookNum())
        {cout<<"您当前最大借阅数目为:"<<me.getHadBookNum()<<"  已借数目:"<<me.getMaxBookNum()<<"  借阅失败"<<endl;}
    }

}
void StuClient::backBook_name(string bName,Time t1)
{
    int num1=me.map_name.count(bName);//该书的操作次数
    if(num1==0)//验证是否借过该书
    { cout<<"无借书记录,不能进行此操作 "<<endl<<endl;}
    else
    {
        me.backBook_name(bName,t1);
        //对该书添加记录;
        //找到该书位置
        pb1=books.begin();
        pb2=books.end();
        for(pb1;pb1!=pb2;pb1++)
        {
            if(pb1->getBookName()==bName)//找到该书
            {
                pb1->addBackRecord(me.getStuNum(),t1);
            }
        }
    }
}
void StuClient::backBook_num(string bNum,Time t1)
{
    int num1=me.map_num.count(bNum);//该书的操作次数
    if(num1==0)//验证是否借过该书
    { cout<<"无借书记录,不能进行此操作 "<<endl<<endl;}
    else
    {
        me.backBook_num(bNum,t1);
        //对该书添加记录;
        //找到该书位置
        pb1=books.begin();
        pb2=books.end();
        for(pb1;pb1!=pb2;pb1++)
        {
            if(pb1->getBookNum()==bNum)//找到该书
            {
                pb1->addBackRecord(me.getStuNum(),t1);
            }
        }
    }
}

int main()
{
    // 1,加书加人
    /*Manager m1;
    m1.addBook(10,"《凡·高》","39655017","安徽文艺出版社");
    m1.addBook(10,"《诗经密码》","40462161","湖南文艺出版社");
    m1.addBook(10,"《自得其乐》","59404817","江苏凤凰文艺出版社");
    m1.addBook(10,"《高效能时间管理术》","08679815","中信出版社");
    m1.addBook(10,"《汪曾祺散文精选》","35498847","长江文艺出版社");
    m1.addBook(10,"《高等数学》","97871154","人民邮电出版社");

    m1.addStu("郭忠浩",20171830,"17级计算机专业2班");
    m1.addStu("郭旭",20171314,"17级土木工程专业1班");
    m1.addStu("郭二苗",20170001,"17级计算机专业6班");
    m1.addStu("郭大宝",20175201,"17级金融专业1班");*/

//用户登录
    StuClient stu1(20171830);
    Time t1(2018,6,16);
    stu1.lendBook("《凡·高》","39655017","安徽文艺出版社",t1);
    stu1.lendBook("《汪曾祺散文精选》","35498847","长江文艺出版社",t1);
    stu1.backBook_name("《凡·高》",t1);
    cout<<stu1.me;
    stu1.backBook_num("35498847",t1);
    cout<<stu1.me;
    stu1.lendBook("《自得其乐》","59404817","江苏凤凰文艺出版社",t1);
    cout<<stu1.me;
    Time t2(2018,8,12);
    return 0;
}



//测试Time类的主函数


//测试时间类
//    Time t1;
//cout<<"t1="<<t1<<endl;
//    Time t2(2018,6,13);
//cout<<"t2="<<t2<<endl;
//
//    Time t3(t2);
//cout<<"t3(t3=t2)="<<t3<<endl;
//    t3=t1;
//cout<<"t3(t3=t1)="<<t3<<endl;
//
//    t2.addTime(t2);
//cout<<"t2+2="<<t2<<endl;
//    t2.addTime(t2);
//cout<<"t2+2="<<t2<<endl;
//    t2.addTime(t2);
//cout<<"t2+2="<<t2<<endl;
//    t2.addTime(t2);
//cout<<"t2+2="<<t2<<endl;
//    t2.addTime(t2);
//cout<<"t2+2="<<t2<<endl;
//
//cout<<"t2.Y="<<t2.getYear()<<"  t2.M="<<t2.getMonth()<<"  t2.D="<<t2.getDay()<<endl;
//return 0;

//测试book_record书的记录类
//    book_record br1;
//    cout<< "br1="<<br1<<endl;
//
//    Time t1(2018,6,13);
//    book_record br2("郭忠浩",20171830,t1);
//    cout<<"br2="<<br2<<endl;
//
//    book_record br3(br1);
//    cout<<"br3(br3=br1)="<<br3<<endl;
//
//    br3=br2;
//    cout<<"br3(br3=br2)="<<br3<<endl;
//
//    Time t2(2018,9,28);
//    br3.realBack(t2);
//    cout<<"br3(realBack)="<<br3<<endl;
//
//    cin>>br1;
//    cout<<"br1="<<br1<<endl;

    //测试书Book类
//    Book b1;
//    cout<<"b1="<<endl<<b1<<endl;
//
//    Book b2(10,"《孔雀森林》","27170001","长江文艺出版社");
//    cout<<"b2="<<endl<<b2<<endl;
//
//    Book b3(b2);
//    cout<<"b3(b3=b2)="<<endl<<b3<<endl;
//
//    b3.setBookNum(16);
//    cout<<"b3="<<endl<<b3<<endl;
//
//    Time t1(2018,6,13);
//    b3.addLendRecord("郭忠浩",20171830,t1);
//    cout<<"b3="<<endl<<b3<<endl;
//    b3.addLendRecord("郭旭",20171314,t1);
//    cout<<"b3="<<endl<<b3<<endl;
//
//    Time t2(2018,7,11);
//    b3.addBackRecord(20171830,t2);
//    cout<<"b3="<<endl<<b3<<endl;
//
//    cout<<"hey,boy,来测试一下输入运算符,输入一本带记录的书:"<<endl;
//    cin>>b1;
//    cout<<"b111="<<b1<<endl;

//测试stu_record类
//stu_record sr1;
//    cout<<"sr1="<<endl<<sr1<<endl;
//
//    Time t1(2018,6,16);
//    stu_record sr2("《飘》","27170003","北京邮电大学出版社",t1);
//    cout<<"sr2="<<endl<<sr2<<endl;
//
//    stu_record sr3(sr1);
//    cout<<"sr3(sr3=sr1)="<<endl<<sr1<<endl;
//
//    sr3=sr2;
//    cout<<"sr3(sr3=sr2)="<<endl<<sr3<<endl;
//
//    Time t2(2018,6,28);
//    sr3.realBack(t2);
//    cout<<"sr3="<<endl<<sr3<<endl;
//
//    cout<<sr3.getYear()<<endl;
//    cout<<sr3.getBookNum()<<endl;
//    cout<<sr3.getBookName()<<endl;
//    cout<<sr3.getLendTime()<<endl;
//    cout<<sr3.getShouldBackTime()<<endl;
//
//    cin>>sr1;
//    cout<<"ssssr1="<<endl<<sr1<<endl;

//测试student类
// Student s1;
//    cout<<"s1="<<endl<<s1<<endl;
//
//    Time t1(2018,6,15);
//    s1.lendBook("《飘》","27170001","外语教学与研究出版社",t1);
//    s1.lendBook("《飘飘》","27170002","外语教学与研究出版社2",t1);
//    cout<<"s1="<<endl<<s1<<endl;
//
//    s1.backBook_name("《飘飘》",t1);
//    s1.backBook_name("《飘》",t1);
//    cout<<"s1="<<endl<<s1<<endl;
//
//    Time t3(2018,6,19);
//    s1.lendBook("《硅谷之火》","27170004","中信出版社",t3);
//    s1.lendBook("《腾讯传》","27170007","人民教育出版社",t3);
//    cout<<"s1="<<endl<<s1<<endl;
//
//    Time t4(2018,6,22);
//    s1.backBook_num("27170004",t4);
//    s1.backBook_num("27170007",t4);
//    cout<<"s1="<<endl<<s1<<endl;
//    Student s2;
//    cin>>s2;
//    cout<<"s2="<<endl<<s2<<endl;

三,学习感悟

    系统快要写好时才反应过来可以使用继承,可以大大缩短代码量。而且其中还隐藏着bug,时间限制加上越写越烦躁,最后还是没能将功能全部实现。一个是要注意多加注释,一个是注意代码简洁性,那样在写较大的项目时,才不会越写越乱。

猜你喜欢

转载自blog.csdn.net/sodacoco/article/details/80958473