当前位置:文档之家› C++图书库存管理器

C++图书库存管理器

#include <iostream>#include <cstring>#include <fstream>#include <stdlib.h>using namespace std;//------------------以下是类定义:Book -----------------------------------------class bookList;class Book //书类{char bookNo[15]; //书号char bookName[20]; //书名int Num; //数量public:Book(char *bNo=NULL, char *bNa=NULL, int n=0); //构造函数,各参数均有缺省值void Show(); //显示一本图书信息void print(ofstream &out); //将一本图书信息写入数据文件void setInfo(char *nop, char *nap, int n); //设置一本图书信息void setNum(int n); //设置库存量int getNum(); //获取库存量friend class bookList; //将bookList类说明为友元类。

//……//根据需要添加公有函数接口…… };Book::Book(char *bNo, char *bNa, int n){if(bNo)strcpy(bookNo, bNo);elsebookNo[0]='\0';if(bNa)strcpy(bookName, bNa);elsebookName[0]='\0';Num=n;}void Book::Show(){cout<<bookNo<<'\t'<<bookName<<'\t'<<Num<<endl;}void Book::print(ofstream &out){out<<bookNo<<'\t'<<bookName<<'\t'<<Num<<endl;}void Book::setInfo(char *nop, char *nap, int n){strcpy(bookNo, nop);strcpy(bookName, nap);Num=n;}void Book::setNum(int n) //设置库存量{Num=n;}int Book::getNum() //获取库存量{return Num;}//-----------以下是类定义:bookList-----------------------------------------------------class bookList //书库类{Book *Books; //图书线性表首指针int curLen; //现有图书种类数int maxLen; //图书最多种类数public:bookList(int Len=20); //构造函数,初始化书库~ bookList ( ); //析构函数,释放书库空间void appendBook(char *nop,char *nap, int n); //追加一种图书int isIn(char *bkNo); //按书号查找图书,若存在,返回其下标;否则返回-1 Book & getBooks(int i); //返回下标为i的图书对象的引用void deleteBook(char * bkNo); //删除指定书号的图书void sortBooks(); //按书号关键字排成升序void showAll( ); //显示全部图书int curBookLen( ); //返回现有图书种类数void setCurBookLen(int len); //设置现有图书种类数void initBookList(); //从文件bookdata.txt中读入全部信息存入书库Books结void readFromFile(char *filename);//从参数指定文件中读入所有的图书void writeToFile(char *filename);//将书库中所有种类的图书写入参数指定文件中};bookList::bookList(int Len) //构造函数,初始化书库{maxLen = Len;curLen = 0;if(Len)Books = new Book[Len];elseBooks = NULL;}bookList::~ bookList ( ) //析构函数,释放书库空间{if(Books) delete []Books;}void bookList::appendBook(char *nop,char *nap, int n) //将追加一本图书{if(curLen==maxLen){Book *newBooks;newBooks=new Book[maxLen+20];for(int i=0;i<maxLen;i++){newBooks[i]=Books[i];}delete [maxLen]Books;maxLen+=20;Books=newBooks;}Books[curLen++].setInfo (nop,nap,n);}int bookList::isIn(char *bkNo) //按书号查找图书,若存在,返回其下标;否则返回-1 {for(int i=0;i<curLen;i++){if(strcmp(Books[i].bookNo,bkNo));else return i;return -1;}Book & bookList::getBooks(int i) //返回下标为i的图书对象的引用{return Books[i];}void bookList::deleteBook(char * bkNo) //删除指定书号的图书{int i=isIn(bkNo);if(i==-1){cout<<"找不到该图书!!!"<<endl;}else{for(int j=i;j<curLen-1;j++){Books[j]=Books[j+1];}curLen--;}}void bookList::sortBooks() //按书号关键字排成升序{Book Book_temp;for(int i=0;i<curLen;i++){for(int j=i+1;j<curLen;j++){if(strcmp(Books[i].bookNo,Books[j].bookNo)>0){Book_temp=Books[i];Books[i]=Books[j];Books[j]=Book_temp;}}}}void bookList::showAll( ) //显示全部图书{for(int i=0;i<curLen;i++){Books[i].Show();}}int bookList::curBookLen( ) //返回现有图书种类数{return curLen;}void bookList::setCurBookLen(int len) //设置现有图书种类数{curLen=len;}void bookList::initBookList() //从文件bookdata.txt中读入全部信息存入书库Books结构{Book Book_help;int Len;ifstream infile;infile.open("bookdata.txt");if(!infile){cout<<"打开文件失败!"<<endl;exit(1);}infile>>Len;for(int i=0;i<Len;i++){infile>>Book_help.bookNo;infile>>Book_help.bookName;infile>>Book_help.Num;appendBook(Book_help.bookNo,Book_help.bookName,Book_help.Num);}infile.close();}void bookList::readFromFile(char *filename) //从参数指定文件中读入所有的图书{Book Book_help;int Len;ifstream infile;infile.open(filename);if(!infile){cout<<"打开文件失败!"<<endl;exit(1);}infile>>Len;maxLen+=Len;for(int i=0;i<Len;i++){infile>>Book_help.bookNo;infile>>Book_help.bookName;infile>>Book_help.Num;appendBook(Book_help.bookNo,Book_help.bookName,Book_help.Num);}infile.close();}void bookList::writeToFile(char *filename) //将书库中所有种类的图书写入参数指定文件中{ofstream out(filename);out<<curLen<<endl;for(int i=0;i<curLen;i++){Books[i].print(out);}out.close();}//-----------以下是主函数中,每个菜单选项处理函数的定义-----------------------------------------------------void appendRecord(bookList &booksObj){char bNo[20], bNa[20];int n;cout<<"输入新增图书的书号书名数目:"<<endl;cin>>bNo>>bNa>>n;if(booksObj.isIn(bNo)==-1){booksObj.appendBook(bNo,bNa,n);cout<<"追加成功!"<<endl;}else{cout<<"书号已存在,正在入库!"<<endl;int i=booksObj.isIn(bNo);Book &Book_show(booksObj.getBooks(i));Book_show.setNum(Book_show.getNum()+n);cout<<"入库成功!"<<endl;}}void delRecord(bookList &booksObj){char bNo[20];cout<<"输入待删图书的书号:"<<endl;cin>>bNo;booksObj.deleteBook(bNo);}void showAll(bookList &booksObj){booksObj.showAll();}void query(bookList &booksObj){char sNo[20];int i;cout<<"输入书号:";cin>>sNo;if((i=booksObj.isIn(sNo))!=-1){Book Book_show(booksObj.getBooks(i));Book_show.Show();}else{cout<<"未知书号!"<<endl;}}void addBooks(bookList &booksObj){char bNo[20],bNa[20];int n;int i;cout<<"输入书号书名数目:"<<endl;cin>>bNo>>bNa>>n;if((i=booksObj.isIn(bNo))!=-1){Book &Book_show(booksObj.getBooks(i));Book_show.setNum(Book_show.getNum()+n);cout<<"入库成功!"<<endl;}else{cout<<"未知书号!正在为您追加!"<<endl;booksObj.appendBook(bNo,bNa,n);cout<<"追加成功!"<<endl;}}void sellBooks(bookList &booksObj){char bNo[20];int n;int i;cout<<"请输入书号和要出售的数量:"<<endl;cin>>bNo>>n;if((i=booksObj.isIn(bNo))!=-1){Book &Book_show=booksObj.getBooks(i);if(n<=Book_show.getNum()){Book_show.setNum(Book_show.getNum()-n);}else{cout<<"库存不足!"<<endl;}}else{cout<<"未知书号!"<<endl;}}void appendFromTxtFile(bookList &booksObj){char filename[40];cout<<"请输入要导入的文件名:"<<endl;cin>>filename;booksObj.readFromFile(filename);cout<<"导入成功!"<<endl;}void writeToTxtFile(bookList &booksObj){char filename[40];cout<<"请输入要导入的文件名:"<<endl;cin>>filename;booksObj.writeToFile(filename);cout<<"导出成功!"<<endl;}void sortByNo(bookList &booksObj){cout<<"排序中......"<<endl;booksObj.sortBooks();cout<<"排序完成!"<<endl;}void delAll(bookList &booksObj){booksObj.setCurBookLen(0);}char Quit(bookList &booksObj){char ans;cout<<"确定退出?y/n: ";cin>>ans;if(ans=='y')booksObj.writeToFile("bookdata.txt");return ans;}//-----------以下是主函数以及菜单函数的定义-----------------------------------------------------int menu_select( ); //函数声明void main(){bookList booksObj; //定义图书记录对象int sel;booksObj.initBookList(); //此函数要完成的任务,可以做到构造函数中for( ; ; ){switch(sel=menu_select()){case 1: cout << "增加图书记录" << endl;appendRecord(booksObj);system("pause");break;case 2: cout << "删除图书记录" << endl;delRecord(booksObj);system("pause");break;case 3: cout << "显示所有图书记录" << endl;showAll(booksObj);system("pause");break;case 4: cout << "查询图书" << endl;query(booksObj);system("pause");break;case 5: cout << "图书入库" << endl;addBooks(booksObj);system("pause");break;case 6: cout << "图书销售" << endl;sellBooks(booksObj);system("pause");break;case 7: cout << "批量导入图书记录" << endl;appendFromTxtFile(booksObj);system("pause");break;case 8: cout << "导出图书记录" << endl;writeToTxtFile(booksObj);system("pause");break;case 9: cout << "按书号排序" << endl;sortByNo(booksObj);system("pause");break;case 10:cout << "删除全部图书记录" << endl;delAll(booksObj);system("pause");break;case 0: if(Quit(booksObj)!='y') continue;}if(sel==0) break;}}int menu_select( ) // 菜单实现{char *menu[ ]={" 1. 增加图书记录"," 2. 删除图书记录"," 3. 显示所有图书记录"," 4. 查询图书"," 5. 图书入库"," 6. 图书销售"," 7. 批量导入图书记录"," 8. 导出图书记录"," 9. 按书号排序"," 10. 删除全部图书记录"," 0. 退出",NULL};int choice;do{system("cls"); // 清屏cout<<"\n ==============图书记录管理============== \n\n";for(int i=0; menu[i]; i++)cout<<menu[i]<<endl;cout<<"\n ======================================= \n";cout<<"请输入选择:";cin>>choice;} while(choice<0 || choice>10);return(choice);}。

相关主题