小小图书馆 - 一次程序作业 - 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、 没有实现图形化界面
- 小小图书馆 - 一次程序作业 - C++控制台程序
- 小小程序
- 小小程序
- 第一次c程序作业
- 第二次c程序作业
- 第三次c程序作业
- 控制台程序Ctrl +C 退出
- C#:控制台程序界面一闪而过
- C程序修改控制台颜色
- C语言扫雷控制台程序
- 【c#】控制台程序编写计时器
- 斯坦福作业2:简单Java程序 控制台作业合集
- 小小图书馆
- 第二次C程序课堂作业
- 第一次C程序课堂作业
- 第三次C程序课堂作业
- 第三次c程序课后作业
- 控制台程序
- 2012.06.12写一个简单的FTP客户端
- 行进中的总结——我的大学
- #pragma data_seg
- Android 解析内存泄漏
- android下使用RChart画曲线图动态刷新
- 小小图书馆 - 一次程序作业 - C++控制台程序
- java 多线程,android 移动开发,日语学习,各项新闻RSS吐血分享
- 什么都不懂?不用怕!
- Ubuntu 12.04 Unity 3D 失效情况打救方法~~
- 作为一个曾经看不上javascript的人,我推荐大家开始学习js
- init suspiciously returned 19, it should follow 0/-En解决思路
- vw虚拟机下CentOS6.2用锐捷xrgsu或mentohust 认证上网
- ORACLE解决登陆em状态暂挂方法
- C#中索引器的实现过程