![圖書館管理系統(tǒng)c++課設(shè)報(bào)告(附源代碼)_第1頁(yè)](http://file4.renrendoc.com/view/d091bc6e4bea07c6604d25beef7c30fe/d091bc6e4bea07c6604d25beef7c30fe1.gif)
![圖書館管理系統(tǒng)c++課設(shè)報(bào)告(附源代碼)_第2頁(yè)](http://file4.renrendoc.com/view/d091bc6e4bea07c6604d25beef7c30fe/d091bc6e4bea07c6604d25beef7c30fe2.gif)
![圖書館管理系統(tǒng)c++課設(shè)報(bào)告(附源代碼)_第3頁(yè)](http://file4.renrendoc.com/view/d091bc6e4bea07c6604d25beef7c30fe/d091bc6e4bea07c6604d25beef7c30fe3.gif)
![圖書館管理系統(tǒng)c++課設(shè)報(bào)告(附源代碼)_第4頁(yè)](http://file4.renrendoc.com/view/d091bc6e4bea07c6604d25beef7c30fe/d091bc6e4bea07c6604d25beef7c30fe4.gif)
![圖書館管理系統(tǒng)c++課設(shè)報(bào)告(附源代碼)_第5頁(yè)](http://file4.renrendoc.com/view/d091bc6e4bea07c6604d25beef7c30fe/d091bc6e4bea07c6604d25beef7c30fe5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
目錄TOC\o"1-5"\h\z1、需求分析 3\o"CurrentDocument"2、系統(tǒng)總框圖 3\o"CurrentDocument"3、每個(gè)模塊的設(shè)計(jì)分析 44、列出所有定義的函數(shù)及說(shuō)明……7\o"CurrentDocument"5、比較有特色的算法 20\o"CurrentDocument"6、存在的問(wèn)題與不足及對(duì)策 277、使用說(shuō)明 298、程序源代碼 34一.需求分析以往,人們使用傳統(tǒng)的人工方式管理圖書館的日常業(yè)務(wù), 其操作流程比較繁瑣。在借書時(shí),讀者首先將要借的書好借閱證交給工作人員, 然后工作人員將每本書的信息卡片好讀者的借閱證放在一個(gè)小格欄里,最后在借閱證和每本書貼的借閱條上填寫借閱信息。 在還書時(shí),讀者首先將要還的書交給工作人員,然后工作人員根據(jù)圖書信息找到相應(yīng)的書卡好借閱證,并填寫相應(yīng)的還書信息。南京航空航天大學(xué)的圖書館有許多書, 如果靠人工的方式來(lái)進(jìn)行管理,那么工作量會(huì)非常大。圖書的統(tǒng)計(jì)和管理會(huì)成為讓人頭疼的問(wèn)題, 讀者借閱圖書進(jìn)行登記也會(huì)十分的不方便。這時(shí),利用計(jì)算機(jī)來(lái)為我們進(jìn)行這些統(tǒng)計(jì)管理的工作,可以給我們的生活帶來(lái)大大的便利,并且提高工作效率。由于條件有限,只能使用鍵盤輸入書的信息,所以在輸入圖書的 ISBN號(hào)時(shí)有些麻煩。所以在課設(shè)里,簡(jiǎn)化了ISBN號(hào),沒有輸入書本的真實(shí)ISBN號(hào)。在現(xiàn)實(shí)生活中,采用掃描的方式錄入ISBN號(hào)會(huì)更加準(zhǔn)確,高效。系統(tǒng)總框圖圖書管理系統(tǒng) ■■ [讀者中心]查找圖書管理員登陸幫助退出系統(tǒng)可選擇保存,也可不保存/ t/注冊(cè) 修改密碼[讀者中心]查找圖書管理員登陸幫助退出系統(tǒng)可選擇保存,也可不保存/ t/注冊(cè) 修改密碼后返I回主/ 注銷帳戶菜單I查看借書情況借還圖書返回菜單[查找菜單]按ISBN號(hào)按書名按出版商按作者關(guān)鍵字搜索顯示所有[書單信息中心]添加新書刪除圖書清空全部修改圖書顯示全部返回菜單打開I文本文件,]讀取|[提示]信息返回菜單三.每個(gè)模塊的設(shè)計(jì)分析(1)主界面模塊"G:\project$\bookism-6,1迎“
歡M¥¥¥¥¥¥注統(tǒng)M
迎“
歡M¥¥¥¥¥¥注統(tǒng)M
戶登至E-力素M
用靠理朋出M
新密一稟退2¥¥¥¥¥¥■當(dāng)進(jìn)入該管理系統(tǒng)時(shí)候, 提示相應(yīng)的說(shuō)明,夠讓使用者了解該如何進(jìn)行操作。 同時(shí)還要具有美觀性。用戶通過(guò)鍵盤輸入選擇, 程序通過(guò)檢測(cè)輸入內(nèi)容進(jìn)行比對(duì), 調(diào)用不同的函數(shù),從而實(shí)現(xiàn)不同的功能。并且,在輸入錯(cuò)誤數(shù)據(jù)時(shí)程序不會(huì)崩潰。(2)讀者注冊(cè)模塊請(qǐng)?jiān)O(shè)置用戶密碼二881n28請(qǐng)?jiān)俅屋斎朊艽a以確認(rèn):88012S_竹喜!您已經(jīng)可以使用圖書館管理系統(tǒng)了,請(qǐng)記住您的ID號(hào):1614007在下次登錄時(shí)需要它!二;二+二二二+二二+二±二二二+:±二+二3:t二要二3二:二±二,:+二二二要二,二±二±二,二±二二二二二±二二二士二二二二+二±二二,/」新用戶使用該管理系統(tǒng)時(shí),可以通過(guò)注冊(cè)獲得一個(gè)屬于自己的賬號(hào)。 注冊(cè)模塊要引導(dǎo)讀者完成一步步的注冊(cè)步驟,并且在最后把注冊(cè)所得賬號(hào)告知讀者。在注冊(cè)時(shí),用了避免用戶輸錯(cuò)設(shè)定的密碼, 所以采用了輸入兩次的方式。 如果兩次輸入的結(jié)果是一致的,那么就完成賬號(hào)的注冊(cè)。如果兩次輸?shù)拿艽a不一致,則用戶需要重新輸入設(shè)定的密碼。這樣的方式可以保證每一次的注冊(cè)都是有效的, 避免了用戶因?yàn)檩斎脲e(cuò)誤,無(wú)法找回自己的密碼。(3)讀者中心模塊¥¥¥¥¥¥¥心置戶書中重單”S專¥¥¥¥¥¥¥心置戶書中重單”S專送帝注查借還返八¥¥¥¥¥¥¥讀者登陸成功之后才可以進(jìn)入該模塊。在該模塊,讀者可以進(jìn)行密碼重置,注銷,查看借書情況,借書,還書。并且也設(shè)有返回菜單功能。注銷帳戶時(shí),要考慮到刪去該讀者節(jié)點(diǎn)之后不能影響到整個(gè)鏈表的連續(xù)性。所有函數(shù)均封裝在ReaderList類中,信息存儲(chǔ)在Reade類r中,ReaderList類中定義了三個(gè)個(gè)Reader*指針,一個(gè)是head_point,作為鏈表的頭結(jié)點(diǎn);一個(gè)是tail_point,作為鏈表的尾指針;另一個(gè)是point,作為活動(dòng)指針,在不同的類的成員函數(shù)中都可使用。為了防止該活動(dòng)指針使用過(guò)頻,造成幾個(gè)函數(shù)同時(shí)使用同一個(gè)指針指向不明, 在有些函數(shù)里還定義了一些臨時(shí)指針。(4)借書還書模塊讀者在登錄之后才可以進(jìn)行借書, 還書。借還書函數(shù)會(huì)分別調(diào)用讀者鏈表和書單鏈表中的借還書函數(shù),并且在調(diào)用這些函數(shù)之前會(huì)先進(jìn)行借還書檢查。 比如,你不能還你沒有借過(guò)的書,也不能超過(guò)限定數(shù)目借書。用戶需先登錄,借還時(shí)要輸入 ISBN號(hào)。以借書為例。借書操作調(diào)用的直接函數(shù)為:intReaderList::Borrow(BookList*g,Reader*p,stringbooklSBN);它會(huì)調(diào)用四個(gè)函數(shù)來(lái)完成借書操作: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ù)函數(shù)。首先會(huì)調(diào)用借書檢查函數(shù),如果不滿足借書條件則不會(huì)繼續(xù)借書的操作。 只有在兩個(gè)借書檢查都返回true的時(shí)候才會(huì)進(jìn)行借書操作,防止了在書類鏈表中借了書卻在讀者類鏈表中沒有借書的情況,實(shí)現(xiàn)了兩個(gè)鏈表借書的同步性。因?yàn)樘砑訄D書時(shí)會(huì)保證 ISBN號(hào)的唯一性,如果有ISBN號(hào)相同的圖書則不會(huì)成功添加到書類鏈表。借書函數(shù)都是通過(guò) ISBN號(hào)查找圖書的,所以借書時(shí)不會(huì)有借錯(cuò)書的情況。
(5)查找圖書模塊5內(nèi)測(cè)版\bin\Det"G:\projects\bookism-6.5內(nèi)測(cè)版\bin\Det—¥¥¥¥¥¥¥¥?
VTVT¥書¥¥£1^1^圖書找¥¥西圖圖找圖查書—¥¥¥¥¥¥¥¥?
VTVT¥書¥¥£1^1^圖書找¥¥西圖圖找圖查書¥¥婿塞查找詞圖單¥¥部查查社查鍵喜木¥¥拜18揖作入示回¥顯返¥¥¥¥¥¥¥用戶不需要登陸就可以使用該模塊。用戶可以通過(guò)ISBN號(hào),書名,出版社,作者對(duì)圖書進(jìn)行精確的查找。同時(shí),為了提高用戶的使用質(zhì)量,增加了輸入關(guān)鍵字搜索功能。輸入查找信息后, 程序會(huì)對(duì)圖書的ISBN號(hào),書名,出版社以及作者等信息進(jìn)行比對(duì), 并且顯示所有滿足搜索條件的結(jié)果。這樣,讀者在搜索時(shí)的自由度就增加了。關(guān)鍵字搜索函數(shù)是通過(guò)string類中自帶的find()函數(shù)實(shí)現(xiàn)的,所以減小了工作量。增加了顯示全部圖書的功能,便于滿足用戶需求。增加了返回主菜單的功能,提高了程序的連續(xù)操作性。 社:名 社:名BN^W量書1S類揖數(shù)1109數(shù)竽m??谝?高等教育出版社198書名:工科數(shù)學(xué)分析教學(xué)輔導(dǎo)書ISBN:1400f:遹由福社,高筆教育出版社查找菜單],按任意其他鍵返回主菜單(6)管理圖書模塊
■I HG:\projects\booknsm-6.15RiSSI?\bin\Debug\bookism.exe*歡迎使用圖書館管理系統(tǒng)AA由A內(nèi)A共外八內(nèi)八代瑪八八八八A八八A由A內(nèi)八六小小內(nèi)八八A八八八八A八八TOC\o"1-5"\h\zF 1新用戶注冊(cè) 1f ; Slit :F 4置理圖書 XF 5者皈 1\o"CurrentDocument"f 6退出系統(tǒng) 144AAAAA.AAAA/^AAAAAAAAAAAAAAAAAAAA1AA內(nèi)A請(qǐng)輸入管理員密碼二123幀功登量-一置否需要修改管理員密碼?按日表示確定,按其他任意鍵表示不需要修改工要輸入管理員密碼以后才可以進(jìn)入圖書管理菜單。為了安全性,管理員在登錄之后可以選擇修改自己的密碼。并且,這個(gè)密碼在退出系統(tǒng)時(shí)可以保存下來(lái),下一次打開程序時(shí)的密碼就會(huì)使修改后的密碼了。"G:\projecK\bookism-6.15內(nèi)測(cè)版\5口\。¥¥¥¥¥¥¥5制書(好圖(主中新圖圖^百加除空改示回4裾添理俏修顯返“¥¥¥¥¥¥¥5制書(好圖(主中新圖圖^百加除空改示回4裾添理俏修顯返“[123456A¥¥¥¥¥¥¥書單信息菜單里,可以對(duì)圖書進(jìn)行添加,刪除,清空,修改,顯示所有。都是分別調(diào)用了BookList類中的函數(shù),對(duì)整個(gè)書單鏈表進(jìn)行了一系列操作。在修改時(shí)會(huì)進(jìn)入圖書修改菜單
圖書信,鼠;名二工科數(shù)學(xué)分析IGBN:1100數(shù)學(xué)馬知國(guó)出版社:高等教育出版社量:199[圖書信息修改菜單】社書“BN量楣量回MIS^K^H存返“¥¥¥¥¥¥¥A1AA八八A八八八八八AA1八八入八八八八八八社書“BN量楣量回MIS^K^H存返“¥¥¥¥¥¥¥A在搜索書的ISBN號(hào)之后會(huì)返回該本書的指針,對(duì)該本書的信息進(jìn)行一系列修改, 并且也可以返回上級(jí)書庫(kù)信息菜單。(7)讀取保存信息模塊信息的讀取和保存分為三大部分,讀者信息, 書單信息,管理員信息的保存。而這三個(gè)部分的信息又分別由六個(gè)函數(shù)負(fù)責(zé)讀取和保存。在保存文件里,鏈表中的信息會(huì)依次存入 txt文件。在讀取時(shí),會(huì)先將信息存入一個(gè)類的數(shù)組里,然后將類的數(shù)組依次存入鏈表里。系統(tǒng)在打開時(shí)會(huì)自動(dòng)從文件里面讀取上次存儲(chǔ)的信息, 在退出系統(tǒng)時(shí)可以選擇保存或不保存本次操作的結(jié)果。如果要保存,則會(huì)將操作后的鏈表存入文件,刷新數(shù)據(jù)??偟膩?lái)說(shuō),程序的各個(gè)菜單都有比較清晰的結(jié)構(gòu), 也都有返回上級(jí)菜單的功能。基本上所有的函數(shù)都考慮到了讀者輸入錯(cuò)誤數(shù)據(jù)的情況, 并且能夠進(jìn)行一定的處理,具有較強(qiáng)的健壯性,不容易崩潰。四.列出所有定義的函數(shù)及說(shuō)明[管理員類]中的函數(shù)#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()//重載修改密碼函數(shù){cout<<”是否需要修改管理員密碼?按 0表示確定,按其他任意鍵表示不需要修改:"<<endl;charchoice;cin>>choice;if(choice=='0'){cout<<"請(qǐng)?jiān)O(shè)置新密碼:"<<endl;cin>>password;cout<<"修改成功!"<<endl;return0;}elsereturn0;}boolLogin()//管理員登陸{cout<<"請(qǐng)輸入管理員密碼:"<<endl;stringpass;cin>>pass;if(pass==password){cout<<"成功登錄!"<<endl;changePassword();}else
{cout<<"密碼錯(cuò)誤!"<<endl;returnfalse;}system("pause");returntrue;}stringgetPassword(){returnpassword;}};#endif〃LIBRARIAN_H_INCLUDED[書類]中的函數(shù)#ifndefBOOK_H_INCLUDED#defineBOOK_H_INCLUDED#include<iostream>#include<string>#include<windows.h>usingnamespacestd;classBookList;classBook{friendclassBookList;friendvoidsaveBooks(BookList*p);friendvoidreadBooks(BookList*p);protected:〃圖書分類〃書名〃圖書分類〃書名〃作者名〃出版商〃單個(gè)書的本數(shù)〃指向下一個(gè)節(jié)點(diǎn)的指針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);〃運(yùn)算符重載voidsetBook();//重新設(shè)定該本書的所有信息voiddisplayBook();//展示一本書virtualvoidAdd_list(classBook*p)〃把書加入鏈表{next=p;p->next=NULL;}virtualvoidAddNewBook()//添加新書并且設(shè)置它的信息{next=newclassBook;next->setBook();cout<<"已經(jīng)成功添加新書:"<<endl;next->displayBook();}virtualvoidshow_all()〃顯示所有書{system("cls");displayBook();while(next!=NULL){next->displayBook();next=next->next;}}};#endif〃BOOK_H_INCLUDED[書鏈表類]中的函數(shù)#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; 〃活動(dòng)指針staticintN;public:friendReaderList;friendvoidsaveBooks(BookList*p);//保存圖書到txt文件的函數(shù)BookList();~BookList();voidAdd_list(classBook*p);//把一本書加入圖書鏈表voidAddNewBook();//添加一本書到鏈表里,并且設(shè)置它的各類信息boolCheck_borrow_book(stringISBN_Of_Book);//檢查是否有這一本書,并且它是否有庫(kù)存返回是否能借書的布爾變量voidborrow_book(stringISBN_Of_Book);//在書類鏈表里的借書操作boolCheck_return_book(stringISBN_Of_Book);//檢查是否存在這本書voidreturn_book(stringISBN_Of_Book);//在書類鏈表里進(jìn)行還書操作classBook*search_ISBN(stringisbn);//按ISBN查找圖書,并且返回一個(gè) Book*voidsearch_BookName(stringbookname);//按書名查找并展示所有查找結(jié)果voidsearch_Writer(stringwriter);//按作者名查找并展示所有查找結(jié)果voidsearch_Publisher(stringpublisher);//按出版社查找并展示所有查找結(jié)果voidsearch_keyword(stringkey);//按關(guān)鍵字查找并展示所有查找結(jié)果intsearch。;//查找圖書的菜單用來(lái)調(diào)用其他的查找函數(shù)voidshow_all();//顯示書庫(kù)中的所有圖書booldelete_onebook(stringISBN_Of_Book);//從鏈表中刪除一本書intchange_content(stringISBN_Of_Book);//圖書修改菜單 用來(lái)調(diào)用不同的改變圖書信息的函數(shù)intGoInto_BookInfo();//書庫(kù)信息菜單,用來(lái)調(diào)用對(duì)圖書管理的各種操作};#endif//BOOKLIST_H_INCLUDED[讀者類]中的函數(shù)#ifndefREADER_H_INCLUDED#defineREADER_H_INCLUDED#include<iostream>#include<string>usingnamespacestd;classReaderList;classReader
friendReaderList;friendvoidsaveReaders(ReaderList*g);friendvoidreadReaders(ReaderList*g);protected:〃讀者姓名〃密碼〃每人最多借〃讀者姓名〃密碼〃每人最多借5本書,可以根據(jù)需要增減限額〃記錄借的書的數(shù)目,0為沒有借書,〃指向下一節(jié)點(diǎn)的指針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);//運(yùn)算符重載voidresetPassword(stringnewpassword);〃重設(shè)密碼virtualvoidAdd_Point(Reader*p)//添加一個(gè)讀者節(jié)點(diǎn){next=p;p->next=NULL;}virtualvoidchange_password(){stringnewpassword;cin>>newpassword;Password=newpassword;}};#endif//READERHINCLUDED[讀者鏈表類]中的函數(shù)#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; 〃定義兩個(gè)Rreader指針,head_point為頭指針,point為活動(dòng)指針public:staticintnumberOfReader;ReaderList(); 〃構(gòu)造函數(shù),使指針初始化~ReaderList();voidAdd_Point(Reader*p); 〃增加新結(jié)點(diǎn)到鏈表voidreader_register(); 〃讀者注冊(cè)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);//進(jìn)行借書操作boolCheck_returnBook(Reader*p,stringBookISBN);//檢查是否可以還書voidreturnBook(Reader*p,stringBookISBN);//進(jìn)行還書操作intBorrow(BookList*g,Reader*p,stringbookISBN);// 借書操作的總的函數(shù),用來(lái)調(diào)用書類鏈表和讀者類鏈表里的借書相關(guān)函數(shù)intReturn(BookList*g,Reader*p,stringbookISBN);//還書操作的總的函數(shù),用來(lái)調(diào)用書類鏈表和讀者類鏈表里的還書相關(guān)函數(shù)intGoInto_ReaderInfo(Reader*p,BookList*g); 〃登陸后的讀者信息菜單};#endif//READERLIST_H_INCLUDED[不在類中的函數(shù)]{幫助函數(shù)}voidhelp(){system("cls");ifstreamreadHelp;readHelp.open("help.txt",ios::in);if(readHelp.fail()){cout<<"無(wú)法打開文件!"<<endl;exit(0);}stringtemp;cout<<endl;while(!readHelp.eof()){getline(readHelp,temp);cout<<temp<<endl;}}{存儲(chǔ)讀取相關(guān)的函數(shù)}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<<"個(gè)讀者:"<<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<<"個(gè)讀者:"<<id<<name<<endl<<endl;}while(!readReaders.eof());cout<<"讀者信息讀取完畢! "<<endl<<endl;cout<<" <<<< "<<endl;cout<<endl;readReaders.close();}{退出時(shí)跳出詢問(wèn)保存的函數(shù)}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("已經(jīng)保存"),TEXT("YES"),MB_OK);break;}caseIDNO:MessageBox(NULL,TEXT("未保存"),TEXT("NO"),MB_OK);break;}exit(0);}{菜單界面函數(shù)}voidmenu(BookList*p,ReaderList*g,Librarian*t){Book*temBook=NULL;//主菜單cout<<"歡迎使用圖書館管理系統(tǒng)"<<endl;cout<<"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<<endl;cout<<"¥1新用戶注冊(cè)¥"<<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<<"錯(cuò)誤的輸入!"<<endl;)){主函數(shù)}
intmain()readLibrarian(&mitang);//讀取管理員信息readBooks(&list1);〃讀取書單鏈表readReaders(&readerlist);//讀取讀者鏈表cout<<"信息已經(jīng)讀取完畢!歡迎使用圖書管理系統(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<<"已經(jīng)達(dá)到最大借書上限,不能再借書啦!"<<endl;returnfalse;elsereturntrue;比較有特色的算法⑴借還圖書,以借書函數(shù)為例intReaderList::Borrow(BookList*g,Reader*p,stringbookISBN);是借書操作調(diào)用的直接函數(shù)它會(huì)調(diào)用四個(gè)函數(shù)來(lái)完成借書操作://Booklist中的借書檢查//Booklist中的借書手續(xù)//Booklist中的借書檢查//Booklist中的借書手續(xù)voidReaderList::borrowBook(Reader*p,stringBookISBN)//ReaderList中的借書手續(xù)在Booklist和ReaderList的類中都有借書檢查和借書手續(xù)函數(shù)。借書時(shí)首先會(huì)調(diào)用借書檢查函數(shù), 如果不滿足借書條件則不會(huì)繼續(xù)借書的操作。 只有在兩個(gè)借書檢查都返回true的時(shí)候才會(huì)進(jìn)行借書操作,防止了在書類鏈表中借了書卻在讀者類鏈表中沒有借書的情況,實(shí)現(xiàn)了兩個(gè)鏈表借書的同步性。因?yàn)樘砑訄D書時(shí)會(huì)保證 ISBN號(hào)的唯一性,如果有ISBN號(hào)相同的圖書則不會(huì)成功添加到書類鏈表。借書函數(shù)都是通過(guò) ISBN號(hào)查找圖書的,所以借書時(shí)不會(huì)有借錯(cuò)書的情況。程序代碼如下: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<<"已經(jīng)達(dá)到最大借書上限,不能再借書啦! "<<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中的主借書函數(shù){chari;boola=g->Check_borrow_book(bookISBN);if(!a)return0;boolb=Check_borrowBook(p,bookISBN);if(a&&b){cout<<"當(dāng)前讀者帳戶借書情況: "<<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<<"已經(jīng)取消本次借書"<<endl;return0;
}elsecout<<"信息有誤! "<<endl;return0;}(2)利用關(guān)鍵詞搜索查找圖書關(guān)鍵子搜索函數(shù)是通過(guò) string類中自干的find()函數(shù)實(shí)現(xiàn)的,所以減小了工作量。//輸入關(guān)鍵字查找圖書//輸入關(guān)鍵字查找圖書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<<"條結(jié)果!"<<endl;}相比于其他幾種搜索, 關(guān)鍵詞搜索的自由度更大, 用戶只需要輸入想要查找的關(guān)鍵字, 就可以查找到所有相關(guān)的內(nèi)容,搜索更有發(fā)散性。(3)文件讀取和保存在程序開始時(shí)會(huì)自動(dòng)開始讀取文件中存儲(chǔ)的信息, 并將這些信息載入鏈表中, 從而進(jìn)行下面的各項(xiàng)操作。以讀者鏈表的保存和讀取為例: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<<"個(gè)讀者:"<<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();}保存時(shí)比較簡(jiǎn)單,只要將所有的信息存入文件即可。為了下一次讀取時(shí)能夠順利進(jìn)行, 將BookInHand的string數(shù)組中的空字符串用 "empty”替代,以免在用〉〉操作符讀取時(shí)程序自動(dòng)跳過(guò)所有的空格,導(dǎo)致出錯(cuò)。一開始讀取的時(shí)候最后一行的信息總是會(huì)被讀取兩遍,經(jīng)過(guò)排查之后發(fā)現(xiàn)是 eof導(dǎo)致的。因?yàn)樵谧x取到結(jié)尾時(shí)它并不知道已經(jīng)是結(jié)尾了, 要再往后面的空的地方去讀取失敗了才知道是已經(jīng)到了結(jié)尾,而在讀取失敗時(shí)string變量里存的還是上一次讀取的結(jié)果, 所以導(dǎo)致了重復(fù)讀取。后來(lái)加了一個(gè)if語(yǔ)句,終于解決了這個(gè)問(wèn)題。if(readBooks.fail())break;而且,在把臨時(shí)存放數(shù)據(jù)的的 string變量存到臨時(shí)的類后,把這個(gè)類存入鏈表的時(shí)候也出現(xiàn)了問(wèn)題。一開始我在這個(gè) while循環(huán)里面每次都是new了一個(gè)Reader類,然后加入鏈表中,直到最后讀完了所有的數(shù)據(jù)再跳出循環(huán)。 但這樣運(yùn)行不出來(lái)。因?yàn)槊看芜@個(gè)函數(shù)用完以后這個(gè)類就被回收了,后來(lái)在主函數(shù)里面開了一個(gè) Readerreaders[100]來(lái)存放文件里面讀出來(lái)的數(shù)據(jù),然后把它加入鏈表,就可以成功讀取所有的數(shù)據(jù)了。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)時(shí)會(huì)自動(dòng)跳出一個(gè)窗口,詢問(wèn)是否需要保存本次操作。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("已經(jīng)保存"),TEXT("YES"),MB_OK);break;}caseIDNO:MessageBox(NULL,TEXT("未保存"),TEXT("NO"),MB_OK);break;}exit(0);}txt如果選擇保存,則會(huì)自動(dòng)調(diào)用 3個(gè)函數(shù),將管理員,書鏈表,讀者鏈表分別保存在三個(gè)txt文件里面。這樣的保存方式可以讓用戶感覺更有交互性。六.存在的問(wèn)題與不足及對(duì)策.沒有做出圖形界面。本來(lái)希望可以做出圖形界面,這樣用戶在使用時(shí)可以用鼠標(biāo)進(jìn)行操作,而不是只能以 dos命令行的形式用鍵盤輸入來(lái)操作。可是在圖書館里借了幾本 mfc相關(guān)的書后感覺要短時(shí)間內(nèi)掌握這個(gè)有些困難。所以,就只是在函數(shù)里面設(shè)計(jì)讓輸出的符號(hào)和文字排列整齊, 給用戶一種操作菜單的感覺并且能夠比較方便的使用。 暑假的時(shí)候有比較充裕的時(shí)間, 希望能夠?qū)W習(xí)好圖形界面,自己做個(gè)小型的軟件來(lái)自己使用。.讀者借了圖書之后沒有時(shí)間限制本想要模仿學(xué)校的圖書館的管理系統(tǒng)的,每一本書可以借 30天,然后可以延期續(xù)借,如果超期了就每天罰款一角錢。然而一方面這樣會(huì)增加不少的工作量,另一方面我沒有想到獲得時(shí)間的方法。于是就省略了這個(gè)功能。.沒有成功在文件中用二進(jìn)制直接讀取一個(gè)類一開始的時(shí)候沒有考慮到文件存儲(chǔ)的問(wèn)題, 為了方便所有的字符串都是直接用 string來(lái)存儲(chǔ),而沒有使用char數(shù)組。后來(lái)在用fwrite,fread的時(shí)候就出現(xiàn)了問(wèn)題。但是因?yàn)榍懊嫠械牡胤蕉际莝tring了,要改起來(lái)的話工作量會(huì)很大,而且可能已經(jīng)實(shí)現(xiàn)了的功能也會(huì)有問(wèn)題。所以就用txt文件來(lái)存儲(chǔ)信息了,保存時(shí)候直接把鏈表中的每一個(gè)對(duì)象的 string,int類型的信息直接存入文件,讀取的時(shí)候再按順序讀取,讀入一個(gè)新的對(duì)象,存入鏈表。并且,以只讀的方式打開,存入鏈表之后再次以空白的形式打開文件, 將鏈表中的信息存入文件, 以達(dá)到刷新文件信息的目的。.沒有在一開始的時(shí)候構(gòu)思好整體的框架有不少地方都是在后來(lái)寫了部分程序之后又啟發(fā)而想到的。 以后再寫程序的時(shí)候應(yīng)該更有整體觀念,具體到連各種變量用什么符號(hào)來(lái)表示也要統(tǒng)一一下。 在這次的程序里面,同一個(gè)類的表示有的地方是g,有的地方是p,這樣就沒有很好的統(tǒng)一,可能會(huì)造成混淆。.沒有使用異常處理一開始是有構(gòu)想使用異常處理的,本來(lái)想把它在最后添加進(jìn)去的。后來(lái)在寫程序的過(guò)程中,經(jīng)過(guò)各種修改之后,基本上出現(xiàn)錯(cuò)誤的情況都用 if處理過(guò)了,所以就沒有使用了。還是因?yàn)槿钟^念把握的不到位??傊?,雖然還有很多不足,但是課設(shè)的結(jié)果我自己還是相對(duì)滿意的。畢竟是自己一行一行敲進(jìn)去的代碼,從一開始的時(shí)候只要一輸入錯(cuò)誤的數(shù)據(jù)程序就崩潰,到現(xiàn)在它已經(jīng)具有了一定的健壯性,能夠應(yīng)對(duì)不少的輸入錯(cuò)誤,感覺還是很欣慰的。
七.使用說(shuō)明(編譯器為Code::Blocks13.12)正在君郎再I本書.工^微學(xué)分析%讀取制本書.航空旅刑t論正三波郎英[本7:三國(guó)f學(xué)堂格之片車品隹RIE在讀取第*本書二工科歌學(xué)分析教學(xué)精異書正在宗郎第5率工;一*簡(jiǎn)強(qiáng)代程正在讀取第蟀書?5,程序設(shè)計(jì)IE在讀取第7本書?MM*E在讀印第■本書:T里信號(hào)話那元〒正二:比用該第1個(gè)加者士正在才取俊享£百博哥正在讀取g個(gè)讀^iE在讀取謝會(huì)介讀者上■?■**正在讀
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 木工裝修合同
- 保健按摩店裝修合同監(jiān)管費(fèi)
- 水利行業(yè)水資源管理與水生態(tài)修復(fù)方案
- 專利代理合同書年
- 三農(nóng)村社會(huì)組織創(chuàng)新發(fā)展方案
- 留學(xué)服務(wù)合同
- 品牌營(yíng)銷策略及市場(chǎng)分析作業(yè)指導(dǎo)書
- 數(shù)字化工廠設(shè)計(jì)與實(shí)施作業(yè)指導(dǎo)書
- 旅游景點(diǎn)智能化管理系統(tǒng)的設(shè)計(jì)與實(shí)施計(jì)劃書
- 三農(nóng)地區(qū)基礎(chǔ)設(shè)施建設(shè)規(guī)劃方案
- 《中國(guó)香文化》課件
- 演出經(jīng)紀(jì)人培訓(xùn)
- 蓋房四鄰簽字協(xié)議書范文
- 2024年新人教版七年級(jí)上冊(cè)數(shù)學(xué)教學(xué)課件 第六章 幾何圖形初步 數(shù)學(xué)活動(dòng)
- 《新時(shí)代大學(xué)生勞動(dòng)教育》全套教學(xué)課件
- 2024簡(jiǎn)易租房合同下載打印
- 碼頭工程施工組織設(shè)計(jì)
- TBSES 001-2024 建設(shè)項(xiàng)目環(huán)境影響后評(píng)價(jià)技術(shù)指南 污染影響類
- 北師大版數(shù)學(xué)三年級(jí)下冊(cè)《分橘子》說(shuō)課稿及反思(共二篇)
- 新能源汽車:電動(dòng)壓縮機(jī)技術(shù)簡(jiǎn)介
- 2024年醫(yī)美項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告范文
評(píng)論
0/150
提交評(píng)論