首页

源码搜藏网

首页 > 开发教程 > C语言 >

C++课程设计之图书馆管理系统

创建时间:2022-03-12 18:15  

本文实例为大家分享了C++课程设计之图书馆管理系统的具体代码,供大家参考,具体内容如下

一.代码

#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=month=day=0;}
  void setDate(int x,int y,int z){year=x;month=y;day=z;}
  void setYear(int x){year=x;}
  void setMonth(int x){month=x;}
  void setDay(int x){day=x;}


  int getYear(){return year;}
  int getMonth(){return month;}
  int getDay(){return day;}
  friend ostream& operator<<(ostream &out,Date &t );
  friend istream& operator>>(istream &in,Date &t);
  bool operator<(const Date &t);
};
ostream& operator<<(ostream &out,Date &t )
{
  out<<t.year<<" ";
  out<<t.month<<" ";
  out<<t.day;
  return out;
}
istream& operator>>(istream &in,Date &t)
{
  in>>t.year>>t.month>>t.day;
  return in;
}
bool Date::operator<(const Date &t)
{
  return year!=t.yearyear<t.year:month!=t.monthmonth<t.month:day<t.day;
}
class Record
{
  int uid;
  int bid;
  Date start;
  Date end;//默认end为应该还书的时间
  int xj;//1表示已经续借过,0时还未续借
  int sy;//1时已经还书,0时未还书
public:
  Record(int a,int b,Date c):uid(a),bid(b),start(c)
  {
   int i,j,k;
   i=start.getYear();
   j=start.getMonth();
   k=start.getDay();
   if(j+2<=12)
   {
     end.setDate(i,j+2,k);
   }
   else end.setDate(i+1,j+2-12,k);
   xj=0;sy=0;
  }
  Record(){}
  int getUid(){return uid;}
  int getBid(){return bid;}
  Date getS(){return start;}


  Date getE(){return end;}
  int getxj(){return xj;}
  int getsy(){return sy;}


  void setE();//用于续借时修改应该还书的时间,即将end再加两个月
  void setxj(int x){xj=x;}
  void setsy(int x){sy=x;}


  friend ostream& operator<<(ostream &out,Record &r );
  friend istream& operator>>(istream &in,Record &r);
  void display();
};
void Record::setE()
{
  int i,j,k;
  i=end.getYear();
  j=end.getMonth();
  k=end.getDay();
  if(j+2<=12)
  {
    end.setDate(i,j+2,k);
  }
  else end.setDate(i+1,j+2-12,k);
}
ostream& operator<<(ostream &out,Record &r)
{
  out<<r.uid<<" ";
  out<<r.bid<<" ";
  out<<r.start<<" ";
  out<<r.end<<" ";
  out<<r.xj<<" ";
  out<<r.sy<<" ";
  return out;
}
istream& operator>>(istream &in,Record &r)
{
  in>>r.uid>>r.bid>>r.start>>r.end>>r.xj>>r.sy;
  return in;
}
void Record::display()
{
  cout<<"借阅人:"<<uid<<" "<<"书号:"<<bid<<" "<<"借书日期:"<<start<<" "<<"应还书日期:"<<end<<" "<<"是否续借过:"<<xj<<" "<<"是否已还书:"<<sy<<endl;
}
class Book
{
  int id;//书号
  string name;//书名
  string press;//出版社
  Date pd;//出版日期
  int sum,ln;//总册数,已借出
  int i;
public:
  vector<Record>v1;
  vector<Record>::iterator it1;
  multimap<int,int>m1;//根据借阅人的学号建立
  multimap<int,int>::iterator mit1;
  Book(int a,string b,string c,Date d,int e,int f):id(a),name(b),press(c),pd(d),sum(e),ln(f){i=v1.size();}
  Book(){}
  int getId(){return id;}
  string getName(){return name;}
  string getPress(){return press;}
  Date getPd(){return pd;}


  int getSum(){return sum;}
  int getLn(){return ln;}


  void setSum(int x){sum=x;}
  void setLn(int x){ln=x;}


  void addRecord(Record r);
  void dispRecord();
  int search(int x);//根据借阅人的学号查询
  void display();
  void display1();
  friend istream& operator>>(istream &in,Book &b);
  friend ostream& operator<<(ostream &out,Book &b);
};
istream& operator>>(istream &in,Book &b)
{
  in>>b.id>>b.name>>b.press>>b.pd>>b.sum>>b.ln>>b.i;
  int s=0;
  if(b.i!=0)
  {
    while(s!=b.i)
    {
      in>>b.v1[s];s++;
    }
  }
  return in;
}
ostream& operator<<(ostream &out,Book &b)
{
  out<<b.id<<" "<<b.name<<" "<<b.press<<" "<<b.pd<<" "<<b.sum<<" "<<b.ln<<" "<<endl;
  if(b.v1.size()!=0)
  {
   out<<b.v1.size()<<endl;
   for(int i=0;i<b.v1.size();i++)
   {
     out<<b.v1[i];
     if(i!=b.v1.size()-1)
       out<<endl;
   }
  }
  else
    out<<b.v1.size();
  return out;
}
void Book::addRecord(Record r)
{
  int i;
  v1.push_back(r);
  i=v1.size();
  m1.insert(make_pair(r.getUid(),i-1));
}
void Book::dispRecord()
{
  for(int i=0;i<v1.size();i++)
    v1[i].display();
}
int Book::search(int x)
{
  mit1=m1.find(x);
  if(mit1!=m1.end())
  {
    return mit1->second;//返回的是这本书存储的关于借阅人x的借阅记录的下标值
  }
  else return -1;
}
void Book::display()
{
  cout<<"书号:"<<id<<" "<<"书名:"<<name<<" "<<"出版社:"<<press<<" "<<"出版日期:"<<pd<<" "<<"总册数:"<<sum<<" "<<"已借出:"<<ln<<endl;
  if(v1.size()!=0)
  {
    dispRecord();
  }
}
void Book::display1()
{
  cout<<"书号:"<<id<<" "<<"书名:"<<name<<" "<<"出版社:"<<press<<" "<<"出版日期:"<<pd<<" "<<"总册数:"<<sum<<" "<<"已借出:"<<ln<<endl;
}
class User
{
  int id;
  string name;
  string major;
  int mb,nb;//mb为最大借阅量,nb为当前借阅量
  int wj;//1为违纪过,此时无法借书;
  int i;
public:
  vector<Record>v2;
  vector<Record>::iterator it2;
  multimap<int,int>m2;//根据所借书的书号建立
  multimap<int,int>::iterator mit2;
  User(int a,string b,string c):id(a),name(b),major(c)
  {
    mb=10;nb=0;wj=0;i=v2.size();
  }
  User(){i=v2.size();}
  int getId(){return id;}
  string getName(){return name;}
  string getMajor(){return major;}


  int getmb(){return mb;}
  int getnb(){return nb;}
  int getwj(){return wj;}


  void setmb(int x){mb=x;}
  void setnb(int x){nb=x;}
  void setwj(){wj=1;mb=0;}


  void addRecord(Record r);
  void dispRecord();
  int search(int no);//通过书号查找
  void display();


  bool operator ==( User &u)
  {
    if(this->id==u.getId())
    return 1;
    else return 0;
  }
  User & operator =(User &u)
  {
    id=u.id;
    name=u.name;
    major=u.major;
    mb=u.mb;
    nb=u.nb;
    wj=u.wj;
    v2=u.v2;
    m2=u.m2;
  }
  friend ostream& operator<<(ostream &out,User &u);
  friend istream& operator>>(istream &in,User &u);
};
ostream& operator<<(ostream &out,User &u)
{
  out<<u.id<<" "<<u.name<<" "<<u.major<<" "<<u.mb<<" "<<u.nb<<" "<<u.wj<<" "<<endl;
  if(u.v2.size()!=0)
  {
    out<<u.v2.size()<<endl;
    for(int i=0;i<u.v2.size();++i)
    {
      out<<u.v2[i];
      if(i!=u.v2.size()-1)
       out<<endl;
    }
  }
  else
    out<<u.v2.size();
  return out;
}
istream& operator>>(istream &in,User &u)
{


  in>>u.id>>u.name>>u.major>>u.mb>>u.nb>>u.wj>>u.i;
  int s=0;
  if(u.i!=0)
  {
    while(s!=u.i)
    {
      in>>u.v2[s];s++;
    }
  }
  return in;
}
void User::addRecord(Record r)
{
  int i;
  v2.push_back(r);
  i=v2.size();
  m2.insert(make_pair(r.getBid(),i-1));
}
void User::dispRecord()
{
  for(int i=0;i<v2.size();i++)
  {
    v2[i].display();
  }
}
int User::search(int no)
{
  mit2=m2.find(no);
  if(mit2!=m2.end())
  {
    return mit2->second;
  }
  else return -1;
}
void User::display()
{
  cout<<"学号:"<<id<<" "<<"姓名:"<<name<<" "<<"专业班级:"<<major<<" "<<"最大借阅量:"<<mb<<" "<<"当前借阅量:"<<nb<<" "<<"有无违纪:"<<wj<<endl;
  if(v2.size()!=0)
  {
    dispRecord();
  }
}
class Client
{
  User u;
  vector<Book>v3;
  vector<Book>::iterator it3;
  multimap<int,int>m3;
  multimap<int,int>::iterator mit3;


  vector<User>v;
  vector<User>::iterator it;
  multimap<int,int>m;
  multimap<int,int>::iterator mit;
public:
  Client(int x)
  {
    load1();
    load2(x);
  }
  ~Client()
  {
    save1();
    save2();
  }
  void load1();
  void save1();
  void load2(int x);
  void save2();
  void queryBook(int x);
  void borrow(int x,Date t);
  void back(int x);
  void displayu(){u.display();}
  void displayb(int x){mit3=m3.find(x); v3[mit3->second].display();}
};
void Client::load1()
{
  Book b;
  int i;
  ifstream infile("d:\\20171750book.txt",ios::in);
  if(!infile) return;
  while(infile>>b)
  {
    v3.push_back(b);
    i=v3.size();
    m3.insert(make_pair(b.getId(),i-1));
  }
  infile.close();
}
void Client::save1()
{
  ofstream outfile("d:\\20171750book.txt",ios::out);
  if(!outfile) return;
  for(int i=0;i<v3.size();i++)
  {
    outfile<<v3[i];
    outfile<<endl;
  }
  outfile.close();
}
void Client::load2(int x)
{
  User u;
  int i;
  ifstream infile("d:\\20171750stu.txt",ios::in);
  if(!infile) return;
  while(infile>>u)
  {
    v.push_back(u);
    i=v.size();
    m.insert(make_pair(u.getId(),i-1));
    if(x==u.getId())
    {
      this->u=u;
    }
  }
  infile.close();
}
void Client::save2()
{
  ofstream outfile("d:\\20171750stu.txt",ios::out);
  if(!outfile) return ;
  for(it=v.begin();it!=v.end();it++)
  {
    outfile<<*it;
    outfile<<endl;
  }
  outfile.close();
}
void Client::queryBook(int x)
{
  mit3=m3.find(x);
  if(mit3!=m3.end())
  {
    v3[mit3->second].display1();
  }
  else
    cout<<"未找到该书!"<<endl;
}
void Client::borrow(int x,Date t)
{
  mit3=m3.find(x);
  int i,j,k;
  i=mit3->second;
  j=v3[i].getLn();
  k=v3[i].getSum();
  if(u.getwj()==0&&j<k&&u.getnb()<u.getmb()&&mit3!=m3.end())
  {
    cout<<"借书成功!"<<endl;
    Record r(u.getId(),v3[i].getId(),t);
    u.addRecord(r);   mit=m.find(u.getId()); v[mit->second].addRecord(r);
    v3[i].addRecord(r);
    u.setnb(u.getnb()+1);            v[mit->second].setnb(u.getnb());
    v3[i].setLn(j+1);
  }
  else
   cout<<"借书失败!"<<endl;
}
void Client::back(int x)
{
  mit3=m3.find(x);
  int s=u.v2.size();
  int flag=0;
  int i=mit3->second;
  int j=v3[i].getLn();
  if(s!=0)
  {
    for(int i=0;i<s;++i)
    {
      if(x==u.v2[i].getBid())
       flag=1;
    }
  }
  if(mit3!=m3.end()&&flag==1)
  {
    cout<<"还书成功!"<<endl;//用户的nb-1√  书的ln-1√ 用户和书的借阅记录的sy变为1
    u.setnb(u.getnb()-1);  mit=m.find(u.getId()); v[mit->second].setnb(u.getnb());
    v3[i].setLn(j-1);
    v3[i].mit1=v3[i].m1.find(u.getId()); v3[i].v1[v3[i].mit1->second].setsy(1);
    u.mit2=u.m2.find(x);         u.v2[u.mit2->second].setsy(1);
    int k=mit->second;
    v[k].mit2=v[k].m2.find(x); v[k].v2[v[k].mit2->second].setsy(1);
  }
  else
    cout<<"还书失败!"<<endl;
}
class Manger
{
 vector<User>v4;
 vector<User>::iterator it4;
 multimap<int,int>m4;
 multimap<int,int>::iterator mit4;


 vector<Book>v5;
 vector<Book>::iterator it5;
 multimap<int,int>m5;
 multimap<int,int>::iterator mit5;
public:
 Manger()
 {
   load1();
   load2();
 }
 ~Manger()
 {
   save1();
   save2();
 }
 void load1();
 void load2();
 void save1();
 void save2();
 void addUser(User u);
 void addBook(Book b);
 void displayU(int x);
 void displayB(int x);
};
void Manger::load1()
{
  User u;
  int i;
  ifstream infile("d:\\20171750stu.txt",ios::in);
  if(!infile) return;
  v4.clear(); m4.clear();
  i=0;
  while(infile>>u)
  {
    v4.push_back(u);
    m4.insert(make_pair(u.getId(),i));
    i++;
  }
  infile.close();
}
void Manger::load2()
{
  Book b;
  int i;
  ifstream infile("d:\\20171750book.txt",ios::in);
  if(!infile) return;
  v5.clear();m5.clear();
  i=0;
  while(infile>>b)
  {
    v5.push_back(b);
    m5.insert(make_pair(b.getId(),i));
    i++;
  }
  infile.close();
}
void Manger::save1()
{
  ofstream outfile("d:\\20171750stu.txt",ios::out);
  if(!outfile) return;
  for(it4=v4.begin();it4!=v4.end();it4++)
  {
    outfile<<*it4;
    outfile<<endl;
  }
  outfile.close();
}
void Manger::save2()
{
  ofstream outfile("d:\\20171750book.txt",ios::out);
  if(!outfile) return;
  for(it5=v5.begin();it5!=v5.end();it5++)
  {
    outfile<<*it5;
    outfile<<endl;
  }
  outfile.close();
}
void Manger::addUser(User u)
{
  int x;
  x=u.getId();
  mit4=m4.find(x);
  if(mit4!=m4.end())
  {
    cout<<"添加用户失败,该用户已存在!"<<endl;
  }
  else
  {
    cout<<"添加用户成功!"<<endl;
    int i;
    v4.push_back(u);
    i=v4.size();
    m4.insert(make_pair(u.getId(),i-1));
  }
}
void Manger::addBook(Book b)
{
  int x;
  x=b.getId();
  mit5=m5.find(x);
  if(mit5!=m5.end())
  {
    cout<<"添加图书失败,该图书已存在!"<<endl;
  }
  else
  {
    cout<<"添加图书成功!"<<endl;
    int i;
    v5.push_back(b);
    i=v5.size();
    m5.insert(make_pair(b.getId(),i-1));
  }
}
void Manger::displayU(int x)
{
  mit4=m4.find(x);
  v4[mit4->second].display();
}
void Manger::displayB(int x)
{
  mit5=m5.find(x);
  v5[mit5->second].display();
}
int main()
{
 //时间类测试
/*
 Date a(1999,4,27);
 Date b(2000,4,27);
 cout<<a<<endl;
 cout<<b<<endl;
 if(a<b) cout<<"a小于b";
            */
 //记录类测试
/*
 Date t(1999,4,27);
 Record r(20171750,1,t);
 r.display();
 r.setE();
 r.setxj(1);
 r.setsy(1);
 r.display();
       */
 //图书类测试


 /*Date t1(2015,8,6);
 Date t2(2018,6,7);
 Book b(1,"呐喊","人民出版社",t1,10,0);
 b.display();
 Record r(201717,1,t2);
 b.addRecord(r);
 b.display();
 //用户类测试
/*
 User u(20171750,"朱宪栋","计算机3班");
 u.display();
 Date t(2018,6,7);
 Record r(20171750,1,t);
 u.addRecord(r);
 u.display();
       */
 //管理端测试


 /*Manger m;*/


 /*User u1(20171750,"朱宪栋","计算机3班");
 User u2(20176666,"李明","计算机4班");//加用户
 m.addUser(u1);
 m.addUser(u2);*/


 /*Date t1(2017,1,1);
 Date t2(2014,5,1);
 Book b1(1,"呐喊","人民出版社",t1,10,0);
 Book b2(2,"狂人日记","人民出版社",t2,10,0);  //加书
 m.addBook(b1);
 m.addBook(b2);*/


 Client c(20171750);
 Date t(2018,6,14);
 c.borrow(1,t);  //借书
 c.back(1);  //还书
}

二.总结

经过了三周的探索与尝试,通过对重载运算符和STL模板库的实际应用,完成了第一个面对设计对象的程序设计,当然在接下来的完善中,还需使用“继承”“多态”进行修改。总之,作为一个完善的图书馆管理系统,如今已经实现了完整的四个功能:增加用户,增加书籍,借书和还书以及相应的完整的数据记录与变化,可以说基本具备了一个图书馆管理系统应该具有的功能。

当然,在试验设计的过程中,出现了诸多问题。例如读入用户信息后无法进行操作,借书还书前后的图书数据没有变化,这些问题的出现大多都是对于重载的认知不够导致的,于是我参考了各类书籍,其中对我帮助最大的是C++ Premer Plus ,某些例子的使用使我找到了灵感。总之,解决问题的过程是辛苦的但也是快乐的,试验设计使我深深地体会到了这一点。

在接下来的学习中,有更多更深入的设计等待着我,最终的目的便是应用程序APP之类的,我相信通过自己的努力,在不久的将来会更加优秀。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持源码搜藏网。

上一篇:C++实现小型图书管理系统
下一篇:C++实现图书馆管理系统源码

相关内容

热门推荐