//************************************************************** // customer_exception.h // ************************************************************ #ifndef CUSTOMER_EXCEPTION_H_ #define CUSTOMER_EXCEPTION_H_ #include<stdexcept> #include<string> class customerException :public std::logic_error { public: customerException(const std::string &message=""): logic_error(message.c_str()) {} }; #endif
//*********************************************************** // book_exception.h //*********************************************************** #ifndef BOOK_EXCEPTION_H_ #define BOOK_EXCEPTION_H_ #include<stdexcept> #include<string> class bookException:public std::logic_error { public: bookException(const std::string &message=""): logic_error(message.c_str()) {} }; #endif
//******************************************************** // book_item.h implemention file---book_item.cpp //******************************************************** #ifndef BOOK_ITEM_H_ #define BOOK_ITEM_H_ #include<string> #include<iostream> #include<fstream> using namespace std; class bookItem { private: string title; string author; string ISBN; string publisher; string category; string custID; float price; int pages; //construtor function public: bookItem(const bookItem&_item); bookItem(); void createBookItem(); string getTitle()const; string getAuthor()const; string getISBN()const; string getPublisher()const; string getCategory()const; string getCustID()const; bool getStatus()const; void setCustID(const string &_custID); bookItem & getPtr(); void display()const; friend ifstream & operator>>(ifstream &fin,bookItem &_item); friend ofstream & operator<<(ofstream &fout,const bookItem &_item); }; #endif
//***************************************************************** // book_item.cpp book's information //***************************************************************** #include"book_item.h" #include<cstddef> using namespace std; bookItem::bookItem(const bookItem &_item) { title=_item.title; author=_item.author; ISBN=_item.ISBN; publisher=_item.publisher; category=_item.category; custID=_item.custID; price=_item.price; pages=_item.pages; } bookItem::bookItem() { title=""; author=""; ISBN=""; publisher=""; category=""; custID=""; price=0.0; pages=0; } void bookItem::createBookItem() { bool isok=false; char ch; while(!isok) { cout<<"\t\t\t create book item !"<<endl<<endl<<endl; cout<<" \t\t\tenter the book's title :"; getline(cin,title); cout<<"\n \t\t\tenter the book's author :"; getline(cin,author); cout<<"\n \t\t\tenter the book's ISBN :"; getline(cin,ISBN); cout<<"\n \t\t\tenter the book's publisher :"; getline(cin,publisher); cout<<"\n \t\t\tenter the book's category :"; getline(cin,category); cout<<"\n \t\t\tenter the book's price :"; cin>>price; while(cin.get()!='\n') ; cout<<"\n \t\t\tenter the book's pages :"; cin>>pages; while(cin.get()!='\n') ; cout<<endl<<endl<<endl; cout<<" \t\t\tbook information is ok !"<<endl; cout<<" \t\t\tS for Save And R for Reset :"; cin>>ch; while(cin.get()!='\n') ; if(ch=='S'||ch=='s') isok=true; } } string bookItem::getTitle()const { return title; } string bookItem::getAuthor()const { return author; } string bookItem::getISBN()const { return ISBN; } string bookItem::getPublisher()const { return publisher; } string bookItem::getCategory()const { return category; } string bookItem::getCustID()const { return custID; } bool bookItem::getStatus()const { if(custID.empty()) return false; else return true; } void bookItem::setCustID(const string &_custID) { custID=_custID; } bookItem & bookItem::getPtr() { return *this; } void bookItem::display()const { cout<<"********************************************************************************"<<endl<<endl; cout<<"**\t\tbook's title : "<<title<<endl; cout<<"**\t\tbook's author : "<<author<<endl; cout<<"**\t\tbook's ISBN : "<<ISBN<<endl; cout<<"**\t\tbook's publisher : "<<publisher<<endl; cout<<"**\t\tbook's category : "<<category<<endl; cout<<"**\t\tbook's price : $ "<<price<<endl; cout<<"**\t\tbook's pages : "<<pages<<endl; if(getStatus()) cout<<"\t\t\t\tthis book has been borrowed !"<<endl; else cout<<"\t\t\t\tthis book is still in lirary !"<<endl; cout<<"\n********************************************************************************"<<endl<<endl; } ifstream &operator>>(ifstream &fin,bookItem &_item) { if(fin.peek()=='\n') fin.ignore(1); getline(fin,_item.title,'~'); getline(fin,_item.author,'~'); getline(fin,_item.ISBN,'~'); getline(fin,_item.publisher,'~'); getline(fin,_item.category,'~'); if(fin.peek()=='~') { fin.ignore(1); _item.custID=""; } else getline(fin,_item.custID,'~'); fin>>_item.price>>_item.pages; return fin; } ofstream &operator<<(ofstream &fout,const bookItem &_item) { fout<<_item.title<<'~'<<_item.author<<'~'<<_item.ISBN<<'~'<<_item.publisher<<'~'<<_item.category <<'~'<<_item.custID<<'~'<<_item.price<<' '<<_item.pages<<endl; return fout; }
//************************************************************ // customer_item.h implemention file--customer_item.cpp //************************************************************ #ifndef CUSTOMER_ITEM_H_ #define CUSTOMER_ITEM_H_ #include<string> #include<iostream> #include<fstream> #include"book_tree.h" #include"book_item.h" using namespace std; class customerItem { private: static const int MAX=5; string name; string ID; string unit; string password; int numb; bookItem *books[MAX]; public: customerItem(); customerItem(const customerItem &_item); ~customerItem(); void createCustomerItem(); customerItem &operator=(const customerItem &_item); bookItem*& operator[](int index); void setPassword(const string &_str); string getPassword()const; string getID()const; void display()const;//attention void borrow(bookItem &_item); void revert(const string &_ISBN); ifstream& readCitem(ifstream &fin,bookTree &btree); friend ofstream &operator<<(ofstream &fout, customerItem &_item); }; #endif
//*************************************************************** // customer_item.cpp customer information //************************************************************** #include"customer_item.h" #include"book_item.h" customerItem::customerItem() { name=""; ID=""; unit=""; password=""; numb=0; for(int i=0;i<MAX;i++) { books[i]=NULL; } } customerItem::customerItem(const customerItem &_item) { name=_item.name; ID=_item.ID; unit=_item.unit; password=_item.password; numb=_item.numb; for(int i=0;i<numb;i++) books[i]=_item.books[i]; } customerItem::~customerItem() { } void customerItem::createCustomerItem() { bool isok=false; char ch; while(!isok) { cout<<"\t\t\tcreate new customer information !"<<endl<<endl<<endl; cout<<"\t\t\tenter the customer's name :"; getline(cin,name); cout<<"\n\t\t\tenter the customer's ID :"; getline(cin,ID); cout<<"\n\t\t\tenter the customer's unit :"; getline(cin,unit); cout<<"\a\n\n\t\t\t customer information is ok "<<endl<<endl; cout<<"\t\t S for Save or R for Reset :"; cin>>ch; while(cin.get()!='\n') ; if(ch=='s'||ch=='S') isok=true; } } customerItem &customerItem::operator=(const customerItem &_item) { if(this == &_item) return *this; else { name=_item.name; ID=_item.ID; unit=_item.unit; password=_item.password; numb=_item.numb; for(int i=0;i<numb;i++) books[i]=_item.books[i]; } return *this; } void customerItem::setPassword(const string &_str) { password=_str; } string customerItem::getPassword()const { return password; } string customerItem::getID()const { return ID; } void customerItem::display()const { cout<<"********************************************************************************"<<endl<<endl; cout<<"**\t\tthe customer's name :"<<name<<endl; cout<<"**\t\tthe customer's ID :"<<ID<<endl; cout<<"**\t\tthe customer's unit :"<<unit<<endl<<endl; if(numb==0) cout<<"\t\t\t you has borrowed 0 book !"<<endl; else { cout<<"\t\t\t you has borrow "<<numb<<" books ."<<endl; cout<<"\t\t\t\t AS follows :"<<endl; for(int i=0;i<numb;i++) books[i]->display(); } } void customerItem::borrow(bookItem &_item) { if(numb>=MAX) { cout<<"\a\a\a\t\t more than "<<MAX<<" books you have borrowed !\n"; cout<<"\t\t\t borrowing is canceled "<<endl<<endl; } else { _item.setCustID(ID); books[numb]=&(_item.getPtr()); numb++; cout<<"\t\t\t borrowing success !"<<endl<<endl; } } void customerItem::revert(const string &_ISBN) { int index=0; while(books[index]->getISBN()!=_ISBN && index<numb) { index++; } if(books[index]->getISBN()!=_ISBN) cout<<"\t\t\t you didnot borrow this book !"<<endl<<endl; else { int i; string tem=""; books[index]->setCustID(tem); for(i=index;i<numb-1;i++) { books[i]=books[i+1]; } books[i]=NULL; numb--; cout<<"\t\t\t revert book success !"<<endl<<endl; } } ofstream &operator<<(ofstream &fout, customerItem &_item) { fout<<_item.name<<'~'<<_item.ID<<'~'<<_item.unit<<'~'<<_item.password<<'~'<<_item.numb<<'~'; for(int i=0;i<_item.numb;i++) { fout<<_item[i]->getISBN()<<'~'; } fout<<endl; return fout; } ifstream& customerItem::readCitem(ifstream &fin, bookTree &_tree) { getline(fin,name,'~'); getline(fin,ID,'~'); getline(fin,unit,'~'); getline(fin,password,'~'); fin>>numb; if(fin.peek()=='~') fin.ignore(1); for(int i=0;i<numb;i++) { string temp; getline(fin,temp,'~'); books[i]=&(_tree.search(temp).getPtr()); } while(fin.get()!='\n') ; return fin; } bookItem *&customerItem::operator[](int index) { return books[index]; }
//************************************************************ // custoemr_node.h implemention file---customer_node.cpp //************************************************************ #ifndef CUSTOMER_NODE_H_ #define CUSTOEMR_NODE_H_ #include"customer_item.h" class customerNode { private: customerItem item; customerNode *leftchild; customerNode *rightchild; customerNode(); customerNode(const customerItem &_item,customerNode *leftPtr=NULL, customerNode *rightPtr=NULL); ~customerNode(); friend class customerTree; }; #endif
//***************************************************************** // customer_node.cpp binary's customer node //***************************************************************** #include"customer_node.h" customerNode::customerNode() { item=customerItem(); leftchild=rightchild=NULL; } customerNode::customerNode(const customerItem &_item,customerNode *leftPtr, customerNode *rightPtr):item(_item),leftchild(leftPtr),rightchild(rightPtr) {} customerNode::~customerNode() {}
//***************************************************************** // book_node.h implemention file---book_node.cpp //***************************************************************** #ifndef BOOK_NODE_H_ #define BOOK_NODE_H_ #include"book_item.h" class bookNode { private: bookItem item; bookNode *leftchild; bookNode *rightchild; explicit bookNode(); bookNode(const bookItem &_item,bookNode *leftPtr=NULL, bookNode *rightPtr=NULL); ~bookNode(); friend class bookTree; }; #endif
//**************************************************************** // book_node.cpp binary's book node //**************************************************************** #include"book_node.h" bookNode::bookNode() { item=bookItem(); leftchild=NULL; rightchild=NULL; } bookNode::bookNode(const bookItem &_item,bookNode *leftPtr,bookNode *rightPtr): item(_item),leftchild(leftPtr),rightchild(rightPtr) {} bookNode::~bookNode() {}
//********************************************************** // book_tree.h implemention file---book_tree.cpp //********************************************************** #ifndef BOOK_TREE_H_ #define BOOK_TREE_H_ #include<fstream> #include<iostream> #include<cstddef> #include<string> #include"book_node.h" #include"book_exception.h" using namespace std; typedef void (*Function)(const bookItem &_item); class bookTree { private: bookNode *root; int amount; public: bookTree(); bookTree(const bookItem &_item); ~bookTree(); bool isEmpty()const; int getAmount()const{return amount;} void insert(const bookItem &newitem)throw(bookException); void remove(const string &_ISBN)throw(bookException); void search(const string &_key,char & _type)const; bookItem & search(const string &_ISBN)throw(bookException); void traverse(Function visit); void write(ofstream &fout); void read(ifstream &fin,int n); protected: void insertItem(bookNode*& treePtr,const bookItem &newItem)throw(bookException); void removeItem(bookNode *& treePtr,const string &_ISBN)throw(bookException); void removeNode(bookNode*& treePtr); void processLeft(bookNode*& treePtr,bookItem &_item); void destory(bookNode * &_treePtr); void retrieveInorde(bookNode *const & treePtr,const string &_key,char &_type)const; bookItem & retrieveTree(bookNode * & treePtr,const string &_ISBN)throw(bookException); void traverseItem(bookNode * & treePtr,Function visit); void writeItem(bookNode * & treePtr,ofstream &fout); void readItem(bookNode *& treePtr,ifstream &fin,int n); }; #endif
//************************************************************** // book_tree.cpp search binary tree storing book items//************************************************************** #include<cassert> #include<cstdlib> #include<cstddef> #include"book_tree.h" bookTree::bookTree() { root=NULL; amount=0; } bookTree::bookTree(const bookItem &_item) { root=new bookNode(_item,NULL,NULL); assert(root!=NULL); amount=1; } bookTree::~bookTree() { destory(root); } bool bookTree::isEmpty()const { return (root==NULL); } void bookTree::insert(const bookItem &newitem)throw(bookException) { try{ insertItem(root,newitem); }catch(bookException &bexvept) { throw; } } void bookTree::remove(const string &_ISBN)throw(bookException) { try { removeItem(root,_ISBN); } catch(bookException &bexcept) { throw; } } void bookTree::search(const string &_key,char & _type)const { retrieveInorde(root,_key,_type); } bookItem & bookTree::search(const string &_ISBN)throw(bookException) { try{ return(retrieveTree(root,_ISBN)); } catch(bookException &cexcept) { throw; } } void bookTree::traverse(Function visit) { traverseItem(root,visit); } void bookTree::write(ofstream &fout) { writeItem(root,fout); } void bookTree::read(ifstream &fin,int n) { readItem(root,fin,n); } void bookTree::insertItem(bookNode *&treePtr,const bookItem &newitem) throw(bookException) { if(treePtr==NULL) { treePtr=new bookNode(newitem,NULL,NULL); if(treePtr==NULL) throw bookException("bookException :can't allocate memory in insert function !\a\a\a\a\a"); amount++; } else if((treePtr->item.getISBN())>newitem.getISBN()) insertItem(treePtr->leftchild,newitem); else insertItem(treePtr->rightchild,newitem); } void bookTree::removeItem(bookNode *& treePtr,const string &_ISBN)throw(bookException) { if(treePtr==NULL) throw bookException("bookException :delete the key book failed in remove function !\a\a\a\a\a"); else if(treePtr->item.getISBN()>_ISBN) removeItem(treePtr->leftchild,_ISBN); else if(treePtr->item.getISBN()==_ISBN) { removeNode(treePtr); amount--; } else removeItem(treePtr->rightchild,_ISBN); } void bookTree::removeNode(bookNode *& treePtr) { bookNode *delPtr; bookItem tempItem; if(treePtr->leftchild==NULL&&treePtr->rightchild==NULL) { delete treePtr; treePtr=NULL; } else if(treePtr->leftchild==NULL) { delPtr=treePtr; treePtr=treePtr->rightchild; delPtr->rightchild=NULL; delete delPtr; } else if(treePtr->rightchild==NULL) { delPtr=treePtr; treePtr=treePtr->leftchild; delPtr->leftchild=NULL; delete delPtr; } else { processLeft(treePtr->rightchild,tempItem); treePtr->item=tempItem; } } void bookTree::processLeft(bookNode *&treePtr,bookItem &_item) { if(treePtr->leftchild==NULL) { _item=treePtr->item; bookNode *tempPtr=treePtr; treePtr=treePtr->rightchild; tempPtr->rightchild=NULL; delete tempPtr; } else processLeft(treePtr->leftchild,_item); } void bookTree::destory(bookNode *&_treePtr) { if(_treePtr!=NULL) { destory(_treePtr->leftchild); destory(_treePtr->rightchild); delete _treePtr; _treePtr=NULL; amount--; } } void bookTree::retrieveInorde(bookNode *const & treePtr,const string &_key,char & _type)const { if(treePtr!=NULL) { if(_type=='T'||_type=='t') { retrieveInorde(treePtr->leftchild,_key,_type); if(treePtr->item.getTitle()==_key) { treePtr->item.display(); } retrieveInorde(treePtr->rightchild,_key,_type); } else if(_type=='A'||_type=='a') { retrieveInorde(treePtr->leftchild,_key,_type); if(treePtr->item.getAuthor()==_key) { treePtr->item.display(); } retrieveInorde(treePtr->rightchild,_key,_type); } else if(_type=='I'||_type=='i') { retrieveInorde(treePtr->leftchild,_key,_type); if(treePtr->item.getISBN()==_key) { treePtr->item.display(); } retrieveInorde(treePtr->rightchild,_key,_type); } else if(_type=='P'||_type=='p') { retrieveInorde(treePtr->leftchild,_key,_type); if(treePtr->item.getPublisher()==_key) { treePtr->item.display(); } retrieveInorde(treePtr->rightchild,_key,_type); } else if(_type=='C'||_type=='c') { retrieveInorde(treePtr->leftchild,_key,_type); if(treePtr->item.getCategory()==_key) { treePtr->item.display(); } retrieveInorde(treePtr->rightchild,_key,_type); } } } bookItem &bookTree::retrieveTree(bookNode *&treePtr,const string &_ISBN) throw(bookException) { if(treePtr==NULL) throw bookException("bookException :seek the key book failed in search function !\a\a\a\a\a"); else if(treePtr->item.getISBN()==_ISBN) return treePtr->item; else if(treePtr->item.getISBN()>_ISBN) retrieveTree(treePtr->leftchild,_ISBN); else retrieveTree(treePtr->rightchild,_ISBN); } void bookTree::traverseItem(bookNode *&treePtr,Function visit) { if(treePtr!=NULL) { traverseItem(treePtr->leftchild,visit); visit(treePtr->item); traverseItem(treePtr->rightchild,visit); } } void bookTree::writeItem(bookNode *&treePtr,ofstream &fout) { if(treePtr!=NULL) { writeItem(treePtr->leftchild,fout); fout<<treePtr->item; writeItem(treePtr->rightchild,fout); } } void bookTree::readItem(bookNode *&treePtr ,ifstream &fin,int n) { if(n>0) { treePtr=new bookNode(); readItem(treePtr->leftchild,fin,n/2); fin>>treePtr->item; amount++; readItem(treePtr->rightchild,fin,(n-1)/2); } }
//**************************************************************** // customer_tree.h implemention file---customer_tree.cpp//******************************************************************* #ifndef CUSTOMER_TREE_H_ #define CUSTOMER_TREE_H_ #include<string> #include<fstream> #include<iostream> #include<cstddef> #include"customer_node.h" #include"customer_exception.h" using namespace std; typedef void (*FunctionType)(const customerItem &_item); class customerTree { private: customerNode *root; int amount; public: customerTree(); customerTree(const customerItem &_item); ~customerTree(); int getAmount()const{return amount;} bool isEmpty()const; void insert(const customerItem &newitem)throw(customerException); void remove(const string &_ID)throw(customerException); customerItem & search(const string &_ID)throw(customerException); void traverse(FunctionType visit); void write(ofstream &fout); void read(ifstream &fin,int n, bookTree &_tree); protected: void insertItem(customerNode *&treePtr,const customerItem &newitem)throw(customerException); void removeItem(customerNode *&treePtr,const string &_ID)throw(customerException); void removeNode(customerNode *&treePtr); void processLeft(customerNode *&treePtr,customerItem &_item); void destory(customerNode *&treePtr); customerItem & retrieveTree(customerNode *&treePtr,const string &_ID)throw(customerException); void traverseItem(customerNode *&treePtr,FunctionType visit); void writeItem(customerNode *&treePtr,ofstream &fout); void readItem(customerNode *&treePtr,ifstream &fin,int n,bookTree &_tree); }; #endif
//************************************************************************ // customer_tree.cpp search binary tree storing customer items //************************************************************************ #include<cassert> #include<cstddef> #include"customer_tree.h" #include"book_tree.h" customerTree::customerTree() { root=NULL; amount=0; } customerTree::customerTree(const customerItem &_item) { root=new customerNode(_item,NULL,NULL); assert(root!=NULL); amount=1; } customerTree::~customerTree() { destory(root); } bool customerTree::isEmpty()const { return (root==NULL); } void customerTree::insert(const customerItem &newitem)throw(customerException) { try { insertItem(root,newitem); } catch(customerException &cExcept) { throw; } } void customerTree::remove(const string &_ID)throw(customerException) { try { removeItem(root,_ID); } catch(customerException &cexcept) { throw; } } customerItem &customerTree::search(const string &_ID)throw(customerException) { try{ return retrieveTree(root,_ID); } catch(customerException &cexcept) { throw; } } void customerTree::traverse(FunctionType visit) { traverseItem(root,visit); } void customerTree::read(ifstream &fin,int n,bookTree &_tree) { readItem(root,fin,n,_tree); } void customerTree::write(ofstream &fout) { writeItem(root,fout); } void customerTree::writeItem(customerNode *&treePtr,ofstream &fout) { if(treePtr!=NULL) { writeItem(treePtr->leftchild,fout); fout<<treePtr->item; writeItem(treePtr->rightchild,fout); } } void customerTree::readItem(customerNode *& treePtr,ifstream &fin,int n,bookTree &_tree) { if(n>0) { treePtr=new customerNode(); readItem(treePtr->leftchild,fin,n/2,_tree); treePtr->item.readCitem(fin,_tree); amount++; readItem(treePtr->rightchild,fin,(n-1)/2,_tree); } } void customerTree::insertItem(customerNode *&treePtr,const customerItem &newitem)throw(customerException) { if(treePtr==NULL) { treePtr= new customerNode(newitem,NULL,NULL); if(treePtr==NULL) throw customerException("customerException :allocate memory failed in insert function !\a\a\a\a\a"); amount++; } else if(treePtr->item.getID()>newitem.getID()) insertItem(treePtr->leftchild,newitem); else insertItem(treePtr->rightchild,newitem); } void customerTree::removeItem(customerNode *&treePtr,const string &_ID)throw(customerException) { if(treePtr==NULL) throw customerException("customerException :delete failed in remove function !\a\a\a\a\a"); else if(treePtr->item.getID()>_ID) removeItem(treePtr->leftchild,_ID); else if(treePtr->item.getID()==_ID) { removeNode(treePtr); amount--; } else removeItem(treePtr->rightchild,_ID); } void customerTree::removeNode(customerNode *&treePtr) { customerNode *delPtr; customerItem tempItem; if(treePtr->leftchild==NULL &&treePtr->rightchild==NULL) { delete treePtr; treePtr=NULL; } else if(treePtr->leftchild==NULL) { delPtr=treePtr; treePtr=treePtr->rightchild; delPtr->rightchild=NULL; delete delPtr; } else if(treePtr->rightchild==NULL) { delPtr=treePtr; treePtr=treePtr->leftchild; delPtr->leftchild=NULL; delete delPtr; } else { processLeft(treePtr->rightchild,tempItem); treePtr->item=tempItem; } } void customerTree::processLeft(customerNode *&treePtr,customerItem &_item) { if(treePtr->leftchild==NULL) { _item=treePtr->item; customerNode *delPtr=treePtr; treePtr=treePtr->rightchild; delPtr->rightchild=NULL; delete delPtr; } else processLeft(treePtr->leftchild,_item); } void customerTree::destory(customerNode *&treePtr) { if(treePtr!=NULL) { destory(treePtr->leftchild); destory(treePtr->rightchild); delete treePtr; treePtr=NULL; } } customerItem &customerTree::retrieveTree(customerNode *&treePtr,const string &_ID) throw(customerException) { if(treePtr==NULL) throw customerException("customerException :seek the key customer failed in search function !\a\a\a\a\a"); else if(treePtr->item.getID()>_ID) retrieveTree(treePtr->leftchild,_ID); else if(treePtr->item.getID()==_ID) return treePtr->item; else retrieveTree(treePtr->rightchild,_ID); } void customerTree::traverseItem(customerNode *&treePtr,FunctionType visit) { if(treePtr!=NULL) { traverseItem(treePtr->leftchild,visit); visit(treePtr->item); traverseItem(treePtr->rightchild,visit); } }