• [C++] 面向对象图书管理系统


      

    注:来源于教科书

    /*
    [问题描述]
        设计一个图书管理系统,该图书管理系统分为借书,还书,图书维护和读者维护4个部分,如下图所示.
                        ┏━━━━━━━┓
                        ┃ 图书管理系统 ┃
                        ┗━━━┳━━━┛
          ┏━━━━━━┳━━━┻━━━┳━━━━━━┓
    ┏━━┻━━┓┏━━┻━━┓  ┏━━┻━━┓┏━━┻━━┓
    ┃   借书   ┃┃   还书   ┃  ┃ 图书维护 ┃┃ 读者维护 ┃
    ┗━━━━━┛┗━━━━━┛  ┗━━━━━┛┗━━━━━┛
                         图书管理系统示意图

    [算法分析]
        设计一个读者类Reader,包括一个读者的基本管理功能,具有以下私有数据:
            int  tag;             //删除标记(0:未删,1:已删)
            int  no;              //读者编号
            char name[10];        //读者姓名
            int  borbook[Maxbor]; //所借图书
        设计一个读者类库RDatabase,具有以下私有数据:
            int    top;           //读者记录指针
            Reader read[Maxr];    //读者记录
        在其构造函数中,将reader.txt文件的所有记录读到read[]中.处理完毕,在析构函数中将read[]中的
    所有未删记录写入到read.txt文件中,中间的处理都是对read[]进行的.
        设计一个图书类Book,包括一本图书的基本管理功能,私有数据包括:
            int  tag;             //删除标记(0:未删,1:已删)
            int  no;              //读者编号
            char name[20];        //读者姓名
            int  onshelf[Maxr];   //所借图书
        设计一个图书类库BDatabase,私有数据包括:
            int  top;             //读者记录指针
            Book book[Maxb];      //读者记录
        在其构造函数中,将book.txt文件的所有记录读到book[]中.处理完毕,在析构函数中将book[]中的所
    有未删记录写入到book.txt文件中,中间的处理都是对book[]进行的.
    */
    #include 
    "iostream.h"
    #include 
    "iomanip.h"
    #include 
    "string.h"
    #include 
    "fstream.h"

    const int Maxr   = 100;                 //最多读者数
    const int Maxb   = 100;                 //最多图书数
    const int Maxbor = 5;                   //每位读者最多借5本书

    //读者类
    class Reader{
    private:                                //私有部分
        int  tag;                           //删除标记(0:未删,1:已删)
        int  no;                            //读者编号
        char name[10];                      //读者姓名
        int  borbook[Maxbor];               //所借图书
    public:                                 //公有部分
        Reader();                           //构造函数
        char *getname();                    //获取姓名
        int  gettag();                      //获取删除标记
        int  getno();                       //获取读者编号
        void setname(char na[]);            //设置姓名
        void delbook();                     //设置删除标记
        void addreader(int n,char *na);     //增加读者
        void borrowbook(int bookid);        //借书操作
        int  retbook(int bookid);           //还书操作
        void display();                     //输出读者信息
        ~Reader();                          //析构函数
    };

    //读者库类
    class RDatabase{
    private:                                //私有部分
        int    top;                         //读者记录指针
        Reader read[Maxr];                  //读者记录
    public:                                 //公有部分
        RDatabase();                        //构造函数,将reader.txt读到read[]中
        void   clear();                     //删除所有读者信息
        int    addreader(int n,char *na);   //添加读者时先查找是否存在
        Reader *query(int readerid);        //按编号查找
        void   display();                   //输出所有读者信息
        void   readerdata();                //读者库维护
        ~RDatabase();                       //析构函数,将read[]写入reader.txt文件中
    };

    //图书类
    class Book{
    private:                                //私有部分
        int  tag;                           //删除标记(0:未删,1:已删)
        int  no;                            //图书编号
        char name[20];                      //书名
        int  onshelf;                       //是否在架(0:已借,1:在架)
    public:                                 //公有部分
        Book();                             //构造函数
        char *getname();                    //获取书名
        int  getno();                       //获取图书编号
        int  gettag();                      //获取删除标记
        void setname(char na[]);            //设置书名
        void delbook();                     //删除图书
        void addbook(int n,char *na);       //增加图书
        int  borrowbook();                  //借书操作
        void retbook();                     //还书操作
        void display();                     //输出图书信息
        ~Book();                            //析构函数
    };

    //图书库类
    class BDatabase{
    private:                                //私有部分
        int  top;                           //图书记录指针
        Book book[Maxb];                    //图书记录
    public:                                 //公有部分
        BDatabase();                        //构造函数,将book.txt读到book[]中
        void clear();                       //删除所有图书信息
        int  addbook(int n,char *na);       //添加图书时先查找是否存在
        Book *query(int bookid);            //按编号查找
        void display();                     //输出所有可借的图书信息
        void bookdata();                    //图书库维护
        ~BDatabase();                       //析构函数,将book[]写入book.txt文件中
    };
    /***********************************************************************************/
    //定义读者类Reader成员
    Reader::Reader(){                       //构造函数
    };
    char *Reader::getname(){                //获取姓名
        return name;
    };
    int Reader::gettag(){                   //获取删除标记
        return tag;
    };
    int Reader::getno(){                    //获取读者编号
        return no;
    };
    void Reader::setname(char na[]){        //设置姓名
        strcpy(name,na);
    };
    void Reader::delbook(){                 //设置删除标记
        tag = 1;
    };
    void Reader::addreader(int n,char *na){ //增加读者
        tag = 0;
        no 
    = n;
        strcpy(name,na);
        
    for(int i=0;i<Maxbor;i++){
            borbook[i] 
    = 0;
        }
    };
    void Reader::borrowbook(int bookid){    //借书操作
        for(int i=0;i<Maxbor;i++){
            
    if(borbook[i]==0){
                borbook[i] 
    = bookid;
                
    return;
            }
        }
    };
    int Reader::retbook(int bookid){        //还书操作
        for(int i=0;i<Maxbor;i++){
            
    if(borbook[i]==bookid){
                borbook[i] 
    = 0;
                
    return 1;
            }
        }
        
    return 0;
    };
    void Reader::display(){                 //输出读者信息
        cout << setw(5<< no << setw(10<< name << setw(20<< "借书编号:[";
        
    for(int i=0;i<Maxbor;i++){
            
    if(borbook[i]!=0){
                cout 
    << borbook[i];
                
    if(borbook[i+1]!=0){ cout << "|"; }
            }
        }
        cout 
    << "]" << endl;
    };
    Reader::
    ~Reader(){                      //析构函数
    };

    /////////////////////////////////////////////////////////////////////////////////////
    //定义读者库类RDatabase成员
    RDatabase::RDatabase(){                 //构造函数,将reader.txt读到read[]中
        Reader r;
        top 
    = -1;
        fstream file(
    "reader.txt",ios::in);
        
    while(1){
            file.read((
    char *)&r,sizeof(r));
            
    if(!file){ break; }
            top
    ++;
            read[top] 
    = r;
        }
        file.close();
    };
    void RDatabase::clear(){                //删除所有读者信息
        top = -1;
    };
    int RDatabase::addreader(int n,char *na){ //添加读者时先查找是否存在
        Reader *= query(n);
        
    if(p==NULL){
            top
    ++;
            read[top].addreader(n,na);
            
    return 1;
        }
        
    return 0;
    };
    Reader 
    *RDatabase::query(int readerid){ //按编号查找
        for(int i=0;i<=top;i++){
            
    if(read[i].getno()==readerid && read[i].gettag()==0){
                
    return &read[i];
            }
        }
        
    return NULL;
    };
    void RDatabase::display(){              //输出所有读者信息
        if(top==-1){
            cout 
    << "Reader database is empty!" << endl << endl;
            
    return;
        }
        
    for(int i=0;i<=top;i++){
            
    if(read[i].gettag()==0){
                read[i].display();
            }
        }
    };
    void RDatabase::readerdata(){           //读者库维护
        int    choice = 1;
        
    char   rname[20];
        
    int    readerid;
        Reader 
    *r;

        
    while(choice!=0){
            cout 
    << "读者维护:" << "  "
                 
    << "1:新增"    << "  "
                 
    << "2:更改"    << "  "
                 
    << "3:删除"    << "  "
                 
    << "4:查找"    << "  "
                 
    << "5:显示"    << "  "
                 
    << "6:全删"    << "  "
                 
    << "0:退出"    << "  请选择:";
            cin 
    >> choice;
            
    switch(choice){
            
    case 0:
                {
                    
    break;
                }
            
    case 1:
                {
                    cout 
    << "输入读者编号:";   cin >> readerid;
                    cout 
    << "输入读者姓名:";   cin >> rname;
                    addreader(readerid,rname);
                    
    break;
                }
            
    case 2:
                {
                    cout 
    << "输入读者编号:";   cin >> readerid;
                    r 
    = query(readerid);
                    
    if(r==NULL){
                        cout 
    << "该读者不存在" << endl;
                        
    break;
                    }
                    cout 
    << "输入新的姓名:";   cin >> rname;
                    r
    ->setname(rname);
                    
    break;
                }
            
    case 3:
                {
                    cout 
    << "输入读者编号:";   cin >> readerid;
                    r 
    = query(readerid);
                    
    if(r==NULL){
                        cout 
    << "该读者不存在" << endl;
                        
    break;
                    }
                    r
    ->delbook();
                    
    break;
                }
            
    case 4:
                {
                    cout 
    << "输入读者编号:";   cin >> readerid;
                    r 
    = query(readerid);
                    
    if(r==NULL){
                        cout 
    << "该读者不存在" << endl;
                        
    break;
                    }
                    r
    ->display();
                    
    break;
                }
            
    case 5:
                {
                    display();
                    
    break;
                }
            
    case 6:
                {
                    clear();
                    
    break;
                }
            
    default:
                {
                    cout 
    << "输入错误,请输入正确的选项" << endl;
                    
    break;
                }
            }
        }
    };
    RDatabase::
    ~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();
    };

    /////////////////////////////////////////////////////////////////////////////////////
    //定义图书类Book成员
    Book::Book(){                           //构造函数
    };
    char *Book::getname(){                  //获取书名
        return name;
    };
    int Book::getno(){                      //获取图书编号
        return no;
    };
    int Book::gettag(){                     //获取删除标记
        return tag;
    };
    void Book::setname(char na[]){          //设置书名
        strcpy(name,na);
    };
    void Book::delbook(){                   //删除图书
        tag = 1;
    };
    void Book::addbook(int n,char *na){     //增加图书
        tag = 0;
        no 
    = n;
        strcpy(name,na);
        onshelf 
    = 1;
    };
    int Book::borrowbook(){                 //借书操作
        if(onshelf==1){
            onshelf 
    = 0;
            
    return 1;
        }
        
    return 0;
    };
    void Book::retbook(){                   //还书操作
        onshelf = 1;
    };
    void Book::display(){                   //输出图书信息
        cout << setw(6<< no << setw(18<< name << setw(10<< ((onshelf==1)?"在架":"已借"<< endl;
    };
    Book::
    ~Book(){                          //析构函数
    };

    /////////////////////////////////////////////////////////////////////////////////////
    //定义图书库类BDatabase成员
    BDatabase::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 BDatabase::clear(){                //删除所有图书信息
        top = -1;
    };
    int BDatabase::addbook(int n,char *na){ //添加图书时先查找是否存在
        Book *= query(n);
        
    if(p==NULL){
            top
    ++;
            book[top].addbook(n,na);
            
    return 1;
        }
        
    return 0;
    };
    Book 
    *BDatabase::query(int bookid){     //按编号查找
        for(int i=0;i<=top;i++){
            
    if(book[i].getno()==bookid && book[i].gettag()==0){
                
    return &book[i];
            }
        }
        
    return NULL;
    };
    void BDatabase::display(){              //输出所有可借的图书信息
        if(top==-1){
            cout 
    << "Book database is empty!" << endl << endl;
            
    return;
        }
        
    for(int i=0;i<=top;i++){
            
    if(book[i].gettag()==0){
                book[i].display();
            }
        }
    };
    void BDatabase::bookdata(){             //图书库维护
        int  choice = 1;
        
    char bname[40];
        
    int  bookid;
        Book 
    *b;
        
    while(choice!=0){
            cout 
    << "图书维护:" << "  "
                 
    << "1:新增"    << "  "
                 
    << "2:更改"    << "  "
                 
    << "3:删除"    << "  "
                 
    << "4:查找"    << "  "
                 
    << "5:显示"    << "  "
                 
    << "6:全删"    << "  "
                 
    << "0:退出"    << "  请选择:";
            cin 
    >> choice;
            
    switch(choice){
            
    case 0:
                {
                    
    break;
                }
            
    case 1:
                {
                    cout 
    << "输入图书编号:";   cin >> bookid;
                    cout 
    << "输入图书书名:";   cin >> bname;
                    addbook(bookid,bname);
                    
    break;
                }
            
    case 2:
                {
                    cout 
    << "输入图书编号:";   cin >> bookid;
                    b 
    = query(bookid);
                    
    if(b==NULL){
                        cout 
    << "该图书不存在" << endl;
                        
    break;
                    }
                    cout 
    << "输入新的书名:";   cin >> bname;
                    b
    ->setname(bname);
                    
    break;
                }
            
    case 3:
                {
                    cout 
    << "输入图书编号:";   cin >> bookid;
                    b 
    = query(bookid);
                    
    if(b==NULL){
                        cout 
    << "该图书不存在" << endl;
                        
    break;
                    }
                    b
    ->delbook();
                    
    break;
                }
            
    case 4:
                {
                    cout 
    << "输入图书编号:";   cin >> bookid;
                    b 
    = query(bookid);
                    
    if(b==NULL){
                        cout 
    << "该图书不存在" << endl;
                        
    break;
                    }
                    b
    ->display();
                    
    break;
                }
            
    case 5:
                {
                    display();
                    
    break;
                }
            
    case 6:
                {
                    clear();
                    
    break;
                }
            
    default:
                {
                    cout 
    << "输入错误,请输入正确的选项" << endl;
                    
    break;
                }
            }
        }
    };
    BDatabase::
    ~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 main(){
        
    int choice=1;

        RDatabase ReaderDB;   
    int readerid;   Reader *r;
        BDatabase BookDB;     
    int bookid;     Book   *b;

        
    while(choice!=0){
            cout 
    << "操作:"      << "  "
                 
    << "1:借书"     << "  "
                 
    << "2:还书"     << "  "
                 
    << "3:图书维护" << "  "
                 
    << "4:读者维护" << "  "
                 
    << "0:离开"     << "  请选择:";
            cin 
    >> choice;
            
    switch(choice){
            
    case 0:
                {
                    
    break;
                }
            
    case 1:
                {
                    cout 
    << "借书" << endl;
                    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;
                    }
                    r
    ->borrowbook(b->getno());
                    
    break;
                }
            
    case 2:
                {
                    cout 
    << "还书" << endl;
                    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;
                    }
                    b
    ->retbook();
                    r
    ->retbook(b->getno());
                    
    break;
                }
            
    case 3:
                {
                    BookDB.bookdata();
                    
    break;
                }
            
    case 4:
                {
                    ReaderDB.readerdata();
                    
    break;
                }
            
    default:
                {
                    cout 
    << "输入错误,请输入正确的选项" << endl;
                    
    break;
                }
            }
            cout 
    << endl;
        }
    }
  • 相关阅读:
    Java 线程之间的通讯,等待唤醒机制
    Java 死锁以及死锁的产生
    2018Java开发面经(持续更新)
    OpenFlow1.3协议wireshark抓包分析
    SDN核心技术剖析和实战指南---读书笔记
    Kafka常用命令
    安装kafka+zk-ui
    flink窗口
    flink架构原理
    安装Flink集群
  • 原文地址:https://www.cnblogs.com/hcbin/p/1669584.html
Copyright © 2020-2023  润新知