图书管理系统

一  代码

#include<bits/stdc++.h>
using namespace std;
class BookTime
{
    int year,month,day;
    public:
    BookTime()
    {
        int year=month=day=0;
    }
    BookTime(int y,int m,int d):year(y),month(m),day(d){};
    int getYear(){return year;}
    void setYear(int a){year=a;}
    int getMonth(){return month;}
    void setMonth(int b){month=b;}
    int getDay(){return day;}
    void setDay(int c){day=c;}
    bool operator<(const BookTime&d)const
    {
        return year!=d.year?year<d.year:month!=d.month?month<d.month:day<d.day;
    }
    void display();
    friend ostream&operator<<(ostream&os,BookTime&d);
    friend istream&operator>>(istream&is,BookTime&d);
};
void BookTime::display()
{
    cout<<year<<" "<<month<<" "<<day<<endl;
}
ostream&operator<<(ostream&os,BookTime&d)
{
    os<<d.year<<" ";
    os<<d.month<<" ";
    os<<d.day<<" ";
    return os;
}
istream&operator>>(istream&is,BookTime&d)
{
    is>>d.year>>d.month>>d.day;
    return is;
}
class Record
{
    int id;//书号
    int number;//学号
    int state;//借书,还书状态,0借,1未借
    BookTime start;//借书时间
    BookTime end;//还书时间
    //bool reborrow;//续借,
    public:
    Record(int i,BookTime s,int n):number(i),start(s),id(n)
    {if(s.getMonth()+2>12) {BookTime d(s.getYear()+1,s.getMonth()-10,s.getDay());end=d;}
        else {BookTime d(s.getYear(),s.getMonth()+2,s.getDay());end=d;}
    state=0;
    }
    Record()
    {
        BookTime start(0,0,0);
        BookTime end(0,0,0);
        id=0;
        number = 0;
        //reborrow = 0;
    }
    int getState(){return state;}
    int getNumber(){return number;}
    int getId(){return id;}
    //int getReborrow(){return reborrow;}
    BookTime getstart(){return start;}
    BookTime getend(){return end;}
    //void setReborrow(){reborrow=1;}
    void setState(bool n){state=n;}
    void setNumber(int a){number=a;}
    void setId(int b){id=b;}
    void setStart(BookTime t){start=t;}
    void setEnd()
    {
         BookTime e;
         if(end.getMonth()+1>12)
        e=BookTime(end.getYear()+1,end.getMonth()+1,end.getDay());
        else e=BookTime(end.getYear()+1,end.getMonth(),end.getDay());end=e;
    }
    Record (BookTime t1,BookTime t2);
    friend istream&operator>>(istream&is,Record&r);
    friend ostream&operator<<(ostream&os,Record&r);
};
istream&operator>>(istream&is,Record&r)
{
    is>>r.number>>r.start>>r.id>>r.end>>r.state;
    return is;
}
ostream&operator<<(ostream&os,Record&r)
{
    os<<r.number<<" ";
    os<<r.start<<" ";
    os<<r.id<<" ";
    os<<r.end<<" ";
    os<<r.state<<endl;
    return os;
}
class RecordJ//基类
{
    protected:
    int n;
    vector<Record>v1;
    vector<Record>::iterator it1;
    multimap<int,int>map1;
    multimap<int,int>::iterator mit1;
public:
    void setN(int a){n=a;}
    vector<Record>getRecord(){return v1;}
    void addRecord(Record r1)
     {
        n+=1;
        r1.setState(0);
        v1.push_back(r1);
        int i=v1.size();
        map1.insert(make_pair(r1.getNumber(),i-1));
    }
     int searchRecord(int no)
    {
        mit1=map1.find(no);
        if(mit1!=map1.end())
        return mit1->second;
        else return -1;
    }
    void deleteRecord(int no)
    {
        int i;
        i=searchRecord(no);
        if(i!=-1) {v1[i].setState(0);}
    }
    int getState(int no,int id)
    {
        for(int b=0;b<n;b++)
        {
            if(v1[b].getState()==0&&v1[b].getNumber()==no&&v1[b].getId()==id) return 1;
        }
        return 0;
    }
    void setState(int no,int id)
    {
        for(int b=0;b<n;b++)
        {
            if(v1[b].getState()==0&&v1[b].getNumber()==no&&v1[b].getId()==id) v1[b].setState(1);
        }
    }
};
class BookInformation:public RecordJ
{
   string bname;//书名
   int id;//书号
   string author;//作者
   string publish;//出版社
   BookTime issue;//发行时间
   int sum;//每类书总数
   int left;//剩余量
   public:
   BookInformation()
   {
       id=sum=n=left=0;
   }
   BookInformation(int i,string c,string m,string d,BookTime e,int s,int l):id(i),bname(c),author(m),publish(d),issue(e),sum(s),left(l){n=0;}
   string getbname(){return bname;}
   int getId(){return id;}
   string getAuthor(){return author;}
   string getPublish(){return publish;}
   int getsum(){return sum;}
   BookTime getIssue(){return issue;}
   int getN(){return n;}
   int getleft(){return left;}
   int getborrow(){return sum-left;}
   void setSum(int h){sum=h;}
   //void setborrow(int i){borrow=i;}
   void setleft(int i){left=i;}
   void setBname(string a){bname=a;}
   void setAuthor(string b){author=b;}
   void setPublish(string d){publish=d;}
   void setIssue(BookTime t){issue=t;}
   void setN(int i){n=i;}
   void display(){cout<<id<<" "<<bname<<" "<<author<<" "<<publish<<" "<<issue;}
    friend ostream &operator <<(ostream&os,BookInformation&d);
    friend istream &operator >>(istream&is,BookInformation&d);
    bool operator<(const BookInformation &d2)const{return id<d2.id;}
};
istream &operator>>(istream&is,BookInformation&d)
{   is>>d.id;
    if(d.id==-1)
    return is;
    is>>d.bname>>d.author>>d.publish>>d.issue>>d.sum>>d.left>>d.n;
    Record r1;
     for(int a=0;a<d.n;a++)
        {
            is>>r1;
            d.v1.push_back(r1);
        }
     return is;
}
ostream &operator <<(ostream&os,BookInformation&d)
{
    os<<d.id<<" ";
    os<<d.bname<<" ";
    os<<d.author<<" ";
    os<<d.publish<<" ";
    os<<d.issue<<" ";
    os<<d.sum<<" ";
    os<<d.left<<" ";
    os<<d.n<<endl;
     for(int a=0;a<d.n;a++)
         {
             os<<d.v1[a]<<endl;
         }
    return os;
}
class Student:public RecordJ
{  string name;
   int number;
   string major;
   int borrows;//可以借书的总数
   int nowborrows;//当前借书数
   public:


Student()
{borrows=nowborrows=0;
}
Student(int i,string na,string a):number(i),name(na),major(a){borrows=nowborrows=n=0;}
    void setNumber(int i){number=i;}
    int getNumber(){return number;}
    void setName(string na){name=na;}
    string getName(){return name;}
    void setBorrows(int m){borrows=m;}
    int getBorrows(){return borrows;}
    void setNowborrows(int cb){nowborrows=cb;}
    int getNowborrows(){return nowborrows;}
    int getN(){return n;}
    void setN(int i){n=i;}
    string getMajor(){return major;}
    string setMajor(int b){major=b;}
    friend istream&operator>>(istream&is,Student&s);
    friend ostream&operator<<(ostream&os,Student&s);
    void operator=(Student&s)
{
    number=s.getNumber();
    name=s.getName();
    major=s.getMajor();
    borrows=s.getBorrows();
    nowborrows=s.getNowborrows();
    n=s.getN();
    v1=s.getRecord();
}
bool operator==(Student s)const
{
    return this->number==s.getNumber()?1:0;
}
};
istream&operator>>(istream&is,Student&s)
{
    is>>s.number;
    if(s.number==-1)
    return is;
    is>>s.name>>s.major>>s.nowborrows>>s.borrows>>s.n;
    Record r1;
    for(int a=0;a<s.n;a++)
        {
            is>>r1;
            s.v1.push_back(r1);
        }
    return is;
}
ostream&operator<<(ostream&os,Student&s)
{
    os<<s.number<<" ";
    os<<s.name<<" ";
    os<<s.major<<" ";
    os<<s.nowborrows<<" ";
    os<<s.borrows<<" ";
    os<<s.n<<endl;
    if(s.getN()!=0)
    for(int i=0; i<s.getN(); i++)
    os<<endl<<s.v1[i];
    return os;
}


class Manage
{   vector <BookInformation> b1;
    vector<BookInformation>::iterator it1;
    multimap<int,int>m1;//按书号
    multimap<int,int>::iterator mit1;
    vector <Student>b2;
    vector<Student>::iterator it2;
    multimap<int,int>m2;//按学号查找
    multimap<int,int>::iterator mit2;


public:
    Manage(){loadStudent();loadBookInformation();}
     ~Manage(){saveStudent();saveBookInformation();}
    void loadStudent();
    void saveStudent();
    void loadBookInformation();
    void saveBookInformation();
    //int searchStu(int);
    void addStudent();
    void dispAllStudent();
    void addBookInformation();
    void dispAllBookInformation();
};
void Manage::loadStudent()
{
    Student s;
    int i=0;
    ifstream infile("D:\\20171831.stu.txt",ios::in);
    if(!infile)
        return;
    b2.clear();
    m2.clear();
    while(infile>>s)
    {
        b2.push_back(s);
        m2.insert(make_pair(s.getNumber(),i));
        i++;
    }
    infile.close();
}
void Manage::loadBookInformation()
{
    BookInformation B;
    int i=0;
    ifstream infile("D:\\20171831.book.txt",ios::in);
    if(!infile)
        return;
    b1.clear();
    m1.clear();
    while(infile>>B)
    {
        b1.push_back(B);
        m1.insert(make_pair(B.getId(),i));
        i++;
    }
    infile.close();
}
void Manage::saveStudent()
{
    ofstream outfile("D:\\20171831.stu.txt",ios::out);
    if(!outfile)
        return ;
    for(it2=b2.begin(); it2!=b2.end(); it2++)
    {
        outfile<<*it2;
    }
    outfile.close();


}
void Manage::saveBookInformation()
{
    ofstream outfile("D:\\20171831.book.txt",ios::out);
    if(!outfile)
        return;
    for(it1=b1.begin(); it1!=b1.end(); it1++)
    {
        outfile<<*it1;
    }
    outfile.close();
}
void Manage::addBookInformation()
{
    BookInformation B;
    int i;
    while(1)
    {   cin>>B;
        if(B.getId()==-1)
        break;
        b1.push_back(B);
        i=b1.size();
        m1.insert(make_pair(B.getId(),i-1));
    }
}
void Manage::dispAllBookInformation()
  {
      for(it1=b1.begin();it1!=b1.end();it1++)
                   cout<<*it1;
  }
void Manage::addStudent()
 {
     Student s;
     int i;
     while(1)
     {cin>>s;
         if(s.getNumber()==-1)
         break;
         b2.push_back(s);
         i=b2.size();
         m2.insert(make_pair(s.getNumber(),i-1));
     }
 }
 void Manage::dispAllStudent()
 {
     for(it2=b2.begin();it2!=b2.end();it2++)
     cout<<*it2;
 }
class Client
{
    Student s;
    BookTime t;
    vector<BookInformation>b3;
    vector<BookInformation>::iterator it3;
    multimap<int,int>m3;//按书号查找
    multimap<int,int>::iterator mit3;
    vector<Student>b4;
    vector<Student>::iterator it4;
    multimap<int,Student>m4;//避免学号错误,重新输入,还是存一遍方便验证
    multimap<int,Student>::iterator mit4;
public:
Client(int no)
{loadStudent();
loadBookInformation();
while(proveStudent(no)!=1)
 {
            cout<<"非法用户,请重输\n";
            cin>>no;
}
}
~Client(){saveBookInformation();saveStudent();}
void loadStudent();
void saveStudent();
void loadBookInformation();
void saveBookInformation();
int proveStudent(int a);
void borrow();
void back();
void dispAllBookInformation();
void display();
int searchBookInformation(int s);
};
void Client::loadStudent()
{
    ifstream infile("D:\\20171831.stu.txt",ios::in);
    if(!infile)
        return;
        m4.clear();
        int i=0;
    while(infile>>s)
    {
            b4.push_back(s);
            m4.insert(make_pair(s.getNumber(),s));
            i++;
    }
    infile.close();
}
void Client::loadBookInformation()
{
    BookInformation B;
    ifstream infile("D:\\20171831.book.txt",ios::in);
    if(!infile)
        return;
    b3.clear();
    m3.clear();
    int i=0;
    while(infile>>B)
    {
            b3.push_back(B);
            m3.insert(make_pair(B.getId(),i));
            i++;
    }
    infile.close();
}
int Client::proveStudent(int a)
    {
        mit4=m4.find(a);
        if(mit4!=m4.end())
        {
            s=mit4->second;
            return 1;
        }
        else return 0;
    }
void Client::saveStudent()
{   ofstream outfile("D:\\20171831.stu.txt",ios::out);
    if(!outfile)
        return;
    for(it4=b4.begin(); it4!=b4.end(); it4++)
        {if(*it4==s)
        *it4=this->s;
        outfile<<*it4;}
    outfile.close();
}
void Client::saveBookInformation()
{
    ofstream outfile("D:\\20171831.book.txt",ios::out);
    if(!outfile)
        return;
    for(it3=b3.begin(); it3!=b3.end(); it3++)
    {
        outfile<<*it3;
    }
    outfile.close();
}
int Client::searchBookInformation(int s)
{
    mit3=m3.find(s);
    if(mit3!=m3.end())
    {
        return mit3->second;
    }
    else
        return -1;
}
void Client::borrow()
{


    int id;
    BookTime t;
    cout<<"请输入书号:";
    cin>>id;
    cout<<"请输入借书时间:";
    cin>>t;
    int i=searchBookInformation(id);
        if(i!=-1&&s.getNowborrows()>0&&b3[i].getleft()>0)
        {
            b3[i].setleft(b3[i].getleft()-1);
            s.setNowborrows(s.getNowborrows()-1);
            Record r(s.getNumber(),t,id);
            b3[i].addRecord(r);
            s.addRecord(r);
            }
}
void Client::back()
{   int id;
    cout<<"请输入书号:";
    cin>>id;
    int i=searchBookInformation(id);
    if(b3[i].getState(s.getNumber(),id)==1)
        {s.setState(s.getNumber(),id);
        b3[i].setState(s.getNumber(),id);
        b3[i].setleft(b3[i].getleft()+1);
        s.setNowborrows(s.getNowborrows()+1);}


}
void Client::dispAllBookInformation()
{
    if(b3.size()!=0)
    for(it3=b3.begin();it3!=b3.end();it3++)
    cout<<*it3;
}
void Client::display()
{
    cout<<s;//输出当前学生的信息
}
int main()
{
/*
Manage m;
m.addBookInformation();
m.dispAllBookInformation();
m.addStudent();
m.dispAllStudent();
*/
int i;
cin>>i;
Client c(i);
c.back();
c.dispAllBookInformation();
c.display();
return 0;




}

二 心得

首先这个系统我做了很多遍,之前的那几遍都是不符合老师的要求,这一遍才符合了老师的要求,因为书籍和读者都有一些基本信息,他们有相似之处,所以我写了一个基类,然后通过继承调用基类的信息。收获主要是对STL的理解以积极对文件操作的掌握,通过使用STL和文件操作,这个系统实现了对用户和图书的增加功能,以及借书还书,这些数据的变化在相应的txt中会显示出来 。具体功能的实现见源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值