C++实现图书管理程序
作者:sipprince
这篇文章主要为大家详细介绍了C++实现图书管理程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了C++实现图书管理程序的具体代码,供大家参考,具体内容如下
主文件
#include <iostream> #include "library.h" #include "info.h"//读取帮助文件 using namespace std; int main() { char choice='w'; string bookid; int readerid;//图书、读者编号 RDatabase ReaderDB; //读者库 Reader *r; BDatabase BookDB; //图书库 Book *b; int i=1; while(choice!='0') { cout <<"\n\n\t\t\t 图 书 管 理 系 统\n\n\n"; cout <<"\t\t\t1: 借 书\n\n\t\t\t2: 还 书 \n\n\t\t\t3: 图 书 维 护\n\n\t\t\t4: 读 者 维 护\n\n\t\t\t5: 帮 助\n\n\t\t\t0: 退 出"<<endl; cin >> choice; switch (choice) { case '1': cout <<" |借书|\n读者编号(1~"<<Maxr<<"):"; cin >>readerid; r=ReaderDB.query(readerid);//按编号查找 if (NULL==r) //查找是否有该读者 { cout <<"不存在该读者,不能借书"<<endl; break; } cout <<" 图书编号(n-n-n-x):"; bookid=input_ISBN(); b=BookDB.query(bookid); //查找是否有该书 if (b==NULL) { cout <<"不存在该图书,不能借书"<< endl; break; } if (b->borrowbook()==0)//存在该书的情况下查找该书是否已借出 { cout << " 该图书已借出,不能借书"<< endl; break; } r->borrowbook(b->getISBN());//成功借书 cout<<"借书成功!"<<endl; break; case '2': cout<<"|还书|\n 读者编号(1~"<<Maxr<<"):"; cin >>readerid; if (r==NULL) { cout <<"不存在该读者,不能还书" << endl; break; } cout <<"图书编号(n-n-n-x):"; bookid=input_ISBN(); r=ReaderDB.query(readerid); b=BookDB.query(bookid); if (b==NULL) { cout <<"不存在该图书,不能还书" <<endl; break; } b->retbook(); r->retbook(b->getISBN()); //还书成功 break; case '3': BookDB.bookdata(); //图书维护 break; case '4': ReaderDB.readerdata(); //读者维护 break; case '5': read_info(); case '0': break; default: cout<<"输入错误,请重新输入:"; } } return 0; }
acquire_date.h
//获取系统时间 #include <iostream> #include <ctime> /* time.h in C */ using namespace std; struct Time { int y; int m; int d; }; Time acquire_time() { time_t now; struct tm *fmt; Time t; time(&now); fmt = localtime(&now); t.y=fmt->tm_year%100;//获取年月日 t.m=fmt->tm_mon+1; t.d=fmt->tm_mday; cout<<t.y<<"年"<<t.m<<"月"<<t.d<<"日"<<endl; return t; }
delete_space.h
//去空格 #include <iostream> #include <string> using namespace std; string input_ISBN() { bool ifGo=1; char n='0'; string names="0"; cout<<"(输入ISBN)"<<endl; while(ifGo==1){ int i=0; int f=0; while(cin>>n) { if(n>='0'&&n<='9'&&i<3){ names+=n; f++;} else if(n=='-'&&i<3&&f!=0){ names+=n; i++; } else if(i==3&&((n>='a'&&n<='z')||(n>='A'&&n<='Z')||(n>='0'&&n<='9'))) { names+=n; cin.clear(); cin.sync(); ifGo=0; break; } else{ cout<<"输入错误!请重新输入:"; names="0"; ifGo=1; cin.clear(); cin.sync(); i=0; f=0; } } } string names1; for(int j=1;j<names.length();j++) names1+=names[j]; return names1; }
info.h
//读取帮助文件 #include <fstream> #include <iostream> using namespace std; const int l=100;//每一行的长度 void read_info() { ifstream ios("help.txt"); char s[l];//用于读取文件中的一行 for(int j=0;j<l;j++) s[j]='\t'; while( ios.getline(s,l)) { for(int i=0;i<l;i++) { if(s[i]!='\t') cout<<s[i]; } cout<<endl; for(int j=0;j<l;j++) s[j]='\t'; } }
library.h
//主功能实现 #include <iostream> #include <iomanip> #include <string> #include <fstream>//输入/输出文件流类 #include "delete_space.h" #include "acquire_date.h"//获取系统日期 using namespace std; const int Maxr=100;//最多的读者 const int Maxb=100;//最多的图书 const int Maxbor=8;//每位读者最多借八本书 const int bkNlen=20;//图书名字长度 const int rdNlen=20;//读者及作者名字长度 const int Maxday=60;//读书借阅期(以日算) enum Genre{fic,nfic,per,bio,chi,unk};/*fic-fiction,nfic-nonfiction,per-periodical, bio-biography,chi-children,unk-unknown*/ //读者类,实现对读者的信息的描述 class Reader { private: bool tag; //删除标记 1:已删 0:未删 int num; //读者编号 char name[rdNlen]; //读者姓名 string borbook[Maxbor];//所借图书 Time bortime[Maxbor];//借书时间 public: Reader() {} char *getname() {return name;} //获取姓名 bool gettag() {return tag;} //获取删除标记 int getnum() {return num;} //获取读者编号 void setname(char na[]) //设置姓名 { strcpy(name,na); } void delbook(){ tag=1; }//设置删除标记 1:已删 0:未删 void addreader(int n,char *na)//增加读者 { tag=0; num=n; strcpy(name,na); for(int i=0;i<Maxbor;i++) borbook[i]="0"; } void borrowbook(string bookid)//借书操作 { for(int i=0;i<Maxbor;i++) { if (borbook[i]=="0") { borbook[i]=bookid; bortime[i]=acquire_time(); return; } } } int retbook(string bookid)//还书操作 { for(int i=0;i<Maxbor;i++) { if(borbook[i]==bookid) { borbook[i]="0"; bortime[i].y=0; bortime[i].m=0; bortime[i].d=0; return 1; } } return 0; } void check()//检查是否欠费 { Time t=acquire_time(); for(int i=0;i<Maxbor;i++) { if((bortime[i].y!=0&&bortime[i].m!=0&&bortime[i].d!=0) &&((t.y-bortime[i].y)*365+(t.m-bortime[i].m)*30+(t.d-bortime[i].d))>Maxday) cout<<"欠费"<<endl; } cout<<"不欠费"<<endl; } void disp()//读出读者信息 { check(); cout << setw(10) << num <<setw(20) << name<<"借书编号:["; for(int i=0;i<Maxbor;i++) if(borbook[i]!="0") cout << borbook[i] << "|"; cout << "]"<<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 (true) { file.read((char *)&s,sizeof(s)); if (!file)break; top++; read[top]=s; } file.close(); //关闭 reader.txt } void clear()//删除所有读者信息 { top=-1; } int addreader(int n,char *na)//添加读者时先查找是否存在 { Reader *p=query(n); if (p==NULL) { top++; read[top].addreader(n,na); return 1; } return 0; } Reader *query(int readerid)//按编号查找 { for (int i=0;i<=top;i++) if (read[i].getnum()==readerid && read[i].gettag()==0) { return &read[i]; } return NULL; } void disp() //输出所有读者信息 { for (int i=0;i<=top;i++) 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 choice='7'; char rname[rdNlen]; int readerid; Reader *r; while (choice!='0') { cout <<"\n\n\t\t\t读 者 维 护\n\n\n\t\t 1: 新 增\n\n\t\t 2: 更改\n\n\t\t 3: 删 除\n\n\t\t 4: 查 找\n\n\t\t 5: 显 示\n\n\t\t 6: 全 删\n\n\t\t 0: 退出"<<endl; cin >> choice; switch (choice) { case '1': cout << "输入读者编号(1~"<<Maxr<<"):"; cin >> readerid; cout << "输入读者姓名:"; cin >> rname; addreader (readerid,rname); break; case '2': cout << "输入读者编号(1~"<<Maxr<<"):"; cin >> readerid; r=query(readerid); if (r==NULL) { cout << " 该读者不存在 "<<endl; break; } cout << "输入新的姓名:"; cin >> rname; r->setname(rname); break; case '3': cout << " 输入读者编号(1~"<<Maxr<<"):"; cin >> readerid; r=query(readerid); if (r==NULL) { cout <<" 该读者不存在" << endl; break; } r->delbook(); break; case '4': cout << "输入读者编号(1~"<<Maxr<<"):"; cin >> readerid; r=query(readerid); if (r==NULL) { cout <<"该读者不存在"<< endl; break; } r->disp(); break; case '5': disp(); break; case '6': clear(); break; default: cout<<"输入错误,请重新输入:"; } } } //图书类,实现对图书的描述,图书的编号,书名,借出,还入等 class Book { private: bool tag;//删除标记 1:已删 0:未删 string ISBN;//图书编号 char name[bkNlen];//书名 char author[rdNlen];//作者名 Genre kind;//图书类型 bool onshelf;//是否在架 1:在架 0:已借 public: Book(){} char *getname() { return name; }//获取书名 char *getauthor(){return author;}//获取作者 string getkind(); //获取图书类型 string getISBN(){ return ISBN; }//获取图书ISBN bool gettag(){ return tag; }//获取删除标记 void setname(char na[])//设置书名 { strcpy(name,na); } void setauthor(char au[])//设置作者名 { strcpy(author,au); } void setkind(Genre g)//设置图书类型 { kind=g; } void delbook(){ tag=1;}//删除图书 void addbook(string s1,char *na,char *au,Genre g)//增加图书 { tag=0; ISBN=s1; strcpy(name,na); strcpy(author,au); kind=g; onshelf=1; } bool borrowbook()//借书操作 (并查找是否在架) { if (onshelf==1) { onshelf=0; return 1; } return 0; } void retbook()//还书操作 { onshelf=1; } void disp()//输出图书 { cout <<setw(10)<<ISBN <<setw(10)<<"《"<<name<<"》" <<setw(10)<<"("<<author<<")" <<setw(15)<<getkind() <<setw(10)<<(onshelf==1? "在架":"已借") <<endl; } }; string Book::getkind()//返回图书类型 { switch(kind) { case 0: return"fiction"; break; case 1: return "nonfiction"; break; case 2: return "periodical"; case 3: return "biography"; case 4: return "children"; default: return "unknow"; } } bool operator==(Book &b1,Book&b2)//判断两本书的ISBN号是否相等 1-相同 0-不同 { if(b1.getISBN()==b2.getISBN()) return 1; return 0; } bool operator!=(Book &b1,Book&b2)//判断两本书的ISBN号是否不等 1-不同 0-相同 { if(b1.getISBN()!=b2.getISBN()) return 1; return 0; } //图书库类,实现对图书的维护,查找,删除等 class BDatabase { private: int top; //图书数组最高下标 Book book[Maxb]; //图书记录 public: BDatabase()//将book.txt读到book[]中 { Book b; top=-1; fstream file("book.txt",ios::in); while (true) { file.read((char *)&b,sizeof(b)); if (!file) break; top++; book[top]=b; } file.close(); } void clear()//全删 { top=-1; } int addbook(string s1,char *na,char *au,Genre g)//增加图书 { Book *p=query(s1); if (p==NULL) { top++; book[top].addbook(s1,na,au,g); return 1; } else{ cout<<"已存在该ISBN号!请检查输入!"<<endl; return 0; } } Book *query(string bookid)//查找图书 { for (int i=0;i<=top;i++) if (book[i].getISBN()==bookid &&book[i].gettag()==0)//找到并且未删 { return &book[i]; } 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 choice='w'; char bname[bkNlen]; char aname[rdNlen]; int bkind; Genre bkind1; string bookid; Book *b; while (choice!='0') { cout <<"\n\n\n\t\t\t图 书 维 护 \n"<<endl; cout<<"\t\t1: 新 增\n \t\t2: 更 改\n\t\t3: 删 除\n\t\t4: 查 找\n\t\t5: 显示\n\t\t6: 全 删\n\t\t0: 退 出"<<endl; cin >> choice; switch (choice) { case '1': cout <<"输入图书编号(n-n-n-x):"<<endl; bookid=input_ISBN(); cout <<"输入图书书名:"<<endl; cin >>bname; cout<<"输入作者姓名:"<<endl; cin>>aname; cout<<"输入图书类型:\n1-fiction,2-nonfiction,3-periodical,4-biography,5-children"<<endl; cin>>bkind; if(bkind<6&&bkind>0) bkind1=Genre(bkind-1); else bkind1=Genre(5); addbook(bookid,bname,aname,bkind1); break; case '2': cout << "输入图书编号(n-n-n-x):"<<endl; cin >> bookid; b=query(bookid); if (b==NULL) { cout << " 该图书不存在 "<<endl; break; } cout <<"输入新的书名:"<<endl; cin >>bname; b->setname(bname); cout <<"输入新的作者名:"<<endl; cin >>aname; b->setauthor(aname); cout <<"输入新的类型:\n1-fiction,2-nonfiction,3-periodical,4-biography,5-children"<<endl; cin >>bkind; if(bkind<6&&bkind>0) bkind1=Genre(bkind-1); b->setkind(bkind1); break; case '3': cout <<"输入图书编号(n-n-n-x):"<<endl; cin >> bookid; b=query(bookid); if (b==NULL) { cout <<"该图书不存在" << endl; break; } b->delbook(); break; case '4': cout <<"输入图书编号(n-n-n-x):"<<endl; cin >> bookid; b=query(bookid); if (b==NULL) { cout <<"该图书不存在"<< endl; break; } b->disp(); break; case '5': disp(); break; case '6': clear(); break; case '0': break; default: cout<<"输入错误,请重新输入:"; } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。