版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
目錄TOC\o"1-5"\h\z1、需求分析 3\o"CurrentDocument"2、系統(tǒng)總框圖 3\o"CurrentDocument"3、每個模塊的設計分析 44、列出所有定義的函數及說明……7\o"CurrentDocument"5、比較有特色的算法 20\o"CurrentDocument"6、存在的問題與不足及對策 277、使用說明 298、程序源代碼 34一.需求分析以往,人們使用傳統(tǒng)的人工方式管理圖書館的日常業(yè)務, 其操作流程比較繁瑣。在借書時,讀者首先將要借的書好借閱證交給工作人員, 然后工作人員將每本書的信息卡片好讀者的借閱證放在一個小格欄里,最后在借閱證和每本書貼的借閱條上填寫借閱信息。 在還書時,讀者首先將要還的書交給工作人員,然后工作人員根據圖書信息找到相應的書卡好借閱證,并填寫相應的還書信息。南京航空航天大學的圖書館有許多書, 如果靠人工的方式來進行管理,那么工作量會非常大。圖書的統(tǒng)計和管理會成為讓人頭疼的問題, 讀者借閱圖書進行登記也會十分的不方便。這時,利用計算機來為我們進行這些統(tǒng)計管理的工作,可以給我們的生活帶來大大的便利,并且提高工作效率。由于條件有限,只能使用鍵盤輸入書的信息,所以在輸入圖書的 ISBN號時有些麻煩。所以在課設里,簡化了ISBN號,沒有輸入書本的真實ISBN號。在現實生活中,采用掃描的方式錄入ISBN號會更加準確,高效。系統(tǒng)總框圖圖書管理系統(tǒng) ■■ [讀者中心]查找圖書管理員登陸幫助退出系統(tǒng)可選擇保存,也可不保存/ t/注冊 修改密碼[讀者中心]查找圖書管理員登陸幫助退出系統(tǒng)可選擇保存,也可不保存/ t/注冊 修改密碼后返I回主/ 注銷帳戶菜單I查看借書情況借還圖書返回菜單[查找菜單]按ISBN號按書名按出版商按作者關鍵字搜索顯示所有[書單信息中心]添加新書刪除圖書清空全部修改圖書顯示全部返回菜單打開I文本文件,]讀取|[提示]信息返回菜單三.每個模塊的設計分析(1)主界面模塊"G:\project$\bookism-6,1迎“
歡M¥¥¥¥¥¥注統(tǒng)M
迎“
歡M¥¥¥¥¥¥注統(tǒng)M
戶登至E-力素M
用靠理朋出M
新密一稟退2¥¥¥¥¥¥■當進入該管理系統(tǒng)時候, 提示相應的說明,夠讓使用者了解該如何進行操作。 同時還要具有美觀性。用戶通過鍵盤輸入選擇, 程序通過檢測輸入內容進行比對, 調用不同的函數,從而實現不同的功能。并且,在輸入錯誤數據時程序不會崩潰。(2)讀者注冊模塊請設置用戶密碼二881n28請再次輸入密碼以確認:88012S_竹喜!您已經可以使用圖書館管理系統(tǒng)了,請記住您的ID號:1614007在下次登錄時需要它!二;二+二二二+二二+二±二二二+:±二+二3:t二要二3二:二±二,:+二二二要二,二±二±二,二±二二二二二±二二二士二二二二+二±二二,/」新用戶使用該管理系統(tǒng)時,可以通過注冊獲得一個屬于自己的賬號。 注冊模塊要引導讀者完成一步步的注冊步驟,并且在最后把注冊所得賬號告知讀者。在注冊時,用了避免用戶輸錯設定的密碼, 所以采用了輸入兩次的方式。 如果兩次輸入的結果是一致的,那么就完成賬號的注冊。如果兩次輸的密碼不一致,則用戶需要重新輸入設定的密碼。這樣的方式可以保證每一次的注冊都是有效的, 避免了用戶因為輸入錯誤,無法找回自己的密碼。(3)讀者中心模塊¥¥¥¥¥¥¥心置戶書中重單”S專¥¥¥¥¥¥¥心置戶書中重單”S專送帝注查借還返八¥¥¥¥¥¥¥讀者登陸成功之后才可以進入該模塊。在該模塊,讀者可以進行密碼重置,注銷,查看借書情況,借書,還書。并且也設有返回菜單功能。注銷帳戶時,要考慮到刪去該讀者節(jié)點之后不能影響到整個鏈表的連續(xù)性。所有函數均封裝在ReaderList類中,信息存儲在Reade類r中,ReaderList類中定義了三個個Reader*指針,一個是head_point,作為鏈表的頭結點;一個是tail_point,作為鏈表的尾指針;另一個是point,作為活動指針,在不同的類的成員函數中都可使用。為了防止該活動指針使用過頻,造成幾個函數同時使用同一個指針指向不明, 在有些函數里還定義了一些臨時指針。(4)借書還書模塊讀者在登錄之后才可以進行借書, 還書。借還書函數會分別調用讀者鏈表和書單鏈表中的借還書函數,并且在調用這些函數之前會先進行借還書檢查。 比如,你不能還你沒有借過的書,也不能超過限定數目借書。用戶需先登錄,借還時要輸入 ISBN號。以借書為例。借書操作調用的直接函數為:intReaderList::Borrow(BookList*g,Reader*p,stringbooklSBN);它會調用四個函數來完成借書操作:boolBookList::Check_borrow_book(stringISBN_Of_Book) //Booklist中的借書檢查voidBookList::borrow_book(stringISBN_Of_Book) //Booklist中的借書手續(xù)boolReaderList::Check_borrowBook(Reader*p,stringBookISBN)//ReaderList 中的借書檢查voidReaderList::borrowBook(Reader*p,stringBookISBN)//ReaderList中的借書手續(xù)在Booklist和ReaderList的類中都有借書檢查和借書手續(xù)函數。首先會調用借書檢查函數,如果不滿足借書條件則不會繼續(xù)借書的操作。 只有在兩個借書檢查都返回true的時候才會進行借書操作,防止了在書類鏈表中借了書卻在讀者類鏈表中沒有借書的情況,實現了兩個鏈表借書的同步性。因為添加圖書時會保證 ISBN號的唯一性,如果有ISBN號相同的圖書則不會成功添加到書類鏈表。借書函數都是通過 ISBN號查找圖書的,所以借書時不會有借錯書的情況。
(5)查找圖書模塊5內測版\bin\Det"G:\projects\bookism-6.5內測版\bin\Det—¥¥¥¥¥¥¥¥?
VTVT¥書¥¥£1^1^圖書找¥¥西圖圖找圖查書—¥¥¥¥¥¥¥¥?
VTVT¥書¥¥£1^1^圖書找¥¥西圖圖找圖查書¥¥婿塞查找詞圖單¥¥部查查社查鍵喜木¥¥拜18揖作入示回¥顯返¥¥¥¥¥¥¥用戶不需要登陸就可以使用該模塊。用戶可以通過ISBN號,書名,出版社,作者對圖書進行精確的查找。同時,為了提高用戶的使用質量,增加了輸入關鍵字搜索功能。輸入查找信息后, 程序會對圖書的ISBN號,書名,出版社以及作者等信息進行比對, 并且顯示所有滿足搜索條件的結果。這樣,讀者在搜索時的自由度就增加了。關鍵字搜索函數是通過string類中自帶的find()函數實現的,所以減小了工作量。增加了顯示全部圖書的功能,便于滿足用戶需求。增加了返回主菜單的功能,提高了程序的連續(xù)操作性。 社:名 社:名BN^W量書1S類揖數1109數竽m??谝?高等教育出版社198書名:工科數學分析教學輔導書ISBN:1400f:遹由福社,高筆教育出版社查找菜單],按任意其他鍵返回主菜單(6)管理圖書模塊
■I HG:\projects\booknsm-6.15RiSSI?\bin\Debug\bookism.exe*歡迎使用圖書館管理系統(tǒng)AA由A內A共外八內八代瑪八八八八A八八A由A內八六小小內八八A八八八八A八八TOC\o"1-5"\h\zF 1新用戶注冊 1f ; Slit :F 4置理圖書 XF 5者皈 1\o"CurrentDocument"f 6退出系統(tǒng) 144AAAAA.AAAA/^AAAAAAAAAAAAAAAAAAAA1AA內A請輸入管理員密碼二123幀功登量-一置否需要修改管理員密碼?按日表示確定,按其他任意鍵表示不需要修改工要輸入管理員密碼以后才可以進入圖書管理菜單。為了安全性,管理員在登錄之后可以選擇修改自己的密碼。并且,這個密碼在退出系統(tǒng)時可以保存下來,下一次打開程序時的密碼就會使修改后的密碼了。"G:\projecK\bookism-6.15內測版\5口\。¥¥¥¥¥¥¥5制書(好圖(主中新圖圖^百加除空改示回4裾添理俏修顯返“¥¥¥¥¥¥¥5制書(好圖(主中新圖圖^百加除空改示回4裾添理俏修顯返“[123456A¥¥¥¥¥¥¥書單信息菜單里,可以對圖書進行添加,刪除,清空,修改,顯示所有。都是分別調用了BookList類中的函數,對整個書單鏈表進行了一系列操作。在修改時會進入圖書修改菜單
圖書信,鼠;名二工科數學分析IGBN:1100數學馬知國出版社:高等教育出版社量:199[圖書信息修改菜單】社書“BN量楣量回MIS^K^H存返“¥¥¥¥¥¥¥A1AA八八A八八八八八AA1八八入八八八八八八社書“BN量楣量回MIS^K^H存返“¥¥¥¥¥¥¥A在搜索書的ISBN號之后會返回該本書的指針,對該本書的信息進行一系列修改, 并且也可以返回上級書庫信息菜單。(7)讀取保存信息模塊信息的讀取和保存分為三大部分,讀者信息, 書單信息,管理員信息的保存。而這三個部分的信息又分別由六個函數負責讀取和保存。在保存文件里,鏈表中的信息會依次存入 txt文件。在讀取時,會先將信息存入一個類的數組里,然后將類的數組依次存入鏈表里。系統(tǒng)在打開時會自動從文件里面讀取上次存儲的信息, 在退出系統(tǒng)時可以選擇保存或不保存本次操作的結果。如果要保存,則會將操作后的鏈表存入文件,刷新數據。總的來說,程序的各個菜單都有比較清晰的結構, 也都有返回上級菜單的功能?;旧纤械暮瘮刀伎紤]到了讀者輸入錯誤數據的情況, 并且能夠進行一定的處理,具有較強的健壯性,不容易崩潰。四.列出所有定義的函數及說明[管理員類]中的函數#ifndefLIBRARIAN_H_INCLUDED#defineLIBRARIAN_H_INCLUDED#include<string>classLibrarian{private:stringpassword;public:Librarian。{password="880128";}Librarian(stringa){password=a;}~Librarian(){password="";}voidchangePassword(stringa){password=a;}intchangePassword()//重載修改密碼函數{cout<<”是否需要修改管理員密碼?按 0表示確定,按其他任意鍵表示不需要修改:"<<endl;charchoice;cin>>choice;if(choice=='0'){cout<<"請設置新密碼:"<<endl;cin>>password;cout<<"修改成功!"<<endl;return0;}elsereturn0;}boolLogin()//管理員登陸{cout<<"請輸入管理員密碼:"<<endl;stringpass;cin>>pass;if(pass==password){cout<<"成功登錄!"<<endl;changePassword();}else
{cout<<"密碼錯誤!"<<endl;returnfalse;}system("pause");returntrue;}stringgetPassword(){returnpassword;}};#endif〃LIBRARIAN_H_INCLUDED[書類]中的函數#ifndefBOOK_H_INCLUDED#defineBOOK_H_INCLUDED#include<iostream>#include<string>#include<windows.h>usingnamespacestd;classBookList;classBook{friendclassBookList;friendvoidsaveBooks(BookList*p);friendvoidreadBooks(BookList*p);protected:〃圖書分類〃書名〃圖書分類〃書名〃作者名〃出版商〃單個書的本數〃指向下一個節(jié)點的指針stringKind;stringBookName;stringWriter;stringPublisher;intnumber;Book*next;public:Book();Book(stringisbn,stringkind,stringname,stringwriter,stringpublisher,intnumber);voidcopyBook(stringisbn,stringkind,stringname,stringwriter,stringpublisher,intnumber);voidcopyBook(Book*p);voidsetISBN(stringtem);voidsetKind(stringtem);voidsetBookName(stringtem);voidsetWriter(stringtem);voidsetPublisher(stringtem);voidsetNumber(inttem);voidoperator=(constBook&book);〃運算符重載voidsetBook();//重新設定該本書的所有信息voiddisplayBook();//展示一本書virtualvoidAdd_list(classBook*p)〃把書加入鏈表{next=p;p->next=NULL;}virtualvoidAddNewBook()//添加新書并且設置它的信息{next=newclassBook;next->setBook();cout<<"已經成功添加新書:"<<endl;next->displayBook();}virtualvoidshow_all()〃顯示所有書{system("cls");displayBook();while(next!=NULL){next->displayBook();next=next->next;}}};#endif〃BOOK_H_INCLUDED[書鏈表類]中的函數#ifndefBOOKLIST_H_INCLUDED#defineBOOKLIST_H_INCLUDED#include<iostream>#include<string>#include"Book.h"usingnamespacestd;classReaderList;classBookList;classBook;classBookList:publicBook//書類的鏈表{private:classBook*head;//頭指針classBook*tail; 〃尾指針classBook*node; 〃活動指針staticintN;public:friendReaderList;friendvoidsaveBooks(BookList*p);//保存圖書到txt文件的函數BookList();~BookList();voidAdd_list(classBook*p);//把一本書加入圖書鏈表voidAddNewBook();//添加一本書到鏈表里,并且設置它的各類信息boolCheck_borrow_book(stringISBN_Of_Book);//檢查是否有這一本書,并且它是否有庫存返回是否能借書的布爾變量voidborrow_book(stringISBN_Of_Book);//在書類鏈表里的借書操作boolCheck_return_book(stringISBN_Of_Book);//檢查是否存在這本書voidreturn_book(stringISBN_Of_Book);//在書類鏈表里進行還書操作classBook*search_ISBN(stringisbn);//按ISBN查找圖書,并且返回一個 Book*voidsearch_BookName(stringbookname);//按書名查找并展示所有查找結果voidsearch_Writer(stringwriter);//按作者名查找并展示所有查找結果voidsearch_Publisher(stringpublisher);//按出版社查找并展示所有查找結果voidsearch_keyword(stringkey);//按關鍵字查找并展示所有查找結果intsearch。;//查找圖書的菜單用來調用其他的查找函數voidshow_all();//顯示書庫中的所有圖書booldelete_onebook(stringISBN_Of_Book);//從鏈表中刪除一本書intchange_content(stringISBN_Of_Book);//圖書修改菜單 用來調用不同的改變圖書信息的函數intGoInto_BookInfo();//書庫信息菜單,用來調用對圖書管理的各種操作};#endif//BOOKLIST_H_INCLUDED[讀者類]中的函數#ifndefREADER_H_INCLUDED#defineREADER_H_INCLUDED#include<iostream>#include<string>usingnamespacestd;classReaderList;classReader
friendReaderList;friendvoidsaveReaders(ReaderList*g);friendvoidreadReaders(ReaderList*g);protected:〃讀者姓名〃密碼〃每人最多借〃讀者姓名〃密碼〃每人最多借5本書,可以根據需要增減限額〃記錄借的書的數目,0為沒有借書,〃指向下一節(jié)點的指針stringReaderName;stringPassword;stringBookInHand[5];intnumberOfBooks;為借了一本,2為借了二本Reader*next;public:Reader。;~Reader();Reader(intID,stringname,stringmi,stringbooks[5],intnum);voidsetReader(intID,stringname,stringmi,stringbooks[5],intnum);voidcopyReader(Reader*p);voidoperator=(constReader&reader);//運算符重載voidresetPassword(stringnewpassword);〃重設密碼virtualvoidAdd_Point(Reader*p)//添加一個讀者節(jié)點{next=p;p->next=NULL;}virtualvoidchange_password(){stringnewpassword;cin>>newpassword;Password=newpassword;}};#endif//READERHINCLUDED[讀者鏈表類]中的函數#ifndefREADERLIST_H_INCLUDED#defineREADERLISTHINCLUDED#include<iostream>#include<string>#include<string.h>#include<windows.h>#include"BookList.h"#include"Reader.h"usingnamespacestd;classBookList;classReaderList;classReader;classReaderList:publicReader{private:friendvoidsaveReaders(ReaderList*g);Reader*head_point;Reader*tail_point;Reader*point; 〃定義兩個Rreader指針,head_point為頭指針,point為活動指針public:staticintnumberOfReader;ReaderList(); 〃構造函數,使指針初始化~ReaderList();voidAdd_Point(Reader*p); 〃增加新結點到鏈表voidreader_register(); 〃讀者注冊Reader*search_ReaderID(intid); //按ID查找Reader*reader_land(intid,stringpasswordT); 〃讀者登錄,成功后將返回該讀者的Reader*voidshow_OneReader(Reader*p,BookList*g);〃顯示某讀者借書情況voidchange_password(Reader*p); 〃修改密碼intdelete_reader(Reader*p); 〃讀者注銷boolCheck_borrowBook(Reader*p,stringBookISBN);//檢查是否可以借書voidborrowBook(Reader*p,stringBookISBN);//進行借書操作boolCheck_returnBook(Reader*p,stringBookISBN);//檢查是否可以還書voidreturnBook(Reader*p,stringBookISBN);//進行還書操作intBorrow(BookList*g,Reader*p,stringbookISBN);// 借書操作的總的函數,用來調用書類鏈表和讀者類鏈表里的借書相關函數intReturn(BookList*g,Reader*p,stringbookISBN);//還書操作的總的函數,用來調用書類鏈表和讀者類鏈表里的還書相關函數intGoInto_ReaderInfo(Reader*p,BookList*g); 〃登陸后的讀者信息菜單};#endif//READERLIST_H_INCLUDED[不在類中的函數]{幫助函數}voidhelp(){system("cls");ifstreamreadHelp;readHelp.open("help.txt",ios::in);if(readHelp.fail()){cout<<"無法打開文件!"<<endl;exit(0);}stringtemp;cout<<endl;while(!readHelp.eof()){getline(readHelp,temp);cout<<temp<<endl;}}{存儲讀取相關的函數}voidsaveLibrarian(Librarian*t){ofstreamsaveLibrarian;saveLibrarian.open("Librarian.txt",ios::out);if(!saveLibrarian){cout<<"保存管理員信息失??!"<<endl;exit(0);}saveLibrarian<<t->getPassword();cout<<endl<<"成功保存管理員信息! "<<endl<<endl;saveLibrarian.close();}voidreadLibrarian(Librarian*t){stringtem;ifstreamsaveLibrarian;saveLibrarian.open("Librarian.txt",ios::in);if(!saveLibrarian){cout<<"保存管理員信息失敗!"<<endl;exit(0);}saveLibrarian>>tem;{{{{t->changePassword(tem);cout<<endl<<"成功讀取管理員信息! "<<endl<<endl;saveLibrarian.close();}voidsaveBooks(BookList*p){ofstreamsaveBook;saveBook.open("Books.txt",ios::out);if(!saveBook){cout<<"保存書單信息失??! "<<endl;exit(0);}Book*tem=p->head;inti=0;cout<<" >>>> "<<endl<<endl;do{i++;cout<<"正在保存第"<<i<<"本書:"<<tem->BookName<<endl<<endl;saveBook<<tem->ISBN<<" "<<tem->Kind<<" "<<tem->BookName<<""<<tem->Writer<<"";saveBook<<tem->Publisher<<""<<tem->number<<endl;tem=tem->next;}while(tem!=NULL);cout<<"書單信息保存完畢! "<<endl<<endl;cout<<" >>>> "<<endl<<endl;saveBook.close();}voidsaveReaders(ReaderList*g){ofstreamsaveReader;saveReader.open("Readers.txt",ios::out);if(!saveReader){cout<<"保存讀者信息失?。?"<<endl;exit(0);}inti=0;Reader*tem=g->head_point;cout<<" <<<< "<<endl<<endl;doi++;cout<<"正在保存第"<<i<<"個讀者:"<<tem->ReaderName<<endl<<endl;saveReader<<tem->ReaderID<<""<<tem->ReaderName<<""<<tem->Password<<""for(inti=0;i<5;i++){if(tem->BookInHand[i]=="")saveReader<<"empty";else{saveReader<<tem->BookInHand[i]<<"";}}saveReader<<tem->numberOfBooks<<endl;tem=tem->next;}while(tem!=NULL);cout<<"讀者信息保存完畢! "<<endl<<endl;cout<<" <<<< "<<endl<<endl;saveReader.close();}voidreadBooks(BookList*p){ifstreamreadBooks;readBooks.open("Books.txt",ios::in);if(!readBooks){cout<<endl;cout<<"讀取書單信息失敗! "<<endl;exit(0);}inti=0;strings[5];intk=0;inttemp_num=0;cout<<endl;cout<<" >>>> "<<endl;do{i++;for(k=0;k<5;k++){readBooks>>s[k];}readBooks>>temp_num;if(readBooks.fail())//if((i!=1)&&(books[i-1].ISBN==books[i].ISBN))break;p->Add_list(&books[i]);books[i].copyBook(s[0],s[1],s[2],s[3],s[4],temp_num);cout<<endl;cout<<"正在讀取第"<<i<<"本書:"<<s[2]<<endl;}while(!readBooks.eof());readBooks.close();cout<<endl;cout<<"書單信息讀取完畢! "<<endl<<endl;cout<<" >>>> "<<endl;cout<<endl;}voidreadReaders(ReaderList*g){stringbooks[5];ifstreamreadReaders;readReaders.open("Readers.txt",ios::in);if(!readReaders){cout<<"讀取讀者信息失敗! "<<endl;exit(0);}intid;stringname,password;stringb0,b1,b2,b3,b4;intnum=0;inti=0;intk=0;cout<<endl;cout<<" <<<< "<<endl<<endl;do{i++;readReaders>>id>>name>>password>>b0>>b1>>b2>>b3>>b4>>num;if(readReaders.fail())break;books[0]=b0;books[1]=b1;books[2]=b2;books[3]=b3;books[4]=b4;for(k=0;k<5;k++)if(books[k]=="empty")books[k]="";)readers[i].setReader(id,name,password,books,num);g->Add_Point(&readers[i]);cout<<"正在讀取讀第"<<i<<"個讀者:"<<id<<name<<endl<<endl;}while(!readReaders.eof());cout<<"讀者信息讀取完畢! "<<endl<<endl;cout<<" <<<< "<<endl;cout<<endl;readReaders.close();}{退出時跳出詢問保存的函數}voidexit_message(BookList*p,ReaderList*g,Librarian*t){intresult=MessageBox(NULL,TEXT("是否需要保存本次操作? "),TEXT("退出圖書館管理系統(tǒng)”工MB_ICONINFORMATION|MB_YESNO);switch(result){caseIDYES:{saveLibrarian(t);saveBooks(p);saveReaders(g);MessageBox(NULL,TEXT("已經保存"),TEXT("YES"),MB_OK);break;}caseIDNO:MessageBox(NULL,TEXT("未保存"),TEXT("NO"),MB_OK);break;}exit(0);}{菜單界面函數}voidmenu(BookList*p,ReaderList*g,Librarian*t){Book*temBook=NULL;//主菜單cout<<"歡迎使用圖書館管理系統(tǒng)"<<endl;cout<<"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<<endl;cout<<"¥1新用戶注冊¥"<<endl;cout<<"¥2讀者登錄¥"<<endl;cout<<"¥3查找圖書¥"<<endl;cout<<"¥4管理圖書¥"<<endl;
cout<<"¥cout<<"¥5幫助6cout<<"¥cout<<"¥5幫助6退出系統(tǒng)cout<<"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"¥"<<endl;¥"<<endl;<<endl;charchoice;cin>>choice;intid;stringpassword;stringISBN;Reader*tem;switch(choice)(case'1':g->reader_register();break;case'2':cout<<"ID:";cin>>id;cout<<"密碼:";cin>>password;tem=g->reader_land(id,password);if(tem==NULL)(cout<<"登錄信息有誤! "<<endl;break;)else(g->GoInto_ReaderInfo(tem,p);break;)case'3':p->search();break;case'4':(if(t->Login())p->GoInto_BookInfo();break;)case'5':help();break;case'6':exit_message(p,g,t);exit(0);break;default:cout<<"錯誤的輸入!"<<endl;)){主函數}
intmain()readLibrarian(&mitang);//讀取管理員信息readBooks(&list1);〃讀取書單鏈表readReaders(&readerlist);//讀取讀者鏈表cout<<"信息已經讀取完畢!歡迎使用圖書管理系統(tǒng)! "<<endl<<endl;system("pause");system("cls");menu(&list1,&readerlist,&mitang);while(1){system("pause");system("cls");menu(&list1,&readerlist,&mitang);return0;}boolReaderList::Check_borrowBook(Reader*p,stringBooklSBN) 〃借書檢查if(p==NULL)returnfalse;inti_tem=p->numberOfBooks;if(i_tem==5){cout<<"已經達到最大借書上限,不能再借書啦!"<<endl;returnfalse;elsereturntrue;比較有特色的算法⑴借還圖書,以借書函數為例intReaderList::Borrow(BookList*g,Reader*p,stringbookISBN);是借書操作調用的直接函數它會調用四個函數來完成借書操作://Booklist中的借書檢查//Booklist中的借書手續(xù)//Booklist中的借書檢查//Booklist中的借書手續(xù)voidReaderList::borrowBook(Reader*p,stringBookISBN)//ReaderList中的借書手續(xù)在Booklist和ReaderList的類中都有借書檢查和借書手續(xù)函數。借書時首先會調用借書檢查函數, 如果不滿足借書條件則不會繼續(xù)借書的操作。 只有在兩個借書檢查都返回true的時候才會進行借書操作,防止了在書類鏈表中借了書卻在讀者類鏈表中沒有借書的情況,實現了兩個鏈表借書的同步性。因為添加圖書時會保證 ISBN號的唯一性,如果有ISBN號相同的圖書則不會成功添加到書類鏈表。借書函數都是通過 ISBN號查找圖書的,所以借書時不會有借錯書的情況。程序代碼如下:boolBookList::Check_borrow_book(stringISBN_Of_Book) //Booklist中的借書檢查{node=search_ISBN(ISBN_Of_Book);if(node==NULL){cout<<"該本書并不存在! "<<endl;returnfalse;}else{if(node->number==0){cout<<"此書已被借完!"<<endl;returnfalse;}else{returntrue;}}}voidBookList::borrow_book(stringISBN_Of_Book) //Booklist中的借書手續(xù){if(Check_borrow_book(ISBN_Of_Book)){node=search_ISBN(ISBN_Of_Book);node->number--;cout<<"借書成功!"<<endl;}}boolReaderList::Check_borrowBook(Reader*p,stringBookISBN)//ReaderList中的借書檢查{if(p==NULL)returnfalse;inti_tem=p->numberOfBooks;if(i_tem==5){cout<<"已經達到最大借書上限,不能再借書啦! "<<endl;returnfalse;}elsereturntrue;}voidReaderList::borrowBook(Reader*p,stringBooklSBN)//ReaderList中的借書手續(xù){inti_tem=p->numberOfBooks;p->BookInHand[i_tem]=BookISBN;p->numberOfBooks++;}intReaderList::Borrow(BookList*g,Reader*p,stringbookISBN)//ReaderList中的主借書函數{chari;boola=g->Check_borrow_book(bookISBN);if(!a)return0;boolb=Check_borrowBook(p,bookISBN);if(a&&b){cout<<"當前讀者帳戶借書情況: "<<endl;show_OneReader(p,g);cout<<"============================="<<endl;cout<<"所要借閱的圖書的基本信息: "<<endl;g->search_ISBN(bookISBN)->displayBook();cout<<"確定要借書嗎?按0確定,按其他任意鍵取消本次借書 "<<endl;cin>>i;if(i=='0'){g->borrow_book(bookISBN);borrowBook(p,bookISBN);return0;}else{cout<<"已經取消本次借書"<<endl;return0;
}elsecout<<"信息有誤! "<<endl;return0;}(2)利用關鍵詞搜索查找圖書關鍵子搜索函數是通過 string類中自干的find()函數實現的,所以減小了工作量。//輸入關鍵字查找圖書//輸入關鍵字查找圖書inti=0;node=head;while(node!=NULL){boola=(node->ISBN.find(key)!=string::npos);boolb=(node->BookName.find(key)!=string::npos);boolc=(node->Writer.find(key)!=string::npos);boold=(node->Publisher.find(key)!=string::npos);boole=(node->Kind.find(key)!=string::npos);if(a||b||c||d||e){node->displayBook();i++;}node=node->next;}cout<<"找至ij"<<i<<"條結果!"<<endl;}相比于其他幾種搜索, 關鍵詞搜索的自由度更大, 用戶只需要輸入想要查找的關鍵字, 就可以查找到所有相關的內容,搜索更有發(fā)散性。(3)文件讀取和保存在程序開始時會自動開始讀取文件中存儲的信息, 并將這些信息載入鏈表中, 從而進行下面的各項操作。以讀者鏈表的保存和讀取為例:voidsaveReaders(ReaderList*g){ofstreamsaveReader;saveReader.open("Readers.txt",ios::out);if(!saveReader){cout<<"保存讀者信息失?。?"<<endl;exit(0);}inti=0;Reader*tem=g->head_point;cout<<" <<<< "<<endl<<endl;do{i++;cout<<"正在保存第"<<i<<"個讀者:"<<tem->ReaderName<<endl<<endl;saveReader<<tem->ReaderID<<""<<tem->ReaderName<<""<<tem->Password<<"";for(inti=0;i<5;i++){if(tem->BookInHand[i]=="")saveReader<<"empty";else{saveReader<<tem->BookInHand[i]<<"";}}saveReader<<tem->numberOfBooks<<endl;tem=tem->next;}while(tem!=NULL);cout<<"讀者信息保存完畢! "<<endl<<endl;cout<<" <<<< "<<endl<<endl;saveReader.close();}保存時比較簡單,只要將所有的信息存入文件即可。為了下一次讀取時能夠順利進行, 將BookInHand的string數組中的空字符串用 "empty”替代,以免在用〉〉操作符讀取時程序自動跳過所有的空格,導致出錯。一開始讀取的時候最后一行的信息總是會被讀取兩遍,經過排查之后發(fā)現是 eof導致的。因為在讀取到結尾時它并不知道已經是結尾了, 要再往后面的空的地方去讀取失敗了才知道是已經到了結尾,而在讀取失敗時string變量里存的還是上一次讀取的結果, 所以導致了重復讀取。后來加了一個if語句,終于解決了這個問題。if(readBooks.fail())break;而且,在把臨時存放數據的的 string變量存到臨時的類后,把這個類存入鏈表的時候也出現了問題。一開始我在這個 while循環(huán)里面每次都是new了一個Reader類,然后加入鏈表中,直到最后讀完了所有的數據再跳出循環(huán)。 但這樣運行不出來。因為每次這個函數用完以后這個類就被回收了,后來在主函數里面開了一個 Readerreaders[100]來存放文件里面讀出來的數據,然后把它加入鏈表,就可以成功讀取所有的數據了。voidreadBooks(BookList*p){ifstreamreadBooks;readBooks.open("Books.txt",ios::in);if(!readBooks){cout<<endl;cout<<"讀取書單信息失?。?"<<endl;exit(0);}inti=0;strings[5];intk=0;inttemp_num=0;cout<<endl;cout<<" >>>> "<<endl;do{i++;for(k=0;k<5;k++){readBooks>>s[k];}readBooks>>temp_num;if(readBooks.fail())break;p->Add_list(&books[i]);
books[i].copyBook(s[0],s[1],s[2],s[3],s[4],temp_num);cout<<endl;cout<<"正在讀取第"<<i<<"本書:"<<s[2]<<endl;}while(!readBooks.eof());readBooks.close();cout<<endl;cout<<"書單信息讀取完畢! "<<endl<<endl;cout<<" >>>> ”<<endl;cout<<endl;}■巴找tbimDebug'30膽出明書E通案統(tǒng)■巴找tbimDebug'30膽出明書E通案統(tǒng)退出系統(tǒng)時會自動跳出一個窗口,詢問是否需要保存本次操作。voidexit_message(BookList*p,ReaderList*g,Librarian*t){intresult=MessageBox(NULL,TEXT("是否需要保存本次操作?"),TEXT("退出圖書館管理系統(tǒng)”工MB_ICONINFORMATION|MB_YESNO);switch(result){caseIDYES:{saveLibrarian(t);saveBooks(p);saveReaders(g);MessageBox(NULL,TEXT("已經保存"),TEXT("YES"),MB_OK);break;}caseIDNO:MessageBox(NULL,TEXT("未保存"),TEXT("NO"),MB_OK);break;}exit(0);}txt如果選擇保存,則會自動調用 3個函數,將管理員,書鏈表,讀者鏈表分別保存在三個txt文件里面。這樣的保存方式可以讓用戶感覺更有交互性。六.存在的問題與不足及對策.沒有做出圖形界面。本來希望可以做出圖形界面,這樣用戶在使用時可以用鼠標進行操作,而不是只能以 dos命令行的形式用鍵盤輸入來操作??墒窃趫D書館里借了幾本 mfc相關的書后感覺要短時間內掌握這個有些困難。所以,就只是在函數里面設計讓輸出的符號和文字排列整齊, 給用戶一種操作菜單的感覺并且能夠比較方便的使用。 暑假的時候有比較充裕的時間, 希望能夠學習好圖形界面,自己做個小型的軟件來自己使用。.讀者借了圖書之后沒有時間限制本想要模仿學校的圖書館的管理系統(tǒng)的,每一本書可以借 30天,然后可以延期續(xù)借,如果超期了就每天罰款一角錢。然而一方面這樣會增加不少的工作量,另一方面我沒有想到獲得時間的方法。于是就省略了這個功能。.沒有成功在文件中用二進制直接讀取一個類一開始的時候沒有考慮到文件存儲的問題, 為了方便所有的字符串都是直接用 string來存儲,而沒有使用char數組。后來在用fwrite,fread的時候就出現了問題。但是因為前面所有的地方都是string了,要改起來的話工作量會很大,而且可能已經實現了的功能也會有問題。所以就用txt文件來存儲信息了,保存時候直接把鏈表中的每一個對象的 string,int類型的信息直接存入文件,讀取的時候再按順序讀取,讀入一個新的對象,存入鏈表。并且,以只讀的方式打開,存入鏈表之后再次以空白的形式打開文件, 將鏈表中的信息存入文件, 以達到刷新文件信息的目的。.沒有在一開始的時候構思好整體的框架有不少地方都是在后來寫了部分程序之后又啟發(fā)而想到的。 以后再寫程序的時候應該更有整體觀念,具體到連各種變量用什么符號來表示也要統(tǒng)一一下。 在這次的程序里面,同一個類的表示有的地方是g,有的地方是p,這樣就沒有很好的統(tǒng)一,可能會造成混淆。.沒有使用異常處理一開始是有構想使用異常處理的,本來想把它在最后添加進去的。后來在寫程序的過程中,經過各種修改之后,基本上出現錯誤的情況都用 if處理過了,所以就沒有使用了。還是因為全局觀念把握的不到位??傊?,雖然還有很多不足,但是課設的結果我自己還是相對滿意的。畢竟是自己一行一行敲進去的代碼,從一開始的時候只要一輸入錯誤的數據程序就崩潰,到現在它已經具有了一定的健壯性,能夠應對不少的輸入錯誤,感覺還是很欣慰的。
七.使用說明(編譯器為Code::Blocks13.12)正在君郎再I本書.工^微學分析%讀取制本書.航空旅刑t論正三波郎英[本7:三國f學堂格之片車品隹RIE在讀取第*本書二工科歌學分析教學精異書正在宗郎第5率工;一*簡強代程正在讀取第蟀書?5,程序設計IE在讀取第7本書?MM*E在讀印第■本書:T里信號話那元〒正二:比用該第1個加者士正在才取俊享£百博哥正在讀取g個讀^iE在讀取謝會介讀者上■?■**正在讀
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年綠色生態(tài)建筑農民工勞動合同示范3篇
- 二零二五年度防盜門行業(yè)市場分析報告合同2篇
- 二零二五版加油站智能監(jiān)控與數據分析合同3篇
- 二零二五白云區(qū)觀白活力中心房地產合作開發(fā)投資框架合同2篇
- 二零二五年度智能家電產品研發(fā)與銷售合同3篇
- 二零二五版養(yǎng)殖企業(yè)與個體養(yǎng)牛戶合作合同3篇
- 二零二五版數據中心機房租賃及數據備份服務合同2篇
- 基于2025年度5G網絡技術研發(fā)合作合同2篇
- 二零二五版拌和站產品質量追溯與售后服務合同2篇
- 二零二五版建筑工程土方中介合同糾紛調解機制3篇
- 第1課+中華文明的起源與早期國家+課件+-2023-2024學年高中歷史統(tǒng)編版2019必修中外歷史綱要上冊+
- 大廈物業(yè)管理保潔服務標準5篇
- 神經內科國家臨床重點??平ㄔO項目評分標準(試行)
- 業(yè)主委員會成員推薦表
- 城市設計與城市更新培訓
- 2023年貴州省銅仁市中考數學真題試題含解析
- 世界衛(wèi)生組織生存質量測量表(WHOQOL-BREF)
- 《葉圣陶先生二三事》第1第2課時示范公開課教學PPT課件【統(tǒng)編人教版七年級語文下冊】
- 某送電線路安全健康環(huán)境與文明施工監(jiān)理細則
- GB/T 28885-2012燃氣服務導則
- PEP-3心理教育量表-評估報告
評論
0/150
提交評論