注:来源于教科书

/*
[问题描述]
    设计一个图书管理系统,该图书管理系统分为借书,还书,图书维护和读者维护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 *p = 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 *p = 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;
    }
}

转载于:https://www.cnblogs.com/hcbin/archive/2010/02/24/1669584.html

[C++] - 面向对象-图书管理系统相关推荐

  1. Python面向对象实现图书管理系统

    # _*_coding:utf-8 _*_ """ name: book1 date: 2018-07-23 8:05 AM (无敌热的一天,40度,没空调没风扇) au ...

  2. python面向对象书籍_python面向对象法实现图书管理系统

    本文实例为大家分享了python实现图书管理系统的具体代码,供大家参考,具体内容如下 需求: 图书管理系统 1.查询图书 2.增加图书 3.借阅图书 4.归还图书 5.退出系统 书:书名,作者,状态, ...

  3. Python基础:面向对象编程实战——简易图书管理系统

    简易图书管理系统主要有以下功能:1.查询所有书籍2.添加书籍3.借阅书籍4.归还书籍5.退出系统.代码实现主要为: class Book:def __init__(self, name, author ...

  4. Python面向对象实现栈和图书管理系统

    1.实现栈 class Stack():def __init__(self):self.stack = []def push(self,value):self.stack.append(value)r ...

  5. Java中利用面向对象写个简单的图书管理系统

    在图书管理系统中,我们有三个事务,一个是管理员事务,一个是购物者事务,还有一个是存储书籍事务,那这三个事务我们就可以写成三个class类. 导入我们所需要的模块: import java.util.* ...

  6. 图书管理系统(简单版)面向对象程序设计c++

    大一期末作业,第一个博客,多多指教 图书信息的组成部分为:书号.书名.作者名.出版社.出版时间.价格 1) 新书上架:添加图书信息 2) 图书浏览:输出所有图书信息 3) 图书查询:可按书号.书名或作 ...

  7. JAVA面向对象小项目之迷你图书管理系统

    系统概述 为某图书馆开发一个迷你图书管理系统,实现图书的管理,包括如下功能: 1.新增图书 2.查看图书 删除图书 4.借出图书 5.归还图书 6.退出图书系统 整体开发思路 系统开发步骤 明确需求 ...

  8. 图书管理系统面向对象分析与设计报告

    目录 一.图书管理系统需求描述 1. 图书管理系统的系统组成 2. 图书管理系统的系统功能 2.2 系统功能框图

  9. 面向对象思想实现图书管理系统

    ps: 此工程分为四个包,分别是input(用于输入输出和给出提示信息),command(定义行为),user(普通用户和管理员用户)和main(主函数) package 图书管理系统;import ...

最新文章

  1. ZOJ 1410 题解
  2. git 移动分支指针_git 分支( branch ) 的基本使用
  3. 和泰c语言函数库,合泰杯 | 合泰单片机入门 编程详解(二)
  4. 解决Windows 2003中不允许的父路径Active Server Pages错误'ASP 0131'的方法
  5. java io 过滤数据,Java IO文件后缀名过滤总结
  6. java压缩----使用ANT JDK压缩---只压缩选中目录的指定文件夹
  7. VS2022+.NET6+C#10,.NET开发起飞
  8. 微前端架构在容器平台的应用
  9. 2021九江一中高考成绩查询系统,九江一中2018高考成绩
  10. python软件下载3版本-Python3.9下载
  11. unity中简单的血条自作
  12. python对钉钉考勤旷工的数据填入excel
  13. 传统数据库逐渐“难适应”,云原生数据库脱颖而出
  14. linux 内核 vrf,linux - linux内核支持多少个vrf,哪些系统资源限制了vrf的数量? - 堆栈内存溢出...
  15. PLC控制气缸,如何使用二位五通和三位五通控制电磁阀控制
  16. 英语dyamaund钻石dyamaund单词
  17. java注解看这一篇就够了
  18. 智慧社区APP开发解决方案
  19. ATI X200驱动安装
  20. LCD液晶显示器高压板维修代换实例[显示器维修实例15个]

热门文章

  1. Mr.J---重拾Ajax(一)--XMLHttpRequest
  2. MONyog-数据库性能监控工具
  3. __RESTRICT修改为__RRSTRICT,程序闪退。
  4. 最简单的ajax示例
  5. Bluetooth篇 开发实例之六 蓝牙RSSI计算距离
  6. virtual box 针对Unable to load R3 module 解决方案
  7. sqlplus 调试存储过程
  8. 【转】Visual Studio 2005/2008中的快捷键与小技巧整理
  9. 如何pspice模型转成saber模型
  10. 前展(规划)后延(架设):编码开发程序员的出路之一