完整版图书管理系统含继承含多态,从系统提取时间

#include<bits/stdc++.h>

using namespace std;

class Date

{

   int year,month,day;

     public:

 

     Date(int x,int y,int z):year(x),month(y),day(z)  {}

     Date()  {year=0;month=0;day=0;}

 

     int getYear()  {return year;}

     int getMonth()  {return month;}

     int getDay()   {return day;}

 

     void setYear(int x)  {year=x;}

     void setMonth(int y)  {month=y;}

     void setDay(int z)   {day=z;}

 

     bool operator <(const Date&d);

 

     friend ostream &operator<<(ostream&os,const Date &d);

     friend istream &operator>>(istream&is,Date &d);

 

     };

 

     bool Date::operator<(const Date&d)

     {

         year!=d.year?year<d.year:month!=d.month?month<d.month:day!=d.day;

     }

 

   ostream &operator<<(ostream &os,const Date&d)

    {

       os<<d.year<<" ";

       os<<d.month<<" ";

       os<<d.day;

 

       return os;

    }

 istream&operator>>(istream&is,Date&d)

    {

       is>>d.year>>d.month>>d.day;

       return is;

    }

 

 

 

 

 class Record

{

   int xh;

   Date start;

   int sh;

   Date end;

   int state;//是否还书0未还1已还

   public:

       Record(int a5,Date a6,int a7,int a10):start(a6)

       {

           xh=a5;

           sh=a7;

           state=a10;

            if (a6.getMonth()+2>12)

       {

           Date d(a6.getYear()+1,a6.getMonth()-10,a6.getDay());

           end=d;

       }

       else

       {

                        Dated(a6.getYear(),a6.getMonth()+2,a6.getDay());

           end=d;

       }

 

 

 

       }

       Record()    {}

       int getXh()   {return xh;}

       Date getStart()  {return start;}

       int getSh()   {return sh;}

       Date getEnd()   {return end;}

       int  getState()  {return state;}

       void setXh(int a)   {xh=a;}

       void setStart(Date a1) {start=a1;}

       void setSh(int a2)   {sh=a2;}

       void  setEnd(Date a11)    {end=a11;}

       void   setState(int a4)  {state=a4;}

       friend ostream&operator<<(ostream&os,const Record&r);

        friendistream&operator>>(istream&is,Record&r);

 

 

};

 

 

 

 

 ostream&operator<<(ostream&os,const Record&r)

 {

    os<<r.xh<<" ";

    os<<r.start<<" ";

    os<<r.sh<<" ";

    os<<r.end<<" ";

    os<<r.state;

 

    return os;

 }

 istream&operator>>(istream&is,Record&r)

 {

    is>>r.xh>>r.start>>r.sh>>r.end>>r.state;

    return is;

 }

 

class Records

{

   protected:

       int number;

       vector <Record> v1;

       vector <Record> ::iterator it1;

       multimap<int,int>m2;

       multimap<int,int>::iterator mit2;//是否归还bool

 

   public:

       Records(){number=0;}

       int getNumber(){return number;}

       vector <Record>  &getRecord(){return v1;}

       multimap<int,int> & getM2(){return m2;}

      multimap<int,int>getMap()

   {

   return m2;

   }

       void setNumber(int x){number=x;}

       //无删除记录与增加记录Opbook类中和student类中这两个函数不同

       void dispRecord();//所有记录

       void disNobackRecord();//显示未还书记录

 

 

};

 

void Records::dispRecord()

{   if(number!=0)

{

 

 

   for(int i=0;i<v1.size();++i)

   cout<<v1[i]<<endl;

}

}

void Records::disNobackRecord()

{

   if(m2.find(0)!=m2.end())

       for(mit2=m2.lower_bound(0);mit2!=m2.upper_bound(0);++mit2)

           cout<<v1[mit2->second]<<endl;

   else cout<<"无记录"<<endl;

}

 

 

class Book:public Records

{

   int sh;

   string sm;

   string author;

   int max;//最大图数量

   int now;//图书库存量

   multimap<int,int>m1;

   multimap<int,int>::iterator mit1;

    public:

   Book(int b1,string b2,string b3,int b4,int b5)

   {   sh=b1;

       sm=b2;

       author=b3;

       max=b4;

       now=b5;

 

    }

   Book()  { }

   multimap<int,int>& getM1(){return m1;}

   int getSh()  {return sh;}

   string getSm()  {return sm;}

   string getAuthor()  {returnauthor;}

   int getMax()    {return max;}

   int getNow()    {return now;}

   void setSh(int b6)    {sh=b6;}

   void setSm(string b7)   {sm=b7;}

   void setAuthor(string b8)  {author=b8;}

   void setMax(int b9)   {max=b9;}

   void setNow(int b10)    {now=b10;}

   friend ostream&operator<<(ostream&os,const Book&b1);

   friend istream&operator>>(istream&is,Book&b1);

   void addRecord(Record r1);

   void deleteRecord(Record r1);

    int  search1(int no);

   void display();

 

 

};

void Book::display()

{

   cout<<sh<<" "<<sm<<""<<author<<" "<<max<<""<<now<<" "<<number<<endl;

}

int Book::search1(int no)//根据书号指针的变化,与查询,删除有关

{

  mit1=m1.find(no);

  if(mit1!=m1.end())//枚举使指针找到

     return mit1->second;

  else

     return -1;

}

void Book::deleteRecord(Record r1)

{

   r1.setState(1);

   v1.push_back(r1);

   int i=v1.size();

   m1.insert(make_pair(r1.getSh(),i-1));

}

 

void Book::addRecord(Record r1)

{

   r1.setState(0);

   v1.push_back(r1);

   int i=v1.size();

   m1.insert(make_pair(r1.getSh(),i-1));

}

istream&operator>>(istream&is,Book&b1)

{

   is>>b1.sh;

   if(b1.sh==-1)

   return is;

   is>>b1.sm>>b1.author>>b1.max>>b1.now>>b1.number;

   b1.v1.clear();

   if(b1.number!=0)

   {

 

 

   for(int u=0;u<b1.number;u++)

    {

       Record r;

       int i;

       {

           is>>r;

           b1.v1.push_back(r);

           i=b1.v1.size();

           b1.m1.insert(make_pair(r.getXh(),i-1));

       }

    }

   }

   return is;

}

ostream&operator<<(ostream&os,constBook&b1)

{

 

   os<<b1.sh;

   os<<" "<<b1.sm;

   os<<" "<<b1.author;

   os<<" "<<b1.max;

   os<<" "<<b1.now;

   os<<" "<<b1.number;

   os<<endl;

   if(b1.number!=0)

    {

 

 

   int i;

   for(i=0;i<b1.number;i++)

    {

       os<<b1.v1[i]<<endl;

    }

    }

   return os;}

class User:public Records

{

   int xh;

   string xm;

   string major;

   string mima;

 

   int max;

   int now;

 

    multimap<int,int>m1;

   multimap<int,int>::iterator mit1;

   public:

   User(int b1,string b2,string b3,string m,int b4,int b5):xh(b1)

    {

       xm=b2;

       major=b3;

       max=b4;

       now=b5;

       mima=m;

 

    }

   User()  {}

    multimap<int,int>& getM2(){return m2;}

   int getXh()  {return xh;}

   string getXm()  {return xm;}

   string getMajor()  {return major;}

   int getMax()    {return max;}

   int getNow()    {return now;}

   void setXh(int b6)    {xh=b6;}

   void setXm(string b7)   {xm=b7;}

   void setMajor(string b8)  {major=b8;}

   void setMax(int b9)   {max=b9;}

   void setNow(int b10)    {now=b10;}

   string  getMima()     {return mima;}

   void setMima(string  m)   {mima=m;}

   friend ostream&operator<<(ostream&os,const User&u1);

   friend istream&operator>>(istream&is,User&u1);

   void addRecord(Record r2);

   void deleteRecord(Record r2);

   int  search2(int no);

   void display();

   void operator=(User&ty)

    {

       xh=ty.xh;

       xm=ty.xm;

       major=ty.major;

       max=ty.max;

       now=ty.now;

       mima=ty.mima;

       number=ty.number;

       v1=ty.getRecord();

    }

   bool operator==(User u1)

    {

       return this->xh==u1.getXh()?1:0;

    }

 

 

};

void User::display()

{

   cout<<xh<<" "<<xm<<""<<mima<<" "<<major<<""<<max<<" "<<now<<""<<number<<endl;

}

int User::search2(int no)

{

  mit2=m2.find(no);

  if(mit2!=m2.end())

     return mit2->second;

  else

     return -1;

}

void User::deleteRecord(Record r1)

{

   r1.setState(1);

   v1.push_back(r1);

   int i=v1.size();

   m2.insert(make_pair(r1.getXh(),i-1));

}

 

void User::addRecord(Record r2)

{

   r2.setState(0);

   v1.push_back(r2);

   int i=v1.size();

   m2.insert(make_pair(r2.getXh(),i-1));

}

istream&operator>>(istream&is,User&u1)

{

   is>>u1.xh;

   if(u1.xh==-1)

   return is;

   is>>u1.xm>>u1.mima>>u1.major>>u1.max>>u1.now>>u1.number;

   Record x;

   int i;

   u1.v1.clear();

   if(u1.number!=0)

    {

       for(int a=0;a<u1.number;a++)

       {

           is>>x;

           u1.v1.push_back(x);

           i=u1.v1.size();

           u1.m2.insert(make_pair(x.getXh(),i-1));

       }

    }

   return is;

}

ostream&operator<<(ostream&os,constUser&u1)

{

 

   os<<u1.xh;

   os<<" "<<u1.xm;

   os<<" "<<u1.mima;

   os<<" "<<u1.major;

   os<<" "<<u1.max;

   os<<" "<<u1.now;

   os<<" "<<u1.number;

   os<<endl;

   if(u1.number!=0)

    {

       int i;

       for(i=0;i<u1.number;i++)

       {

           os<<u1.v1[i]<<endl;

       }

    }

   return os;

}

 

class queryBook

{

  protected:

   vector<Book>v3;

   vector<Book>::iterator it3;

   multimap<int,int> m3;

   multimap<int,int>::iterator mit3;

    public:

  int  search3(int h)

{

   mit3=m3.find(h);

   if(mit3!=m3.end())

    {

       return mit3->second;

    }

   else

   return -1;

}

 voidquery()

{ cout<<"请输入查询的书号"<<endl;

   int h;

   cin>>h;

   int i=search3(h);

   if(i!=-1)

   {v3[i].display();}

   cout<<"查询结束"<<endl;

}

};

 

 

 

 

 

class Person

{

   int no;   //账号;

   string pwd;  //密码;

   int type;  //=1是管理员;=0是用户 ;

   public:

   Person ()  {}

   Person (int no1,string pwd1,int f)

    {

       no=no1;

       pwd=pwd1;

       type=f;

    }

   int getNo(){return no;}

   string getPwd(){return pwd;}

   int getType(){return type;}

   friend ostream &operator<<(ostream&os,const Person &a)

    {

       os<<a.no<<" ";

       os<<a.pwd<<" ";

       os<<a.type<<endl;

       return os;

    }

   friend istream &operator>>(istream&is,Person &b)

    {

       is>>b.no;

       if(b.no==-1) return is;

       is>>b.pwd;

       is>>b.type;

       return is;

    }

};

 

 

 

 

class Manage:public queryBook

{

 

   vector<User>v4;

   vector<User>::iterator it4;

   multimap<int,int> m4;

   multimap<int,int>::iterator mit4;

     vector<Person>v5;

   vector<Person>::iterator it5;

     multimap<int,int> m5;

   multimap<int,int>::iterator mit5;  //根据账号查找

 

 

 

   public:

   Manage()

    {

       load1();

       load2();

       load5();

    }

   ~Manage()

    {

      save1();

      save2();

      save5();

    }

   void addBook();

   void disBook();

   void deleteBook();

   void modifySh();

   void modifyMax();

 

   void addUser();

   void disUser();

   void deleteUser();

   int search4(int h);

   int search5(int h);

   void queryUser();

   void clearUser();

   void clearBook();

 

   void load1();

   void load2();

   void load5();

   void save5();

   void save1();

   void save2();

 

 

 

};

 

 

int Manage::search5(int h)

{

   mit5=m5.find(h);

   if(mit5!=m5.end())

    {

       return mit5->second;

    }

   else

   return -1;

}

 

 

 

void Manage::clearBook()

{

   v3.clear();

}

void Manage::clearUser()

{

   v4.clear();

   v5.clear();

}

void Manage::modifySh()

    {

       cout<<"请输入要修改的书号"<<endl;

       int h;

       cin>>h;

       int i=search3(h);

       cout<<"请输入修改后的书号"<<endl;

       int n;

       cin>>n;

       v3[i].setSh(n);

       cout<<"修改结束"<<endl;

    }

 

 

void Manage::modifyMax()

    {

       cout<<"请输入要修改最大图书数目的书号"<<endl;

       int h;

       cin>>h;

       int i=search3(h);

       cout<<"请输入修改后的图书最大数目"<<endl;

       int n;

       cin>>n;

       v3[i].setMax(n);

       cout<<"修改结束"<<endl;

    }

 

void Manage::queryUser()

{  cout<<"请输入查询的学号"<<endl;

   int h;

   cin>>h;

   int i=search4(h);

   if(i!=-1)

   cout<<v4[i];

   cout<<"查询结束"<<endl;

}

int Manage::search4(int h)

{

   mit4=m4.find(h);

   if(mit4!=m4.end())

    {

       return mit4->second;

    }

   else

   return -1;

}

void Manage::deleteUser()

{  cout<<"请输入删除的学号"<<endl;

   int no;

   cin>>no;

   int i=search4(no);

   if(i!=-1)

   {it4=v4.begin()+i;

   m4.erase(m4.find(no));

   v4.erase(it4);

    }

 

 

   int y=search5(no);

   if(y!=-1)

   {it5=v5.begin()+y;

   m5.erase(m5.find(no));

   v5.erase(it5);

    }

   cout<<endl;

   cout<<"删除结束";

}

void Manage::disUser()

{  cout<<"显示用户"<<endl;

   for( it4=v4.begin();it4!=v4.end();++it4)

   cout<<*it4;

}

void Manage::addUser()

{  cout<<"请输入增加学生信息,当学号为-1结束"<<endl;

  User u;

   int i;

 

   while(1)

   {cin>>u;

 

       if(u.getXh()==-1)

       break;

       v4.push_back(u);

       i=v4.size();

       m4.insert(make_pair(u.getXh(),i-1));

       Person p(u.getXh(),u.getMima(),0);

       int o;

       v5.push_back(p);

 

       o=v5.size();

       m5.insert(make_pair(p.getNo(),o-1));

 

 

    }

   cout<<endl;

     cout<<"增加结束";

}

void Manage::addBook()

{  cout<<"请输入增加的图书信息,当书号为-1结束"<<endl;

   Book b;

   int i;

   while(1)

    {

       cin>>b;

       if(b.getSh()==-1)

       break;

       v3.push_back(b);

 

       i=v3.size();

       m3.insert(make_pair(b.getSh(),i-1));

    }

   cout<<endl;

   cout<<"增加结束";

 

}

 

void Manage::disBook()

{

   for(it3=v3.begin();it3!=v3.end();++it3)

   cout<<*it3;

 

}

void Manage::deleteBook()

{  cout<<"请输入删除图书书号"<<endl;

 

   int h;

   cin>>h;

   int i=search3(h);

   if(i!=-1)

   {it3=v3.begin()+i;

   m3.erase(m3.find(h));

   v3.erase(it3);

    }

   cout<<endl;

   cout<<"删除结束";

}

 

 

void Manage::load1()

{

  Book b;

   int i;

   ifstream infile("D:\\20171777book.txt",ios::in);

   if(!infile)

  {

       return ;}

   v3.clear();

   m3.clear();

 

   while(infile>>b)

   {v3.push_back(b);

   int i=v3.size();

   m3.insert(make_pair(b.getSh(),i-1));

 

    }

infile.close();

}

void Manage::load2()

{

  User a;

   int i;

   ifstream infile("D:\\20171777stu.txt",ios::in);

   if(!infile)

  {

       return ;}

   v4.clear();

   m4.clear();

 

   while(infile>>a)

   {v4.push_back(a);

   int i=v4.size();

   m4.insert(make_pair(a.getXh(),i-1));

 

    }

infile.close();

}

 

 

 

 

 

void Manage::load5()

{

  Person p;

   int i;

   ifstream infile("D:\\Person.txt",ios::in);

   if(!infile)

  {

       return ;}

   v5.clear();

   m5.clear();

 

   while(infile>>p)

   {v5.push_back(p);

     int i=v5.size();

   m5.insert(make_pair(p.getNo(),i-1));

 

 

    }

infile.close();

}

 

 

void Manage::save1()

{

   ofstream outfile("D:\\20171777book.txt",ios::out);

   if(!outfile)

  {

 

 

       return ;}

    for(it3=v3.begin();it3!=v3.end();it3++)

    {

       outfile<<*it3;

 

    }

   outfile.close();

}

void Manage::save2()

{

   ofstream outfile("D:\\20171777stu.txt",ios::out);

   if(!outfile)

    {

       return ;}

   for(it4=v4.begin();it4!=v4.end();it4++)

    {

       outfile<<*it4;

    }

   outfile.close();

}

void Manage::save5()

{

   ofstream outfile("D:\\Person.txt",ios::out);

   if(!outfile)

  {

 

 

       return ;}

   for(it5=v5.begin();it5!=v5.end();it5++)

    {

       outfile<<*it5;

 

    }

   outfile.close();

}

 

 

 

 

 

 

class Client:public queryBook

{

 

   User a;

 

   public:

   Client(int no)   //必须代参

    {

    load3();

    load4(no);

    }

   ~Client()

   {save3();

       save4();

}

void load3();

void save3();

void load4(int no);

void save4();

void borrow();

void back();

void display();

 

 

};

 

void Client ::display()

{

  cout<<a;

}

 

 

void Client::save3()

{

   ofstream outfile("D:\\20171777book.txt",ios::out);

   if(!outfile)

    {

       return ;}

       for(it3=v3.begin();it3!=v3.end();it3++)

       {

           outfile<<*it3;

       }

 

   outfile.close();

}

 

 

void Client::load3()

{

   Book b;

   int i;

   ifstream infile("D:\\20171777book.txt",ios::in);

   if(!infile)

  {

       return ;}

   v3.clear();

   m3.clear();

 

   while(infile>>b)

   {v3.push_back(b);

   int i=v3.size();

   m3.insert(make_pair(b.getSh(),i-1));

 

    }

infile.close();

}

 

 

void Client::load4(int no)

{

   User a;

   int i;

   ifstream infile("D:\\20171777stu.txt",ios::in);

   if(!infile)

    {

       return ;}

 

   while(infile>>a)

   {if(a.getXh()==no)

   this->a=a;

    }

infile.close();

}

 

 

 

void Client::save4()

{vector<User>v;

vector<User>::iterator it;

User u1;

   ifstream infile("D:\\20171777stu.txt",ios::in);

   if(!infile)

 {

       return ;}

   while(infile>>u1)

  {v.push_back(u1);}

   infile.close();

 

   ofstream outfile("D:\\20171777stu.txt",ios::out);

   if(!outfile)

    {

   return;}

   for(int i=0;i<v.size();i++)

      if(v[i].getXh()==a.getXh())

      { v[i]=a;

       outfile<<v[i];  }

      else

       outfile<<v[i];

   outfile.close();

}

 

 

 

void Client::borrow()

{

  int no;

   int q,w,e;

   int argc; char ** argv;

time_t temp;

struct tm *t;

time(&temp);

t= localtime(&temp);

       q=t->tm_year+1900;

       w=t->tm_mon+1;

       e=t->tm_mday;

     Date d1(q,w,e);

 

 cout<<"请输入图书书号"<<endl;

  int h;

  cin>>h;

  int b=search3(h);

 

 

 

 

  if(a.getNow()<=a.getMax()&&a.getNow()>0)

  {   int u=a.getNumber();

     a.setNumber(u+1);

     int k=v3[b].getNumber();

     v3[b].setNumber(k+1);

      v3[b].setNow(v3[b].getNow()-1); //剩余书本减一

      a.setNow(a.getNow()-1);//可借书本数

      Record r(a.getXh(),d1,h,0);

      cout<<r;

      v3[b].addRecord(r);

      a.addRecord(r);

}

}

void Client::back()

{

     int no;

   int q,w,e;

   int argc; char ** argv;

time_t temp;

struct tm *t;

time(&temp);

t= localtime(&temp);

       q=t->tm_year+1900;

       w=t->tm_mon+1;

       e=t->tm_mday;

     Date d1(q,w,e);

cout<<"请输入归还图书书号"<<endl;

  int h;

  cin>>h;

  intb=search3(h);

 

  intu=a.getNumber();

     a.setNumber(u+1);

     int k=v3[b].getNumber();

     v3[b].setNumber(k+1);

   v3[b].setNow(v3[b].getNow()+1);

   a.setNow(a.getNow()+1);

 

  Record r(a.getXh(),d1,h,1);

 v3[b].deleteRecord(r);

   a.deleteRecord(r);

 

 

 

}

 

class CheckIn   //登陆类;

{

   public:

   CheckIn(){load();}

   void load();

   virtual void login()=0;  //纯虚函数;

   protected:

   vector<Person>pv;

   vector<Person>::iterator pt;

   multimap<int,int> mu; //按照账号查询;

   multimap<int,int>::iterator muit;

};

void CheckIn::load()

{

   Person p;

   ifstream infile("D:\\Person.txt",ios::in);

   if(!infile)

   return;

   pv.clear();

   mu.clear();

   int i=0;

   while(infile>>p)

    {

       pv.push_back(p);

       mu.insert(make_pair(p.getNo(),i));

       i++;

    }

   infile.close();

}

 

 

 

class UserCheckin:public CheckIn

{

 public:

 void login()

  {

     int hao;

     string mima;

     cin>>hao>>mima;

     if(mu.find(hao)!=mu.end())

     {

         multimap<int,int>::iteratormulow=mu.lower_bound(hao),muupp=mu.upper_bound(hao);

         for(muit=mulow;muit!=muupp;muit++)

         {

             if(pv[muit->second].getPwd()==mima&&!pv[muit->second].getType())

              {

                  cout<<"欢迎用户登陆"<<endl;

 

                 Client s1(hao);

                 //s1.display();   //显示用户信息

                 //s1.borrow();   //借书

                //s1.borrow();

                // s1.back();     //还书

                 s1.query();   //查询图书

              }

         }

     }

  }

};

 

class AdminCheckIn:public CheckIn

{

 public:

 void login()

  {

     int hao,flag;

     string mima;

      for(int i=0;i<3;i++)

     {

         cin>>hao>>mima;

         if(mu.find(hao)!=mu.end())

       {

         multimap<int,int>::iteratormulow=mu.lower_bound(hao),muupp=mu.upper_bound(hao);

         for(muit=mulow;muit!=muupp;muit++)

           if(pv[muit->second].getPwd()==mima&&pv[muit->second].getType()==1)

              {

                  cout<<"欢迎管理员登陆"<<endl;

 

                   Manage ma1;

                  // ma1.addBook();  //

                  // ma1.addUser();

                   //ma1.clearBook();   //清空文件

                  // ma1.clearUser();

                    ma1.queryUser();  //

                   ma1.query();

                  //ma1.deleteBook();  //

                  ma1.deleteUser();

                // ma1.modifySh();   //

               //ma1.modifyMax();

                  flag=1;

                  break;

              }

       }

         if(flag==1) break;

         if(i>=3) cout<<"非法的账号或密码";

    }

  }

};

int main()

{

 

       cout<<"用户登录,请输入0,管理员登录,请输入1"<<endl;

       int i;

       cin>>i;

     cout<<"请输入账号和密码"<<endl;

     if(i==0)

     {

        UserCheckin u;

          u.login();

     }

 

     if(i==1)

     {

         AdminCheckIn a;

         a.login();

      }

 

   return 0;

}

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值