小小图书馆 - 一次程序作业 - C++控制台程序

来源:互联网 发布:淘宝一键傻瓜上传软件 编辑:程序博客网 时间:2024/05/19 02:43

一、 题目

小小图书馆

 

二、 中文摘要

在现实生活中,管理系统用得非常普遍,企业的人员管理、学校的学生管理、图书馆的图书管理、公司的信息管理(MIS)等等,都是管理系统的典型应用。管理系统以其灵活的操作方式、便捷的数据管理模式、友好的管理界面,得到各行各业管理者的青睐。

在现实应用中,管理系统有其明确的操作授权,每种角色以登陆的方式获取自己的权限,实现对系统数据的管理,数据的安全性有较好的保证。

随着计算机与编程技术的发展,管理系统越来越向图形化、网络化发展,如今先进的管理系统都采用网页登陆的方式进入,无需本地安装额外软件,更方便系统的维护和管理,同时,也减轻了企业的设备开销,每个管理者使用瘦客户机即可完成工作,管理成本大大降低。

本实验中要求我们模拟开发一个图书管理系统,了解管理系统各功能的分工,进一步巩固多文件联合的编程方式。同时,此系统对我们的编程思想有更高的要求。

 

三、 关键词

图书 管理系统 友好 数据处理

 

四、 前言

这次试验参考试验手册的变量设置,同时,在图书、读者数据的管理上使用向量,更加灵活,不受数组数量的限制,适合大量数据的管理。

 

五、 软件的开发过程

过程:

1、    编写图书类头文件与实现

2、    编写读者类头文件与实现

3、    编写图书数据库类,同时调整图书类

4、    编写读者数据库类,同时调整读者类

5、  对变量进行优化,VC++ 6.0对string类的写文件支持不佳(本人使用的是VS 2008)[1],因此所有字符串使用char数组

6、  其他优化将注释在代码文件中。

 

代码清单:

//book.h

#ifndef _BOOK_H_#define _BOOK_H_#include <iostream>using namespace std;/** 类名:Book* 用途:储存一本图书信息* 成员信息:number  图书编号不大于2^32-1*           title   书名长度不超过20个字符* 更新时间:2012-04-28 11:23*/class Book{public:Book(){};Book(int n, const char na[]);//构造函数const char *getTitle();      //获取书名const char *getReader();     //获取该书读者int    getDelete();          //获取删除标记int    getNumber();          //获得图书编号int    getOnshelf();         //获取可借出标记void   setName(const char na[]);           //修改书名void   delBook();                          //删除图书void   addBook(int n, const char na[]);    //修改图书数据int   borrowBook(const char reader[12]);   //借书操作const char *retBook();                     //还书操作void   print();           //输出图书private:char  borrower[12];//借阅者的编号int   isDeleted;   //删除标记(1:已删,0:未删)int   number;      //图书编号char  title[21];   //书名int   onshelf;     //上架标记(1:图书已上架-可借出,0:下架-不可借出)};#endif

//reader.h

#ifndef _READER_H_#define _READER_H_#include <vector>#include <iostream>using namespace std;/** 类名:Reader* 用途:储存一位读者信息* 成员信息:number  读者编号(11位字符*           name    读者姓名(10位字符* 更新时间:2012-04-28 11:23** 更新说明:1.修改操作函数,除了输出信息外,其他打印操作迁移到数据管理内2.引入错误代码,借书、还书、删除读者均会返回操作代码3.修改学生姓名需要密码,密码暂固化在代码中4.所借图书用向量保存5.取消删除标记,在数据库中添加回收站参数缺省含义:0:成功、存在、未被删除1:失败、不存在、已删除*/const int MAXBORROW = 5; //最大借阅量class Reader{public:Reader(){borCount = 0;};Reader(const char num[12], const char na[]){strcpy(number, num);strcpy(name, na);borCount = 0;for(int i = 0; i < MAXBORROW; i++){borbook[i] = -1;}}Reader(const Reader &reader1){strcpy(number, reader1.number);strcpy(name, reader1.name);borCount = reader1.borCount;for(int i = 0; i < MAXBORROW; i++){borbook[i] = reader1.borbook[i];}}//查询函数const char *getName();      //获取姓名const char *getNumber();    //获得读者编号int  getMAX();              //获取最大借阅量void print();               //输出读者信息int getBookCount();         //获取所借图书本书//操作函数int setName(const char na[], const char *psd);//设置姓名int borrowBook(int bookid);  //借书操作int  retBook(int bookid);    //还书操作int  clear();                //重置读者数据private:char number[12];               //读者编号char name[11];                 //读者姓名int borbook[5];              int  borCount;                 //所借本书};#endif


//readerdb.h

#ifndef _READER_DATABASE_H_#define _READER_DATABASE_H_#include "reader.h"#include "book.h"#include <fstream>#include <vector>#include <string>#include <iostream>#include <iomanip>using namespace std;class bookDB;//图书数据库声明/************************ 读者数据库类 实现功能:************************/class readerDB{public:readerDB();~readerDB();int login(const char *id, const char *pwd);//管理员登陆int login(const char *id);                 //读者登陆int search(const char *readerid);          //搜索读者int getCount();                            //获取读者数量int logout();                              //登出int setbdb(bookDB &db);                    //设置图书数据库int returnbook();                          //智能还书private:bookDB *bdb;            //图书数据库引用vector<Reader> readers; //读者数据库vector<Reader> recovery;//回收站vector<Reader>::iterator rpoint;int dboperator;         //操作员,1为读者,0为超级管理员,2为游客int readerCount;        //读者数量int addReader(const char *name, const char *id);//添加一位读者int addReaders();             //从文件重定向批量添加int readerOperating();        //读者操作int managing();               //管理员操作void tipsout(int choice);     //提示文字输出int delReader(const char *id);//删除一位读者int clearDB();                //清空int removeSame();             //去除重复(用于批量导入后的处理,取前面的)int rimport();                //导入int rexport();                //导出int returnbookwhenlogin();    //登陆后还书};/**************************** 图书数据库类 实现功能: 1. 特色: 1.不需要在类外调用的函数全部设为私有函数 2.支持模糊搜索图书(当图书量大时效率低)****************************/class bookDB{public:bookDB();~bookDB();int borrowbook(const char *readerid);  //借书操作const char *returnbook(int booknumber);//还书操作,返回借书人编号int getCount();                        //获取当前图书总数int search(const char *title);         //搜索图书(支持模糊匹配)int managing();                        //管理图书数据库int setrDB(readerDB &r);               //设置读者数据库引用private:vector<Book> books;   //图书数据库vector<Book> recovery;//回收站int bookCount;        //图书总数int bpoint;           //临时储存一本图书的位置readerDB *rdb;        //引用读者数据库int addBook(int number, const char *title);//添加一本图书 int addBooks();          //重定向输入到文件,从文件中添加图书int delBook(int number); //删除一本图书int clearDB();           //清空数据库void tipsout(int choice);//提示int removeSame();        //去除重复int bimport();           //导入int bexport();           //导出};#endif


//book.cpp

#include <iomanip>#include "book.h"/** 类名:Book* 用途:Book类中函数的实现* 更新时间:2012-04-28 11:23*/Book::Book(int n, const char *na){this->number = n;strcpy(this->title, na);isDeleted = 0;onshelf  = 1;}const char *Book::getTitle(){return this->title;}const char *Book::getReader(){return this->borrower;}int Book::getDelete(){return this->isDeleted;}int Book::getNumber(){return this->number;}int Book::getOnshelf(){return this->onshelf;}void Book::setName(const char na[]){strcpy(this->title, na);}void Book::delBook(){this->isDeleted = 1;}void Book::addBook(int n, const char na[]){this->number = n;strcpy(this->title, na);this->onshelf = 1;this->isDeleted = 0;}int Book::borrowBook(const char reader[12]){if(this->onshelf == 0){return 1;//借书失败}else{this->onshelf = 0;strcpy(borrower, reader);return 0;//借书成功}}const char *Book::retBook(){if(this->onshelf == 1){return 0;}else{this->onshelf = 1;//已还书,可借//cout<<"还书成功"<<endl;return this->borrower;}}void Book::print(){cout<<setw(8)<<number<<setw(15)<<title;if(this->onshelf)cout<<setw(8)<<"未借出";elsecout<<setw(8)<<"已借出";}


//bookDB.cpp

#include "readerDB.h"bookDB::bookDB(){rdb = NULL;bimport();}bookDB::~bookDB(){bexport();}int bookDB::getCount(){bookCount = books.size();return this->bookCount;}int bookDB::search(const char *title){bool exist = false;for(vector<Book>::iterator i = books.begin(); i != books.end();){if(strstr(i->getTitle(), title) != 0 || strcmp(i->getTitle(), title) == 0){exist = true;cout<<"----查找成功!----\n图书编号为:"<<i->getNumber()<<"\n图书标题为:"<<i->getTitle()<<endl;cout<<"可借:"<<(i->getOnshelf() == 1 ? "是" : "否" )<<endl<<endl;i++;}elsei++;}if(!exist){cout<<"查找失败,该图书不存在!"<<endl;return 1;}else{return 0;}}int bookDB::addBook(int number, const char *title){Book book1(number, title);books.push_back(book1);bookCount++;return 0;}int bookDB::addBooks(){int count = 0;string path;streambuf *backup;ifstream fin;cout<<"请输入in文件路径:";cin.ignore();getline(cin, path);fstream _file;_file.open(&path[0], ios::in);if(!_file){cout<<"文件不存在!"<<endl;return 1;}_file.close();fin.open(&path[0]);backup = cin.rdbuf();   cin.rdbuf(fin.rdbuf()); int bNumber;char bName[21];while(true){cin>>bNumber;if(bNumber == -1){cin.rdbuf(backup); cout<<"添加成功,一共向数据库添加了"<<count<<"条数据"<<endl;cout<<"正在自动去除重复。。。。"<<endl;removeSame();bookCount = books.size();return 0;}cin.ignore();cin.getline(bName, 21);Book book1(bNumber, bName);books.push_back(book1);count++;}return 1;}int bookDB::delBook(int number){for(vector<Book>::iterator i = books.begin(); i != books.end();){if(i->getNumber() == number){recovery.push_back(*i);i = books.erase(i);return 0;}else i++;}return 1;}int bookDB::clearDB(){books.clear();bookCount = 0;return 0;}int bookDB::managing(){int choice, flag;int bNumber;char bName[21];tipsout(1);while(true){cout<<"【图书维护】请选择功能项:";cin>>choice;switch(choice){case 1:cout<<"请输入新图书的编号:";cin>>bNumber;cout<<"请输入新图书的书名:";cin.ignore();cin.getline(bName, 21);if(addBook(bNumber, bName) == 0){cout<<"添加成功"<<endl;}else{cout<<"添加失败"<<endl;}cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 2:cout<<"请输入需要修改的图书的编号:";cin>>bNumber;for(vector<Book>::iterator i = books.begin(); i != books.end();){if(i->getNumber() ==  bNumber){cout<<"该书书名为:"<<i->getTitle()<<"   ";if(i->getOnshelf() == 1)cout<<"该书未被借出"<<endl;elsecout<<"该书先被 "<<i->getReader()<<" 同学借阅"<<endl;cout<<"┌────────────────┐"<<endl;cout<<"│ 1.修改书名     2.清除读者信息  │"<<endl;cout<<"└────────────────┘"<<endl;cout<<"请选择操作:";cin>>choice;switch(choice){case 1:cout<<"请输入新的书名:";cin.ignore();cin.getline(bName, 21);i->setName(bName);cout<<"修改成功!";break;case 2:i->retBook();cout<<"清除成功!"<<endl;break;default:break;}break;}elsei++;}cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 3:cout<<"请输入图书编号(11位):";cin>>bNumber;flag = delBook(bNumber);if(flag == 0)cout<<"删除成功,在关闭前可再回收站找回该图书!"<<endl;elsecout<<"删除失败,未找到该图书!"<<endl;cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 4:cout<<"请输入书名:";cin.ignore();cin.getline(bName, 21);search(bName);cout<<"-------------操作完成-------------"<<endl<<endl;break;case 10:cout<<"确定要清空图书库吗?1:确定  0:取消  请选择:";cin>>choice;if(choice == 1)clearDB();cout<<"-------------操作完成-------------"<<endl<<endl;break;case 6:cout<<"┌──────┬───────────┬───┐"<<endl;cout<<"│    编号    │          书名        │ 可借 │"<<endl;cout<<"├──────┼───────────┼───┤"<<endl;for(vector<Book>::iterator i = books.begin(); i != books.end();){cout<<"│"<<setw(12)<<i->getNumber()<<"│"<<setw(22)<<i->getTitle()<<"│"<<setw(6)<<(i->getOnshelf() == 1 ? "是" : "否   " )<<"│"<<endl;i++;}cout<<"└──────┴───────────┴───┘"<<endl;cout<<"-------------操作完成-------------"<<endl<<endl;break;case 7:if(!addBooks()){cout<<"操作成功"<<endl;}cout<<"-------------操作完成-------------"<<endl<<endl;break;case 8:flag = 0;while(flag){for(vector<Book>::iterator i = recovery.begin(); i != recovery.end();){cout<<"编号:"<<i->getNumber()<<"  书名:"<<i->getTitle()<<endl;i++;}cout<<"请输入需要恢复的图书编号:";cin>>bNumber;for(vector<Book>::iterator i = recovery.begin(); i != recovery.end();){if(i->getNumber() ==  bNumber){cout<<"图书 "<<i->getTitle()<<" 恢复成功!";books.push_back(*i);i = recovery.erase(i);break;}elsei++;}cout<<"是否还需要恢复?1:是  0:否。请选择:";cin>>flag;}cout<<"-------------操作完成-------------"<<endl<<endl;break;case 5://清屏system("cls");tipsout(1);break;case 0:bexport();cout<<"-------------操作完成-------------"<<endl<<endl;return 0;break;default:cout<<"----选择错误,请重新选择!----"<<endl;break;}}return 1;}void bookDB::tipsout(int choice){cout<<"┌────────────────────┐"<<endl;cout<<"│          欢迎进入图书维护系统          │"<<endl;cout<<"│                                        │"<<endl;cout<<"│ 1:新增        2:修改     3:删除     │"<<endl;cout<<"│ 4:查找并显示  5:清屏     6:全部显示 │"<<endl;cout<<"│ 7:批量录入    8:回收站   9:去除重复 │"<<endl;cout<<"│ 10:全部删除   0:退出                 │"<<endl;cout<<"│                                        │"<<endl;cout<<"└────────────────────┘"<<endl;}int bookDB::borrowbook(const char *readerid)//返回图书编号{int bnumber;cout<<"请输入图书编号:";cin>>bnumber;for(vector<Book>::iterator i = books.begin(); i != books.end();){if(i->getNumber() == bnumber){if(!i->borrowBook(readerid)){cout<<"借书成功!"<<endl;return bnumber;}else{cout<<"对不起,借书失败,这本书可能已经被借走!"<<endl;return -1;//还书失败}}elsei++;}cout<<"对不起,借书失败,这本书可能不存在!"<<endl;return -1;}const char * bookDB::returnbook(int booknumber){int bnumber = booknumber;for(vector<Book>::iterator i = books.begin(); i != books.end();){if(i->getNumber() == bnumber){const char *readerid = i->retBook();if(readerid == 0){cout<<"对不起,该书未被借出!"<<endl;return 0;}else{return readerid;}}elsei++;}return 0;//该书不存在}int bookDB::setrDB(readerDB &r){rdb = &r;return 0;}int bookDB::bimport(){Book book1;fstream file;file.open("book.ldat", ios::in | ios::binary);while(true){file.read((char*)&book1, sizeof(book1));if(!file) break;books.push_back(book1);}file.close();bookCount = books.size();return 0;}int bookDB::bexport(){bookCount = books.size();fstream file;file.open("book.ldat", ios::out | ios::binary);for(int i = 0; i < bookCount; i++){file.write((char*)&books[i], sizeof(books[i]));}file.close();return 0;}int bookDB::removeSame(){for(vector<Book>::iterator i =books.begin(); i != books.end();){for(vector<Book>::iterator j = i + 1; j != books.end();){if(i->getNumber() == j->getNumber())j = books.erase(j);elsej++;}i++;}return 0;}


 

//reader.cpp

#include <iomanip>#include <string>#include <iostream>#include "reader.h"using namespace std;const int MAX_BORROW = 5;//最大图书借阅量const char *Password = "admin";//查询函数const char *Reader::getName(){return name;}const char *Reader::getNumber(){return number;}int Reader::getMAX(){return MAX_BORROW;}void Reader::print(){cout<<"该读者姓名:"<<setw(15)<<this->name<<endl;cout<<"该读者一共借了"<<borCount<<"本书。";if(borCount > 0){cout<<"所借图书编号如下:"<<endl;cout<<"┌───────┐"<<endl;for(int i = 0;i < borCount;i++){cout<<"│"<<i+1<<"、"<<setw(11)<<borbook[i]<<"│"<<endl;}cout<<"└───────┘"<<endl;}else{cout<<endl;}}int Reader::getBookCount(){return this->borCount;}//操作函数int Reader::setName(const char na[], const char *psd){if(strcmp(psd, Password) == 0){strcpy(name,na);return 0;//修改成功}else{return 1;//修改失败}}int Reader::borrowBook(int bookid){if(borCount == MAX_BORROW)return 1;//借书失败,超过最大借阅量了for(int i = 0; i < MAXBORROW; i++){if(borbook[i] == -1){borbook[i] = bookid;break;}}borCount++;return 0;}int Reader::retBook(int bookid){for(int i = 0; i < MAXBORROW; i++){if(borbook[i] == bookid){borbook[i] = -1;borCount--;return 0;}}//cout<<"还书失败!"<<endl;return 1;//还书失败,读者可能没有借阅这本书!}int Reader::clear(){for(int i = 0; i < MAXBORROW; i++){borbook[i] = -1;}borCount = 0;return 0;}


//readerDB.cpp

#include "readerDB.h"const string admin_id = "admin";const string admin_pwd = "admin";const char * ch_admin_id = "admin";const char * ch_admin_pwd = "admin";readerDB::readerDB(){rimport();}readerDB::~readerDB(){rexport();}int readerDB::getCount(){readerCount = readers.size();return this->readerCount;}int readerDB::search(const char *readerid){//查找int i;readerCount = readers.size(); for(i = 0; i < readerCount; i++){if(strcmp(readers[i].getNumber(), readerid) == 0){cout<<"查找成功!读者信息如下:"<<endl;readers[i].print();return 0;//查找成功}}if(i == readerCount){//查无此人cout<<"对不起,查找失败,数据库中没有此读者!"<<endl;return 1;}return 0;}int readerDB::addReader(const char *name, const char *id){readerCount = readers.size();Reader Reader1(id, name);readers.push_back(Reader1);readerCount++;return 0;}int readerDB::addReaders(){/*输入格式:[编号][姓名]结束标记:-1,*/int count = 0;string path;streambuf *backup;ifstream fin;cout<<"请输入in文件路径:";cin.ignore();getline(cin, path);fstream _file;_file.open(&path[0], ios::in);if(!_file){cout<<"文件不存在!"<<endl;return 1;}_file.close();fin.open(&path[0]);backup = cin.rdbuf();   cin.rdbuf(fin.rdbuf()); char rNumber[12], rName[11];while(true){cin.getline(rNumber,12);if(strcmp(rNumber, "-1") == 0){cin.rdbuf(backup); cout<<"添加成功,一共向数据库添加了"<<count<<"条数据"<<endl;cout<<"正在自动去除重复。。。。"<<endl;removeSame();readerCount = readers.size();return 0;}cin.getline(rName, 11);Reader reader1(rNumber, rName);readers.push_back(reader1);count++;}}int readerDB::delReader(const char *id){bool exist = false;for(vector<Reader>::iterator del = readers.begin(); del != readers.end();){if(strcmp(del->getNumber(), id) == 0){exist = true;recovery.push_back((*del));del = readers.erase(del);return 0;//删除成功}else{del++;}}if(!exist){//查无此人return 1;}elsereturn 0;}int readerDB::clearDB(){if(readerCount == 0)return 1;//读者数据库为空for(int i = 0; i < readerCount; i++){readers.pop_back();}return 0;}int readerDB::login(const char *id, const char *pwd){if(strcmp(id, ch_admin_id) == 0 && strcmp(pwd, ch_admin_pwd) == 0){dboperator = 0;managing();return 0;}else if(strcmp(id, ch_admin_id) == 0){//密码错误cout<<"对不起,密码错误!"<<endl;return 2;}else{//管理员用户不存在cout<<"对不起,管理员用户不存在"<<endl;dboperator = 1;return 1;}}int readerDB::login(const char *id){bool exist = false;for(vector<Reader>::iterator del = readers.begin(); del != readers.end();){if(strcmp(del->getNumber(), id) == 0){exist = true;rpoint = del;break;//登陆成功}else{del++;}}if(!exist){//查无此人cout<<"查无此人"<<endl;return 1;}else{readerOperating();}return 0;}int readerDB::readerOperating(){int choice;char *name = new char[21];char number[12];int bnumber;tipsout(1);while(true){cout<<"【读者】请选择功能项:";cin>>choice;switch(choice){case 1:cout<<"\n----------------【图书查询】----------------"<<endl;cout<<"请输入要查询的书名(支持模糊匹配,不支持空格):";cin.ignore();cin.getline(name, 21);if(!bdb->search(name)){cout<<"操作:1、借阅;2、不进行操作。请选择:";cin>>choice;if(choice == 1){bnumber = bdb->borrowbook(rpoint->getNumber());if(bnumber != -1){rpoint->borrowBook(bnumber);}}}cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 2:cout<<"\n----------------【我的信息】----------------"<<endl;rpoint->print();cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 3:cout<<"----------------【借书】----------------"<<endl;if(rpoint->getBookCount() < rpoint->getMAX()){bnumber = bdb->borrowbook(rpoint->getNumber());if(bnumber != -1){rpoint->borrowBook(bnumber);}}else{cout<<"借书失败,该同学已经达到借书上限!"<<endl;}cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 4:cout<<"\n----------------【还书】----------------"<<endl;returnbookwhenlogin();cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 5:cout<<"----------------【清屏】----------------"<<endl;system("cls");tipsout(1);break;case 0:rexport();cout<<"\n----------------【退出】----------------"<<endl;return 0;break;default:cout<<"----选择错误,请重新选择!----"<<endl;break;}}return 1;}int readerDB::managing(){int choice, flag;char rNumber[12], rName[11];readerCount = readers.size();tipsout(2);while(true){cout<<"【读者维护】请选择功能项(5:清屏):";cin>>choice;switch(choice){case 1:cout<<"请输入新读者的编号(11位):";cin>>rNumber;cout<<"请输入新读者的姓名:";cin.ignore();cin.getline(rName, 11);if(addReader(rName, rNumber) == 0){readerCount++;cout<<"添加成功"<<endl;}else{cout<<"添加失败"<<endl;}cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 2:cout<<"请输入需要修改的读者的编号:";cin>>rNumber;for(vector<Reader>::iterator i = readers.begin(); i != readers.end();){if(strcmp(i->getNumber(), rNumber) == 0){cout<<"该读者为:"<<i->getName()<<"  共借出"<<i->getBookCount()<<"本书"<<endl;cout<<"┌──────────────────┐"<<endl;cout<<"│ 1.修改读者姓名     2.重置读者信息  │"<<endl;cout<<"└──────────────────┘"<<endl;cout<<"请选择操作:";cin>>choice;switch(choice){case 1:cout<<"请输入该读者的新姓名:";cin.ignore();cin.getline(rName, 11);if(i->setName(rName, ch_admin_pwd) == 0)cout<<"修改成功!"<<endl;else cout<<"权限不够,修改失败!"<<endl;break;case 2:i->clear();cout<<"重置成功!"<<endl;break;default:cout<<"选择错误!"<<endl;}break;}elsei++;}cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 3:cout<<"请输入读者编号(11位):";cin>>rNumber;flag = delReader(rNumber);if(flag == 0)cout<<"删除成功,在关闭前可再回收站找回该读者!"<<endl;elsecout<<"删除失败,未找到该读者!"<<endl;cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 4:cout<<"请输入读者编号(11位):";cin>>rNumber;search(rNumber);cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 10:cout<<"确定要清空读者库吗?1:确定  0:取消  请选择:";cin>>choice;if(choice == 1)clearDB();cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 6:cout<<"┌──────┬─────┬───┐"<<endl;cout<<"│    编号    │   姓名   │ 借书 │"<<endl;cout<<"├──────┼─────┼───┤"<<endl;for(vector<Reader>::iterator i = readers.begin(); i != readers.end();){cout<<"│"<<setw(12)<<i->getNumber()<<"│"<<setw(10)<<i->getName()<<"│"<<setw(6)<<i->getBookCount()<<"│"<<endl;i++;}cout<<"└──────┴─────┴───┘"<<endl;cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 7:if(!addReaders()){cout<<"操作成功"<<endl;}cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 8:flag = 1;while(flag){for(vector<Reader>::iterator i = recovery.begin(); i != recovery.end();){cout<<"编号:"<<i->getNumber()<<"  姓名:"<<i->getName()<<endl;i++;}cout<<"请输入需要恢复的读者编号:";cin>>rNumber;for(vector<Reader>::iterator i = recovery.begin(); i != recovery.end();){if(strcmp(i->getNumber(), rNumber) == 0){cout<<"读者 "<<i->getName()<<" 恢复成功!";readers.push_back(*i);i = recovery.erase(i);break;}else i++;}cout<<"是否还需要恢复?1:是  0:否。请选择:";cin>>flag;}cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 9:removeSame();cout<<"----------------【操作完成】----------------"<<endl<<endl;break;case 5:cout<<"----------------【操作完成】----------------"<<endl<<endl;system("cls");tipsout(2);break;case 0:rexport();cout<<"----------------【退出成功】----------------"<<endl<<endl;return 0;break;default:cout<<"----选择错误,请重新选择!----"<<endl;break;}}return 1;}int readerDB::logout(){dboperator = 2;return 0;}int readerDB::setbdb(bookDB &db){bdb = &db;return 0;}void readerDB::tipsout(int choice){switch(choice){case 1://读者登陆cout<<"┌──────────────┐"<<endl;cout<<"│    欢迎进入读者信息系统    │"<<endl;cout<<"│                            │"<<endl;cout<<"│    1:图书查询             │"<<endl;cout<<"│    2:查看我的信息         │"<<endl;cout<<"│    3:借书                 │"<<endl;cout<<"│    4:还书                 │"<<endl;cout<<"│    5:清屏                 │"<<endl;cout<<"│    0:退出                 │"<<endl;cout<<"│                            │"<<endl;cout<<"└──────────────┘"<<endl;//cout<<"请输入操作代码:";break;case 2://管理员登陆cout<<"┌──────────────┐"<<endl;cout<<"│    欢迎进入读者维护系统    │"<<endl;cout<<"│                            │"<<endl;cout<<"│ 1:新增  2:更改  3:删除  │"<<endl;cout<<"│                            │"<<endl;cout<<"│ 4:查找并显示   5:清屏    │"<<endl;cout<<"│                            │"<<endl;cout<<"│ 6:全部显示  7:批量录入   │"<<endl;cout<<"│                            │"<<endl;cout<<"│ 8:回收站    9:去除重复   │"<<endl;cout<<"│                            │"<<endl;cout<<"│ 10:全部删除 0:退出       │"<<endl;cout<<"│                            │"<<endl;cout<<"└──────────────┘"<<endl;//cout<<"请输入操作代码:";break;}}int readerDB::rimport(){Reader reader1;ifstream file;file.open("reader.ldat", ios::in|ios::binary);while(true){file.read((char*)&reader1, sizeof(reader1));if(!file) break;readers.push_back(reader1);}readerCount = readers.size();file.close();//removeSame();return 0;}int readerDB::rexport(){readerCount = readers.size();fstream file;file.open("reader.ldat",ios::out| ios::binary);for(int i = 0; i < readerCount; i++){file.write((char*)&readers[i], sizeof(readers[i]));}file.close();return 0;}int readerDB::removeSame(){for(vector<Reader>::iterator i = readers.begin(); i != readers.end();){for(vector<Reader>::iterator j = i + 1; j != readers.end();){if(strcmp(i->getNumber(), j->getNumber()) == 0)j = readers.erase(j);elsej++;}i++;}return 0;}int readerDB::returnbook(){int bnumber;cout<<"请输入图书编号:";cin>>bnumber;const char *readerid = bdb->returnbook(bnumber);cin.clear();//情况缓存区,防止出错if(readerid == 0){cout<<"对不起,该书不存在"<<endl;return 1;}for(vector<Reader>::iterator i = readers.begin(); i != readers.end();){if(strcmp(i->getNumber(), readerid) == 0){if(!i->retBook(bnumber)){cout<<"还书成功!"<<endl;return 0;}else {cout<<"借书信息错误,该同学并未借此书"<<endl;return 2;//这本书信息错误,未借出}}elsei++;}cout<<"该书对应的读者不存在!"<<endl;return 3;//读者不存在}int readerDB::returnbookwhenlogin(){int bnumber;cout<<"请输入图书编号:";cin>>bnumber;const char *readerid = bdb->returnbook(bnumber);if(!rpoint->retBook(bnumber)){cout<<"还书成功!"<<endl;return 0;}else {cout<<"借书信息错误,该同学并未借此书"<<endl;return 2;//这本书信息错误,未借出}cout<<"该书对应的读者不存在!"<<endl;return 3;//读者不存在}


//main.cpp

#include "readerDB.h"#include <iostream>using namespace std;int running();int main(){running();system("pause");return 0;}void tipsout(){cout<<"╔══════════════════╗"<<endl;cout<<"║        欢迎进入小小图书馆          ║"<<endl;cout<<"║                                    ║"<<endl;cout<<"║     1:图书查询    2:读者登陆     ║"<<endl;cout<<"║     3:图书管理    4:读者管理     ║"<<endl;cout<<"║     5:清屏        6:关于         ║"<<endl;cout<<"║                                    ║"<<endl;cout<<"║     7:快捷还书    0:退出图书馆   ║"<<endl;cout<<"║                                    ║"<<endl;cout<<"║     说明:读者要登陆后方可借书     ║"<<endl;cout<<"╚══════════════════╝"<<endl;}void completedout(){cout<<"----------------【操作完成】----------------"<<endl<<endl;}int running(){readerDB rdb;bookDB   bdb;rdb.setbdb(bdb);bdb.setrDB(rdb);char  name[21];char  number[12];char  admin_name[21];char  admin_pwd[21];int choice;tipsout();while(true){cout<<"请选择功能项(5:清屏):";cin>>choice;switch(choice){case 1:cout<<"\n----------------【图书查询】----------------"<<endl;cout<<"请输入要查询的书名(支持模糊匹配,不支持空格):";cin.ignore();cin.getline(name, 21);bdb.search(name);completedout();break;case 2:cout<<"\n----------------【读者登陆】----------------"<<endl;cout<<"请输入读者编号:";cin.ignore();cin.getline(number, 12);if(!rdb.login(number)){system("cls");tipsout();}else{completedout();}break;case 3:cout<<"\n----------------【图书管理】----------------"<<endl;bdb.managing();system("cls");tipsout();break;case 4:cout<<"\n----------------【读者管理】----------------"<<endl;cout<<"请输入管理员用户名(默认为admin):";cin.ignore();cin.getline(admin_name, 20);cout<<"请输入管理员密码(默认为admin):";cin.getline(admin_pwd, 20);if(!rdb.login(admin_name, admin_pwd)){system("cls");tipsout();}elsecompletedout();break;case 5:cout<<"\n----------------【清屏】----------------"<<endl;system("cls");tipsout();break;case 6:cout<<"\n----------------【关于】----------------"<<endl;cout<<"\n小小图书管理系统\n";cout<<"";cout<<"功能说明:(暂未添加)\n\n";completedout();break;case 7:cout<<"\n----------------【快捷还书】----------------"<<endl;rdb.returnbook();cin.ignore();completedout();break;case 0:cout<<"\n----------------【退出】----------------"<<endl;return 0;//退出break;default:cout<<"\n----选择错误,请重新选择!----"<<endl<<endl;cin.clear();  //组合处理输入的字母= =bcin.ignore(); //组合处理输入的字母= =bbreak;}}return 1;}



 

六、 系统测试情况

编译正常、链接正常、运行正常

系统运行演示:

 

 

 

七、 系统的优点与不足

优点:

1、系统管理灵活

2、操作便捷

3、数据有一定的安全性

缺点:

1、    数据安全性尚需加强

2、    没有实现图形化界面