圖書館管理系統(tǒng)c++課設(shè)報告(附源代碼)(共70頁)_第1頁
圖書館管理系統(tǒng)c++課設(shè)報告(附源代碼)(共70頁)_第2頁
圖書館管理系統(tǒng)c++課設(shè)報告(附源代碼)(共70頁)_第3頁
圖書館管理系統(tǒng)c++課設(shè)報告(附源代碼)(共70頁)_第4頁
圖書館管理系統(tǒng)c++課設(shè)報告(附源代碼)(共70頁)_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、面向?qū)ο蟪绦蛟O(shè)計語言課程設(shè)計報告圖書館管理系統(tǒng) 目錄(ml)需求(xqi)分析32、系統(tǒng)(xtng)總框圖33、每個模塊的設(shè)計分析44、列出所有定義的函數(shù)及說明75、比較有特色的算法206、存在的問題與不足及對策277、使用說明298、程序源代碼34需求(xqi)分析以往,人們使用傳統(tǒng)(chuntng)的人工方式管理圖書館的日常業(yè)務(wù),其操作流程比較繁瑣。在借書時,讀者首先將要借的書好借閱證交給工作人員,然后工作人員將每本書的信息卡片好讀者的借閱證放在一個小格欄里,最后在借閱證和每本書貼的借閱條上填寫借閱信息。在還書時,讀者首先將要還的書交給工作人員,然后工作人員根據(jù)圖書信息找到相應(yīng)的書卡好借閱

2、證,并填寫相應(yīng)的還書信息。南京航空航天大學的圖書館有許多書,如果靠人工的方式來進行(jnxng)管理,那么工作量會非常大。圖書的統(tǒng)計和管理會成為讓人頭疼的問題,讀者借閱圖書進行登記也會十分的不方便。這時,利用計算機來為我們進行這些統(tǒng)計管理的工作,可以給我們的生活帶來大大的便利,并且提高工作效率。由于條件有限,只能使用鍵盤輸入書的信息,所以在輸入圖書的ISBN號時有些麻煩。所以在課設(shè)里,簡化了ISBN號,沒有輸入書本的真實ISBN號。在現(xiàn)實生活中,采用掃描的方式錄入ISBN號會更加準確,高效。系統(tǒng)總框圖讀者注冊查找圖書管理員登陸幫助退出系統(tǒng)讀者中心修改密碼注銷帳戶查看借書情況借還圖書返回菜單書單

3、信息中心添加新書刪除圖書清空全部修改圖書顯示全部返回菜單查找菜單按ISBN號按書名按出版商按作者關(guān)鍵字搜索顯示所有返回菜單可選擇保存,也可不保存圖書管理系統(tǒng)讀者登陸打開文本文件,讀取提示信息注冊后返回主菜單每個模塊(m kui)的設(shè)計分析主界面(jimin)模塊當進入該管理系統(tǒng)時候(sh hou),提示相應(yīng)的說明,夠讓使用者了解該如何進行操作。同時還要具有美觀性。用戶通過鍵盤輸入選擇,程序通過檢測輸入內(nèi)容進行比對,調(diào)用不同的函數(shù),從而實現(xiàn)不同的功能。并且,在輸入錯誤數(shù)據(jù)時程序不會崩潰。讀者注冊模塊新用戶使用該管理系統(tǒng)時,可以通過注冊獲得一個屬于自己的賬號。注冊模塊要引導(dǎo)讀者完成一步步的注冊步驟

4、,并且在最后把注冊所得賬號告知讀者。在注冊時,用了避免用戶輸錯設(shè)定的密碼,所以采用了輸入兩次的方式。如果兩次輸入的結(jié)果是一致的,那么就完成賬號的注冊。如果兩次輸?shù)拿艽a不一致,則用戶需要重新輸入設(shè)定的密碼。這樣的方式可以保證每一次的注冊都是有效的,避免了用戶因為輸入錯誤,無法找回自己的密碼。讀者(dzh)中心模塊讀者登陸成功(chnggng)之后才可以進入該模塊。在該模塊,讀者可以進行(jnxng)密碼重置,注銷,查看借書情況,借書,還書。并且也設(shè)有返回菜單功能。注銷帳戶時,要考慮到刪去該讀者節(jié)點之后不能影響到整個鏈表的連續(xù)性。所有函數(shù)均封裝在ReaderList類中,信息存儲在Reade類r中

5、,ReaderList類中定義了三個個Reader*指針,一個是head_point, 作為鏈表的頭結(jié)點;一個是tail_point,作為鏈表的尾指針;另一個是point,作為活動指針,在不同的類的成員函數(shù)中都可使用。為了防止該活動指針使用過頻,造成幾個函數(shù)同時使用同一個指針指向不明,在有些函數(shù)里還定義了一些臨時指針。借書還書模塊讀者在登錄之后才可以進行借書,還書。借還書函數(shù)會分別調(diào)用讀者鏈表和書單鏈表中的借還書函數(shù),并且在調(diào)用這些函數(shù)之前會先進行借還書檢查。比如,你不能還你沒有借過的書,也不能超過限定數(shù)目借書。用戶需先登錄,借還時要輸入ISBN號。以借書為例。借書操作調(diào)用的直接函數(shù)為:int

6、 ReaderList:Borrow(BookList*g, Reader *p, string bookISBN);它會調(diào)用四個函數(shù)來完成借書操作:bool BookList:Check_borrow_book(string ISBN_Of_Book) /Booklist中的借書檢查void BookList:borrow_book(string ISBN_Of_Book) /Booklist中的借書手續(xù)bool ReaderList:Check_borrowBook(Reader*p, string BookISBN) /ReaderList中的借書檢查void ReaderList:bo

7、rrowBook(Reader*p, string BookISBN) /ReaderList中的借書手續(xù)在Booklist和ReaderList的類中都有借書檢查和借書手續(xù)函數(shù)。首先會調(diào)用借書檢查函數(shù),如果不滿足借書條件則不會繼續(xù)借書的操作。只有在兩個借書檢查都返回true的時候才會進行借書操作,防止了在書類鏈表中借了書卻在讀者類鏈表中沒有(mi yu)借書的情況,實現(xiàn)了兩個鏈表借書的同步性。因為添加圖書時會保證ISBN號的唯一性,如果有ISBN號相同(xin tn)的圖書則不會成功添加到書類鏈表。借書函數(shù)都是通過ISBN號查找圖書的,所以借書時不會有借錯書的情況。查找(ch zho)圖書模

8、塊用戶不需要登陸就可以使用該模塊。用戶可以通過ISBN號,書名,出版社,作者對圖書進行精確的查找。同時,為了提高用戶的使用質(zhì)量,增加了輸入關(guān)鍵字搜索功能。輸入查找信息后,程序會對圖書的ISBN號,書名,出版社以及作者等信息進行比對,并且顯示所有滿足搜索條件的結(jié)果。這樣,讀者在搜索時的自由度就增加了。關(guān)鍵字搜索函數(shù)是通過string類中自帶的find()函數(shù)實現(xiàn)的,所以減小了工作量。增加了顯示全部圖書的功能,便于滿足用戶需求。增加了返回主菜單的功能,提高了程序的連續(xù)操作性。管理(gunl)圖書模塊要輸入管理員密碼以后才可以進入圖書管理菜單。為了安全性,管理員在登錄之后可以選擇修改自己的密碼。并且

9、,這個(zh ge)密碼在退出系統(tǒng)時可以保存下來,下一次打開程序時的密碼就會使修改后的密碼了。書單信息菜單里,可以對圖書進行添加,刪除,清空,修改(xigi),顯示所有。都是分別調(diào)用了BookList類中的函數(shù),對整個書單鏈表進行了一系列操作。在修改時會進入圖書(tsh)修改菜單在搜索書的ISBN號之后會返回該本書的指針,對該本書的信息進行一系列修改,并且也可以返回上級(shngj)書庫信息菜單。讀取保存信息模塊信息的讀取和保存分為三大部分,讀者信息,書單信息,管理員信息的保存。而這三個部分的信息又分別由六個函數(shù)負責讀取和保存。在保存文件里,鏈表中的信息會依次存入txt文件。在讀取時,會先將信

10、息存入一個類的數(shù)組里,然后將類的數(shù)組依次存入鏈表里。系統(tǒng)在打開時會自動從文件里面讀取上次存儲的信息,在退出系統(tǒng)時可以選擇保存或不保存本次操作的結(jié)果。如果要保存,則會將操作后的鏈表存入文件,刷新數(shù)據(jù)??偟膩碚f,程序的各個菜單都有比較(bjio)清晰的結(jié)構(gòu),也都有返回上級菜單的功能?;旧纤械暮瘮?shù)都考慮到了讀者輸入錯誤數(shù)據(jù)的情況,并且能夠進行一定的處理,具有較強的健壯性,不容易崩潰。列出所有定義的函數(shù)(hnsh)及說明管理員類中的函數(shù)(hnsh)#ifndef LIBRARIAN_H_INCLUDED#define LIBRARIAN_H_INCLUDED#includeclass Librar

11、ianprivate: string password;public: Librarian() password=880128; Librarian(string a) password=a; Librarian() password=; void changePassword(string a) password=a; int changePassword()/重載修改密碼函數(shù) cout是否需要修改管理員密碼?按0表示確定,按其他任意鍵表示不需要修改:choice; if(choice=0) cout請設(shè)置新密碼:password; cout修改(xigi)成功!endl; return 0

12、; else return 0; bool Login()/管理員登陸(dng l) cout 請輸入(shr)管理員密碼: pass; if (pass = password) cout 成功登錄! endl; changePassword(); else cout 密碼錯誤! endl; return false; system(pause);return true;string getPassword() return password;#endif / LIBRARIAN_H_INCLUDED書類中的函數(shù)#ifndef BOOK_H_INCLUDED#define BOOK_H_INC

13、LUDED#include#include#includeusing namespace std;class BookList;class Book friend class BookList; friend void saveBooks(BookList*p);friend void readBooks(BookList*p);protected:string ISBN;string Kind; /圖書(tsh)分類string BookName; /書名(sh mn)string Writer;/作者(zuzh)名string Publisher;/出版商int number; /單個書的

14、本數(shù)Book *next; /指向下一個節(jié)點的指針public:Book();Book(string isbn, string kind, string name, string writer, string publisher, int number); void copyBook(string isbn, string kind, string name, string writer, string publisher, int number); void copyBook(Book* p);void setISBN(string tem);void setKind(string tem)

15、;void setBookName(string tem);void setWriter(string tem);void setPublisher(string tem);void setNumber(int tem);void operator=(const Book &book);/運算符重載void setBook();/重新設(shè)定該本書的所有信息void displayBook();/展示一本書virtual void Add_list(class Book *p)/把書加入鏈表 next = p; p-next = NULL; virtual void AddNewBook()/添加

16、新書并且設(shè)置它的信息 next = new class Book; next-setBook(); cout 已經(jīng)成功添加新書: displayBook(); virtual void show_all()/顯示所有書 system(cls); displayBook(); while (next!= NULL) next-displayBook(); next = next-next; ;#endif / BOOK_H_INCLUDED書鏈表類中的函數(shù)(hnsh)#ifndef BOOKLIST_H_INCLUDED#define BOOKLIST_H_INCLUDED#include#in

17、clude#includeBook.husing namespace std;class ReaderList;class BookList;class Book;class BookList:public Book/書類的鏈表private:class Book *head;/頭指針(zhzhn)class Book *tail; /尾指針(zhzhn)class Book *node; /活動指針static int N;public:friend ReaderList;friend void saveBooks(BookList*p);/保存圖書到txt文件的函數(shù)BookList();B

18、ookList();void Add_list(class Book *p);/把一本書加入圖書鏈表void AddNewBook();/添加一本書到鏈表里,并且設(shè)置它的各類信息bool Check_borrow_book(string ISBN_Of_Book);/檢查是否有這一本書,并且它是否有庫存 返回是否能借書的布爾變量void borrow_book(string ISBN_Of_Book);/在書類鏈表里的借書操作bool Check_return_book(string ISBN_Of_Book);/檢查是否存在這本書void return_book(string ISBN_Of

19、_Book);/在書類鏈表里進行還書操作class Book* search_ISBN(string isbn);/按ISBN查找圖書,并且返回一個Book*void search_BookName(string bookname);/按書名查找并展示所有查找結(jié)果void search_Writer(string writer);/按作者(zuzh)名查找并展示所有查找結(jié)果void search_Publisher(string publisher);/按出版社查找(ch zho)并展示所有查找結(jié)果void search_keyword(string key);/按關(guān)鍵字查找并展示(zhnsh

20、)所有查找結(jié)果int search();/查找圖書的菜單 用來調(diào)用其他的查找函數(shù)void show_all();/顯示書庫中的所有圖書bool delete_onebook(string ISBN_Of_Book);/從鏈表中刪除一本書int change_content(string ISBN_Of_Book);/圖書修改菜單 用來調(diào)用不同的改變圖書信息的函數(shù)int GoInto_BookInfo();/書庫信息菜單,用來調(diào)用對圖書管理的各種操作;#endif / BOOKLIST_H_INCLUDED讀者類中的函數(shù)#ifndef READER_H_INCLUDED#define READE

21、R_H_INCLUDED#include#includeusing namespace std;class ReaderList;class Reader friend ReaderList; friend void saveReaders(ReaderList*g); friend void readReaders(ReaderList*g);protected:int ReaderID;string ReaderName; /讀者姓名string Password; /密碼string BookInHand5;/每人最多借5本書,可以根據(jù)需要增減限額int numberOfBooks; /

22、記錄借的書的數(shù)目,0為沒有借書,1為借了一本,2為借了二本Reader *next; /指向下一節(jié)點的指針public:Reader();Reader();Reader(int ID,string name, string mi, string books5, int num);void setReader(int ID, string name, string mi, string books5, int num); void copyReader(Reader* p);void operator=(const Reader &reader);/運算符重載void resetPassword

23、(string newpassword);/重設(shè)密碼virtual void Add_Point(Reader *p)/添加一個讀者節(jié)點 next=p; p-next=NULL;virtual void change_password() string newpassword; cinnewpassword; Password=newpassword;#endif / READER_H_INCLUDED讀者(dzh)鏈表類中的函數(shù)#ifndef READERLIST_H_INCLUDED#define READERLIST_H_INCLUDED#include#include#include#

24、include#includeBookList.h#includeReader.husing namespace std;class BookList;class ReaderList;class Reader;class ReaderList:public Readerprivate: friend void saveReaders(ReaderList*g);Reader*head_point;Reader*tail_point;Reader*point; /定義兩個Rreader指針(zhzhn),head_point為頭指針,point為活動指針public:static int nu

25、mberOfReader;ReaderList();/構(gòu)造函數(shù),使指針(zhzhn)初始化ReaderList();void Add_Point(Reader *p); /增加新結(jié)點到鏈表void reader_register(); /讀者注冊Reader* search_ReaderID(int id); /按ID查找Reader* reader_land(int id,string passwordT); /讀者登錄,成功(chnggng)后將返回該讀者的Reader*void show_OneReader(Reader *p,BookList*g); /顯示某讀者(dzh)借書情況vo

26、id change_password(Reader*p); /修改(xigi)密碼int delete_reader(Reader*p); /讀者注銷bool Check_borrowBook(Reader*p, string BookISBN);/檢查是否可以借書void borrowBook(Reader*p, string BookISBN);/進行借書操作bool Check_returnBook(Reader*p, string BookISBN);/檢查是否可以還書void returnBook(Reader*p, string BookISBN);/進行還書操作int Borro

27、w(BookList*g, Reader *p, string bookISBN);/借書操作的總的函數(shù),用來調(diào)用書類鏈表和讀者類鏈表里的借書相關(guān)函數(shù)int Return(BookList*g,Reader *p, string bookISBN);/還書操作的總的函數(shù),用來調(diào)用書類鏈表和讀者類鏈表里的還書相關(guān)函數(shù)int GoInto_ReaderInfo(Reader*p,BookList*g); /登陸后的讀者信息菜單;#endif / READERLIST_H_INCLUDED不在類中的函數(shù)幫助函數(shù)void help()system(cls);ifstream readHelp;read

28、Help.open(help.txt, ios:in);if (readHelp.fail()cout 無法打開文件! endl;exit(0);string temp;cout endl;while (!readHelp.eof()getline(readHelp, temp);cout temp endl;存儲讀取相關(guān)(xinggun)的函數(shù)void saveLibrarian(Librarian *t) ofstream saveLibrarian; saveLibrarian.open(Librarian.txt,ios:out); if(!saveLibrarian) cout保存(

29、bocn)管理員信息失?。ndl; exit(0); saveLibrariangetPassword(); coutendl成功(chnggng)保存管理員信息!endlendl; saveLibrarian.close();void readLibrarian(Librarian *t) string tem; ifstream saveLibrarian; saveLibrarian.open(Librarian.txt,ios:in); if(!saveLibrarian) cout保存管理員信息失?。em; t-changePassword(tem); coutendl成功讀取管

30、理員信息!endlendl; saveLibrarian.close();void saveBooks(BookList*p) ofstream saveBook; saveBook.open(Books.txt,ios:out); if(!saveBook) cout保存書單信息失?。ead; int i=0; coutendlendl; do i+; cout正在(zhngzi)保存第i本書:BookNameendlendl; saveBookISBN Kind BookName Writer ; saveBookPublisher numbernext; while(tem!=NULL

31、); cout書單信息保存(bocn)完畢!endlendl; coutendlendl; saveBook.close();void saveReaders(ReaderList*g) ofstream saveReader; saveReader.open(Readers.txt,ios:out); if(!saveReader) cout保存讀者信息(xnx)失??!head_point; coutendlendl; do i+; cout正在保存第i個讀者:ReaderNameendlendl; saveReaderReaderID ReaderName Password ; for(i

32、nt i=0;iBookInHandi=) saveReader empty ; else saveReaderBookInHandi ; saveReadernumberOfBooksnext; while(tem!=NULL); cout讀者信息保存完畢!endlendl; coutendlendl; saveReader.close();void readBooks(BookList*p) ifstream readBooks; readBooks.open(Books.txt,ios:in); if(!readBooks) coutendl; cout讀取書單信息(xnx)失?。nd

33、l; exit(0); int i=0; string s5; int k=0; int temp_num=0; coutendl; coutendl; do i+; for(k=0;ksk; readBookstemp_num; if(readBooks.fail() / if(i!=1)&(booksi-1.ISBN=booksi.ISBN) break; p-Add_list(&booksi); booksi.copyBook(s0,s1,s2,s3,s4,temp_num); coutendl; cout正在(zhngzi)讀取第i本書:s2endl; while(!readBooks

34、.eof(); readBooks.close(); coutendl; cout書單信息(xnx)讀取完畢!endlendl; coutendl; coutendl;void readReaders(ReaderList*g) string books5; ifstream readReaders; readReaders.open(Readers.txt,ios:in); if(!readReaders) cout讀取讀者(dzh)信息失敗!endl; exit(0); int id; string name,password; string b0,b1,b2,b3,b4; int num

35、=0; int i=0; int k=0; coutendl; coutendlidnamepasswordb0b1b2b3b4num; if(readReaders.fail() break; books0=b0; books1=b1; books2=b2; books3=b3; books4=b4; for(k=0;kAdd_Point(&readersi); cout正在(zhngzi)讀取讀第i個讀者:idnameendlendl; while(!readReaders.eof(); cout讀者(dzh)信息讀取完畢!endlendl; coutendl; coutendl; rea

36、dReaders.close();退出時跳出詢問保存的函數(shù)void exit_message(BookList*p, ReaderList*g,Librarian*t) int result=MessageBox(NULL,TEXT(是否需要(xyo)保存本次操作?),TEXT(退出圖書館管理系統(tǒng)), MB_ICONINFORMATION|MB_YESNO); switch(result) case IDYES: saveLibrarian(t); saveBooks(p); saveReaders(g); MessageBox(NULL,TEXT(已經(jīng)(y jing)保存),TEXT(YES

37、),MB_OK);break; case IDNO:MessageBox(NULL,TEXT(未保存(bocn),TEXT(NO),MB_OK);break; exit(0);菜單界面函數(shù)void menu(BookList*p, ReaderList*g,Librarian*t)Book * temBook = NULL;/主菜單cout 歡迎使用圖書館管理系統(tǒng) endl;cout endl;cout ¥ 1 新用戶注冊 ¥ endl;cout ¥ 2 讀者登錄 ¥ endl;cout ¥ 3 查找圖書 ¥ endl;cout ¥ 4 管理圖書 ¥ endl;cout ¥ 5 幫助 ¥ en

38、dl;cout ¥ 6 退出系統(tǒng) ¥ endl;cout choice;int id;string password;string ISBN;Reader*tem;switch (choice)case 1:g-reader_register(); break;case 2:cout id;cout password;tem = g-reader_land(id, password);if (tem = NULL)cout 登錄(dn l)信息有誤! GoInto_ReaderInfo(tem,p);break;case 3:p-search(); break;case 4:if (t-Log

39、in()p-GoInto_BookInfo();break;case 5:help(); break;case 6: exit_message(p, g,t); exit(0); break;default:cout 錯誤(cuw)的輸入! endl;主函數(shù)(hnsh)int main() readLibrarian(&mitang);/讀取管理員信息 readBooks(&list1);/讀取書單鏈表 readReaders(&readerlist);/讀取讀者鏈表 cout信息已經(jīng)讀取完畢!歡迎使用圖書管理系統(tǒng)!endlnumberOfBooks;if (i_tem = 5)cout 已經(jīng)

40、(y jing)達到最大借書上限,不能再借書啦! endl;return false;elsereturn true;比較(bjio)有特色的算法借還圖書,以借書函數(shù)為例int ReaderList:Borrow(BookList*g, Reader *p, string bookISBN);是借書操作調(diào)用的直接函數(shù)它會調(diào)用四個函數(shù)來完成借書操作:bool BookList:Check_borrow_book(string ISBN_Of_Book) /Booklist中的借書檢查void BookList:borrow_book(string ISBN_Of_Book) /Booklist中

41、的借書手續(xù)bool ReaderList:Check_borrowBook(Reader*p, string BookISBN) /ReaderList中的借書檢查void ReaderList:borrowBook(Reader*p, string BookISBN) /ReaderList中的借書手續(xù)在Booklist和ReaderList的類中都有借書檢查和借書手續(xù)函數(shù)。借書時首先會調(diào)用借書檢查函數(shù),如果不滿足借書條件則不會繼續(xù)借書的操作。只有在兩個借書檢查都返回true的時候才會進行借書操作,防止了在書類鏈表中借了書卻在讀者類鏈表中沒有借書的情況,實現(xiàn)了兩個鏈表借書的同步性。因為添加圖

42、書時會保證ISBN號的唯一性,如果有ISBN號相同的圖書則不會成功添加到書類鏈表。借書函數(shù)都是通過ISBN號查找圖書的,所以借書時不會有借錯書的情況。程序代碼如下:bool BookList:Check_borrow_book(string ISBN_Of_Book) /Booklist中的借書檢查(jinch)node = search_ISBN(ISBN_Of_Book);if (node = NULL)cout 該本書并不存在(cnzi)! number = 0)cout 此書已被借完! number-;cout 借書成功! numberOfBooks;if (i_tem = 5)cou

43、t 已經(jīng)達到最大借書上限,不能再借書啦! numberOfBooks;p-BookInHandi_tem = BookISBN;p-numberOfBooks+;int ReaderList:Borrow(BookList*g, Reader *p, string bookISBN) /ReaderList中的主借書函數(shù)(hnsh)char i;bool a = g-Check_borrow_book(bookISBN);if (!a)return 0;bool b = Check_borrowBook(p, bookISBN);if (a&b)cout 當前讀者帳戶(zhn h)借書情況:

44、endl;show_OneReader(p, g);cout = endl;cout 所要借閱的圖書的基本信息: search_ISBN(bookISBN)-displayBook();cout 確定要借書嗎?按0確定,按其他任意鍵取消本次借書 i;if (i = 0)g-borrow_book(bookISBN);borrowBook(p, bookISBN);return 0;elsecout 已經(jīng)取消本次借書 endl;return 0;elsecout 信息(xnx)有誤! ISBN.find(key)!=string:npos); bool b=(node-BookName.find

45、(key)!=string:npos); bool c=(node-Writer.find(key)!=string:npos); bool d=(node-Publisher.find(key)!=string:npos); bool e=(node-Kind.find(key)!=string:npos); if(a|b|c|d|e) node-displayBook(); i+; node=node-next; cout找到i條結(jié)果!endl;相比于其他幾種搜索(su su),關(guān)鍵詞搜索的自由度更大,用戶只需要輸入想要查找的關(guān)鍵字,就可以查找到所有相關(guān)的內(nèi)容,搜索更有發(fā)散性。文件(wnj

46、in)讀取和保存在程序開始時會自動開始讀取文件中存儲的信息,并將這些信息載入鏈表中,從而進行下面的各項操作。以讀者(dzh)鏈表的保存和讀取為例:void saveReaders(ReaderList*g) ofstream saveReader; saveReader.open(Readers.txt,ios:out); if(!saveReader) cout保存讀者信息失??!head_point; coutendlendl; do i+; cout正在保存第i個讀者:ReaderNameendlendl; saveReaderReaderID ReaderName Password ;

47、for(int i=0;iBookInHandi=) saveReader empty ; else saveReaderBookInHandi ; saveReadernumberOfBooksnext; while(tem!=NULL); cout讀者信息保存完畢!endlendl; coutendlendl; saveReader.close();保存時比較簡單,只要將所有的信息存入文件即可。為了(wi le)下一次讀取時能夠順利進行,將BookInHand的string數(shù)組中的空字符串用“empty”替代,以免在用操作符讀取時程序自動跳過所有(suyu)的空格,導(dǎo)致出錯。一開始讀取的時

48、候最后一行的信息總是會被讀取兩遍,經(jīng)過排查之后發(fā)現(xiàn)是eof導(dǎo)致的。因為(yn wi)在讀取到結(jié)尾時它并不知道已經(jīng)是結(jié)尾了,要再往后面的空的地方去讀取失敗了才知道是已經(jīng)到了結(jié)尾,而在讀取失敗時string變量里存的還是上一次讀取的結(jié)果,所以導(dǎo)致了重復(fù)讀取。后來加了一個if語句,終于解決了這個問題。 = if(readBooks.fail() break;=而且,在把臨時存放數(shù)據(jù)的的string變量存到臨時的類后,把這個類存入鏈表的時候也出現(xiàn)了問題。一開始我在這個while循環(huán)里面每次都是new了一個Reader類,然后加入鏈表中,直到最后讀完了所有的數(shù)據(jù)再跳出循環(huán)。但這樣運行不出來。因為每次這個

49、函數(shù)用完以后這個類就被回收了,后來在主函數(shù)里面開了一個Reader readers100來存放文件里面讀出來的數(shù)據(jù),然后把它加入鏈表,就可以成功讀取所有的數(shù)據(jù)了。void readBooks(BookList*p) ifstream readBooks; readBooks.open(Books.txt,ios:in); if(!readBooks) coutendl; cout讀取書單信息失??!endl; exit(0); int i=0; string s5; int k=0; int temp_num=0; coutendl; coutendl; do i+; for(k=0;ksk;

50、readBookstemp_num; if(readBooks.fail() break; p-Add_list(&booksi); booksi.copyBook(s0,s1,s2,s3,s4,temp_num); coutendl; cout正在(zhngzi)讀取第i本書:s2endl; while(!readBooks.eof(); readBooks.close(); coutendl; cout書單信息(xnx)讀取完畢!endlendl; coutendl; coutendl;退出系統(tǒng)時會(sh hu)自動跳出一個窗口,詢問是否需要保存本次操作。void exit_message

51、(BookList*p, ReaderList*g,Librarian*t) int result=MessageBox(NULL,TEXT(是否需要保存本次操作?),TEXT(退出圖書館管理系統(tǒng)), MB_ICONINFORMATION|MB_YESNO); switch(result) case IDYES: saveLibrarian(t); saveBooks(p); saveReaders(g); MessageBox(NULL,TEXT(已經(jīng)(y jing)保存),TEXT(YES),MB_OK);break; case IDNO:MessageBox(NULL,TEXT(未保存(

52、bocn),TEXT(NO),MB_OK);break; exit(0);如果選擇保存,則會自動調(diào)用3個函數(shù),將管理員,書鏈表,讀者鏈表分別保存在三個txt文件里面(lmin)。這樣的保存方式可以讓用戶感覺更有交互性。存在的問題與不足及對策沒有做出圖形界面。本來希望可以做出圖形界面,這樣用戶在使用時可以用鼠標進行操作,而不是只能以dos命令行的形式用鍵盤輸入來操作??墒窃趫D書館里借了幾本mfc相關(guān)的書后感覺要短時間內(nèi)掌握這個有些困難。所以,就只是在函數(shù)里面設(shè)計讓輸出的符號和文字排列整齊,給用戶一種操作菜單的感覺并且能夠比較方便的使用。暑假的時候有比較充裕的時間,希望能夠?qū)W習好圖形界面,自己做個

53、小型的軟件來自己使用。讀者借了圖書之后沒有時間限制本想要模仿學校的圖書館的管理系統(tǒng)的,每一本書可以借30天,然后可以延期續(xù)借,如果超期了就每天罰款一角錢。然而一方面這樣會增加不少的工作量,另一方面我沒有想到獲得時間的方法。于是就省略了這個功能。沒有成功在文件中用二進制直接讀取一個類一開始的時候沒有考慮到文件存儲的問題,為了方便所有的字符串都是直接用string來存儲,而沒有使用char數(shù)組。后來在用fwrite,fread的時候就出現(xiàn)了問題。但是因為前面所有的地方都是string了,要改起來的話工作量會很大,而且可能已經(jīng)實現(xiàn)了的功能也會有問題。所以就用txt文件來存儲信息了,保存時候直接把鏈表

54、中的每一個對象的string,int類型的信息直接存入文件,讀取的時候再按順序讀取,讀入一個新的對象,存入鏈表。并且,以只讀的方式打開,存入鏈表之后再次以空白的形式打開文件,將鏈表中的信息存入文件,以達到刷新文件信息的目的。沒有在一開始的時候構(gòu)思好整體的框架有不少地方都是在后來寫了部分程序之后又啟發(fā)而想到的。以后再寫程序的時候應(yīng)該更有整體觀念,具體到連各種變量用什么符號來表示也要統(tǒng)一一下。在這次的程序里面,同一個類的表示有的地方是g,有的地方是p,這樣就沒有很好的統(tǒng)一,可能會造成混淆。沒有使用異常處理一開始是有構(gòu)想使用異常處理的,本來想把它在最后添加進去的。后來在寫程序的過程中,經(jīng)過各種修改之

55、后,基本上出現(xiàn)錯誤的情況都用if處理過了,所以就沒有使用了。還是(hi shi)因為全局觀念把握的不到位??傊m然還有很多不足,但是課設(shè)的結(jié)果我自己還是相對滿意的。畢竟是自己一行一行敲進去的代碼,從一開始的時候只要(zhyo)一輸入錯誤的數(shù)據(jù)程序就崩潰,到現(xiàn)在它已經(jīng)具有了一定的健壯性,能夠應(yīng)對不少的輸入錯誤,感覺還是很欣慰的。使用(shyng)說明(編譯器為Code:Blocks 13.12)運行程序會首先出現(xiàn)讀取信息頁面,按任意鍵后會進入主菜單。在主菜單可以進行以系列的操作。新用戶可以查看幫助,了解程序的使用(shyng)方法。返回主菜單之后。新用戶可以注冊(zhc)一個賬號:注冊成功后要

56、記住(j zh)自己的Id號。返回(fnhu)主菜單之后就可以登陸自己的賬號了。登陸成功之后就可以進入讀者中心進行一系列操作(cozu)了??梢灾刂妹艽a,注銷帳戶,查看借書情況,借還圖書。也可以返回主菜單進行其他的操作。注銷帳戶時必須保證(bozhng)賬號內(nèi)借了未還的書,否則不能注銷。借書的上限是5本。已經(jīng)借了5本書的話則不能再借更多的書了。借還圖書時都需要圖書的ISBN號碼??梢韵仍谥鞑藛尾檎覉D書,記下想借還書的ISBN號。然后登陸后進行操作。進入圖書查找菜單并不需要登陸(dng l)??芍苯舆M行操作。按照ISBN號,書名,出版社,作者都是進行精確查找的。而輸入關(guān)鍵詞查找功能可以很自由(z

57、yu)的進行搜索,只要輸入關(guān)鍵詞,程序就會自動檢索所有圖書的各項信息,并且列出所有滿足搜索條件的結(jié)果。如果是以管理員的身份使用圖書管理系統(tǒng),則需要輸入(shr)密碼登陸。為了信息安全,在每次登陸成功之后都會提示管理員是否需要更改密碼(m m)。然后進入書庫信息菜單對圖書進行管理。進入書庫信息菜單以后會是以下界面??梢蕴砑?tin ji),刪除,清空,修改,展示圖書。在進行這些操作時都需要輸入圖書的ISBN號碼。也可以返回主菜單進行其他的操作。進入了圖書修改(xigi)菜單。最后,在完成了所有的操作之后可以(ky)退出系統(tǒng)。退出時可以選擇保存此次(c c)操作,那么系統(tǒng)就會更新文件中存儲的信息。

58、選擇“否”的話則不會(b hu)保存此次操作。但是如果不是通過這種退出方式,而是直接關(guān)閉程序的話是不會保存本次(bn c)的操作的。程序源代碼Book.h#ifndef BOOK_H_INCLUDED#define BOOK_H_INCLUDED#include#include#includeusing namespace std;class BookList;class Book friend class BookList; friend void saveBooks(BookList*p);friend void readBooks(BookList*p);protected:string

59、 ISBN;string Kind; /圖書分類string BookName; /書名string Writer;/作者名string Publisher;/出版商int number; /單個書的本數(shù)Book *next; /指向下一個節(jié)點(ji din)的指針public:Book();Book(string isbn, string kind, string name, string writer, string publisher, int number); void copyBook(string isbn, string kind, string name, string wri

60、ter, string publisher, int number); void copyBook(Book* p);void setISBN(string tem);void setKind(string tem);void setBookName(string tem);void setWriter(string tem);void setPublisher(string tem);void setNumber(int tem);void operator=(const Book &book);/運算符重載(zhn zi)void setBook();/重新設(shè)定該本書的所有(suyu)信息

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論