C++实现简单的图书管理系统

  #include

  #include //控制台数据输入输出的函数

  #include//文件流

  #include //控制数据输出格式

  #include

  const int Maxr=100 ;//最多的读者数

  const int Maxb=100; //最多的图书数

  const int Maxbor=5; //每位读者最多借的书

  class Book

  {//图书类,实现对图书的描述,图书的编号,书名,借出,还入等功能

  private:

  int tag; //删除标记 1:已删 0:未删

  int no; //图书编号

  char name[20]; //书名

  char author[20];//作者

  char fenlei[20];//分类号

  char cbs[20]; //出版社

  int cbtime;//出版时间

  double bookprice;//图书价格

  int onshelf; //是否再架 1:再架 2:已借

  public:

  Book(){;}

  char *getname()

  {//获取书名

  return name;

  }

  char *getauthorname()

  {//获取作者名

  return author;

  }

  char *getfenlei()

  {//获取分类号

  return fenlei;

  }

  char *getcbsname()

  {//获取出版社名

  return cbs;

  }

  int getcbtime()

  {//获取出版时间

  return cbtime;

  }

  double getbookprice()

  {//获取图书价格

  return bookprice;

  }

  int getno()

  {//获取图书编号

  return no;

  }

  int gettag()

  {//获取删除标记

  return tag;

  }

  void setname(char na[])

  {//设置书名

  strcpy(name,na);

  }

  void setauthorname(char aa[])

  {//设置作者名

  strcpy(author,aa);

  }

  void setfenlei(char fe[])

  {//设置分类号

  strcpy(fenlei,fe);

  }

  void setcbs(char ca[])

  {//设置出版社

  strcpy(cbs,ca);

  }

  void setcbtime(int time)

  {//设置时间

  cbtime=time;

  }

  void setbookprice(double price)

  {//设置图书价格

  bookprice=price;

  }

  void setonshelf(int oa)

  {

  onshelf=oa;

  }

  void delbook()

  {//删除图书

  char i;

  cout<<"确定删除吗?Y/N ?"<

  cin>>i;

  if(i=='y'||i=='Y')

  tag=1;

  }

  void addbook(int n,char *na,char *aa,char *fe,char *ca,int time,double price,int oa)

  {//增加图书

  tag=0;

  no=n;

  strcpy(name,na);

  strcpy(author,aa);

  strcpy(cbs,ca);

  strcpy(fenlei,fe);

  cbtime=time;

  bookprice=price;

  onshelf=oa;

  }

  int borrowbook()

  {//借书操作

  if (onshelf>0)

  {

  onshelf--;

  return 1;

  }

  return 0;

  }

  void retbook()

  {//还书操作

  onshelf++;

  }

  void disp()

  {//输出图书

  cout<

  }

  };

  class BDatabase

  {//图书库类,实现对图书的维护,查找,删除等

  private:

  int top; //图书记录指针

  Book book[Maxb]; //图书记录

  public:

  BDatabase()

  {//构造函数,将book.txt读到book[]中

  Book b;

  top=-1;

  fstream file("book.txt",ios::in);

  while (1)

  {

  file.read((char *)&b,sizeof(b));

  if (!file)

  break;

  top++;

  book[top]=b;

  }

  file.close();

  }

  void clear()

  {//全删

  char i;

  cout<<"确定全部删除吗?Y/N ?"<

  cin>>i;

  if(i=='y'||i=='Y')

  top=-1;

  }

  int addbook(int n,char *na,char *aa,char *fe,char *ca,int time, double price,int oa)

  {//增加图书

  Book *p=query1(n);

  if (NULL==p)

  {

  top++;

  book[top].addbook(n,na,aa,fe,ca,time,price,oa);

  return 1;

  }

  return 0;

  }

  Book *query1(int bookid)

  {//按编号查找图书

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

  if(book[i].getno()==bookid &&book[i].gettag()==0)

  {

  return &book[i];

  }

  return NULL;

  }

  Book *query2(char a[])

  {//按书名查找图书

  Book *e;

  int r=0;

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

  if(strcmp(book[i].getname(),a)==0 &&book[i].gettag()==0)

  {

  if(r==0)

  cout<

  e=&book[i];

  e->disp();

  r++;

  }

  if(r==0)

  cout<<"找不到该书!"<

  return NULL;

  }

  Book *query3(char a[])

  {//按作者查找图书

  Book *e;

  int r=0;

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

  if(strcmp(book[i].getauthorname(),a)==0 &&book[i].gettag()==0)

  {

  if(r==0)

  cout<

  e=&book[i];

  e->disp();

  r++;

  }

  if(r==0)

  cout<<"找不到该书!"<

  return NULL;

  }

  Book *query4(char a[])

  {//按出版社查找图书

  Book *e;

  int r=0;

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

  if (strcmp(book[i].getcbsname(),a)==0 &&book[i].gettag()==0)

  {

  if(r==0)cout<

  e=&book[i];

  e->disp();

  r++;

  }

  if(r==0)

  cout<<"找不到该书!"<

  return NULL;

  }

  void bookdata(); //图书库信息

  void disp()

  {

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

  if(book[i].gettag()==0)

  book[i].disp();

  }

  ~BDatabase()

  {//析构函数,将book[]写到book.txt文件中

  fstream file("book.txt",ios::out);

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

  if(book[i].gettag()==0)

  file.write((char *)&book[i],sizeof(book[i]));

  file.close();

  }

  };

  void BDatabase::bookdata()

  {

  char choice3;

  char bname[40];//书名

  char auname[40];//作者名

  char bfenlei[40];//分类号

  char cname[40];//出版社

  int time;//出版时间

  double price;//价格

  char ch;

  int choice4;

  int bookid;

  int bookod;

  Book *b;

  while (choice3!='0')

  {

  cout<<"

  ** 图 书 信 息 **

  "<

  cout<<" ** 1.新 增 **"<

  cout<<" ** 2.更 改 **"<

  cout<<" ** 3.删 除 **"<

  cout<<" ** 4.查 找 **"<

  cout<<" ** 5.显 示 **"<

  cout<<" ** 6.全 删 **"<

  cout<<" ** 0.返 回 **"<

  cout<<" 请选择:";

  cin>>choice3;

  switch(choice3)

  {

  case '1':

  cout<<"请输入新书编号:";

  cin>>bookid;

  b=query1(bookid);

  if(b!=NULL)

  {

  cout<<"该编号已经存在,不能添加!"<

  break;

  }

  cout<<"请输入新书书名:";

  cin>>bname;

  cout<<"请输入新书作者名:";

  cin>>auname;

  cout<<"请输入新书分类号:";

  cin>>bfenlei;

  cout<<"请输入新书出版社:";

  cin>>cname;

  cout<<"请输入新书出版时间:";

  cin>>time;

  cout<<"请输入图书价格:";

  cin>>price;

  cout<<"请输入新书数量:";

  cin>>bookod;

  addbook(bookid,bname,auname,bfenlei,cname,time,price,bookod);

  char choice2;

  {

  cout<<"

  ** 是 否 保 存 Y/N ?**

  "<

  cout<<" ** 1. Y 保 存 **"<

  cout<<" ** 0. N 不 保 存 **"<

  cout<<" 请 选 择: ";

  cin>>choice2;

  switch(choice2)

  {

  case '1':

  cout<<"添加图书成功!";

  break;

  case '0':

  break;

  }

  }

  getch();

  break;

  case '2':

  cout<<"请输入图书编号:";

  cin>>bookid;

  b=query1(bookid);

  if(b==NULL)

  {

  cout<<"该图书不存在! "<

  break;

  }

  cout<<"该图书的信息是:"<

  cout<

  b->disp();

  cout<<"是否修改?( y/n ):";

  cin>>ch;

  if(ch=='y'||ch=='Y')

  {int a;

  cout<<"

  ** 图 书 修 改 **

  "<

  cout<<" ** 1.修 改 书 名 **"<

  cout<<" ** 2.修 改 作 者 **"<

  cout<<" ** 3.修 改 分 类 号 **"<

  cout<<" ** 4.修 改 出 版 社 **"<

  cout<<" ** 5.修 改 出 版 时 间**"<

  cout<<" ** 6.修 改 图 书 价 格**"<

  cout<<" ** 7.修 改 图 书 数 量**"<

  cout<<" ** 0.返 回 **"<

  cout<<" 请选择:";

  cin>>a;

  switch(a)

  {

  case 1: cout<<"请输入新的书名:";

  cin>>bname; b->setname(bname); break;

  case 2: cout<<"请输入新的作者:";

  cin>>auname; b->setauthorname(auname); break;

  case 3: cout<<"请输入新的分类号:";

  cin>>bfenlei; b->setfenlei(bfenlei); break;

  case 4: cout<<"请输入新书出版社:";

  cin>>cname; b->setcbs(cname); break;

  case 5: cout<<"请输入新书出版时间:";

  cin>>time;b->setcbtime(time); break;

  case 6: cout<<"请输入图书价格:";

  cin>>price; b->setbookprice(price); break;

  case 7: cout<<"请输入新的存量:";

  cin>>bookod; b->setonshelf(bookod); break;

  case 0: break;

  }

  }

  cout<<"修改图书成功!";

  getch();

  break;

  case '3':

  cout<<"请输入图书编号:";

  cin>>bookid;

  b=query1(bookid);

  if(b==NULL)

  {

  cout<<"该图书不存在,无法删除!"<

  break;

  }

  b->delbook();

  cout<<"删除成功!";

  getch();

  break;

  case '4':

  cout<<"

  ** 1.按图书编号查找 **"<

  cout<<" ** 2.按图书书名查找 **"<

  cout<<" ** 3.按图书作者查找 **"<

  cout<<" ** 4.按图书出版社查找**"<

  cout<<" ** 0. 返 回 **"<

  cout<<" 请选择:";

  cin>>choice4;

  switch(choice4)

  {

  case 1:

  cout<<"请输入图书编号:";

  cin>>bookid;

  b=query1(bookid);

  if(b==NULL)

  {

  cout<<"该图书不存在!";

  break;

  }

  cout<

  b->disp();

  break;

  case 2:

  cout<<"请输入图书书名:";

  cin>>bname;

  b=query2(bname);

  break;

  case 3:

  cout<<"请输入图书作者:";

  cin>>auname;

  b=query3(auname);

  break;

  case 4:

  cout<<"请输入图书出版社:";

  cin>>cname;

  b=query4(cname);

  break;

  case 0:

  break;

  }

  break;

  case '5':

  cout<

  disp();

  getch();

  break;

  case '6':

  clear();

  break;

  default:

  break;

  }

  }

  }

  class Reader

  {//读者的信息描述

  private:

  int tag; //删除标记 1表示已删 0表示未删

  int no; //读者编号

  char name[20]; //读者姓名

  int borbook[Maxbor]; //所借图书

  public:

  Reader() //构造函数

  { ; }

  friend ostream &operator<<(ostream &output,Reader &rd)

  {output<

  output<<" ";

  output<

  return output;}

  char *getname()

  {//获取姓名

  return name;

  }

  int gettag()

  {//获取删除标记

  return tag;

  }

  int getno()

  {//获取读者编号

  return no;

  }

  void setname(char na[])

  {//设置姓名

  strcpy(name,na);

  }

  void delbook()

  {//设置删除标记 1:已删 0:未删

  char i;

  cout<<"确定删除吗?Y/N ?"<

  cin>>i;

  if(i=='y'||i=='Y')

  tag=1;

  }

  void addreader(int n,char *na)

  {//增加读者

  tag=0;

  no=n;

  strcpy(name,na);

  for(int i=0;i

  borbook[i]=0;

  }

  void borrowbook(int bookid)

  {//借书操作

  for(int i=0;i

  {

  if (borbook[i]==0)

  {

  borbook[i]=bookid;

  return ;

  }

  }

  }

  int retbook(int bookid)

  {//还书操作

  for(int i=0;i

  {

  if(borbook[i]==bookid)

  {

  borbook[i]=0;

  cout<<"还书成功!"<

  return 1;

  }

  }

  cout<<"未借该书,还书失败!"<

  return 0;

  }

  void disp()

  {//读出读者信息

  int have=0;

  int bz=0;

  cout<

  for(int i=0;i

  if(borbook[i]!=0)

  {

  if(bz==0)

  {

  have=1;

  cout<<"["<

  bz++;

  }

  else

  {

  cout<<"

  ""["<

  }

  }

  if(have==0)

  cout<<" 还未借书"<

  }

  };

  class RDatabase

  {//读者类库,实现建立读者的个人资料

  private:

  int top; //读者记录指针

  Reader read[Maxr]; //读者记录

  public:

  RDatabase()

  {//构造函数,将reader.txt读到read[]中

  Reader s;

  top=-1;

  fstream file("reader.txt",ios::in); //打开一个输入文件

  while (1)

  {

  file.read((char *)&s,sizeof(s));

  if (!file)

  break;

  top++;

  read[top]=s;

  }

  file.close(); //关闭 reader.txt 文件

  }

  void clear()

  {//删除所有读者信息

  char i;

  cout<<"确定全部删除吗?Y/N ?"<

  cin>>i;

  if(i=='y'||i=='Y')

  top=-1;

  }

  int addreader(int n,char *na)

  {//添加读者时先查找是否存在

  Reader *p=queryid(n);

  if (p==NULL)

  {

  top++;

  read[top].addreader(n,na);

  return 1;

  }

  else

  cout<<"该编号已经存在!";

  return 0;

  }

  Reader *queryid(int readerid)

  {//按读者编号查找

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

  if (read[i].getno()==readerid&&read[i].gettag()==0)

  {

  return &read[i];

  }

  return NULL;

  }

  Reader *queryname(char readername[10])

  {//按读者姓名查找

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

  if (strcmp(read[i].getname(),readername)==0 && read[i].gettag()==0)

  {

  return &read[i];

  }

  return NULL;

  }

  void disp()

  {//输出所有读者信息

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

  if (read[i].gettag()==0)

  read[i].disp();

  }

  void readerdata(); //读者库信息

  ~RDatabase()

  {//析构函数,将read[]写到reader.txt文件中

  fstream file("reader.txt",ios::out);

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

  if (read[i].gettag()==0)

  file.write((char *)&read[i],sizeof(read[i]));

  file.close();

  }

  };

  void RDatabase::readerdata()

  {

  char choice1;

  char rname[20];

  int readerid;

  char readername[10];

  int choice2;

  Reader *r;

  while(choice1!='0')

  {

  cout<<"

  ** 读 者 信 息 **

  "<

  cout<<" ** 1. 新 增 **"<

  cout<<" ** 2. 更 改 **"<

  cout<<" ** 3. 删 除 **"<

  cout<<" ** 4. 查 找 **"<

  cout<<" ** 5. 显 示 **"<

  cout<<" ** 6. 全 删 **"<

  cout<<" ** 0. 返 回 **"<

  cout<<" 请选择:";

  cin>>choice1;

  switch(choice1)

  {

  case '1':

  cout<<"请输入读者编号:";

  cin>>readerid;

  cout<<"请输入读者姓名:";

  cin>>rname;

  addreader(readerid,rname);

  cout<<"添加读者成功!"<

  getch();

  break;

  case '2':

  cout<<"请输入读者编号:";

  cin>>readerid;

  r=queryid(readerid);

  if(r==NULL)

  {

  cout<<"该读者不存在! "<

  break;

  }

  cout<<"请输入新的姓名:";

  cin>>rname;

  r->setname(rname);

  cout<<"修改读者成功!"<

  getch();

  break;

  case '3':

  cout<<"请输入读者编号:";

  cin>>readerid;

  r=queryid(readerid);

  if(r==NULL)

  {

  cout<<"该读者不存在!" << endl;

  break;

  }

  r->delbook();

  cout<<"删除成功!"<

  getch();

  break;

  case '4':

  cout<<"

  ** 1.按读者编号查找 **"<

  cout<<" ** 2.按读者姓名查找 **"<

  cout<<" ** 0.返 回 **"<

  cout<<" 请选择:";

  cin>>choice2;

  switch(choice2)

  {

  case 1:

  cout<<"请输入读者编号:";

  cin>>readerid;

  r=queryid(readerid);

  if(r==NULL)

  {

  cout<<"该读者不存在!"<< endl;

  break;

  }

  cout<

  r->disp();

  break;

  case 2:

  cout<<"请输入读者姓名:";

  cin>>readername;

  r=queryname(readername);

  if(r==NULL)

  {

  cout<<"该读者不存在!"<

  break;

  }

  cout<

  r->disp();

  break;

  case 0:

  break;

  }

  break;

  case '5':

  cout<

  disp();

  getch();

  break;

  case '6':

  clear();

  break;

  default:

  break;

  }

  }

  }

  class maindesk //实现程序的主界面

  {

  char choice5;

  char choice2;

  double xh,mm;

  int bookid,readerid;

  RDatabase ReaderDB;

  Reader *r;

  BDatabase BookDB;

  Book *b;

  public:

  maindesk() {;}

  int denglu()

  {

  int k=0;

  cout<<"

  欢 迎 光 临 图 书 馆 管 理 系 统!"<

  cout<<" 您 共 有 3 次 登 陆 机 会"<

  while(choice2!='0')

  { ++k;

  cout<<" ** 1. 登 录 **"<

  cout<<" ** 0. 退 出 **"<

  cout<<" 请 选 择: ";

  cin>>choice2;

  switch (choice2)

  {

  case '1':

  cout<<"请输入学号和密码"<

  cin>>xh>>mm;

  if((xh>=138325039)&&(xh<=138325039)&&(xh==mm))

  {

  cout<<"登录成功"<

  enterdesk();

  }

  if((xh<138325039)||(xh>138325039)||(xh!=mm))

  {cout<<"登录失败:您还有"<<3-k<<"次登陆机会"<

  if(k>=3)

  {

  cout<<"您已超过登录次数上限,系统自动退出!"<

  return 1;

  }

  continue;

  }

  break;

  case '0':

  break;}

  return 1;

  }

  return 0;

  }

  void enterdesk()

  {

  while(choice5!='0')

  {

  cout<<"

  **** 图 书 管 理 系 统****

  ";

  cout<<" ** 1.图 书 信 息 **"<

  cout<<" ** 2.读 者 信 息 **"<

  cout<<" ** 3.借 阅 图 书 **"<

  cout<<" ** 4.归 还 图 书 **"<

  cout<<" ** 0. 退 出 **"<

  cout<<" 请选择:";

  cin>>choice5;

  switch (choice5)

  {

  case '1':

  BookDB.bookdata();

  break;

  case '2':

  ReaderDB.readerdata();

  break;

  case '3':

  cout<<" 借书操作"<

  cout<<"请输入借书读者编号:";

  cin>>readerid;

  r=ReaderDB.queryid(readerid);

  if(NULL==r)

  {//按编号查找是否有该读者

  cout<<"不存在该读者,不能借书!"<

  break;

  }

  cout<<"请输入要借图书编号:";

  cin>>bookid;

  b=BookDB.query1(bookid);

  if(b==NULL)

  {//按编号查找是否有该图书

  cout<<"不存在该图书,不能借书!"<

  break;

  }

  if(b->borrowbook()==0)

  {

  cout<<"该图书已借完,不能借书!"<

  break;

  }

  cout<<"读者借书成功!"<

  r->borrowbook(b->getno());

  break;

  case '4':

  cout<<" 还书操作"<

  cout<<"请输入还书读者编号:";

  cin>>readerid;

  r=ReaderDB.queryid(readerid);

  if(r==NULL)

  {

  cout<<"不存在该读者,不能还书"<

  break;

  }

  cout<<"请输入要归还图书编号:";

  cin>>bookid;

  b=BookDB.query1(bookid);

  if(b==NULL)

  {

  cout<<"不存在该图书,不能还书"<

  break;

  }

  b->retbook();

  r->retbook(b->getno());

  break;

  case '0':

  break;

  default:

  break;

  }

  }

  }

  };

  void main() //主函数

  {

  maindesk yourDesk;

  if(yourDesk.denglu())

  cout<<" 谢 谢 使 用 , 再 见 !"<

  }