[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;
    }
}

 

posted @ 2010-02-24 19:58  炎峰森林影  阅读(2230)  评论(2编辑  收藏  举报