图书管理系统总结

图书管理系统总结

图书管理系统包括时间类,记录类,数据类,操作类

时间类:时间类起了一个铺垫的作用,因为记录类,数据类和操作类里面需要调用时间类,比如记录类里面的图书的借阅日期,还书日期,数据类里面的图书的出版日期

 

记录类:作用是用于用户借书时,生成借阅记录

数据类:数据类包括两部分,一是图书数据类,用来写图书的信息;二是用户数据类,用来写用户的信息

 

操作类:操作类也包括两部分,一是管理员操作类,包括管理员对图书和用户的操作;二是用户操作类,用户的操作包括借书还书两部分

 

 

时间类(包括构造函数,get函数,set函数,运算符的重载)

 

class Time
{
    //时间类
    int year;
    int month;
    int day;
public:
    Time()
    {
        year=month=day=0;
    }
    Time(int y,int m,int d)
    {
        year=y;
        month=m;
        day=d;
    }
    friend istream &operator>>(istream &input,Time &x)
    {
        input>>x.year>>x.month>>x.day;
        return input;

    }
    friend ostream &operator<<(ostream &output,const Time &x)
    {
        output<<x.year<<" "<<x.month<<" "<<x.day;
        return output;
    }
    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;
    }
    //重载<操作符
    bool operator<(const Time &x){//如果时间t1<t2 return 1      else return 0
        if(year<x.year){return true;}
        else if(year==x.year){
            if(month<x.month){return true;}
            else if(month==x.month){
                if(day<x.day){return true;}
                    else return false;
                }
                else return false;
            }
             else return false;
        }
    //重载=操作符
    void operator=(const Time &y){
        year=y.year;
        month=y.month;
        day=y.day;
    }
};

 

记录类

class Record
{
    //图书的借阅记录类
    string name;//用户的姓名
    int no;//用户的学号
    string title;//图书的题目
    int number;//图书的编号
    string author;//图书的作者
    string press;//图书的出版日期
    Time t1;//借书日期
    Time t2;//还书日期
    bool xj;//定义一个布尔变量,来判断用户是否有续借
    bool wj;//判断是否违纪
    bool state;
public:
    Record()
    {

    }
    Record(string na,int n,string t,int nu,string au,string p,Time x1)
    {
        name=na;
        no=n;
        title=t;
        number=nu;
        author=au;
        press=p;
        t1=x1;
        if(x1.getMonth()+2>12)
        {
            Time x2(x1.getYear()+1,x1.getMonth()-10,x1.getDay());
            t2=x2;
        }
        else
        {
            Time x2(x1.getYear(),x1.getMonth()+2,x1.getDay());
            t2=x2;
        }
        xj=0;
        wj=0;
        state=0;
    }

    string getName()
    {
        return name;
    }
    int getNo()
    {
        return no;
    }
    string getTitle()
    {
        return title;
    }
    int getNumber()
    {
        return number;
    }
    string getAuthor()
    {
        return author;
    }
    string getPress()
    {
        return press;
    }
    Time getT1()
    {
        return t1;
    }
    Time getT2()
    {
        return t2;
    }
    bool getXj()
    {
        return xj;
    }
    bool getWj()
    {
        return wj;
    }
    bool getState()
    {
        return state;
    }
    void setName(string x)
    {
        name=x;
    }
    void setNo(int g)
    {
        no=g;
    }
    void setTitle(string x)
    {
        title=x;
    }
    void setNumber(int x)
    {
        number=x;
    }
    void setAuthor(string x)
    {
        author=x;
    }
    void setPress(string x)
    {
        press=x;
    }
    void setT1(Time x)
    {
        t1=x;
    }
    void setT2(Time y)
    {
        if(t1.getMonth()+2>12)
        {
            Time y(t1.getYear()+1,t1.getMonth()-10,t1.getDay());
            t2=y;
        }
        else
        {
            Time y(t1.getYear(),t1.getMonth()+2,t1.getDay());
            t2=y;
        }
    }
    void setXj(bool m)
    {
        xj=m;
    }
    void setWj(bool x)
    {
        wj=x;
    }
    void setState(bool y)
    {
        state=y;
    }
    friend istream &operator>>(istream &input,Record &x)
    {
        input>>x.name>>x.no>>x.title>>x.number>>x.author>>x.press>>x.t1>>x.t2>>x.xj>>x.wj>>x.state;
        return input;
    }
    friend ostream &operator<<(ostream&output,const Record &x)
    {
        output<<x.name<<" "<<x.no<<" "<<x.title<<" "<<x.number<<" "<<x.author<<" "<<x.press<<" "<<x.t1<<" "<<x.t2<<" "<<x.xj<<" "<<x.wj<<" "<<x.state<<endl;
    }
};

 

 

 

数据类

 

图书数据类

class BookData
{
    //图书数据类
  int number;//图书的编号
  string author;//图书的作者
  string title;//书名
  string press;//出版社
  Time t1;//图书的出版日期
  int sum;//该类图书的的总册数
  int borrow;//该类图书的总借阅册数
  int num;//借阅记录条数
  vector<Record> s;
  vector<Record>::iterator st1;
  multimap<string,int>m1;//按书名查询
  multimap<string,int>::iterator mit1;
  multimap<int,int>m2;//按书的编号查询
  multimap<int,int>::iterator mit2;
public:
  BookData()
  {

  }
  BookData(int na,string au,string ti,string p,Time x,int s,int bor,int nn)
  {
      number=na;
      author=au;
      title=ti;
      press=p;
      t1=x;
      sum=s;
      borrow=bor;
      num=nn;
  }
  friend istream &operator>>(istream &input,BookData &x)
  {
      input>>x.number>>x.author>>x.title>>x.press>>x.t1>>x.sum>>x.borrow>>x.num;
      return input;
  }
  friend ostream &operator<<(ostream &output,BookData &x)
  {
      output<<x.number<<" "<<x.author<<" "<<x.title<<" "<<x.press<<" "<<x.t1<<" "<<x.sum<<" "<<x.borrow<<" "<<x.num<<endl;
          if(x.getNum()!=0)
    for(int i=0;i<x.getNum();i++)
    output<<x.s[i];

      return output;
  }

  int getNumber()
  {
      return number;
  }
  string getAuthor()
  {
      return author;
  }
  string getTitle()
  {
      return title;
  }
  string getPress()
  {
      return press;
  }
  Time getT1()
  {
      return t1;
  }
  int getSum()
  {
      return sum;
  }
  int getBorrow()
  {
      return borrow;
  }
  int getNum()
  {
      return num;
  }
  vector<Record> getRecord()
  {
      return s;
  }
  void setNumber(int na)
  {
      number=na;
  }
  void setAuthor(string au)
  {
      author=au;
  }
  void setTitle(string ti)
  {
      title=ti;
  }
  void setPress(string p)
  {
      press=p;
  }
  void setT1(Time x)
  {
      t1=x;
  }
  void setSum(int s)
  {
      sum=s;
  }
  void setBorrow(int bor)
  {
      borrow=bor;
  }
  void setNum(int nn)
  {
      num=nn;
  }
  void addRecord(Record r);
  void displayRecord();
  void deleteRecord(string x);
  void deleteRecord(int nu);
  int queryByTitle(string x);//按图书的题目进行查询
  void display();
  int queryByNumber(int nu);//按图书的编号进行查询
  void modify(string x);
  void modify(int nu);
  void clear1();
  void putRecord();
  void putRecord1();
};
void BookData::display()
{
      cout<<"图书的编号"<<":"<<number<<endl;
      cout<<"图书的作者"<<":"<<author<<endl;
      cout<<"图书的名字"<<":"<<title<<endl;
      cout<<"图书的出版社"<<":"<<press<<endl;
      cout<<"图书的出版日期"<<":"<<t1<<endl;
      cout<<"图书的总册数"<<":"<<sum<<endl;
      cout<<"图书的借阅册数"<<":"<<borrow<<endl;
}
void BookData::addRecord(Record r)
{
    r.setState(1);//1代表该借阅记录是借书的,0代表还书
    s.push_back(r);
    int i=s.size();
    //m1.insert(make_pair(r.getTitle(),i-1));
    m2.insert(make_pair(r.getNumber(),i-1));
}
void BookData::displayRecord()
{
    if(s.size()!=0)
    {
        for(st1=s.begin();st1!=s.end();st1++)
            cout<<*st1;
    }
    else
    {
        cout<<"No Record"<<endl;
    }
}
void BookData::clear1()
{
    s.clear();
}
int BookData::queryByTitle(string title)
{
    mit1=m1.find(title);
    if(mit1!=m1.end())
        return mit1->second;
    else
        return -1;
}
int BookData::queryByNumber(int number)
{
    mit2=m2.find(number);
    if(mit2!=m2.end())
        return mit2->second;
    else
        return -1;
}
void BookData::modify(int number)
{
    int i=queryByNumber(number);
    if(s[i].getXj()==0)
    {
        s[i].setXj(1);
        //s[i].setT2();
    }
}
void BookData::modify(string title)
{
    int i=queryByTitle(title);
    if(s[i].getXj()==0)
    {
        s[i].setXj(1);
        //s[i].setT2();
    }
}
void BookData::deleteRecord(int number)
{
    int i;
    i=queryByNumber(number);
    if(i!=-1)
    {
        s[i].setState(0);
    }
}
void BookData::deleteRecord(string title)
{
    int i;
    i=queryByTitle(title);
    if(i!=-1)
    {
        s[i].setState(0);
    }
}

void BookData::putRecord()
{
    Record r;
    while(cin>>r)
    {
        if(r.getTitle()=="end")
            break;
        s.push_back(r);
    }
}
void BookData::putRecord1()
{
    Record r;
    while(cin>>r)
    {
        if(r.getNumber()==0)
            break;
        s.push_back(r);
    }
}


用户数据类

class UserData
{
    //用户数据类
    string name;//用户姓名
    int no;//用户的学号
    int sum;//用户的最大借阅册数
    int a;//用户目前借的册数
    bool wj;//判断是否违纪
    int num;//借阅记录条数
    vector<Record> v;//借阅记录
    vector<Record>::iterator k;
    multimap<int,int>m3;
    multimap<int,int>::iterator mit3;
public:
    UserData()
    {
    wj=0;
    num=0;
    }
    UserData(string na,int n,int s,int x,bool y,int nn)
    {
        name=na;
        no=n;
        sum=s;
        a=x;
        wj=y;
        num=nn;
    }
    string getName()
    {
        return name;
    }
    int getNo()
    {
        return no;
    }
    int getSum()
    {
        return sum;
    }
    int getA()
    {
        return a;
    }
    int getWj()
    {
        return wj;
    }
    int getNum()
    {
        return num;
    }
    vector<Record>getRecord()
    {
        return v;
    }
    void setName(string na)
    {
        name=na;
    }
    void setNo(int n)
    {
        no=n;
    }
    void setSum(int s)
    {
        sum=s;
    }
    void setA(int x)
    {
        a=x;
    }
    void setWj(int y)
    {
        wj=y;
    }
    void setNum(int nn)
    {
        num=nn;
    }
    void setRecord(Record x)
    {
        int i;
        v[i]=x;
    }
    void addRecord1(Record x);//增加一条借阅记录
    void displayRecord1();
    int queryByNo(int a);//按用户的学号查询用户的信息
    void deleteRecord1(int a);
    void modify(int a);
    void wrong(Time x);
    void change();
    void clear2();
    void operator=(UserData&u)
    {
        name=u.getName();
        no=u.getNo();
        sum=u.getSum();
        a=u.getA();
        num=u.getNum();
        wj=u.getWj();
        v=u.getRecord();
    }
    bool operator==(UserData u)
    {
        return this->no==u.getNo()?1:0;
    }
    friend istream &operator>>(istream &input,UserData &x)
    {
        input>>x.name>>x.no>>x.sum>>x.a>>x.wj>>x.num;
        return input;
    }
    friend ostream &operator<<(ostream &output,UserData &x)
    {
        output<<x.name<<" ";
        output<<x.no<<" ";
        output<<x.sum<<" ";
        output<<x.a<<" ";
        output<<x.wj<<" ";
        output<<x.num<<endl;
        if(x.getNum()!=0)
    for(int i=0;i<x.getNum();i++)
    output<<x.v[i];
        return output;
    }
};
void UserData::addRecord1(Record x)
    {
        x.setState(1);
        v.push_back(x);
        int i=v.size();
        m3.insert(make_pair(x.getNumber(),i-1));
    }
void UserData::displayRecord1()
    {
        if(v.size()!=0)
            for(k=v.begin();k!=v.end();k++)
            cout<<*k;
        else
            cout<<"No Record"<<endl;
    }
void UserData::clear2()
{
    v.clear();
}
int UserData::queryByNo(int z)
{
    mit3=m3.find(z);
    if(mit3!=m3.end())
        return mit3->second;
    else
        return -1;
}
void UserData::deleteRecord1(int z)
{
    int i;
    i=queryByNo(z);
    if(i!=-1)
    {
        v[i].setState(0);
    }
}
void UserData::wrong(Time x)
{
    setWj(0);
    for(int i=0;i<v.size();i++)
        if(v[i].getT2()<x&&v[i].getState()==1)
    {
        setWj(1);
        break;
    }
}
void UserData::modify(int z)
{
    int i=queryByNo(z);
    if(v[i].getXj()==0)
    {
        v[i].setXj(1);
    }

}

 

 

 

操作类

 

用户操作类

用户的操作包括查询功能和还书功能

class UserOp
{
    //用户操作类
    UserData u1;
    vector<BookData> b;
    vector<BookData>::iterator d;
    multimap<int,int> m5;//用户按图书编号查询
    multimap<int,int>::iterator mit5;
public:
    UserOp()
    {
        load3();
        load4();
    }
    ~UserOp()
    {
        save3();
        save4();
    }
    //void queryByTitle(string title);//按书名查询图书
    //void queryByNo(int no);//按图书的编号查询
    void load3();
    void save3();
    void load4();
    void save4();
    int search2(int z);
    void queryBookData();
    void borrow();
    void back();
    //void clear();
    void change();//续借
};
void UserOp::save3()
{
    ofstream outfile("E:\\20177412book.txt",ios::out);
    if(!outfile)
    {
        return;
    }
    for(d=b.begin();d!=b.end();d++)
    {
        outfile<<*d;
    }
    outfile.close();
}
void UserOp::load3()
{
    BookData a;
    int c;
    ifstream infile("E:\\20177412book.txt",ios::in);
    if(!infile)
    {
        return;
    }
    b.clear();
    m5.clear();
    while(infile>>a)
    {
        if(a.getNum()!=0)
            for(int i=0;i<a.getNum();i++)
        {
            Record r3;
            infile>>r3;
            a.addRecord(r3);
        }
        b.push_back(a);
        int c=b.size();
        m5.insert(make_pair(a.getNumber(),c-1));
        a.clear1();
    }
    infile.close();
}
void UserOp::load4()
{
    int no;
    cin>>no;
    UserData u2;
    int i;
    ifstream infile("E:\\20177412stu.txt",ios::in);
    if(!infile)
    {
        return;
    }
    while(infile>>u2)
    {
     if(u2.getNum()!=0)
       for(int i=0;i<u2.getNum();i++)

{
    Record r4;
    infile>>r4;
    u2.addRecord1(r4);
}
 if(u2.getNo()==no)
            this->u1=u2;
            u2.clear2();
    }
    infile.close();
}
void UserOp::save4()
{
    vector<UserData>v;
    vector<UserData>::iterator it;
    UserData u2;

    ifstream infile("E:\\20177412stu.txt",ios::in);
    if(!infile)
        return;
    while(infile>>u2)
    {
         if(u2.getNum()!=0)
       for(int i=0;i<u2.getNum();i++)
       {
           Record r5;
           infile>>r5;
           u2.addRecord1(r5);
       }
        if(u2==this->u1)
            u2=this->u1;
        v.push_back(u2);
        u2.clear2();
    }
    infile.close();
    ofstream outfile("E:\\20177412stu.txt",ios::out);
    if(!outfile)
        return;
    for( it=v.begin();it!=v.end();it++)
        {outfile<<*it;}
    outfile.close();
}
int UserOp::search2(int z)
{
    mit5=m5.find(z);
    if(mit5!=m5.end())
    {
        return mit5->second;
    }
    else
        return -1;
}
void UserOp::queryBookData()
{
    int z;
    cin>>z;
    int i=search2(z);
    if(i!=-1)
        b[i].display();
}
void UserOp::borrow()
{
    string h;//用户的姓名
    string ti;
    int nu;
    int no;
    string au;
    string pre;
    Time x;
    cin>>no>>h>>ti>>nu>>au>>pre>>x;
    int a=search2(nu);
    u1.wrong(x);
    if(u1.getWj()==0 && u1.getA()<u1.getSum())
    {
        b[a].setBorrow(b[a].getBorrow()+1);
        b[a].setNum(b[a].getNum()+1);
        u1.setA(u1.getA()+1);
        u1.setNum(u1.getNum()+1);
        Record r(h,no,ti,nu,au,pre,x);
        b[a].addRecord(r);
       // save3();
        u1.addRecord1(r);
        //save4();
    }
}
void UserOp::back()
{
    int z,no;
    cin>>z;
    int a=search2(z);
    b[a].setBorrow(b[a].getBorrow()-1);
    u1.setA(u1.getA()-1);
    b[a].deleteRecord(u1.getNo());
    u1.deleteRecord1(z);
}
void UserOp::change()
{
    int z;
    cin>>z;
    int a=search2(z);
    b[a].modify(z);
}

管理员操作类

管理员操作包括增加信息和增加用户

class ManagerOp
{       //管理员操作类;
    public:
    vector<BookData>p;    //图书集合对象;
    vector<BookData>::iterator it1;
    //multimap<string,int> m3;//管理员按书名查询
    //multimap<string,int>::iterator mit3;
    multimap<int,int> m4;//管理员按图书的编号查询
    multimap<int,int>::iterator mit4;

    //管理员对用户的查询
    vector<UserData>u;  //学生集合对象;
    vector<UserData>::iterator it2;
    //管理员对图书的查询
    multimap<int,int> m6;//管理员按用户的学号对用户的信息进行查询
    multimap<int,int>::iterator mit6;
    ManagerOp()
    {}
    ~ManagerOp()
    {
        save1();
        save2();
    }
    void addBookData();
    void displayBookData();
    int search1(int z);
    void queryByNumber();
    void modifyBookData();
    void deleteBookData();
    void addUserData();
    void displayUserData();
    int search6(int n);
    void queryByNo();
    void modifyUserData();
    void deleteUserData();
    void load1();
    void load2();
    void save1();
    void save2();
};
void ManagerOp::save1()
{
    ofstream outfile("E:\\20177412book.txt",ios::out);
    if(!outfile)
    return;
    for(it1=p.begin();it1!=p.end();it1++)
    {
        outfile<<*it1;
    }
    outfile.close();
}
void ManagerOp::save2()
{
    ofstream outfile("E:\\20177412stu.txt",ios::out);
    if(!outfile)
    return;
    for(it2=u.begin();it2!=u.end();it2++)
    {
        outfile<<*it2;
    }
    outfile.close();
}
void ManagerOp::addBookData()
{
    BookData bb;
    int i;
        cin>>bb;
        //if(bb.getNumber()==-1) break;
        p.push_back(bb);
        i=p.size();
        m4.insert(make_pair(bb.getNumber(),i-1));
        cout<<"添加成功!\n\n";
}
void ManagerOp::displayBookData()
{
    for(it1=p.begin();it1!=p.end();++it1)
        cout<<*it1;
}
void ManagerOp::addUserData()
{
    UserData m;
    int i;
    cin>>m;
    //if(m.getName()=="-1") break;
    u.push_back(m);
    i=u.size();
    m6.insert(make_pair(m.getNo(),i-1));
    cout<<"添加成功!\n\n";
}
void ManagerOp::displayUserData()
{
    for(it2=u.begin();it2!=u.end();++it2)
        cout<<*it2;
}
int ManagerOp::search6(int nn)
{
    mit6=m6.find(nn);
    if(mit6!=m6.end())
    {
        return mit6->second;
    }
    else
    return -1;
}

 

个人心得:

 

   上次ATM系统,这次的图书管理系统对于我们刚刚学习计算机的同学来说,都是一个巨大的挑战,因为以前完全没有接触过这部分,比如说文件的读写,load函数,save函数刚开始我完全不懂,慢慢才了解到load函数是读文件,save函数是写存文件。这个图书馆系统我写了好长时间,而且也改了很多次,因为写的不是这不完整就是那不完整,总会有一些问题,比如管理员的增加功能(增加用户和图书),第一次写的时候,一次就只能增加一条信息,第二次写的时候又出现了错误,增加信息是无限循环,总之,出现了很多错误,来来回回改了无数次,写这个图书馆写了将近一个月吧,在这一个月里,我学到很多知识,也学会如何去写一个完整的系统,写系统时应该注意什么。

   我们在写系统时,一定要有一个清晰的思路,不能没有构思,直接就去写代码;写系统我们还要有严谨的逻辑思维,比如图书管理系统,我们再设计的时候,系统还应该有良好的封装性,设置管理员与用户的最多登录次数,从而使该系统更加完美。

   生活中我们也会遇到很多挑战,就像我们写这个图书管理系统,就是一个很大的挑战我们都要去勇敢的迎接挑战,写代码过程中,我们也会遇到很多问题,我们应该去慢慢解决,不是后退,因为只有我们练得多了,解决的问题多了,才会有掌握写代码的技巧。我们也要相信自己,对自己有自信,还应该多花时间去学好我们的专业课。

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值