小小图书馆

 在社区中有一个小小图书馆,居民可以来阅读或借阅图书,现在要帮助图书管理员管理读者和图书,编写程序完成图书和读者信息的自动管理。

一、目标与要求

 要求程序是一个简单的图书馆管理系统,主要完成的工作有:

● 借书

● 还书

● 图书管理

● 读者维护

其中,图书管理和读者维护功能中可以进行日常的数据添加、删除、查找、显示等功能,使日常图书借阅工作能正常进行。读者信息记录在reader.dat文件中,图书信息在book.dat文件中。编程基于字符界面的的控制台应用程序来实现。源代码如下:(略)

系统模块级别结构图


各类的定义及主函数使用的对象

(1)

classBook                                //图书类

{ private:

    intnote;                      //删除标记(1:已删,0:未删)

    intnumber;                          //图书编号

    charname[100];                       //书名

    intonshelf;                        //上架标志

    intonshelf1;

public:

    Book(){}

    char*getname();                   //获得书名

    intgetnote();                     //获得删除标记

    intgetnumber();                  //获得图书编号

    voidsetname(char na[]);          //设置书名

    void delbook();                   //删除图书

    voidaddbook(int n,char*na);    //添加图书

    intborrowbook();                //借书操作

    voidretbook();                  //还书操作

    voidlist();                      //输出图书

};

(2)

classReader                                 //读者类

{

private:

    intnote;                        //删除标记(1:已删,0:未删)

    intnumber;                          //读者编号

    charname[10];                       //读者姓名

    intborbook[Maxbor];                //所借图书

public:

    Reader(){}

    char*getname();                   //获得姓名

    intgetnote();                     //获得删除标记

    intgetnumber();                  //获得读者编括号

    voidsetname(char na[]);          //设置姓名

    voiddelbook();                   //设置删除标记

    voidaddreader(int n,char*na);   //添加读者

    voiddelreader();

    void borrowbook(int bookid,Book *b);      //借书操作

    int retbook(int bookid);         //还书操作

    voidlist();                   //输出读者信息

    int i;

};

(3)

classRDatabase                               //读者库类

{  

private:

    inttop;                                 //读者记录指针

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

public:

    RDatabase();                        //构造函数初始化:读文件

    voidclear();                          //删除所有读者信息

intaddreader(int n,char*na);         //添加读者记录时,先确定他是否已经存在

    Reader *query(intreaderid);           //按编括号查找

    voidlist();                          //输出所有读者信息

    voidreaderdata();                    //读者库维护

    ~RDatabase();                         //析构函数:写文件

    voiddelreader(Reader *r);

};

(4)

classBDatabase                              //图书库类

{  

private:

       int top;                                 //图书记录指针

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

public:

       BDatabase();                         //构造函数初始化:读文件

       void clear();                          //全部删除

       int addbook(int n,char *na);       //添加图书

       Book *query(int bookid);           //查找图书

       void list();                          //输出图书信息

       void bookdata();                    //图书库维护

       ~BDatabase();                         //析构函数:写文件

       void delbook(Book *b);

};

主函数使用的对象:

RDatabaseReaderDB;

BDatabaseBookDB;

Reader *r;

Book *b;

各模块的流程图

借书:

还书:


图书维护:

1.新增


2.更改


3.删除


4.查找


5.显示


6.删除


5.列明完善的程序及注释

1.book.h(图书类)

#ifndef_book_h_

#define_book_h_

#include<iostream>

usingnamespace std;

classBook                                //图书类

{private:

    int note;                      //删除标记(1:已删,0:未删)

       int number;                          //图书编号

       char name[100];                       //书名

       int onshelf;                        //上架标志

       int onshelf1;

public:

       Book(){}

       char *getname();                   //获得书名

       int getnote();                     //获得删除标记

       int getnumber();                  //获得图书编号

       void setname(char na[]);          //设置书名

       void delbook();                   //删除图书

       void addbook(int n,char *na);    //添加图书

       int borrowbook();                //借书操作

       void retbook();                  //还书操作

       void list();                      //输出图书

};

#endif

2.book.CPP(图书类实现)

#include<iomanip>

#include"book.h"

char*Book::getname()       //获得书名

{ returnname;}

intBook::getnote()         //获得删除标志

{ returnnote;}

int Book::getnumber()     //获得图书编号

{ returnnumber;}

voidBook::setname(char na[])//设置书名

{strcpy_s(name,na);}

voidBook::addbook(int n,char *na)//添加图书

{   note=0;

       number=n;

       strcpy_s(name,na);

       onshelf=1;}//上架

voidBook::delbook()//删除图书

{  note=1;

number=0;

name[0]='\0';

onshelf=0;}//下架

intBook::borrowbook()//结束操作

{

       onshelf1=onshelf;

       onshelf=0;

       return onshelf1;}

void  Book::retbook()//还数操作

{  onshelf=1;}

voidBook::list()//输出图书

{     if(onshelf==1)//判断是否上架

       cout<<setw(5)<<number<<setw(10)<<name<<setw(10)<<"已上架"<<endl;

else

       cout<<setw(5)<<number<<setw(10)<<name<<setw(10)<<"未上架"<<endl;

}

3.reader.h(读者类)

#ifndef_reader_h_

#define_reader_h_

#include<iostream>

#include"book.h"

usingnamespace std;

constint Maxbor=5;                          //最大借阅量

classReader                                 //读者类

{

private:

       int note;                        //删除标记(1:已删,0:未删)

       int number;                          //读者编号

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

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

public:

       Reader(){}

       char *getname();                   //获得姓名

       int getnote();                     //获得删除标记

       int getnumber();                  //获得读者编号

       void setname(char na[]);          //设置姓名

       void delbook();                   //设置删除标记

       void addreader(int n,char *na);   //添加读者

       void delreader();

       void borrowbook(int bookid,Book *b);      //借书操作

       int retbook(int bookid);          //还书操作

       void list();                   //输出读者信息

       int i;

};

#endif

4.reader.cpp(读者类实现)

#include<iomanip>

#include"reader.h"

//constint Maxbor=5; 

#include<iostream>                       //最大借阅量

char*Reader::getname()//获得姓名

{ returnname;}

intReader::getnote()//获得删除标记

{ returnnote;}

intReader::getnumber()//获得读者编号

{ returnnumber;}

voidReader::setname(char na[])//设置姓名

{strcpy_s(name,na);

}

void Reader::addreader(intn,char *na)//添加读者

{

       note=0;

       number=n;

       strcpy_s(name,na);

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

              borbook[i]=0;}//借书编号清零

voidReader::delreader()//删除读者

{

       note=1;

       number=0;

       name[0]='\0';

}

voidReader::delbook()//获得删除标记

{  note=1;}

voidReader::borrowbook(int bookid,Book *b)//借书操作

{  for(i=0;i<Maxbor;i++)

       {

              if(borbook[i]==0)

              {borbook[i]=bookid;//获得图书编号

              break;}

       }

if(i==5)//判断是否超出最大借阅量

{

       cout<<"该读者已经超出最大借阅量,不能再借书。"<<endl;

       b->retbook();

}

elsecout<<"借书成功。"<<endl;

}

intReader::retbook(int bookid)//还书操作

{

              for(inti=0;i<Maxbor;i++)

              {

                if(borbook[i]==bookid) { borbook[i]=0; return1;}

         }

              return0;

}

voidReader::list()//输出图书

{

       cout<<setw(5)<<number<<setw(10)<<name<<"借书编号:[";

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

               cout<<borbook[i]<<" ";

               cout<<"]"<<endl;}

5.bdatabase.h(图书信息库类)

#ifndef_bdatadase_h_

#define_bdatabase_h_

#include"book.h"

#include<iostream>

usingnamespace std;

constint Maxb=100;                          //最大图书数量

classBDatabase                              //图书库类

{  

private:

       int top;                                 //图书记录指针

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

public:

       BDatabase();                         //构造函数初始化:读文件

       void clear();                          //全部删除

       int addbook(int n,char *na);       //添加图书

       Book *query(int bookid);           //查找图书

       void list();                          //输出图书信息

       void bookdata();                    //图书库维护

       ~BDatabase();                         //析构函数:写文件

       void delbook(Book *b);

};

#endif

6.bdatabase.cpp(图书信息库类实现)

#include<fstream>

#include<iomanip>

#include<iostream>

#include"bdatabase.h"

usingnamespace std;

BDatabase::BDatabase()//构造函数初始化,读文件

{

       Book s;

       top=-1;

       fstream file;

       file.open("book.dat",ios::in|ios::binary);

              while(1)

              {

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

                     if(!file) break;

                      top++;

                      book[top]=s;

              }

              file.close();}

voidBDatabase::clear()//全部删除

{top=-1;}

Book*BDatabase::query(int bookid)//查找图书

{

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

       if(book[i].getnumber()==bookid&&book[i].getnote()==0)

              return&book[i];

       return NULL;}

intBDatabase::addbook(int n,char *na)//添加图书

{

       Book *p=query(n);

       if(p==NULL)

       {

              top++;

              book[top].addbook(n,na);

              return1;

       }

       return 0;}

voidBDatabase::delbook(Book *b)

{

      

       b->delbook();

       //top--;

}

voidBDatabase::list()//输出图书信息

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

book[i].list();

}

BDatabase::~BDatabase()//析构函数,写文件

{

       fstream file;

       file.open("book.dat",ios::out|ios::binary);

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

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

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

              file.close();

}

voidBDatabase::bookdata()//图书库维护

{

       int choice=1;

       char bookname[20];

       int bookid;

       Book *b;

       while(choice!=0)

       {

              cout<<"图书维护:"<<endl;

              cout<<"---------------------------------------------"<<endl;

              cout<<"1:新增 2:更改  3:删除 4:查找 5:显示 6:全删 0:退出"<<endl;

              cin>>choice;

cout<<"----------------------------------------"<<endl;

              switch(choice)

              {

               case 1:cout<<"输入图书编号:";

                      cin>>bookid;

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

                      cin>>bookname;

                      b=query(bookid);

                      if(b!=NULL)

                             cout<<"添加失败,该图书编号上已存在图书"<<endl;

                      else

                      addbook(bookid,bookname); break;

               case 2:cout<<"输入图书编号:";

                      cin>>bookid;

                      b=query(bookid);

                      if(b==NULL)

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

                       break; }

                      cout<<"输入新的图书名:";

                      cin>>bookname;

                      b->setname(bookname);break;

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

                       cin>>bookid;

                       b=query(bookid);//查找

                       if(b==NULL)

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

                       else

                            {  

                                   delbook(b);//删除

                       cout<<"删除成功!"<<endl;

                       }

                       break;

        case 4:cout<<"输入图书编号:";

                       cin>>bookid;

                         b=query(bookid);//查找

                      if(b==NULL)

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

                       break;}

                      b->list(); break;

              case5:

                     list();break;//显示操作

              case6:

                     clear();//全部删除

                     break;

              }//end switch

       }    //end while

}

7.rdatabase.h(读者信息库类)

#ifndef_rdatadase_h_

#define_rdatabase_h_

#include"reader.h"

#include<iostream>

usingnamespace std;

constint Maxr=100;                          //最大读者数

classRDatabase                              //读者库类

{  

private:

       int top;                                 //读者记录指针

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

public:

       RDatabase();                        //构造函数初始化:读文件

       void clear();                          //删除所有读者信息

intaddreader(int n,char *na);         //添加读者记录时,先确定他//是否已经存在

       Reader *query(int readerid);           //按编号查找

       void list();                          //输出所有读者信息

       void readerdata();                    //读者库维护

       ~RDatabase();                         //析构函数:写文件

       void delreader(Reader *r);

};

#endif

8.rdatabase.cpp(读者信息库类实现)

#include<fstream>

#include<iostream>

#include"rdatabase.h"

usingnamespace std;

RDatabase::RDatabase()//构造函数初始化,读文件

{

       Reader s;

       top=-1;

       ifstream file;

   file.open("reader.dat",ios::in|ios::binary);

 

              while(1)

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

                     if(!file) break;

                      top++;

                      read[top]=s;}

              file.close();

}

voidRDatabase::clear()//删除所有读者信息

{top=-1;}

Reader*RDatabase::query(int readerid)//按编号查找

{

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

       if(read[i].getnumber()==readerid&&read[i].getnote()==0)return &read[i];

       return NULL;}

intRDatabase::addreader(int n,char *na)//添加读者记录时,先确定他是否已经存在

{

       Reader *p=query(n);

       if(p==NULL)

       {

              top++;

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

              return1;

       }

       return 0;}

voidRDatabase::delreader(Reader *r)//删除读者

{

       //top--;

       r->delreader();

}

voidRDatabase::list()//输出读者信息

{ for(inti=0;i<=top;i++)

read[i].list();

}

RDatabase::~RDatabase()//析构函数,写文件

{  fstream file;

       file.open("reader.dat",ios::out|ios::binary);

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

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

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

              file.close();}

voidRDatabase::readerdata()

{  int choice=1;

       char readername[20];

       int readerid;

       Reader *r;

       while(choice!=0)

       {

              cout<<"读者维护:"<<endl;

       cout<<"----------------------------------------------"<<endl;

cout<<"1:新增 2:更改  3:删除 4:查找 5:显示 6:全删 0:退出"<<endl;

              cin>>choice;

cout<<"--------------------------------------------"<<endl;

              switch(choice)

              {

               case 1:cout<<"输入读者编号:";

                      cin>>readerid;

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

                      cin>>readername;

                      r=query(readerid);

                      if(r!=NULL)

                             cout<<"添加失败,该读者编号上已存在读者!"<<endl;

                      else

                      addreader(readerid,readername);break;

               case 2:cout<<"输入读者编号:";

                      cin>>readerid;

                      r=query(readerid);

                      if(r==NULL)

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

                       break; }

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

                      cin>>readername;

                      r->setname(readername); break;

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

                       cin>>readerid;

                       r=query(readerid);

                       if(r==NULL)

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

                        break;}

                       else

                       {

                               delreader(r);

                               cout<<"删除成功!"<<endl;

                       }

                       break;

        case 4:cout<<"输入读者编号:";

                       cin>>readerid;

                         r=query(readerid);

                      if(r==NULL)

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

                       break;}

                      r->list();break;

              case5:list();break;

              case6:

                     clear();

                     break;

              }//end switch

       }    //end while

}

9.library.cpp(主函数实现)

#include"reader.h"

#include"rdatabase.h"

#include"book.h"

#include"bdatabase.h"

#include<iostream>

usingnamespace std;

intmain(int argc, char* argv[])

{  int choice=1,bookid,readerid;

       RDatabase ReaderDB;

       BDatabase BookDB;

       Reader *r;

       Book *b;

       cout<<"欢迎进入“小小图书馆”管理软件"<<endl;

       cout<<"------------------------------"<<endl;

       while(choice!=0)

       {cout<<"--------------------------------------"<<endl;

              cout<<"1:  借书  2  还书  3: 图书维护 4:  读者维护  0: 离开";

              cin>>choice;

       cout<<"----------------------------------------------"<<endl;

              switch(choice)

              {case1:

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

                       cin>>readerid;

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

                       cin>>bookid;

                       r=ReaderDB.query(readerid);//查找读者

                       if(r==NULL)

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

                       break;}

                       b=BookDB.query(bookid);//查找图书

                       if(b==NULL)

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

                       break;}

                       if(b->borrowbook()==0)//判断是否借出

                       {cout<<"该图书已借出,不能借书!"<<endl;

                       break; }

                       else

                       {

                       r->borrowbook(b->getnumber(),b);//借出图书操作

                       break;

                       }

              case2:

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

                       cin>>readerid;

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

                       cin>>bookid;

                       r=ReaderDB.query(readerid);

                       if(r==NULL)

                       {cout<<"该读者不存在,不能还书!"<<endl;

                       break;}

                       b=BookDB.query(bookid);

                       if(b==NULL)

                       {cout<<"该图书不存在,不能还书!"<<endl;

                       break;}

                       else

                       {

                       b->retbook();//还书操作

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

                       cout<<"还书成功!"<<endl;break;

                       }

              case3:

                     BookDB.bookdata();break;//图书维护

              case4:

                     ReaderDB.readerdata();break;//读者维护

              }//endswitch

       }//end while

       return 0;

}



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值