图书管理系统总结



图书管理系统总结

设计思路

基本功能为增删查改,实现文件的读和写,使用STL以及vector。

将一个系统分为用户和管理员两大类:

对于用户,分为用户数据类和用户操作类:

在用户数据类中只有借阅记录的向量。

在用户操作类中只有书的向量而没有用户的向量,主要功能为查书、借书、还书、续借。

在管理员中又分为管理图书和管理用户:

管理图书的操作为:增加图书,删除图书,查询图书。

管理用户的操作为:增加用户、删除用户、查询用户。

另外还有时间类,借阅记录类以及图书信息类。

时间类:包含年月日,主要功能为判断时间大小为后面对书的操作是否违规做准备。

借阅记录类:其中包含的数据成员主要是学号、书号、借阅时间、归还时间、是否续借、是否在借。

图书信息类:包含的数据成员为书号、书名、图书总量、出版社、借阅数目、出版日期、借阅记录条数等。该类中应当含有借阅记录向量。另外要写增加借阅记录、删除借阅记录、查找借阅记录的功能代码,为后面管理员和用户的操作做准备。

遇到的问题

  1. 如何将生成的借阅记录推到图书和用户向量中去。

  2. 为什么当一次运行后文件中的数据就消失了。

  3. 运行中会出现程序崩溃的情况。

4、构建时出现很多错误,但这些错误标记的行并没有错误。

问题的解决

  1. 在图书和用户中增加了一个数据成员为借阅记录的条数,新书和新用户借阅记录条数为0,每次借书都生成一条借阅记录,并同时将该书和该用户的借阅记录条数加一,再把该条借阅记录推进该图书和该用户信息下面

  2. load()没有写好导致文件中的数据不能及时更新。

  3. 越界是崩溃的一个原因,还有一次是因为复制构造函数写错了导致程序崩溃,修改后就能正常运行了。

  4. 找了很长时间才终于发现原来出现这种错误是因为某个地方少写了“;”、“(”、“)”等等符号或者在某个地方不小心写上了字母。而且错误的地方不在提示的错误行中。所以写程序时一定一定要细心,否则真的会浪费很长时间。

总结收获

滚雪球法是写系统的正确方法,一点一点增加功能完善功能,而不是写出所有的功能后再调试(错误多到改不过来)。另外写系统重要的是组织数据,使用STL以及vector。很多地方可以使用模板,当写过一个系统后,其中的一些功能比如增删查改都可以在其他系统中用到。所以自己要试着写系统试着使用STL的一些函数并熟悉这些函数。实践是学习的最好方法。

代码实现

#include<iostream>
#include<fstream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
//时间类
class Date{
    public:
    //无参构造函数
    Date()
    {
    year=0;
    month=0;
    day=0;
    }
    //有参构造函数
    Date(int y,int m,int d):year(y),month(m),day(d){}
    //get&set函数
    int getYear(){return year;}
    int getMonth(){return month;}
    int getDay(){return day;}
    void setYear(int y){year=y;}
    void setMonth(int m){month=m;}
    void setDay(int d){day=d;}
    void setDate(int y,int m,int d)
    {
    year=y;
    month=m;
    day=d;
    }
    void display();//显示函数
    //重载"<"比较日期大小
    bool operator<(const Date&d)const
    {
    return year!=d.year?year<d.year:month!=d.month?month<d.month:day<d.day;}
    //重载输入输出流
    friend ostream&operator<<(ostream&out,const Date&d);//整体输出Date对象数据
    friend istream&operator>>(istream&in,Date&d);//整体输入Date对象数据
    //重载赋值运算符
    Date&operator=(const Date&d){
    year=d.year;
    month=d.month;
    day=d.day;
    }
    private:
    int year;
    int month;
    int day;
    };


    //显示函数
    void Date::display()
    {
    cout<<year<<" "<<month<<" "<<day<<endl;
    }


    //重载输入输出流
    ostream&operator<<(ostream&out,const Date&d)
    {
    out<<d.year<<" "<<d.month<<" "<<d.day;
    return out;
    }
    istream&operator>>(istream&in,Date&d)
    {
    in>>d.year>>d.month>>d.day;
    return in;
    }


//借阅记录类
class Record{
  public:
  //无参构造函数
  Record(){}
  //有参构造函数
  Record(int nu,Date beg,int n)
  {
        num=nu;
        begin=beg;
        number=n;
  if(beg.getMonth()+2>12)
  {
  Date e(beg.getYear()+1,beg.getMonth()-10,beg.getDay());
  end=e;
  }
  else
  {
  Date e(beg.getYear(),beg.getMonth()+2,beg.getDay());
  end=e;
  }
  renew=0;
  state=0;
  }
  //get&set函数
  int getNum(){return num;}//得到学号
  int getNumber(){return number;}//得到书号
  int getRenew(){return renew;}//是否续借
  int getState(){return state;}//是否归还
  Date getBegin(){return begin;}//得到借阅时间
  Date getEnd(){return end;}//得到还书时间
  void setRenew(){renew=1;}//将renew置为1(当前为续借)
  void setEnd();//设置还书时间
  void setState(int n){state=n;}//设置书的状态
  //重载输入输出流
  friend istream&operator>>(istream&in,Record&r);//整体输入Record对象数据
  friend ostream&operator<<(ostream&out,Record&r);//整体输出Record对象数据
  //重载赋值运算符
  Record&operator=(const Record&r)
  {
  num=r.num;
  renew=r.renew;
  begin=r.begin;
  end=r.end;
 number=r.number;
  state=r.state;
  }
 private:
  int num;
  int renew;//是否续借,0为否1为是
 Date begin;//借阅时间
 Date end;//归还时间
  int number;//书号
  int state;//=1在借,=0已还
  };


  //从上一次借的归还时间起往后加两个月
    void Record::setEnd()
    {
        Date e;
        if(end.getMonth()+2>12)
        e=Date(end.getYear()+1,end.getMonth()-10,end.getDay());
        else
        e=Date(end.getYear(),end.getMonth()+2,end.getDay());
        end=e;
    }


 //重载输入输出流
  istream&operator>>(istream&in,Record&r)
  { in>>r.num;
    if(r.num==-1)
    return in;
    in>>r.begin>>r.number>>r.end>>r.renew>>r.state;
      return in;
  }
  ostream&operator<<(ostream&out,Record&r)
  {
  out<<r.num<<" "<<r.begin<<" "<<r.number<<" "<<r.end<<" "<<r.renew<<" "<< r.state<<endl;
  return out;
  }


struct cmp7
 {
    int num;
    cmp7(int n){num=n;}
    bool operator()(Record&r)
    {
        return (r.getNum()==num);
    }
 };

//图书信息类
class Book{
    int number;//书号
    string title;//书名
    int sum;//图书总量
    string press;//出版社
    int jc;//j借阅数目
    Date date;//出版日期
    int no;//借阅记录个数
    vector<Record>v1;//借阅记录信息
    vector<Record>::iterator it1;
    multimap<int,int>m1;//按学号查找借阅记录
    multimap<int,int>::iterator mit1;
  public:
  //无参构造函数,初始化数据成员
  Book(){}
    //有参构造函数
  //Book(int n,string ti,int s,string p,int j,Date d):number(n),title(ti),sum(s),press(p),jc(j),date(d){}
  vector<Record>getRecord()
  {
      return v1;
  }
  //get&set函数
  int getNumber(){return number;}
  string getTitle(){return title;}//书名
  int getSum(){return sum;}//书号
  int getNo(){return no;}
 string getPress(){return press;}//出版社
 Date getDate(){return date;}
 int getJc(){return jc;}
  void setSum(int s){sum=s;}//书号
  void setJc(int j){jc=j;}
  void setNo(int n){no=n;}
  void operator=(Book&b){
  number=b.number;
  title=b.title;
  sum=b.sum;
  press=b.press;
  jc=b.jc;
  date=b.date;
  no=b.no;
  v1=b.getRecord();
  }
  //重载输入输出流函数
  friend istream&operator>>(istream&in,Book&b);
  friend ostream&operator<<(ostream&out,Book&b);
  void addRecord1(Record r1);//增加借阅记录
  void displayRecord1();//显示所有的借阅记录
  void deleteRecord1(int num);//删除借阅记录,并非真正删除原记录
  int search1(int num);//按学号查找借阅记录
  void display();//显示图书信息
  void modify(int num);
  void addR1(Record r1);
  void clear1();
  };


//显示图书信息
  void Book::display()
{
    cout<<number<<" "<<title<<" "<<press<<endl;
    date.display();
}


    //重载输入输出流
  istream&operator>>(istream&in,Book&b)
  {in>>b.number;
  if(b.number==-1)
  return in;
   in>>b.title>>b.sum>>b.press>>b.jc>>b.date>>b.no;
   return in;
  }
  ostream&operator<<(ostream&out,Book&b)
  {
  out<<b.number<<" "<<b.title<<" "<<b.sum<<" "<<b.press<<" "<<b.jc<<" "<<b.date<<" "<<b.no<<endl;
  if(b.getNo()!=0)
    for(int i=0;i<b.getNo();i++)
    out<<b.v1[i];
  return out;
  }


//管理员操作时增加借阅记录
   void Book::addR1(Record r1)
    {
        v1.push_back(r1);
        int i=v1.size();
m1.insert(make_pair(r1.getNum(),i-1));
    }


  //用户操作时生成借阅记录
  void Book::addRecord1(Record r1)
  {
      r1.setState(1);//图书被借
      v1.push_back(r1);
      int i=v1.size();
      m1.insert(make_pair(r1.getNum(),i-1));
  }


  //显示所有的借阅记录
  void Book::displayRecord1()
  {
      if(v1.size()!=0)
      for(it1=v1.begin();it1!=v1.end();it1++)
      cout<<*it1;
      else
      cout<<"no record!"<<endl;
  }


//按学号查找借阅记录
   int Book::search1(int num)
    {
    mit1=m1.find(num);
    if(mit1!=m1.end())
    {
    return mit1->second;
    }
    else
    return -1;
       }


//修改renew以及还书日期
      void Book::modify(int num)
{
    int i=search1(num);
    if(v1[i].getRenew()==0)
    {v1[i].setRenew();//借阅记录中将renew改为1(续借)
    v1[i].setEnd();//设置还书日期
    }
}


//“删除记录”(将归还的图书状态置为已还)
       void Book::deleteRecord1(int num)
       {
   it1=find_if(v1.begin(),v1.end(),cmp7(num));
    while(it1!=v1.end())
    {
   v1[it1-v1.begin()].setState(0);
    it1=find_if(it1+1,v1.end(),cmp7(num));
       }}
//清除
void Book::clear1()
{
    v1.clear();
}


struct cmp1
 {
    int number;
    cmp1(int n){number=n;}
    bool operator()(Record&r)
    {
        return (r.getNumber()==number);
    }
 };


//用户数据类
class User{
 public:
 User()
    {
     wj=0;//用户起初无违纪记录
     no=0;//用户起初无借阅记录
 }
User(int nu,string nam,int n,int wj1,int no1)
{
    num=nu;
    name=nam;
    max=10;
    now=n;
    wj=wj1;
    no=no1;
}
//复制构造函数
 //User(const User&u):num(u.num),name(u.name),max(u.max),now(u.now),wj(u.wj),no(u.no){}
 //重载输入输出流
 friend istream&operator>>(istream&in,User&u);
 friend ostream&operator<<(ostream&out,User&u);
 //get&set函数
 string getName(){return name;}
 int getNum(){return num;}
 int getMax(){return max;}
 int getNow(){return now;}
 int getWj(){return wj;}
 int getNo(){return no;}
 void setName(int n){name=n;}
 void setNum(int n){num=n;}
 void setMax(int m){max=m;}
 void setNow(int n){now=n;}
 void setWj(int w){wj=w;}
 void setNo(int n){no=n;}
 vector<Record>getRecord()
 {
    return v2;
 }
void addRecord2(Record r2);//增加借阅记录
void dispRecord2();//输出所有的借阅记录
int search2(int number);//按书号查找借阅记录
int search6(int number);//按书号查找借阅记录并输出
void display();//显示用户信息
void deleteRecord2(int number);//”删除“借阅记录
void modify(int number);
void judge(Date t);//判断是否超时未还图书并修改违纪状况
void clear2();
void addR2(Record r);
void operator=(User&u)
{
    num=u.getNum();
    name=u.getName();
    max=u.getMax();
    now=u.getNow();
    wj=u.getWj();
    no=u.getNo();
    v2=u.getRecord();
}
//如果学号是当前用户返回1否则返回0
bool operator==(User u)
{
    return this->num==u.getNum()?1:0;
}
 private:
 vector<Record>v2;//借阅记录信息
 vector<Record>::iterator it2;
 multimap<int,int>m2;
 multimap<int,int>::iterator mit2;
 string name;//姓名
 int num;//学号
 int max;//最大借书量
 int now;//当前借书量
 int wj;//是否违纪
 int no;
 };


//重载输入输出流整体输入用户信息
istream&operator>>(istream&in,User&u)
{
    in>>u.num;
    if(u.num==-1)
    return in;
    in>>u.name>>u.max>>u.now>>u.wj>>u.no;
    return in;
}
ostream&operator<<(ostream&out,User&u)
{
    out<<u.num<<" "<<u.name<<" "<<u.max<<" "<<u.now<<" "<<u.wj<<" "<<u.no<<endl;
    if(u.getNo()!=0)//有借阅记录
    for(int i=0;i<u.getNo();i++)
    out<<u.v2[i];
    return out;
}


//管理员增加借阅记录
void User::addR2(Record r2)
{
v2.push_back(r2);
int i=v2.size();
m2.insert(make_pair(r2.getNumber(),i-1));
}


//用户借书时生成借阅记录
void User::addRecord2(Record r2)
{r2.setState(1);
v2.push_back(r2);
int i=v2.size();
m2.insert(make_pair(r2.getNumber(),i-1));
}


//输出所有的借阅记录
void User::dispRecord2()
{if(v2.size()!=0)
   for(it2=v2.begin();it2!=v2.end();it2++)
   cout<<*it2;
   else
   cout<<"No Record!"<<endl;
}


//显示用户信息
void User::display()
{
    cout<<num<<" "<<name<<" "<<max<<" "<<now<<" "<<wj<<" "<<no<<endl;
}


//按书号查找借阅记录
int User::search2(int number)
{
    mit2=m2.find(number);
    if(mit2!=m2.end())
    return mit2->second;
    else
    return -1;
}


//按书号查找借阅记录并输出
int User::search6(int number)
{
    it2=find_if(v2.begin(),v2.end(),cmp1(number));
    while(it2!=v2.end())
    {
    cout<<"found"<<endl;
    cout<<v2[it2-v2.begin()]<<endl;
    it2=find_if(it2+1,v2.end(),cmp1(number));
}}


//"删除"借阅记录
void User::deleteRecord2(int number)
{

    it2=find_if(v2.begin(),v2.end(),cmp1(number));
    while(it2!=v2.end())
    {
   v2[it2-v2.begin()].setState(0);
    it2=find_if(it2+1,v2.end(),cmp1(number));
}}


//判断是否超时未还图书并修改违纪状况
void User::judge(Date t)
{   setWj(0);
    for(int i=0;i<v2.size();i++)
    if(t<v2[i].getEnd()&&v2[i].getState()==1)
        {setWj(1);
        break;
        }
}


//修改renew以及还书日期
void User::modify(int number)
{
 int i=search2(number);
    if(v2[i].getRenew()==0)
    {
    v2[i].setRenew();
    v2[i].setEnd();
    }
}
void User::clear2()
{
    v2.clear();
}

struct cmp3
 {
    int number;
    cmp3(int n){number=n;}
    bool operator()(Book&b)
    {
        return (b.getNumber()==number);
    }
 };

struct cmp4
 {
    int num;
    cmp4(int n){num=n;}
    bool operator()(User&u)
    {
        return (u.getNum()==num);
    }
 };

//管理类
class Operator{
  public:
    Operator()
    {
    load1();//构造函数从文件读数据
    load2();//构造函数从文件读数据
    }
    ~Operator()
    {
    save1();//析构函数写数据到文件
    save2();//析构函数写数据到文件
    }
    void load1();//读文件操作
    void load2();//读文件操作
    void save1();//写文件操作
    void save2();//写文件操作
    void addBook();//新书上架
    void deleteBook();//旧书下架
    void displayAllBook();//输出所有的图书
    int search3(int number);//按书号查书
    int search7(int number);//按书号查书并输出
    void modifyBook();//修改图书数目
    void addUser();//增加用户
    void deleteUser();//删除用户
    void dispUser();//显示所有的用户
    int search4(int num);//按学号查找用户
    int search8(int num);//按学号查找用户并输出
    void queryByNum();//按学号查找用户信息
    void queryByNumber();//按书号查书
    void modifyUser();//修改用户最大借书量
  private:
 vector<Book>v3;//图书信息
 vector<Book>::iterator it3;
 multimap<int,int>m3;//按书号查书
 multimap<int,int>::iterator mit3;
 vector<User>v4;//用户信息
 vector<User>::iterator it4;
 multimap<int,int>m4;
 multimap<int,int>::iterator mit4;
  };

  //从文件读入数据到集合对象
  
    void Operator::load1()
{
    Book b;
    int i;
    ifstream infile("D:\\20171793book.txt",ios::in);
    if(!infile)
   { return;}
    v3.clear();
    m3.clear();
    i=0;
    while(infile>>b)
    {v3.push_back(b);
     m3.insert(make_pair(b.getNumber(),i-1));
    i++;
    }
    infile.close();
}


 //从文件读入数据到集合对象
 
    void Operator::load2()
    {
        User u;
        int i;
        ifstream infile("D:\\20171793stu.txt",ios::in);//数据文件在d盘根目录下
        if(!infile)
        return;
        v4.clear();
  m4.clear();
        i=0;
        while(infile>>u)
        {
            v4.push_back(u);
            m4.insert(make_pair(u.getNum(),i));
            i++;
        }
        infile.close();
    }
   

//写文件
void Operator::save1()
{
    ofstream outfile("D:\\20171793book.txt",ios::out);
    if(!outfile)
    return ;
    for(it3=v3.begin();it3!=v3.end();it3++)
    {
        outfile<<*it3;
    }
    outfile.close();
}


//写文件
void Operator::save2()
{
    ofstream outfile("D:\\20171793stu.txt",ios::out);
    if(!outfile)
    return;
    for(it4=v4.begin();it4!=v4.end();it4++)
    {
        outfile<<*it4;
    }
    outfile.close();
}


//新书上架
 void Operator::addBook()
   {
 Book b;
    int i;
    while(1)
    {cout<<"请输入增加图书的图书信息,输入-1结束增加图书操作:"<<endl;
    cout<<"书号、书名、图书数目、出版社、借出数目、出版日期、借阅记录条数"<<endl;
    cin>>b;
    if(b.getNumber()==-1)
    break;
    if(b.getNo()!=0)
        for(int i=0;i<b.getNo();i++)
        {
            Record r;
            cout<<"请输入该书的借阅记录:"<<endl;
            cout<<"学号、借阅时间、书号、还书时间、是否续借(1为续借否则为0)、是否在借 "<<endl;
            cin>>r;
            b.addR1(r);
        }
 v3.push_back(b);
    i=v3.size();
    m3.insert(make_pair(b.getNumber(),i-1));
    b.clear1();
    cout<<"新书上架成功!"<<endl;
}
   }


//按书号查书
int Operator::search3(int number)
{
    mit3=m3.find(number);
    if(mit3!=m3.end())
    {
        return mit3->second;
    }
    else
    return -1;
}


//按书号查书
void Operator::queryByNumber()
{
    int number;
    cout<<"请输入要查询的图书的书号:"<<endl;
    cin>>number;
   int i=search3(number);
   cout<<v3[i];
}


   //旧书下架
 void Operator::deleteBook()
 {
 int number;
 cout<<"请输入要下架的图书书号,输入-1结束下架:"<<endl;
 cin>>number;
 int i=search3(number);
 if(i!=-1)
 {
 it3=v3.begin()+i;
  m3.erase(m3.find(number));
  v3.erase(it3);
  cout<<"旧书下架成功!"<<endl;
  }
  }


//按书号查书并输出
int Operator::search7(int number)
{
    it3=find_if(v3.begin(),v3.end(),cmp3(number));
    if(it3!=v3.end())
    {
    cout<<"found"<<endl;
    cout<<v3[it3-v3.begin()]<<endl;
    it3=find_if(it3+1,v3.end(),cmp3(number));
}
else
cout<<"not found!"<<endl;
}


    //按书号修改图书数目
    void Operator::modifyBook()
    {
        int number;
        cout<<"请输入要修改数目的图书的书号:"<<endl;
        cin>>number;
       int i=search3(number);
        int sum;
        cout<<"请输入修改后的图书数目:"<<endl;
        cin>>sum;
       v3[i].setSum(sum);
    }


  //输出所有的图书
    void Operator::displayAllBook()
   {
   for(it3=v3.begin();it3!=v3.end();it3++)
   cout<<*it3<<endl;
   }


//增加用户
    void Operator::addUser()
{
    User u;
    int i;
    while(1)
    {cout<<"请输入用户信息,按-1结束增加用户操作"<<endl;
    cout<<"学号、姓名、最大借书量、已借书量、是否违纪(违纪填1否则为0),借阅记录条数"<<endl;
    cin>>u;
     if(u.getNum()==-1)
        break;
        if(u.getNo()!=0)
for(int i=0;i<u.getNo();i++)
{
    Record r;
    cout<<"请输入该用户的借阅记录:"<<endl;
    cout<<"学号、借阅时间、书号、还书时间、是否续借(1为续借否则为0)、是否在借 "<<endl;
    cin>>r;
    u.addR2(r);
}
    v4.push_back(u);
    i=v4.size();
    m4.insert(make_pair(u.getNum(),i-1));
    u.clear2();
    cout<<"用户增加成功!"<<endl;
}
}


//按学号查找用户
int Operator::search4(int num)
{
    mit4=m4.find(num);
    if(mit4!=m4.end())
    {
        return mit4->second;
    }
    else
    return -1;
}


//按学号查找用户并输出用户信息
int Operator::search8(int num)
{
    it4=find_if(v4.begin(),v4.end(),cmp4(num));
    if(it4!=v4.end())
    {
    cout<<"found"<<endl;
    cout<<v4[it4-v4.begin()]<<endl;
    it4=find_if(it4+1,v4.end(),cmp4(num));
}
else
cout<<"not found!"<<endl;
}


//按学号查找用户信息
void Operator::queryByNum()
{
    int num;
    cout<<"请输入学号进行查找:"<<endl;
    cin>>num;
   int i=search4(num);
   cout<<v4[i];
}


//删除用户
void Operator::deleteUser()
{
    int num;
    cout<<"请输入要删除的用户的学号:"<<endl;
    cin>>num;
    int i=search4(num);
    if(i!=-1)
    {
    it4=v4.begin()+i;
    m4.erase(m4.find(num));
    v4.erase(it4);
    cout<<"删除用户成功!"<<endl;
    }
    }


   //按学号修改用户最大借书量
    void Operator::modifyUser()
    {
        int num;
        cout<<"请输入要修改的用户学号:"<<endl;
        cin>>num;
      int i=search4(num);
        int m;
        cout<<"请输入修改后的最大借书量:"<<endl;
        cin>>m;
     v4[i].setMax(m);
     cout<<"修改成功!"<<endl;
    }


//显示所有的用户信息
    void Operator::dispUser()
{
    for( it4=v4.begin();it4!=v4.end();++it4)
    cout<<*it4;
}


struct cmp5
 {
    int number;
    cmp5(int n){number=n;}
    bool operator()(Book&b)
    {
        return (b.getNumber()==number);
    }
 };
struct cmp6
  {
   string title;
  cmp6(string t){title=t;}
   bool operator()(Book&b)
   {
      return (b.getTitle().find(title)!=string::npos);
    }
  };


//用户操作类
class UserOp
     {
    public:
    UserOp()
    {
     load3();//构造函数从文件读数据
     load4();//构造函数从文件读数据
    }
    ~UserOp()
    {
    save3();
    save4();
    }
void load3();//读文件操作
void save3();//写文件操作
void load4();//读文件操作
void save4();//写文件操作
int search5(int number);//按书号查书
int search9(int number);//按书号查书并输出图书信息
void queryByNumber();//按书号查书并输出图书信息
void displayAllBook();//输出所有的图书
void borrow();//借书
void back();//还书
void Renew();//续借
  private:
  vector<Book>v5;//图书信息
  vector<Book>::iterator it5;
  multimap<int,int>m5;
  multimap<int,int>::iterator mit5;
  User u;
  Book b;
    };


    //从文件读入数据到集合对象
    void UserOp::load3()
    {
        Book b;
        int i;
        ifstream infile("D:\\20171793book.txt",ios::in);//数据文件在d盘根目录下
        if(!infile)
       { return;}
        v5.clear();
  m5.clear();
        i=0;
        while(infile>>b)
        {
            if(b.getNo()!=0)
    for(int i=0;i<b.getNo();i++)
    {
        Record r3;
        infile>>r3;
        b.addR1(r3);
    }
            v5.push_back(b);
            m5.insert(make_pair(b.getNumber(),i-1));
            i++;
            b.clear1();
        }
        infile.close();
    }


 //从文件读入数据到集合对象
void UserOp::load4()
{int num;
cout<<"请输入用户学号:"<<endl;
cin>>num;
    User u1;
    int i;
    ifstream infile("D:\\20171793stu.txt",ios::in);
    if(!infile)
    return;
    while(infile>>u1)
    {
       if(u1.getNo()!=0)
    for(int i=0;i<u1.getNo();i++)
    {
        Record r4;
        infile>>r4;
        u1.addR2(r4);
    }
    if(u1.getNum()==num)
    this->u=u1;
    u1.clear2();
    }
infile.close();
}


//写文件
void UserOp::save3()
{
    ofstream outfile("D:\\20171793book.txt",ios::out);
    if(!outfile)
    {
        return ;}
    for(it5=v5.begin();it5!=v5.end();it5++)
    {
        outfile<<*it5;
    }
    outfile.close();
}


//写文件
void UserOp::save4()
{vector<User>v;
vector<User>::iterator it;
User u1;
    ifstream infile("D:\\20171793stu.txt",ios::in);
    if(!infile)
    return ;
    while(infile>>u1)
   {//cout<<u<<endl;
      if(u1.getNo()!=0)
       for(int i=0;i<u1.getNo();i++)
       {
           Record r5;
           infile>>r5;
           u1.addR2(r5);
       }
    if(u1==this->u)
    u1=this->u;
    v.push_back(u1);
    u1.clear2();
 }
    infile.close();
    ofstream outfile("D:\\20171793stu.txt",ios::out);
    if(!outfile)
    return;
    for(it=v.begin();it!=v.end();it++)
    outfile<<*it;
    outfile.close();
}


//按书号查书
int UserOp::search5(int number)
{
    mit5=m5.find(number);
    if(mit5!=m5.end())
    {
      return mit5->second;
    }
    else
    return -1;
}


//按书号查书并输出
int UserOp::search9(int number)
{
    it5=find_if(v5.begin(),v5.end(),cmp5(number));
    if(it5!=v5.end())
    {
    cout<<"found"<<endl;
    cout<<v5[it5-v5.begin()]<<endl;
    it5=find_if(it5+1,v5.end(),cmp5(number));
}
}


  //输出所有的图书
    void UserOp::displayAllBook()
   {
   for(it5=v5.begin();it5!=v5.end();it5++)
   cout<<*it5<<endl;
   }


//按书号查书并输出图书信息
void UserOp::queryByNumber()
{int number;
cout<<"请输入要查询图书的书号:"<<endl;
cin>>number;
int i=search5(number);
if(i!=-1)
v5[i+1].display();
}


//借书
void UserOp::borrow()
{
    int number;
    Date t;
    cout<<"请输入要借的图书书号:"<<endl;
    cin>>number;
    cout<<"请输入借阅时间:"<<endl;
    cin>>t;
    int i=search5(number)+1;
    u.judge(t);
    for(it5=v5.begin();it5!=v5.end();it5++)
    {
    if(it5->getNumber()==number&&u.getWj()==0&&u.getNow()<u.getMax())
    {
    v5[i].setJc(v5[i].getJc()+1);//图书借出数目加一
    u.setNow(u.getNow()+1);//用户目前借书量加一
    v5[i].setNo(v5[i].getNo()+1);//借阅记录增加一条
    u.setNo(u.getNo()+1);
    Record r(u.getNum(),t,number);
    v5[i].addRecord1(r);
    u.addRecord2(r);
    //cout<<u.getNo();
    //输出所有的借阅记录
    //u.dispRecord2();
    cout<<"借阅成功!"<<endl;
}
}}


//还书
void UserOp::back()
{//借阅记录不增加,只是将借阅记录中该书的state(在借)改为0(已还),用户的目前借书量以及该书的借出量均减一
    Date t;
int number;
cout<<"请输入要还的图书书号:"<<endl;
   cin>>number;
   cout<<"请输入还书时间:"<<endl;
    cin>>t;
    t.setMonth(t.getMonth()-2);
    int i=search5(number)+1;
    for(it5=v5.begin();it5!=v5.end();it5++)
    {
    if(it5->getNumber()==number&&u.getWj()==0&&u.getNow()<u.getMax())
    {
    v5[i].setJc(v5[i].getJc()-1);//图书借出数目减一
    u.setNow(u.getNow()-1);//用户目前借书量减一
    //v5[i].setNo(v5[i].getNo()+1);//借阅记录增加一条
    //u.setNo(u.getNo()+1);//借阅记录增加一条
   // Record r(u.getNum(),t,number);
    //v5[i].addRecord1(r);
    //u.addRecord2(r);
   v5[i].deleteRecord1(u.getNum());//“删除”借阅记录
    u.deleteRecord2(number);//“删除”借阅记录
    cout<<"还书成功!"<<endl;
}}}


//续借
void UserOp::Renew()
//用户目前的借书量不变,且续借的图书的借出数量不变。
{   Date t;
    int number;
    cout<<"请输入要续借的图书书号:"<<endl;
    cin>>number;
    cout<<"请输入续阅时间:"<<endl;
    cin>>t;
    int i=search5(number)+1;
    u.judge(t);//判断是否违纪(超期未还)
    for(it5=v5.begin();it5!=v5.end();it5++)
    {
    if(it5->getNumber()==number&&u.getWj()==0&&u.getNow()<u.getMax())
    {
    v5[i].setNo(v5[i].getNo()+1);//借阅记录增加一条
    u.setNo(u.getNo()+1);//借阅记录增加一条
    Record r(u.getNum(),t,number);//生成一条借阅记录
    r.setRenew();//将借阅记录中的renew改为1(当前为续借)
    v5[i].addRecord1(r);
    u.addRecord2(r);
    //cout<<u.getNo();
    cout<<"续借成功!"<<endl;
}
}}

int main()
 {
 //测试Date类
/*
 Date d1(2018,6,1),d2(2018,6,2);
 d1.display();
 d2.display();
 Date d3;
 d3=d1;
 cout<<d3;
 Date d4;
 cin>>d4;
 cout<<d4;
*/


//测试记录类
/*
 Record r1;
 cin>>r1;
 cout<<r1;
*/


//测试图书信息类
/*
Book b1;
Record r2;
 cin>>r2;
 b1.addRecord1(r2);
b1.displayRecord1();
b1.deleteRecord1(20171793);
b1.displayRecord1();
Date d2(1998,10,3);
 Book book1(30,"围城",1,"人民出版社",0,d2);
 book1.display();
 Book book2;
 book2=book1;
 book2.display();
 Book book3;
 cin>>book3;
 book3.display();
 cout<<book3;
*/


//测试用户数据类
/*
Date d1(2018,6,1),d2(2018,6,2);
Record r1;
cin>>r1;
Record r2;
cin>>r2;
User user1(20171793,"孔藤",0);
user1.addRecord2(r1);//只测试,不实现该功能,借阅记录自动生成
user1.addRecord2(r2);
user1.dispRecord2();//输出所有的借阅记录
user1.search6(1);//按书号查找借阅记录并输出
User user2;
user2=user1;
user2.display();
cout<<user2;
user1.deleteRecord2(1);
user1.dispRecord2();//输出所有的借阅记录
*/


//测试管理类
//Date t1(2018,6,1);
//Operator o1;
//o1.addBook();//新书上架
//o1.addUser();//增加用户
//o1.deleteUser();//删除用户
//o1.deleteBook();//旧书下架?????实现不了功能
//o1.modifyBook();//修改图书总数???实现不了功能
/*
o1.displayAllBook();//输出所有的图书
o1.displayAllBook();//输出所有的图书
o1.search7(1);//按书号查书并输出
o1.search7(20);//按书号查书并输出
o1.modifyUser();//修改用户最大借书量
o1.queryByNum();//按学号查找用户信息
o1.search8(20171700);//按学号查找用户并输出
o1.search8(20172019);//按学号查找用户并输出

o1.dispUser();//显示所有的用户
*/


//测试用户操作类
UserOp u1;
//u1.borrow();//借书
//u1.back();//还书
u1.Renew();//续借
//u1.displayAllBook();//显示所有的图书
/*
u1.queryByNumber();//按书号查书并输出图书信息
u1.search9(1);//按书号查书并输出图书信息
*/
 return 0;
 }

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Famiglistimott

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值