#include<iostream>
#include<conio.h> //控制台数据输入输出的函数
#include<fstream>//文件流
#include<iomanip> //控制数据输出格式
#include<string.h>
using namespace std; const int Maxr=100 ;//最多的读者数
const int Maxb=100; //最多的图书数
const int Maxbor=5; //每位读者最多借的书class Book
{//图书类,实现对图书的描述,图书的编号,书名,借出,还入等功能
private:
int tag; //
int no; //图书编号
char name[20]; //书名
char author[20];//作者
char cbs[20]; //出版社
int cbtime;//出版时间
double bookprice;//图书价格
int onshelf; //是否再架 1:再架 2:已借
public:
Book(){;}
char *getname()
{//获取书名return name;
}
char *getauthorname()
{//获取作者名return author;
}
char *getcbsname()
{//获取出版社名 return cbs;
}
int getcbtime()
{//获取出版时间return cbtime;
}
double getbookprice()
{//获取图书价格return bookprice;
}
int getno()
{//获取图书编号return no;
}
int gettag()
{//获取删除标记 return tag;
}void setname(char na[])
{//设置书名strcpy(name,na);
}
void setauthorname(char aa[])
{//设置作者名
strcpy(author,aa);
}
void setcbs(char ca[])
{//设置出版社strcpy(cbs,ca);
}
void setcbtime(int time)
{//设置时间cbtime=time;
}
void setbookprice(double price)
{//设置图书价格bookprice=price;
}
void setonshelf(int oa)
{onshelf=oa;
}
void delbook()
{//删除图书char i;cout<<"确定删除吗?Y/N ?"<<endl;cin>>i;if(i=='y'||i=='Y')tag=1;
}
void addbook(int n,char *na,char *aa,char *ca,int time,double price,int oa)
{//增加图书 tag=0; no=n; strcpy(name,na);strcpy(author,aa);strcpy(cbs,ca);cbtime=time;bookprice=price;onshelf=oa;
}
int borrowbook()
{//借书操作 if (onshelf>0) { onshelf--;return 1; } return 0;
}
void retbook()
{//还书操作onshelf++;
}
void disp()
{//输出图书 cout<<setw(6)<<no<<setw(10)<<name<<setw(10)<<author<<setw(10)<<cbs<<setw(15)<<cbtime<<setw(15)<<bookprice<<setw(10)<<onshelf<<endl;
}
}; class BDatabase
{//图书库类,实现对图书的维护,查找,删除等
private:
int top; //图书记录指针
Book book[Maxb]; //图书记录
public:
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 clear()
{//全删 char i;cout<<"确定全部删除吗?Y/N ?"<<endl;cin>>i;if(i=='y'||i=='Y')top=-1;
}
int addbook(int n,char *na,char *aa,char *ca,int time, double price,int oa)
{//增加图书 Book *p=query1(n); if (NULL==p) { top++; book[top].addbook(n,na,aa,ca,time,price,oa); return 1; } return 0;
}
Book *query1(int bookid)
{//按编号查找图书 for(int i=0;i<=top;i++) if(book[i].getno()==bookid &&book[i].gettag()==0) { return &book[i]; } return NULL;
}
Book *query2(char a[])
{//按书名查找图书Book *e;int r=0;for(int i=0;i<=top;i++)if(strcmp(book[i].getname(),a)==0 &&book[i].gettag()==0) { if(r==0)cout<<setw(6)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"出版社"<<setw(15)<<"出版时间"<<setw(15)<<"图书价格"<<setw(10)<<"存量"<<endl;e=&book[i];e->disp();r++; } if(r==0)cout<<"找不到该书!"<<endl;return NULL;
}
Book *query3(char a[])
{//按作者查找图书 Book *e;int r=0;for(int i=0;i<=top;i++) if(strcmp(book[i].getauthorname(),a)==0 &&book[i].gettag()==0) { if(r==0)cout<<setw(6)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"出版社"<<setw(15)<<"出版时间"<<setw(15)<<"图书价格"<<setw(10)<<"存量"<<endl;e=&book[i];e->disp();r++; } if(r==0)cout<<"找不到该书!"<<endl;return NULL;
}
Book *query4(char a[])
{//按出版社查找图书 Book *e;int r=0;for (int i=0;i<=top;i++)if (strcmp(book[i].getcbsname(),a)==0 &&book[i].gettag()==0) { if(r==0)cout<<setw(6)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"出版社"<<setw(15)<<"出版时间"<<setw(15)<<"图书价格"<<setw(10)<<"存量"<<endl;e=&book[i];e->disp();r++; }if(r==0)cout<<"找不到该书!"<<endl;return NULL;
}
void bookdata(); //图书库信息
void disp()
{ for(int i=0;i<=top;i++) if(book[i].gettag()==0) book[i].disp();
}
~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 BDatabase::bookdata()
{
char choice3;
char bname[40];//书名
char auname[40];//作者名
char cname[40];//出版社
int time;//出版时间
double price;//价格
char ch;
int choice4;
int bookid;
int bookod;
Book *b;
while (choice3!='0')
{ cout<<"\n\t\t\t**   图  书 信 息 **\n"<<endl; cout<<"\t\t\t** 1.新        增 **"<<endl;cout<<"\t\t\t** 2.更        改 **"<<endl;cout<<"\t\t\t** 3.删        除 **"<<endl;cout<<"\t\t\t** 4.查        找 **"<<endl;cout<<"\t\t\t** 5.显        示 **"<<endl;cout<<"\t\t\t** 6.全        删 **"<<endl;cout<<"\t\t\t** 0.返        回 **"<<endl; cout<<"\t\t\t 请选择:";cin>>choice3; switch(choice3) { case '1': cout<<"请输入新书编号:"; cin>>bookid;b=query1(bookid); if(b!=NULL) { cout<<"该编号已经存在,不能添加!"<<endl;break; }cout<<"请输入新书书名:"; cin>>bname;cout<<"请输入新书作者名:"; cin>>auname;cout<<"请输入新书出版社:"; cin>>cname;cout<<"请输入新书出版时间:";cin>>time;cout<<"请输入图书价格:";cin>>price;cout<<"请输入新书数量:"; cin>>bookod;addbook(bookid,bname,auname,cname,time,price,bookod);cout<<"添加图书成功!";getch(); break; case '2': cout<<"请输入图书编号:"; cin>>bookid; b=query1(bookid); if(b==NULL) { cout<<"该图书不存在! "<<endl;break; }cout<<"该图书的信息是:"<<endl;cout<<setw(6)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"出版社"<<setw(15)<<"出版时间"<<setw(15)<<"图书价格"<<setw(10)<<"存量"<<endl;b->disp();cout<<"是否修改?( y/n ):";cin>>ch;if(ch=='y'||ch=='Y'){int a;cout<<"\n\t\t\t**   图 书 修 改 **\n"<<endl; cout<<"\t\t\t** 1.修 改 书 名      **"<<endl;cout<<"\t\t\t** 2.修 改 作 者      **"<<endl;cout<<"\t\t\t** 3.修 改 出 版 社   **"<<endl;cout<<"\t\t\t** 4.修 改 出 版 时 间**"<<endl;cout<<"\t\t\t** 5.修 改 图 书 价 格**"<<endl;cout<<"\t\t\t** 6.修 改 图 书 数 量**"<<endl;cout<<"\t\t\t** 0.返        回 **"<<endl; cout<<"\t\t\t 请选择:";cin>>a;
switch(a)
{case 1:  cout<<"请输入新的书名:"; cin>>bname; b->setname(bname); break;
case 2:    cout<<"请输入新的作者:";cin>>auname; b->setauthorname(auname); break;
case 3:    cout<<"请输入新书出版社:";cin>>cname;  b->setcbs(cname); break;
case 4:  cout<<"请输入新书出版时间:";cin>>time;b->setcbtime(time); break;
case 5:  cout<<"请输入图书价格:";cin>>price;  b->setbookprice(price); break;
case 6: cout<<"请输入新的存量:"; cin>>bookod; b->setonshelf(bookod);  break;
case 0: break;}}cout<<"修改图书成功!";getch(); break;case '3':   cout<<"请输入图书编号:"; cin>>bookid; b=query1(bookid); if(b==NULL) { cout<<"该图书不存在,无法删除!"<<endl;break; } b->delbook();cout<<"删除成功!";getch();break; case '4':   cout<<"\t\t\t** 1.按图书编号查找 **"<<endl;cout<<"\t\t\t** 2.按图书书名查找 **"<<endl;cout<<"\t\t\t** 3.按图书作者查找 **"<<endl;cout<<"\t\t\t** 4.按图书出版社查找**"<<endl;cout<<"\t\t\t** 0.  返      回   **"<<endl;cout<<"\t\t\t 请选择:"; cin>>choice4;switch(choice4){case 1: cout<<"请输入图书编号:"; cin>>bookid;b=query1(bookid);if(b==NULL) { cout<<"该图书不存在!";break; }cout<<setw(6)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"出版社"<<setw(15)<<"出版时间"<<setw(15)<<"图书价格"<<setw(10)<<"存量"<<endl;b->disp(); break;     case 2: cout<<"请输入图书书名:"; cin>>bname;b=query2(bname);break;case 3: cout<<"请输入图书作者:"; cin>>auname;b=query3(auname);break;case 4: cout<<"请输入图书出版社:"; cin>>cname;b=query4(cname);break;case 0: break;}break;case '5': cout<<setw(6)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"出版社"<<setw(15)<<"出版时间"<<setw(15)<<"图书价格"<<setw(10)<<"存量"<<endl;disp();getch(); break; case '6': clear(); break; default: break; }
}
}class Reader
{//读者的信息描述
private:
int tag; //删除标记 1表示已删 0表示未删
int no; //读者编号
char name[20]; //读者姓名
int borbook[Maxbor]; //所借图书
public:
Reader()  //构造函数
{ ; }
char *getname()
{//获取姓名 return name;}
int gettag()
{//获取删除标记 return tag;
}
int getno()
{//获取读者编号 return no;
}
void setname(char na[])
{//设置姓名 strcpy(name,na);
}
void delbook()
{//设置删除标记 1:已删 0:未删 char i;cout<<"确定删除吗?Y/N ?"<<endl;cin>>i;if(i=='y'||i=='Y')tag=1;
}
void addreader(int n,char *na)
{//增加读者 tag=0; no=n; strcpy(name,na); for(int i=0;i<Maxbor;i++) borbook[i]=0;
}
void borrowbook(int bookid)
{//借书操作 for(int i=0;i<Maxbor;i++) { if (borbook[i]==0) {borbook[i]=bookid;return ; } }
}
int retbook(int bookid)
{//还书操作 for(int i=0;i<Maxbor;i++) { if(borbook[i]==bookid) { borbook[i]=0;cout<<"还书成功!"<<endl;return 1; } }cout<<"未借该书,还书失败!"<<endl;return 0;
}
void disp()
{//读出读者信息int have=0;int bz=0;cout<<setw(5)<<no<<setw(21)<<name<<setw(15);for(int i=0;i<Maxbor;i++) if(borbook[i]!=0){ if(bz==0){have=1;cout<<"["<<borbook[i]<<"]\t\t"<<endl;            bz++;}else{cout<<"\r\t\t\t\t\t""["<<borbook[i]<<"]\t\t"<<setw(15)<<endl; }}if(have==0)cout<<"\t     还未借书"<<endl;
}
};class RDatabase
{//读者类库,实现建立读者的个人资料
private:
int top; //读者记录指针 Reader read[Maxr]; //读者记录
public:
RDatabase()
{//构造函数,将reader.txt读到read[]中 Reader s; top=-1;    fstream file("reader.txt",ios::in); //打开一个输入文件while (1) { file.read((char *)&s,sizeof(s)); if (!file)break; top++; read[top]=s; } file.close(); //关闭 reader.txt 文件
}
void clear()
{//删除所有读者信息 char i;cout<<"确定全部删除吗?Y/N ?"<<endl;cin>>i;if(i=='y'||i=='Y')top=-1;
}
int addreader(int n,char *na)
{//添加读者时先查找是否存在 Reader *p=queryid(n); if (p==NULL){top++; read[top].addreader(n,na); return 1; }elsecout<<"该编号已经存在!";return 0;
}
Reader *queryid(int readerid)
{//按读者编号查找for (int i=0;i<=top;i++) if (read[i].getno()==readerid&&read[i].gettag()==0) { return &read[i]; } return NULL;
}
Reader *queryname(char readername[10])
{//按读者姓名查找for (int i=0;i<=top;i++) if (strcmp(read[i].getname(),readername)==0 && read[i].gettag()==0) { return &read[i]; } return NULL;
}
void disp()
{//输出所有读者信息 for(int i=0;i<=top;i++)if (read[i].gettag()==0)read[i].disp();
}
void readerdata(); //读者库信息
~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();
}
};void RDatabase::readerdata()
{char choice1;
char rname[20];
int readerid;
char readername[10];
int choice2;
Reader *r;
while(choice1!='0')
{cout<<"\n\t\t\t** 读 者 信 息 **\n"<<endl;cout<<"\t\t\t** 1.  新       增 **"<<endl;cout<<"\t\t\t** 2.  更       改 **"<<endl;cout<<"\t\t\t** 3.  删       除 **"<<endl;cout<<"\t\t\t** 4.  查       找 **"<<endl;cout<<"\t\t\t** 5.  显       示 **"<<endl;cout<<"\t\t\t** 6.  全       删 **"<<endl;cout<<"\t\t\t** 0.  返       回 **"<<endl; cout<<"\t\t\t 请选择:";cin>>choice1; switch(choice1) { case '1': cout<<"请输入读者编号:"; cin>>readerid;cout<<"请输入读者姓名:"; cin>>rname;addreader(readerid,rname);cout<<"添加读者成功!"<<endl;getch();break;case '2': cout<<"请输入读者编号:"; cin>>readerid; r=queryid(readerid); if(r==NULL) { cout<<"该读者不存在! "<<endl; break; } cout<<"请输入新的姓名:"; cin>>rname; r->setname(rname); cout<<"修改读者成功!"<<endl;getch();break;case '3': cout<<"请输入读者编号:"; cin>>readerid; r=queryid(readerid); if(r==NULL) { cout<<"该读者不存在!" << endl; break; }        r->delbook();cout<<"删除成功!"<<endl;getch();break; case '4':cout<<"\t\t\t** 1.按读者编号查找 **"<<endl;cout<<"\t\t\t** 2.按读者姓名查找 **"<<endl;cout<<"\t\t\t** 0.返          回 **"<<endl;cout<<"\t\t\t 请选择:"; cin>>choice2;switch(choice2){case 1: cout<<"请输入读者编号:"; cin>>readerid;r=queryid(readerid); if(r==NULL) { cout<<"该读者不存在!"<< endl; break; }cout<<setw(10)<<"读者编号"<<setw(17)<<"读者姓名"<<setw(20)<<"已借书编号"<<endl;r->disp();break;     case 2: cout<<"请输入读者姓名:"; cin>>readername; r=queryname(readername); if(r==NULL) { cout<<"该读者不存在!"<<endl;break; }cout<<setw(10)<<"读者编号"<<setw(17)<<"读者姓名"<<setw(20)<<"已借书编号"<<endl;r->disp();break;case 0: break;}break;case '5':cout<<setw(10)<<"读者编号"<<setw(17)<<"读者姓名"<<setw(20)<<"已借书编号"<<endl;disp();getch(); break; case '6': clear();break; default: break; }
}
}class maindesk //实现程序的主界面
{ char choice5; int bookid,readerid; RDatabase ReaderDB; Reader *r; BDatabase BookDB; Book *b;
public:
maindesk() {;}
void enterdesk()
{cout<<"\t\t\t 欢迎光临图书馆管理系统!"<<endl;
while(choice5!='0')
{   cout<<"\n\t\t\t**** 图 书 管 理 系 统****\n\n"; cout<<"\t\t\t** 1.图   书   信   息 **"<<endl;cout<<"\t\t\t** 2.读   者   信   息 **"<<endl;cout<<"\t\t\t** 3.借   阅   图   书 **"<<endl;cout<<"\t\t\t** 4.归   还   图   书 **"<<endl;cout<<"\t\t\t** 0.     退   出      **"<<endl; cout<<"\t\t\t 请选择:";cin>>choice5; switch (choice5) { case '1':   BookDB.bookdata(); break; case '2': ReaderDB.readerdata(); break; case '3':cout<<"\t\t\t\t借书操作"<<endl;cout<<"请输入借书读者编号:"; cin>>readerid;r=ReaderDB.queryid(readerid);           if(NULL==r)    {//按编号查找是否有该读者 cout<<"不存在该读者,不能借书!"<<endl;break; } cout<<"请输入要借图书编号:"; cin>>bookid;   b=BookDB.query1(bookid);              if(b==NULL)   {//按编号查找是否有该图书 cout<<"不存在该图书,不能借书!"<<endl;break; }     if(b->borrowbook()==0) { cout<<"该图书已借完,不能借书!"<<endl;break; }cout<<"读者借书成功!"<<endl;r->borrowbook(b->getno());break;   case '4': cout<<"\t\t\t\t还书操作"<<endl;cout<<"请输入还书读者编号:"; cin>>readerid;r=ReaderDB.queryid(readerid);if(r==NULL) { cout<<"不存在该读者,不能还书"<<endl;break; } cout<<"请输入要归还图书编号:"; cin>>bookid; b=BookDB.query1(bookid); if(b==NULL) {cout<<"不存在该图书,不能还书"<<endl; break; }b->retbook(); r->retbook(b->getno());break; default: break; }
}
}
};int main() //主函数
{maindesk yourDesk;yourDesk.enterdesk();
cout<<"\t\tGAME OVER !"<<endl;
}

作者:艾孜尔江;转载请务必标明出处!
适用于大学C++期末大作业

C++图书管理系统_艾孜尔江撰相关推荐

  1. JavaScript实现令人放松的小游戏_艾孜尔江撰

    <html><head><!-- 由艾孜尔江·艾尔斯兰复现,转载或使用请注意标明出处.全程均使用鼠标交互,原游戏创作者不详,复现时有改动.使用时请在本地路径下放置一张玩家 ...

  2. 用JavaScript实现贪吃蛇游戏_艾孜尔江撰

    <!DOCTYPE html> <html><head><meta charset="utf-8" /><title>J ...

  3. JavaScript实现打砖块游戏_艾孜尔江撰

    <!DOCTYPE html> <html> <!-- 使用原生的JavaScript复现打砖块游戏:代码在复现时有所改动.--><head><m ...

  4. Git常用命令及其作用_艾孜尔江撰

    撤销所有本次未提交的修改(相当于Tortoise Git的revert按钮): git checkout . 恢复某个已修改的文件(撤销未提交的修改): git checkout file-name ...

  5. 从0开始配置云服务器开发环境_艾孜尔江撰

    选择云服务器系统为Cent OS最新版本或根据自己的需求选择稳定版本,并在完成部署之后从本地通过在终端中输入 ssh root@YourIPAdress 登录到服务器上,如果出现 ssh连接时提示TH ...

  6. 获取平面的法向量_艾孜尔江撰

    Vector4 GetNormalVector(const Vector4& p1, const Vector4& p2, const Vector4& p3){Vector4 ...

  7. 点与平面的距离特征_艾孜尔江撰

    点到平面距离公式 distance = Ax + By + Cz + D; //点P(x,y,z),平面的法向量n=(A,B,C),D是距原点的距离. 其中n = (A, B, C)是平面的法向量,D ...

  8. 关闭Windows更新后出现的桌面下方天气预报_艾孜尔江撰

    问题阐述 最近根据微软官方定时更新提示,更新了一下Windows 10系统,更新完之后最大的改变我感觉就是桌面右下角任务栏上出现了关于今日天气预报的相关提示,类似于任务栏上的广告.笔者不禁慨叹:&qu ...

  9. 文曲星猜数字算法_艾孜尔江撰

    //姓名:艾孜尔江·艾尔斯兰 学号:17081160 时间:2018年5月25日 21:33 #include<iostream> #include<ctime>//时间 #i ...

最新文章

  1. mysql 游标 ,嵌套游标
  2. OVS vxlan(二十八)
  3. Lua 5.1.1 源代码阅读笔记
  4. WCF与 Web Service的区别
  5. 计算机无法检测电池损耗怎么办,笔记本电脑无法充电怎么办?笔记本电池损耗如何修复?...
  6. SQL Server 2012 中的 Service Broker功能的一些改进或增强
  7. php 接口说明文档,phpwind文章中心接口说明
  8. SAP Spartacus 自定义 PageResolver 的用法
  9. mysql order by按照汉字拼音进行排序
  10. hdfs snapshot 快照的使用场景应用与操作命令的介绍
  11. php while循环语句格式,PHP while 循环
  12. Handler.sendMessage 与 Handler.obtainMessage.sendToTarget比较
  13. VMware-分配 vSphere 5.0 许可证密钥
  14. GD32E230开发笔记-GD32E230开发Demo
  15. (VGG)VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION--Karen Simonyan
  16. T156基于51单片机LCD12864指针时钟Proteus设计、keil程序、c语言、源码、ds1302,电子时钟,62256
  17. SUBSTANCE PAINTER质感案例教学 PBR次世代影视游戏场景道具制作 SP金属木头皮革材质渲染...
  18. MySQL学习教程(超全)
  19. Ormlite的工具使用
  20. LeetCode 力扣每日一题 488.祖玛游戏

热门文章

  1. 【CANopen】CAN总线的高级协议详解
  2. 手指检测心跳设计——传感器制作篇
  3. uos网页服务器安装,安装uos
  4. 项目经理的能力模型和能力提升的方法
  5. 周末了,看,首富出门遛狗。
  6. react实现路由跳转拦截功能(导航守卫)
  7. 如何确定论文研究方向,看了很多论文还是没有头绪?
  8. git 多人在同一分支上迭代开发时,如何保证分支提交历史保持线性
  9. linux下drcom无法上网,安装drcom出现问题
  10. 认真阅读完这篇文章熟练掌握关于IDEA断点调试操作(图文详解)