第一篇:數(shù)據(jù)結(jié)構(gòu)圖書管理報告
一.實驗?zāi)康?/p>
圖書管理:
圖書管理基本業(yè)務(wù)活動包括:對一本書的采編入庫、清除庫存。借閱和歸還等等。試設(shè)計一個圖書管理系統(tǒng),將上述業(yè)務(wù)活動借助于計算機系統(tǒng)完成。
二.實驗內(nèi)容
計一個計算機管理系統(tǒng)完成圖書管理基本業(yè)務(wù)?!净疽蟆?/p>
1)每種書的登記內(nèi)容包括書號、書名、著作者、現(xiàn)存量和庫存量; 2)對書號建立索引表(線性表)以提高查找效率; 3)系統(tǒng)主要功能如下:
*采編入庫:新購一種書,確定書號后,登記到圖書帳目表中,如果表中已有,則只將庫存量增加;*借閱:如果一種書的現(xiàn)存量大于0,則借出一本,登記借閱者的書證號和歸還期限,改變現(xiàn)存量;*歸還:注銷對借閱者的登記,改變該書的現(xiàn)存量。
三.實驗步驟(可選)
1.圖書館基本操作函數(shù)
void delbook(){ tag=1;}//設(shè)置刪除標記 1:已刪 0:未刪
void addreader(int n,char *na)//增加讀者
{
tag=0;
no=n;
strcpy(name,na);
for(int i=0;i borbook[i]=0;} void borrowbook(int bookid)//借書操作 { for(int i=0;i { if(borbook[i]==0) { borbook[i]=bookid; return; } } } int retbook(int bookid)//還書操作 { for(int i=0;i { if(borbook[i]==bookid) { borbook[i]=0; return 1; } } return 0;} void disp()//讀出讀者信息 { cout << setw(5)<< no < for(int i=0;i if(borbook[i]!=0) cout << borbook[i] << “|”; cout << “]”< 2.讀者類庫,實現(xiàn)建立讀者的個人資料 class RDatabase { private: int top; //讀者記錄指針 Reader read[Maxr];//讀者記錄 public: RDatabase() //構(gòu)造函數(shù),將reader.txt讀到read[]中 { Reader s; top=-1; fstream file(“reader.txt”,ios::in);//打開一個輸入文件 while(1){ file.read((char *)&s,sizeof(s)); if(!file)break; top++; read[top]=s;} file.close(); //關(guān)閉 reader.txt } void clear()//刪除所有讀者信息 { top=-1;} int addreader(int n,char *na)//添加讀者時先查找是否存在{ Reader *p=query(n);if(p==NULL){ top++; read[top].addreader(n,na); return 1;} return 0;} Reader *query(int readerid)//按編號查找 { for(int i=0;i<=top;i++) if(read[i].getno()==readerid && read[i].gettag()==0) { return &read[i]; } return NULL;} void disp()//輸出所有讀者信息 { for(int i=0;i<=top;i++) read[i].disp();} void readerdata();//讀者庫維護 ~RDatabase()//析構(gòu)函數(shù),將read[]寫到reader.txt文件中 { fstream file(“reader.txt”,ios::out); for(int i=0;i<=top;i++) if(read[i].gettag()==0) file.write((char *)&read[i],sizeof(read[i])); file.close();} };void RDatabase::readerdata(){ char choice;char rname[20];int readerid;Reader *r;while(choice!='0'){ cout <<“讀者維護:t1.新增t2.更改t3.刪除t4.查找t5.顯示t6.全刪t0.退出”< cin >> choice; switch(choice) { case '1': cout << “輸入讀者編號:”; cin >> readerid; cout << “輸入讀者姓名:”; cin >> rname; addreader(readerid,rname); break; case '2': cout << “輸入讀者編號:”; cin >> readerid; r=query(readerid); if(r==NULL) { cout << “ 該讀者不存在”< break; } cout << “輸入新的姓名:”; cin >> rname; r->setname(rname); break; case '3': cout << “ 輸入讀者編號:”; cin >> readerid; r=query(readerid); if(r==NULL) { cout <<“ 該讀者不存在” << endl; break; } r->delbook(); break; case '4': cout << “讀入讀者編號:”; cin >> readerid; r=query(readerid); if(r==NULL) { cout <<“該讀者不存在”<< endl; break; } r->disp(); break; case '5': disp(); break; case '6': clear(); break; default:cout<<“輸入錯誤,請從新輸入:”;break; } } } 四.實驗的結(jié)果及分析。 實驗結(jié)果: 實驗結(jié)果分析:圖書管理系統(tǒng)分為圖書管理和會員管理兩大部分。設(shè)計一個圖書類Book,包括一本圖書的基本管理功能。再設(shè)計一個圖書庫類BDatabase,具有以下私有數(shù)據(jù):int top;//圖書記錄指針Book book[Maxb];//圖書記錄。在其構(gòu)造函數(shù)中,將book.txt文件的所有錄入讀到book[]中。處理完畢,在析構(gòu)函數(shù)中將book[]中的所有未刪除記錄笑道book.txt文件中,中間的處理是對book[]進行的。設(shè)計一個讀者類Reader,包括一個讀者的基本管理功能。在其構(gòu)造函數(shù)中,將reader.txt文件的所有記錄讀到read[]中。處理完畢,在析構(gòu)函數(shù)中將read[]中的所有未刪除記錄寫到reader.txt文件中,中間的處理都是對reader[]進行的。 五.實驗中出現(xiàn)的問題、解決方法和心得體會 本實驗是這個學期的最后一個實驗,我選擇的是圖書管理系統(tǒng)的設(shè)計。這個實驗的設(shè)計有一定的難度,花費 的時間比較長。雖然做過了很多實驗,但是這個實驗操作中還是遇到了很多問題,所以特意到圖書館專門借了幾本關(guān)于數(shù)據(jù)結(jié)構(gòu)程序設(shè)計方面的書,希望能對知識有更深層次的理解。一切準備就緒,把平時寫的相關(guān)的程序出來參考,對比,慢慢才找到一些感覺,把源程序?qū)懗鰜?。比起前面的幾個實驗,這個設(shè)計的功能完成的比較全面,也有原因是有前面的實驗作為基礎(chǔ)。 雖然這學期的數(shù)據(jù)結(jié)構(gòu)課程已經(jīng)學完,但這并不是學習編程的結(jié)束。雖然做了很多份設(shè)計,但基本還要參考資料或問老師和同學,所以,在以后的學習中,還應(yīng)該繼續(xù)多做題,多獨立思考,爭取在編程上取得一定的進步,點點滴滴積累下來的能量是無窮的。所以我要腳踏實地、從點滴做起。 《數(shù)據(jù)結(jié)構(gòu)》 課程設(shè)計報告書 一.課程設(shè)計題目 圖書借閱管理系統(tǒng) 二.課程設(shè)計內(nèi)容 實現(xiàn)圖書管理信息系統(tǒng)的設(shè)計 (一)管理員功能: ①登錄:輸入管理員密碼,若密碼錯誤則不得執(zhí)行管理員操作。 ②添加新書:增加新的圖書資料,同時需檢查新書的圖書編號是否已存在于原圖書資料中,若已存在則應(yīng)取消添加或提示重新輸入。 ③修改圖書:通過編號查詢該圖書資料,若該編號存在,則顯示已有信息,允許修改,否則提示 無該圖書信息。 ④刪除圖書:通過編號查詢該圖書資料,若該編號存在,則顯示已有信息,允許刪除,否則提示無該圖書信息。刪除對象包括該圖書資料以及“圖書狀態(tài)”和“借閱人”中與此書相關(guān)的所有記錄。 ⑤查找圖書: A.按書號查找:通過編號查詢該圖書資料,若該編號存在,則顯示圖書信息,否則提示無該圖書信息。 B.按書名查找:通過書名查詢該圖書資料,若該編號存在,則顯示圖書信息,否則提示無該圖書信息。 C.按作者查找:通過作者查詢該圖書資料,若該編號存在,則顯示圖書信息,否則提示無該圖書信息。 ⑥查看全部圖書:顯示所有圖書資料,包括書號、書名、作者、狀態(tài)和借閱人等信息。 ⑦修改讀者:通過姓名查詢該讀者信息,若該姓名存在,則顯示已有信息,允許修改,否則提示無該讀者信息。 ⑧刪除讀者:通過姓名查詢該讀者信息,若該姓名存在,則顯示已有信息,允許刪除,否則提示無該讀者信息。刪除對象包括該讀者姓名、班級、電話以及“圖書狀態(tài)”和“借閱人”中與此人相關(guān)的所有記錄。 ⑨查看所有讀者:顯示所有讀者資料,包括姓名、班級、電話等信息。 (二)讀者功能: ①登錄:輸入讀者姓名,若未經(jīng)注冊則不得進入讀者服務(wù)界面。②注冊:新用戶經(jīng)注冊方可登錄系統(tǒng)并使用讀者服務(wù)功能。③借書: A.輸入所需圖書編號,判斷該編號是否存在,若不存在則提示重新輸入。 B.若所輸入圖書編號存在,則判斷該書籍是否已被借出,若已借則不允許執(zhí)行借書操作。 C.若所輸入圖書未借,則提示輸入讀者姓名,判斷所輸入讀者姓名是否存在,若不存在則提示重新輸入。D.若讀者姓名存在,則允許執(zhí)行借書操作。 E.借書處理包括在“圖書狀態(tài)”中加上“已借”標記。④還書: A.輸入所借書編號,判斷該編號是否存在,若不存在則提示重新輸入。B.判斷該書是否已借出,若未借則不允許執(zhí)行還書操作。C.借書處理包括在“圖書狀態(tài)”中加上“未借”標記。⑤查詢圖書: A.按書號查找:通過編號查詢該圖書資料,若該編號存在,則顯示圖書信息,否則提示無該圖書信息。 B.按書名查找:通過書名查詢該圖書資料,若該編號存在,則顯示圖書信息,否則提示無該圖書信息。 C.按作者查找:通過作者查詢該圖書資料,若該編號存在,則顯示圖書信息,否則提示無該圖書信息。 ⑥查看借閱情況:輸入讀者姓名,若該姓名不存在則提示重新輸入,若該姓名存在則顯示該讀者借閱信息。 三.算法設(shè)計 1.流程圖(部分示例) ①管理員登錄 ②讀者登錄 ③讀者借閱圖書 ④管理員或讀者按書名查找圖書 2.代碼實現(xiàn) #include #include //將字符串BookFile替換原文件中的宏名稱book #define ReaderFile “reader.txt” using namespace std;//**********讀者結(jié)構(gòu)體,用于存放讀者基本信息********** class Reader { private: char rname[10]; char rclass[10]; char rtel[10];public: Reader()//構(gòu)造函數(shù),實現(xiàn)數(shù)據(jù)初始化 {strcpy(rname,“");strcpy(rclass,”“);strcpy(rtel,”“);} //初始化 void set_rname(char *rn)//設(shè)置讀者姓名 {strcpy(rname,rn);} //將rn的字符復制給rname char * get_rname()//獲得讀者姓名 {return rname;} //返回rname的值 void set_rclass(char *rc)//設(shè)置班級 {strcpy(rclass,rc);} char *get_rclass() //獲得班級 {return rclass;} void set_rtel(char *rt) //設(shè)置電話 {strcpy(rtel,rt);} char *get_rtel() //獲得電話 {return rtel;} void copy(Reader m)//讀者Reader結(jié)構(gòu)體copy函數(shù) {strcpy(rname,m.get_rname());strcpy(rclass,m.get_rclass());strcpy(rtel,m.get_rtel());} };//*********讀者管理結(jié)構(gòu)體,實現(xiàn)對讀者用戶的管理********* class ReaderManage { Reader readers[50];//定義讀者結(jié)構(gòu)體數(shù)組對象,最多50位 int length; void readFile() //讀取讀者文件函數(shù) { ifstream fread;//定義輸入文件流對象fread length=0; //計數(shù) if(!fread) {cout<<”讀取磁盤文件失敗!“< fread.open(ReaderFile,ios::binary);//使文件流與文件關(guān)聯(lián),以二進制方式打開 int i=0; while((fread.read((char *)&readers[i],sizeof(Reader))))//計算并返回所占字節(jié)數(shù) i++; length=i; fread.close();//關(guān)閉磁盤文件 } void saveFile()//保存讀者文件 { ofstream fwrite; //定義輸出文件流對象fwrite if(!fwrite) {cout<<”文件保存失敗!n“;exit(1);} fwrite.open(ReaderFile,ios::binary);//使文件流與文件關(guān)聯(lián),以二進制方式打開 fwrite.write((char *)readers,length*sizeof(Reader));//計算并返回所占字節(jié)數(shù) fwrite.close();//關(guān)閉磁盤文件 } public: ReaderManage()//構(gòu)造函數(shù),讀取讀者文件 {readFile();} ~ReaderManage()//析構(gòu)函數(shù),保存讀者文件 {saveFile();} void add_reader(Reader r)//添加讀者用戶函數(shù) { if(length>=50) {cout<<”對不起,注冊人數(shù)已滿!n“;return;} readers[length].copy(r);//調(diào)用讀者結(jié)構(gòu)體copy函數(shù) length++;} int search(char *rn)//按姓名查找讀者函數(shù) { for(int i=0;i if(strcmp(readers[i].get_rname(),rn)==0)//判斷是否相等 return i; return-1; } bool revise(Reader reader,int i)//修改讀者資料函數(shù) { readers[i].copy(reader);//調(diào)用讀者結(jié)構(gòu)體cpoy函數(shù) return true;} void delete_reader(int index)//刪除讀者函數(shù) { for(int i=index;i readers[i].copy(readers[i+1]);//用后面的地址覆蓋前面的地址 length--;} bool log_reader(Reader r)//登錄時判斷讀者用戶是否存在函數(shù),相當于遍歷 { for(int i=0;i if(strcmp(readers[i].get_rname(),r.get_rname())==0) return true; return false; } void reg_reader()//注冊用戶函數(shù) { char n[10]; //姓名name char c[10]; //班級class char t[10]; //電話tel Reader reader; cout<<”nt請輸入您的姓名:“; cin>>n; cout<<”nt請輸入您的所在班級:“; cin>>c; cout<<”nt請輸入您的聯(lián)系電話:“; cin>>t; reader.set_rname(n);//調(diào)用讀者結(jié)構(gòu)體設(shè)置讀者姓名函數(shù) reader.set_rclass(c);//調(diào)用讀者結(jié)構(gòu)體設(shè)置讀者班級函數(shù) reader.set_rtel(t);//調(diào)用讀者結(jié)構(gòu)體設(shè)置聯(lián)系電話函數(shù) add_reader(reader);//調(diào)用讀者結(jié)構(gòu)體添加讀者函數(shù) cout<<”nt注冊成功!“;} void show_reader()//不帶參的顯示讀者信息函數(shù) { cout<<”n ☆☆☆☆☆☆☆☆☆☆☆☆讀★★者★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”姓名ttt班級ttt電話n“; for(int i=0;i { cout< cout<<”ttt“< cout<<”ttt“< } } void show_reader(int i)//帶參的顯示讀者信息函數(shù) { cout<<”n ☆☆☆☆☆☆☆☆☆☆☆☆讀★★者★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆nn“; cout<<”姓名ttt班級ttt電話n“; cout< cout<<”ttt“< cout<<”ttt“< } }; //********書籍結(jié)構(gòu)體,用于存放書籍基本信息******** class Book { private: char bnum[10]; //書號 char bname[20]; //書名 char bauthor[10]; //作者 char rname[10]; //借閱人 public: int tag; //狀態(tài)標記判斷指標(已借/在架)Book() //構(gòu)造函數(shù)初始化信息 {strcpy(bnum,”“);strcpy(bname,”“);strcpy(bauthor,”“);strcpy(rname,”“);tag=0;} void set_bnum(char *no) //設(shè)置書號 {strcpy(bnum,no);} //把字符串no中的字符復制到字符串bnum中 char *get_bnum() //獲得書號 { return bnum;} //返回值為bnum void set_bname(char *n) //設(shè)置書名 {strcpy(bname,n);} char *get_bname() //獲得書名 {return bname;} void set_bauthor(char *a) //設(shè)置作者 {strcpy(bauthor,a);} char * get_bauthor() //獲得作者姓名 {return bauthor;} void set_tag(int t) //狀態(tài)設(shè)置 {tag=t;} void set_rname(char *rn) //設(shè)置借閱人 {strcpy(rname,rn);} char *get_rname() //獲得借閱人姓名 {return rname;} void show_tag() //顯示圖書狀態(tài) { if(tag==1) {cout<<”已借“;} else {cout<<”在架“;} } void copy(Book m) //Book結(jié)構(gòu)體copy函數(shù) { strcpy(bnum,m.get_bnum()); //將獲得書號函數(shù)里的返回值里的字符復制到bnum strcpy(bname,m.get_bname()); strcpy(bauthor,m.get_bauthor()); tag=0; } };//**********書籍管理結(jié)構(gòu)體,實現(xiàn)管理書籍功能********** class BookManage { private: Book books[100]; //定義Book書籍結(jié)構(gòu)體數(shù)組對象,最大容量100本 int length; void saveFile() //保存書籍文件 { ofstream fwrite;//定義輸出文件流ofstream結(jié)構(gòu)體對象fwrite if(!fwrite) {cout<<”文件保存失敗!n“;exit(1); } fwrite.open(BookFile,ios::binary);//使文件流與文件建立關(guān)聯(lián),以二進制方式打開 fwrite.write((char *)books,length*sizeof(Book));//計算并返回所占字節(jié)數(shù) fwrite.close(); //關(guān)閉磁盤文件 } void readFile() //讀取書籍文件 { ifstream fread;//定義輸入文件流對象fread length=0; if(!fread) {cout<<”文件讀取失敗!“< Book temp; //定義書籍結(jié)構(gòu)體臨時對象temp int i=0; fread.open(BookFile ,ios::binary);//使文件流與文件建立關(guān)聯(lián),以二進制方式打開 while((fread.read((char *)&books[i],sizeof(Book)))) i++; //每讀完一次,指針后移一位,直到不能讀出正確結(jié)果為止 length=i; fread.close();} public: BookManage() //構(gòu)造函數(shù),讀取磁盤文件 { length=0; //從頭讀起,計數(shù),最大100 readFile(); //調(diào)用讀取文件函數(shù) } ~BookManage() //析構(gòu)函數(shù),保存磁盤文件 { saveFile(); //調(diào)用保存文件函數(shù) } bool add(Book book) //添加圖書資料 { if(length>=100) { cout<<”對不起,儲存已滿,您無法繼續(xù)添加!n“; return-1; } else { books[length].copy(book);//調(diào)用書籍結(jié)構(gòu)體copy函數(shù) length++; return(length-1); } } int bnu_search(char *bnu) //按書號查找書籍 { for(int i=0;i if(strcmp(books[i].get_bnum(),bnu)==0)//字符串比較,判斷是否相等 return i; return-1; } int bna_search(char *bna) //按書名查找書籍 { for(int i=0;i if(strcmp(books[i].get_bname(),bna)==0)//判斷 return i; return-1; } int bau_search(char *bau)//按作者查找書籍 { for(int i=0;i if(strcmp(books[i].get_bauthor(),bau)==0)//判斷 return i; return-1; } int rn_search(char *rn)//按借閱人查找書籍 { for(int i=0;i if(strcmp(books[i].get_rname(),rn)==0)//判斷 return i; return-1; } void revise(Book book,int i)//帶參的修改書籍函數(shù) {books[i].copy(book);} //調(diào)用Book結(jié)構(gòu)體copy函數(shù) void deleteBook(int index)//帶參的刪除書籍資料函數(shù) { for(int i=index;i books[i].copy(books[i+1]);//用后面的地址將當前的地址覆蓋 length--; } void show_book()//不帶參的顯示書籍函數(shù) { cout<<” ☆☆☆☆☆☆☆☆☆☆☆書★★籍★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”書號“; cout.width(10); cout<<”書名“; cout.width(10); cout<<”作者“; cout.width(17); cout<<”狀態(tài)“; cout.width(25); cout<<”借閱人n“; for(int i=0;i { cout< cout.width(10); cout< cout.width(10); cout< cout.width(20); books[i].show_tag(); cout.width(20); cout< } } void show_book(int i)//帶參的顯示書籍函數(shù) { cout<<” ☆☆☆☆☆☆☆☆☆☆☆書★★籍★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”書號“; cout.width(10); cout<<”書名“; cout.width(10); cout<<”作者“; cout.width(17); cout<<”狀態(tài)“; cout.width(25); cout<<”借閱人n“; cout< cout.width(10); cout< cout.width(10); cout< cout.width(20); books[i].show_tag(); cout.width(20); cout< } void br_book()//讀者借、還書功能函數(shù) { ReaderManage reader; int choi;//選擇 int a; //圖書狀態(tài)指標(1已借2在架) char sh[10];//需要還書的書號 char dz[10];//讀者姓名 cin>>sh; int index=bnu_search(sh);//定義一個變量等于查找到的書號 if(index>=0) { if(books[index].tag==1)//已借 a=1; if(books[index].tag==0)//在架 a=2; switch(a) { case 1: cout<<”nt該書目前狀態(tài)為<已借出>n“; cout<<”nt請選擇您需要的服務(wù):1:還書 0:返回n“; cin>>choi; cin.ignore();//清除以回車結(jié)束的輸入緩沖區(qū)的內(nèi)容,消除上一次輸入對下一次輸入的影響 if(choi!=1&&choi!=0) { cout<<”nt操作有誤,請重新選擇(0/1)!n“; return; } else if(choi==1) { cout<<”nt請輸入您的姓名:“; cin>>dz; cin.ignore(); int index1=reader.search(dz); if(index1==-1) { cout<<”nt對不起,系統(tǒng)無該讀者記錄,新用戶請先注冊!“; return; } else { strcpy(dz,”“);//將讀者姓名已空白代替 books[index].set_rname(dz);//借閱人一項變?yōu)榭瞻?/p> books[index].set_tag(0);//圖書狀態(tài)變?yōu)樵诩?/p> cout<<”nt還書成功!“< } }break; case 2: cout<<”nt該書目前狀態(tài)為<在館>n“; cout<<”nt請您需要的服務(wù):1:借書 0:返回n“; cin>>choi; cin.ignore(); if(choi!=1&&choi!=0) { cout<<”nt操作有誤,請重新選擇(0/1)!n“; return; } else if(choi==1) { cout<<”nt請輸入您的姓名:“; cin>>dz; int index1=reader.search(dz); if(index1==-1) { cout<<”nt對不起,系統(tǒng)無改讀者記錄,新用戶請先注冊!“; return; } else { books[index].set_rname(dz); books[index].set_tag(1); cout<<”nt借書成功!“< } }break; } } else { cout<<”nt對不起,系統(tǒng)無該書記錄!“;} } bool in(int i)//判斷圖書是否在架函數(shù) { if(books[i].tag==1) return false; return true; } };//**********菜單結(jié)構(gòu)體,實現(xiàn)界面引導********** class Menu { BookManage bm; //定義書籍管理結(jié)構(gòu)體對象bm ReaderManage rm; //定義讀者管理結(jié)構(gòu)體對象rm Reader r; //定義讀者結(jié)構(gòu)體對象r private: int choice; //菜單序號選擇 int key; //管理員密碼 public: void header() //頁眉 { system(”color fd“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 圖 書 借 閱 管 理 系 統(tǒng) ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“;} void log_menu() //主界面登錄菜單 { system(”color fd“); header(); cout<<”nttt< 請 選 擇 登 錄 身 份 >n“; cout<<”ntttt1: 管理員nntttt2: 讀 者nntttt0: 退 出nt您的選擇是: “;choice: cin>>choice; cin.ignore(); //清除以回車結(jié)束的輸入緩沖區(qū)的內(nèi)容,消除上一次輸入對下一次輸入的影響 switch(choice) { case 1: log_admin(); //管理員登錄,需密碼驗證 break; case 2: reader_lr(); //讀者登錄或注冊 break; case 0: exit(1); //退出系統(tǒng) break; default: cout<<”nt您的操作有誤,請重新選擇(0→2): “; goto choice; } } void admin_menu() //管理員管理菜單 { system(”cls“); system(”color f9“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 系★統(tǒng)★管★理★界★面 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 1: 添加新的圖書資料 2: 修改已有圖書資料 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 3: 刪除已有圖書資料 4: 查找已有圖書資料 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 5: 查看所有圖書資料 6: 修改讀者用戶信息 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 7: 刪除讀者用戶信息 8: 查看所有讀者信息 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 9: 返回系統(tǒng)登錄界面 0: 退出圖書管理系統(tǒng) ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”nt請選擇您需要的服務(wù)序號: “;choice: cin>>choice; cin.ignore(); switch(choice) { case 1: //添加圖書 addBook(); bm.~BookManage(); break; case 2: //修改圖書 reviseBook(); bm.~BookManage(); break; case 3: //刪除圖書 delBook(); bm.~BookManage(); break; case 4: //查找圖書 absearch_menu(); break; case 5: //查看全部圖書 bm.show_book(); cout<<”nt顯示完畢!“; system(”pause“); admin_menu(); break; case 6: //修改讀者 reviseReader(); rm.~ReaderManage(); break; case 7: //刪除讀者 delReader(); rm.~ReaderManage(); break; case 8: //查看所有讀者 rm.show_reader(); cout<<”nt顯示完畢!“; system(”pause“); admin_menu(); break; case 9: //返回系統(tǒng)登錄界面 system(”cls“); log_menu(); case 0: //退出系統(tǒng) exit(1); break; default: cout<<”nt您的操作有誤,請重新選擇(0→7): “; goto choice; } } void reader_menu() //讀者服務(wù)菜單 { system(”cls“); system(”color f9“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 讀★者★服★務(wù)★界★面 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 1: 借 閱 圖 書 2: 歸 還 圖 書 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 3: 查 找 圖 書 4: 借 閱 情 況 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 5: 返 上 一 級 0: 退 出 系 統(tǒng) ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”nt請選擇您需要的服務(wù)序號: “;choice: cin>>choice; cin.ignore(); switch(choice) { case 1: cout<<”nt請輸入您欲借閱的圖書書號: “; bm.br_book(); bm.~BookManage(); break; case 2: cout<<”nt請輸入您欲歸還的圖書書號: “; bm.br_book(); bm.~BookManage(); break; case 3: bsearch_menu(); break; case 4: rn_search(); break; case 5: system(”cls“); reader_lr(); break; case 0: exit(1); break; default: cout<<”nt您的操作有誤,請重新選擇(0→5): goto choice; } } void bsearch_menu() //讀者查找書籍菜單 { system(“color f2”); cout<<“ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n”;cout<<“ttt☆ ☆n”; cout<<“ttt☆ 書★籍★查★找★界★面 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 1: 按 書號查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 2: 按 書名查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 3: 按 作者查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 4: 返 回 上 級 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 0: 退 出 系 統(tǒng) ☆n”;cout<<“ttt☆ ☆n”; cout<<“ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n”; int bsc;//book search choice cout<<“nt請輸入您需要的服務(wù)序號: ”; cin>>bsc; cin.ignore(); switch(bsc){ case 1: bnu_search(); break; case 2: bna_search(); “; break; case 3: bau_search(); break; case 4: reader_menu(); break; case 5: exit(1); default: cout<<”nt操作有誤,請重新選擇<0→4>“; break; } } void absearch_menu() //管理員查找書籍菜單 { system(”color f2“); cout<<”ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 書★籍★查★找★界★面 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 1: 按 書號查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 2: 按 書名查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 3: 按 作者查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 4: 返 回 上 級 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 0: 退 出 系 統(tǒng) ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; int bsc;//book search choice cout<<”nt請輸入您需要的服務(wù)序號: “; cin>>bsc; cin.ignore(); switch(bsc) { case 1: bnu_search(); break; case 2: bna_search(); break; case 3: bau_search(); break; case 4: admin_menu(); break; case 5: exit(1); default: cout<<”nt操作有誤,請重新選擇<0→4>“; break; } } void reader_lr()//讀者登錄或注冊菜單 { system(”cls“); header(); system(”color f1“); cout<<”nttt< 讀 者 登 錄 界 面 >n“; cout<<”nttt 1: 登 錄t2: 注 冊nnttt 3: 返 回t0: 退 出nt您的選擇是: “; int rlc;//reader login choice choice: cin>>rlc; cin.ignore(); switch(rlc) { case 1: //已注冊讀者登錄 cout<<”nt請輸入您的姓名: “; char rn[10];//reader name cin>>rn; r.set_rname(rn); if(rm.log_reader(r)) { cout<<”nt登錄成功!“; system(”pause“); reader_menu(); } else cout<<”nt登錄失敗!新用戶請先注冊!“; system(”pause“); reader_lr(); break; case 2: //新用戶注冊 rm.reg_reader(); rm.~ReaderManage(); system(”pause“); reader_lr(); break; case 3: system(”cls“); log_menu(); case 0: exit(1); break; default: cout<<”nt您的操作有誤,請重新選擇(0→2): goto choice; } } void log_admin() //管理員登錄 { cout<<“nt請輸入管理員密碼:”; int key; cin>>key; if(key==14125) { cout<<“nt登錄成功!nnt”; system(“pause”); admin_menu(); //管理員操作菜單 } else {cout<<“nt登錄失敗!原因是密碼錯誤!n”; cout<<“nt請選擇 <1:返回上一級菜單 0:退出系統(tǒng)> cin>>choice; cin.ignore(); switch(choice) ”;“; { case 1: system(”cls“); log_menu(); break; case 0: exit(1); break; default: cout<<”nt操作有誤,請重新選擇(0/1)“; } } } void rn_search() //按書號查找函數(shù) { char rn[10];//reader name cout<<”nt請輸入您的姓名:“; cin>>rn; int index=bm.rn_search(rn); if(index>=0) bm.show_book(index); else cout<<”nt對不起,系統(tǒng)無您的借閱記錄!“; cout<<”nt“; system(”pause“); reader_menu(); } void bnu_search() //按書號查找函數(shù) { char bnu[10]; cout<<”nt請輸入您要查找的書號:“; cin>>bnu; int index=bm.bnu_search(bnu); if(index>=0) bm.show_book(index); else cout<<”nt對不起,系統(tǒng)無該書籍記錄!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void bna_search() //按書名查找函數(shù) { cout<<”nt請輸入您要查找的書名:“< char bna[20]; cin>>bna; int index=bm.bna_search(bna); if(index>=0) bm.show_book(index); else cout<<”nt對不起,系統(tǒng)無該書籍記錄!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void bau_search() //按作者查找函數(shù) { cout<<”nt請輸入您要查找的作者:“< char bau[10]; cin>>bau; int index=bm.bau_search(bau); if(index>=0) bm.show_book(index); else cout<<”nt對不起,系統(tǒng)無該書籍記錄!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void addBook() //新增書籍函數(shù) { char numb[10]; //書號 char nameb[20]; //書名 char authorb[10];//作者 Book book; //書籍結(jié)構(gòu)體對象book int tag1;input1:cout<<”nt請輸入新書書號:“; cin>>numb; int index=bm.bnu_search(numb); if(index==-1) { cout<<”nt系統(tǒng)目前尚無該書記錄,您可以繼續(xù)操作!n“; cout<<”nt請輸入新書書名:“; cin>>nameb; cout<<”nt請輸入新書作者:“; cin>>authorb; tag1=0; book.set_bnum(numb); book.set_bname(nameb); book.set_bauthor(authorb); book.set_tag(tag1); bm.add(book); cout<<”nt恭喜您!新書資料錄入成功!“; } else { cout<<”nt對不起,該書號紀錄已存在!請重新輸入!“; goto input1; } system(”pause“); admin_menu();} void reviseBook() //修改書籍函數(shù) { char numb[10]; char nameb[20]; char authorb[10]; Book book; int index=-1;input2: cout<<”nt請輸入您要修改書籍的書號:“; cin>>numb; index=bm.bnu_search(numb); if(index==-1) { cout<<”nt對不起,您輸入的書號不存在,請重新輸入!“< goto input2; return; } bool sta=bm.in(index);//判斷是否在館 if(sta) { cout<<”nt該書目前處于<在架>狀態(tài),您可以繼續(xù)操作!“; cout<<”nt請輸入更改后的書名:“; cin>>nameb; cout<<”nt請輸入更改后的作者:“; cin>>authorb; book.set_bnum(numb); book.set_bname(nameb); book.set_bauthor(authorb); bm.revise(book,index); cout<<”nt恭喜您!書籍資料修改成功!“;} else cout<<”nt該書已被借出,請于讀者歸還后再進行相關(guān)操作!“< system(”pause“); admin_menu(); } void delBook() //刪除書籍函數(shù) { char numb[10]; cout<<”nt請輸入您要刪除書籍的書號:“; cin>>numb; int index=bm.bnu_search(numb); if(index>=0) { cout<<”nt您確定要刪除該書記錄嗎(y/n) “; char y; cin>>y; if(y=='y'||y=='Y') { bm.deleteBook(index); cout<<”nt刪除成功!“; } else cout<<”nt刪除取消!“; } else cout<<”nt對不起,系統(tǒng)沒有該圖書記錄!“; system(”pause“); admin_menu(); } void reviseReader()//修改讀者用戶函數(shù) { char namer[10]; Reader reader;get1: cout<<”nt請輸入你要修改讀者用戶的姓名: “; cin>>namer; int index=rm.search(namer); if(index==-1) { cout<<”nt對不起,系統(tǒng)無改讀者記錄,重新輸入請按1,返回請按0: int a; cin>>a;get2: cin.ignore(); switch(a) { case 1: goto get1; break; case 0: system(“pause”); admin_menu(); break; default: cout<<“nt您的操作有誤,請重新選擇(0/1): ”; goto get2; } return; } “; else { char namer[10]; char classr[10]; char telr[10]; Reader reader; cout<<”nt請輸入更改后的讀者姓名:“; cin>>namer; cout<<”nt請輸入更改后的班級名稱:“; cin>>classr; cout<<”nt請輸入更改后的聯(lián)系電話:“; cin>>telr; reader.set_rname(namer); reader.set_rclass(classr); reader.set_rtel(telr); cout<<”nt是否真的修改該記錄(y/n?):“; char y; cin>>y; if(y=='y'||y=='Y') { rm.revise(reader,index); cout<<”nt修改成功!n“; } else cout<<”nt操作取消!n“; } system(”pause“); admin_menu(); } void delReader() //刪除讀者用戶函數(shù) { cout<<”nt請輸入您要刪除的讀者用戶的姓名:“< char namer[10]; cin>>namer; int index=rm.search(namer); if(index>=0) { cout<<”nt是否真的刪除該記錄(y/n?): “; char y; cin>>y; if(y=='y'||y=='Y') { rm.delete_reader(index); cout<<”nt刪除成功!n“; } else cout<<”nt操作取消!n“; } else cout<<”nt對不起,系統(tǒng)尚無該讀者記錄!“; system(”pause“); admin_menu(); } };//********主函數(shù)******** int main(){ system(”color fd“);Menu menu;//定義菜單結(jié)構(gòu)體對象menu cout<<”ttt 文計091-1 龐麗萍 200990514125 “;cout<<”ttt 當前日期:2011-6-22 星期三“;cout<<”ttt 當前時間:08:00 “;cout<<”nttt ★ 歡 “;cout<<”★ 迎 “; } cout<<”★ 進 “;cout<<”★ 入 ★nn";menu.log_menu();return 0;四.程序正確性驗證 1主頁面 2.管理員登陸頁面 3.圖書添加 五.課程設(shè)計過程中出現(xiàn)的問題、原因及解決方法 1.用戶登錄密碼時,不能使用暗碼來保護密碼。(未解決成功)2.每個界面都能退出到主頁面,而不是直接跳出系統(tǒng)。(以解決)3.書名字長太多影響書籍、作者、數(shù)量等之間的一一對應(yīng)關(guān)系。(為解決成功) 六.課程設(shè)計的主要收獲 通過這幾天學習設(shè)計圖書信息管理系統(tǒng),認識到一切看似簡單的事情只有自己動手做,明白了其中的原理才會更好的把它變成自己的東西。圖書管理系統(tǒng)主要用到了文件的輸入輸出,以及利用簡單的順序查找知識,加深了對數(shù)據(jù)結(jié)構(gòu)的理解與應(yīng)用。對于這次的課程設(shè)計,首先,許多知識不僅僅只是課本上的,需要我們自己去圖書館或網(wǎng)上收集資料。其次,編程過程終遇到各種錯誤,需要我們耐心分析,討論,最后得出正確結(jié)果。第三,程序無錯,進行調(diào)試,然后進行加工修改優(yōu)化。 七.對今后課程設(shè)計的建議 希望老師可以分小組做課程設(shè)計,題目可以相應(yīng)的增大難度。分組可以鍛煉團對合作能力,隊員可以相互討論解決問題,彼此能夠激發(fā)更多的思想,做出更完善的作品,同時也防止了互相拷貝的情況,讓每個同學都積極的參與到設(shè)計中,而不是坐享其成。 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告 課程名稱:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計 課設(shè)題目: 西文圖書管理系統(tǒng) 教師姓名: 郭 艷 本科生姓名: 王瑞林 本科生學號: 20121002932 班 號: 191124 日 期:2014年6月20日 題號:十 題目:西文圖書管理 1.需求分析 圖書管理系統(tǒng)對象有兩個,包括讀者和管理員。 讀者的需求:借書,還書,續(xù)借,查詢當前所借書籍還書截至日期,查詢借閱歷史,修改登陸密碼。其中借書可以根據(jù)書號和書名兩種方式查詢借閱。 管理員的需求:采編入庫,清除庫存,注冊讀者,刪除讀者,根據(jù)書號查詢書籍,修改管理員用戶名和密碼。 2.設(shè)計 2.1設(shè)計思想 (1)數(shù)據(jù)與操作特性: 有搜索,插入,刪除操作。而數(shù)據(jù)有:讀者信息,書籍信息,讀者借閱書籍歷史信息,書籍讀者借閱歷史信息,讀者當前所借書籍信息。(2)數(shù)據(jù)結(jié)構(gòu)設(shè)計: 數(shù)據(jù)的邏輯結(jié)構(gòu)有線性結(jié)構(gòu)和樹形結(jié)構(gòu)。 根據(jù)書號和書名建立兩個B-樹,便于讀者查詢借閱,其中關(guān)鍵字設(shè)置為書籍指針,便于找到書籍 后直接進行修改書籍信息。 讀者和書籍的信息從文件中讀取,由于會不斷注冊和刪除讀者以及新增刪除書籍,因此書籍和讀者的信息采用單鏈表存儲。 讀者的借閱歷史和書籍的讀者歷史,都采用數(shù)組的形式存儲,為了節(jié)省存儲空間,每個借閱歷史數(shù)組最大空間為15。超過15個借閱歷史,則刪除最早的借閱歷史。2.2設(shè)計表示(1)數(shù)據(jù)類型定義 typedef struct //日期結(jié)構(gòu)體類型 { int year;//記錄年 int month;//記錄月 int day;//記錄日 }Date;//記錄借閱者所借書籍的信息結(jié)構(gòu)體 typedef struct { char bookID[15];//書號 char name[15];//書名 char writer[15];//作者 Date bordate;//借閱時間 Date backdate;//還書時間 int flag;//是否續(xù)借,續(xù)借為1.否則為0 }BookHistory;//記錄借閱者當前所借書籍的信息結(jié)構(gòu)體 typedef struct { char bookID[15];//書號 char name[15];//書名 char writer[15];//作者 Date bordate;//借閱時間 Date lastdate;//最后還書期限 int flag;//是否續(xù)借,續(xù)借為1.否則為0 }BookRec;//記錄書籍被借閱的讀者記錄 typedef struct { char readerID[15];//記錄讀者的借閱證號 char readername[15];//讀者的名字 Date bor;//記錄讀者的借書日期 Date back;//記錄讀者的還書日期 int flag;//借閱者是否有續(xù)借跡象(flag取值0或者1)}ReaderHistory;//記錄讀者信息的結(jié)構(gòu)體類型(允許讀者同時借閱五本書,每本書支持續(xù)借一次)typedef struct { char readerID[12];//記錄讀者的借書證號,一般是學號 //記錄書的信息的結(jié)構(gòu)體類型 typedef struct { char bookID[15];//書號 char title[15];//記錄書名 char writer[15];//記錄著者 int currentnum;//書現(xiàn)存量 int totalnum;//書總存量 int bortimes;//被借的歷史總次數(shù) //B_LQueue *B_LQH; ReaderHistory RH[15];//借書者記錄,規(guī)定鏈式隊列的最大節(jié)點個數(shù)為15,來節(jié)省空間 char name[15];//讀者的名字 char password[16];//讀者登陸密碼 BookRec rec[5];//讀者現(xiàn)在所借書籍 int hn;//總借閱數(shù)量 //R_LQueue *R_LQH; BookHistory bh[15];//記錄讀者的借閱記錄,規(guī)定鏈式隊列的最大節(jié)點個數(shù)為15,來節(jié)省空間 int bn;//讀者現(xiàn)在所借書籍數(shù)量,最大數(shù)量為5本 }Reader;}Book;//根據(jù) 書名為關(guān)鍵字的B-樹的結(jié)構(gòu)體類型 typedef struct Namenode //根據(jù)書名為關(guān)鍵字建立的B樹 { typedef struct///根據(jù)書名建立的B樹的搜索結(jié)果 { //根據(jù)書號為關(guān)鍵字的B-樹的結(jié)構(gòu)體類型 typedef struct IDnode //根據(jù)書號為關(guān)鍵字建立的B樹 { typedef struct///根據(jù)書號建立的B樹的搜索結(jié)果 { //從文件中讀取書籍數(shù)據(jù)后存儲在單鏈表里 typedef struct BookNode { //從文件中讀取學生數(shù)據(jù)后存儲在單鏈表里 typedef struct ReaderNode { Book SLbook;struct BookNode *next;BTIDnode *pt;////指向找到的節(jié)點指針 int i;//所找關(guān)鍵字在節(jié)點里的位置 int tag;//查找成功值為1,查找失敗值為0 int n;//記錄結(jié)點中的關(guān)鍵字(即書號)個數(shù) Book *key[MAXM];//key[0...n-1],Maxsize個關(guān)鍵字(即書號)域 struct IDnode *chd[MAXM];//ptr[0...n],MAXM個指向子結(jié)點的指針域 BTNamenode *pt;////指向找到的節(jié)點指針 int i;//所找關(guān)鍵字在節(jié)點里的位置 int tag;//查找成功值為1,查找失敗值為0 int n;//記錄結(jié)點中的關(guān)鍵字(即書號)個數(shù) Book *key[MAXM];//key[0...n-1],Maxsize個關(guān)鍵字(即書名)域 struct Namenode *chd[MAXM];//ptr[0...n],MAXM個指向子結(jié)點的指針域 struct Namenode *par;//指向父結(jié)點的指針域 }BTNamenode;}NameResult;struct IDnode *par;//指向父結(jié)點的指針域 }BTIDnode;}IDResult;}BookSLNode;Reader SLreader;struct ReaderNode *next;}ReaderSLNode;2.3詳細設(shè)計 (1)登陸界面login():有管理員和讀者登陸,都必須輸入密碼和用戶名。 (2)管理員登陸adminer_login():管理員需輸入登錄名和密碼,為了安全登錄,將輸入密碼錯誤次數(shù)限制在5次。其中管理員密碼和用戶名以及初始用戶名和密碼從管理員文件里讀出賦值給全局變量。當輸入正確時,管理員功能界面函數(shù)admin_menu();當密碼輸入錯誤達6次以上,將調(diào)用鎖定系統(tǒng)函數(shù)lock_admin_menu(),將系統(tǒng)鎖定,下次進入系統(tǒng)時將不再顯示登陸界面,而是初始管理員登陸。 (3)管理員采編入庫insert_stock():輸入新書的信息,調(diào)用SearchBTree_ID()按照書號在B-樹搜索書籍,如果沒有找到,返回書籍插入的位置,然后調(diào)用插入函數(shù)InsertBTree_Name(),InsertBTree_ID(),分別將書籍按書名和書號插入到相應(yīng)的樹中,同時將書籍信息插入到書籍鏈表里調(diào)用ListInsert_Book();同時將全局變量書籍總數(shù)booknum加1。 (4)管理員清除庫存deletestock():根據(jù)書號書名搜索到書籍,在B-樹中刪除書籍,同時在書籍信息鏈表里刪除。并將書籍總數(shù)booknum減1。 (5)管理員讀者模塊adminer_reader():有刪除讀者和注冊讀者兩個功能,刪除讀者,按讀者的ID查找到,在讀者信息鏈表里刪除讀者,讀者總數(shù)readernum減1;注冊讀者,初始密碼為讀者ID后6位,同時讀者總數(shù)readernum加1。 (6)管理員修改用戶名和密碼adminer_change_password():連續(xù)兩次輸入新密碼,兩次結(jié)果一樣,修改成功。 (7)學生登陸student_login():輸入密碼成功,調(diào)用 stu_menu()功能界面。(8)學生借書borrow():有兩種搜索所借書籍的方式,按書名搜索,按書號搜索,使用相應(yīng)的B-樹搜索功能。借書成功后,將書籍信息寫到讀者當前所借書籍里面。并將書籍當前存量減1.(9)學生還書back():進入還書界面,將顯示出讀者當前所借書籍,讓讀者選擇歸還書籍。歸還后將書籍從讀者當前所借書籍里刪除,此書當前存量加1,并將書籍信息寫到讀者借閱歷史里面。 (10)學生續(xù)借renew():顯示當前所借書籍信息,讀者選擇續(xù)借書目,當書籍信息的續(xù)借標志為0時可以續(xù)借,否則 不能續(xù)借,續(xù)借成功,將對應(yīng)的讀者當前所借書籍的續(xù)借標志置為1.(11)學生查詢最后還書期限deadline():進入之后顯示當前所借書籍信息,里面包含最后還書期限。 (12)學生查詢借閱歷史history():顯示讀者信息里面的借閱歷史。 (13)學生修改密碼change_reader_password():兩次新密碼輸入一致,修改成功。(14)鎖定系統(tǒng)admin_lock(),鎖定系統(tǒng)后登陸lock_admin_menu():全局變量m_lock,當其值為1時解鎖,值為0時鎖定。 (15)建立讀者書籍鏈表readreader(),readbook():首先從文件中讀取讀者總數(shù),采用for循環(huán),將每個讀者信息寫到鏈表里,在循環(huán)中,讀取讀者的ID、姓名、密碼,然后讀取讀者當前所借書籍,采用for循環(huán),將所借書籍信息寫到數(shù)組里面,依次讀取所借書籍信息。之后讀取讀者歷史所借書籍數(shù)量,當數(shù)量大于15時,使用for循環(huán),循環(huán)15次,依次讀取書籍信息;如果 數(shù)量小于等于 15,采用for循環(huán),循環(huán)當前借閱歷史書籍數(shù)量次,將書籍信息寫道數(shù)組中。然后將每個讀者插入到鏈表里。書籍鏈表類似讀者鏈表的建立。 (16)B-樹的搜索插入刪除功能(以按書名建立的B-樹為例);搜索,SearchBTree_ID(),搜索成功返回搜索到的位置,搜索失敗,返回插入的位置。Search_Name()函數(shù)將在當前節(jié)點搜索到關(guān)鍵字的位置。 插入,InsertBTree_Name(),如果為空,調(diào)用NewRoot_name()函數(shù),建立根節(jié)點。如果不為空,將調(diào)用Insert_Name()將插入到節(jié)點里,判斷是否大于最大關(guān)鍵字個數(shù),如果大于,調(diào)用Split_Name()進行分裂。刪除,并非自己完成,參考網(wǎng)上代碼。 (16)建立B-樹newBT():按書名建立,使用B樹搜索功能,沒有找到,將根據(jù)返回的位置進行插入。按書號的類似。 (17)打印文件printftxt():分別將書籍和讀者 信息寫到文件里,同時將管理員信息也寫道文件中。在每個退出系統(tǒng)的接口中都進行調(diào)用此函數(shù),保證文件不丟失,同時更新文件信息。 3.調(diào)試分析 在進行調(diào)試時,有很多內(nèi)存讀寫錯誤,問題的根本原因是在進行結(jié)構(gòu)體賦值前,沒有將結(jié)構(gòu)體里面包含的結(jié)構(gòu)體或者數(shù)組鏈表進行初始化,導致問題十分嚴重普遍。 4.用戶手冊 首先登陸時有兩種登陸:讀者和管理員。然后管理員登陸功能有采編入庫,清除庫存,讀者模塊,書籍查詢,修改密碼和用戶名。讀者登陸有借書,還書,續(xù)借,修改密碼,查詢借閱歷史,查詢截至日期。 管理員登陸用戶名:123456,密碼:123456 管理員初始用戶名:20121002932,初始密碼:167350 讀者的ID和密碼請到reader.txt文件中查詢,文件格式見下面說明。文件的格式: 1.reader.txt: 其中第一行的數(shù)字“4”為當前讀者總數(shù),第二行為: ID 名字 密碼 第三行的數(shù)字”0“為當前所借書籍數(shù)量,之后為所借書籍信息: 書號 名稱 作者 借閱時間年 月 日 最后還書日期年 月 日 是否續(xù)借 第三行數(shù)字 “0”為歷史所借書籍數(shù)量,之后為所借書籍信息: 書號 名稱 作者 借閱時間年 月 日 還書日期年 月 日 是否續(xù)借 2.book.txt: 第一行數(shù)字”4“為當前書籍總數(shù) 第二行為書籍信息: 書號 書名 作者 現(xiàn)存量 總存量 第三行數(shù)字”0“為讀者借閱歷史,以《飛鳥集》為例: ID 姓名 借閱時間年 月 日 還書時間年 月 日 是否續(xù)借 20121002932 王瑞林 114 17 5 17 1 3.a(chǎn)dminer.txt: 第一行:管理員名稱; 第二行:管理員登陸密碼; 第三行:管理員初始用戶名; 第四行:管理員初始密碼; 第五行:鎖定系統(tǒng)標志,此時為未鎖定狀態(tài)。 5.測試數(shù)據(jù)及測試結(jié)果 初始登陸界面: 管理員登陸界面: 采編入庫: 清除庫存: 讀者模塊: 刪除讀者: 此時刪除讀者后,讀者文件中應(yīng)該不存在該讀者。書籍查詢: 修改用戶名和密碼: 修改用戶名: 修改密碼: 修改用戶名和密碼后,退出系統(tǒng)后,查看adminer.txt文件,第一行和第二行為用戶名和密碼,將改變?yōu)?567890。讀者登陸: 讀者借書: 當讀者借書成功之后退出系統(tǒng),在reader.txt文件中對應(yīng)讀者的ID信息的縮進的第二級為讀者當前所借書籍數(shù)量和所借書籍信息,在此之后可以看到讀者現(xiàn)在所借書籍信息 讀者還書: 讀者還書后,在reader.txt文件中,縮進的第三級為讀者歷史借閱書籍數(shù)量和書籍信息,此時應(yīng)該看到剛才還書的信息。 讀者續(xù)借: 當讀者還書成功后,對應(yīng)的當前所借書籍的flag值為1.查詢借閱歷史: 查詢截至日期: 修改登錄密碼: 當修改成功之后,reader.txt文件中對應(yīng)讀者的信息密碼修改為當前密碼。 6.致謝 感謝郭老師的指導,讓我們在實踐中提高了合理設(shè)計數(shù)據(jù)結(jié)構(gòu)的能力,鞏固了課堂所學。同時感謝王鑫學姐,幫助我們調(diào)試程序,并傳輸經(jīng)驗。 7.參考文獻 《數(shù)據(jù)結(jié)構(gòu)—使用C語言》第四版 朱站立編著 《C程序設(shè)計》第四版 譚浩強編著 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 圖書管理系統(tǒng) 工程管理 121279044 伍楊 目錄一、二、三、題目要求...................................................................2 總體設(shè)計...................................................................2 編碼實現(xiàn)...................................................................3 1)定義圖書結(jié)構(gòu)體.......................................................3 2)登記操作...............................................................4 3)查看操作...............................................................8 4)刪除操作.............................................................11 5)Main函數(shù)...........................................................20四、五、六、調(diào)試與測試..............................................................26 五心得體會..............................................................28 用戶手冊.................................................................28 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 一、題目要求 1)目的要求 本課程設(shè)計任務(wù)的目的是要求學生按照分析、設(shè)計、編碼、調(diào)試和測試的軟件開發(fā)過程獨立完成管理系統(tǒng)設(shè)計,以及C語言算法的掌握,并能最終實現(xiàn)本系統(tǒng)的功能要求,通過這個程序可以學習到以前調(diào)試短程序沒有的的經(jīng)驗。2)題目要求 實現(xiàn)圖書管理信息系統(tǒng)的設(shè)計。要求實現(xiàn)圖書添加、顯示全部圖書、查詢、借閱和歸還。主要考查利用文件的操作! 二、總體設(shè)計 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 三、編碼實現(xiàn) 1)定義圖書結(jié)構(gòu)體 struct book{ char bookname[20]; //書名 int NO; //書編號 char type[20]; //類型 int date; //到書日期 };struct person{ char name[10]; //姓名 char classes[20]; //班級 int number; //學號 char telephone[12]; //聯(lián)系電話 int NO; //書編號 char bookname[20]; //書名 int borrowdate; //借書日期 int returndate; //還書日期 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 2)登記操作 void new_book(){ FILE *fp;struct book b;//登記新書 int i,j; printf(“請朱老師輸入此次收到的書本總數(shù):”);if((fp=fopen(“shuku.txt”,“a”))==NULL){ printf(“File open error!n”);exit(0);} scanf(“%d”,&i); for(j=0;j printf(“請朱老師輸入書名:”);scanf(“%s”,b.bookname);fprintf(fp,“%s”,b.bookname);printf(“請朱老師輸入書編號:”);scanf(“%d”,&b.NO);fprintf(fp,“ %d”,b.NO);printf(“請朱老師輸入類型:”);scanf(“%s”,b.type); 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 } } fprintf(fp,“ %s”,b.type);printf(“請朱老師輸入到書日期:”);scanf(“%d”,&b.date);fprintf(fp,“ %d”,b.date);if(fclose(fp)){ } printf(“Can not close the file!n”);exit(0);void new_person() { FILE *fp;struct person p;char choice; //登記借書 if((fp=fopen(“jieshujilu.txt”,“a”))==NULL){ printf(“File open error!n”);exit(0);} 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 printf(“請朱老師輸入借書人姓名:”);scanf(“%s”,p.name);fprintf(fp,“%s”,p.name);printf(“請朱老師輸入借書人班級:”);scanf(“%s”,p.classes);fprintf(fp,“ %s”,p.classes);printf(“請朱老師輸入借書人學號:”);scanf(“%d”,&p.number);fprintf(fp,“ %d”,p.number);printf(“請朱老師輸入借書人聯(lián)系電話:”);scanf(“%s”,p.telephone);fprintf(fp,“ %s”,p.telephone);printf(“請朱老師輸入書編號:”);scanf(“%d”,&p.NO);fprintf(fp,“ %d”,p.NO);printf(“請朱老師輸入書名:”);scanf(“%s”,p.bookname);fprintf(fp,“ %s”,p.bookname);printf(“請朱老師輸入借書日期:”);scanf(“%d”,&p.borrowdate);fprintf(fp,“ %d”,p.borrowdate); 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 printf(“請朱老師輸入還書日期:”);scanf(“%d”,&p.returndate);fprintf(fp,“ %d”,p.returndate);printf(“nt您想繼續(xù)嗎?(y/n)”);scanf(“ %c”,&choice);if(choice=='Y'||choice=='y'){ } system(“cls”);new_person();if(fclose(fp)){ } printf(“Can not close the file!n”);exit(0);}實現(xiàn)程序?qū)ξ募淖x取 void Read(){ int i=0;int j=0;ifstream in(“Libra.txt”,ios::out);in>>i; 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 nt; } all=i;if(i>0&&i<=Max){ in>>data[j].id>>data[j].name>>data[j].type>>data[j].status>>data[j].coufor(j=1;j<=i;j++){ } } in.close(); 3)查看操作 v void see_book(){ FILE *fp;long NO;char bookname[20];char type[20];long date;//查看書庫記錄 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 } if((fp=fopen(“shuku.txt”,“r”))==NULL){ } printf(“File open error!n”);exit(0);while(!feof(fp)){ fscanf(fp,“%s%ld%s%ld”,bookname,&NO,type,&date);printf(“%-10s %-10ld %-10s %ldn”,bookname,NO,type,date);};if(fclose(fp)){ } printf(“Can not close the file!n”);exit(0);void see_person(){ //查看所有借書記錄 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 FILE *fp;char name[10]; char classes[20]; int number;char telephone[20]; int NO; char bookname[20]; int borrowdate; int returndate; fscanf(fp,“%s %s %ld %s %ld %s %ld %ld”,name,classes,&number,telephonwhile(!feof(fp)){ if((fp=fopen(“jieshujilu.txt”,“r”))==NULL){ } printf(“File open error!n”);exit(0);e,&NO,bookname,&borrowdate,&returndate);printf(“%-5s %-5s %ld %-5s %ld %-5s %ld %ldn”,name,classes,number,telephone,NO,bookname,borrowdate,returndate); 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 } };if(fclose(fp)){ } printf(“Can not close the file!n”);exit(0); 4)刪除操作 void delete_books() { int number;void deletebooks(); printf(“請輸入您要刪除的書編號:”);scanf(“%d”,&number);FILE *fp;struct book b; //刪除舊書 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 if((fp=fopen(“shuku.txt”,“r”))==NULL){ } printf(“不能打開此文件!n”);exit(0);while(!feof(fp)){ fscanf(fp,“%s %d %s %d”,b.bookname,&b.NO,b.type,&b.date); } if(b.NO==number){ } printf(“nnt***************圖書信息*******************n”);printf(“nt圖書書名:%25s”,b.bookname);printf(“nt----------”);printf(“nt圖書編號:%25d”,b.NO);printf(“nt----------”);printf(“nt圖書類型:%23s”,b.type);printf(“nt----------”);printf(“nt到書日期:%25d”,b.date);printf(“nt----------”); deletebooks(); 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 } void deletebooks(){ while(!feof(fp)){ fscanf(fp,“%s %d %s %d”,b.bookname,&b.NO,b.type,&b.date);if((fp=fopen(“shuku.txt”,“r”))==NULL){ } if((fp1=fopen(“tempshuku.txt”,“w”))==NULL){ //建立一個臨時文件 } printf(“不能打開此文件!n”);exit(0);printf(“不能打開此文件!n”);exit(0);printf(“nn確認刪除?請再次輸入書編號:”);scanf(“%d”,&number);FILE *fp,*fp1,*fp2,*fp3;int number;struct book b; 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 } if(b.NO==number)continue;else fprintf(fp1,“%s %d %s %d”,b.bookname,b.NO,b.type,b.date);fclose(fp);fclose(fp1);if((fp2=fopen(“tempshuku.txt”,“r”))==NULL){ } if((fp3=fopen(“shuku.txt”,“w”))==NULL){ //清空書庫 } while(!feof(fp2)){ //將臨時文件的內(nèi)容寫人源文件 } fscanf(fp2,“%s %d %s %d”,b.bookname,&b.NO,b.type,&b.date);fprintf(fp3,“%s %d %s %d”,b.bookname,b.NO,b.type,b.date);printf(“不能打開此文件!n”);exit(0);printf(“不能打開此文件!n”);exit(0); 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 } void delete_returnbook(){ if((fp=fopen(“jieshujilu.txt”,“r”))==NULL){ } printf(“不能打開此文件!n”);exit(0);printf(“n請輸入所還書本的書編號:”);scanf(“%d”,&numbers);FILE *fp;int numbers;struct person p;void deletereturnbook();char choice;printf(“n 刪除成功!n”);fclose(fp2);fclose(fp3); //刪除借書記錄 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 while(!feof(fp)){ fscanf(fp,“%s %s %ld %s %ld %s %ld %ld”,p.name,p.classes,&p.number,p.telephone,&p.NO,p.bookname,&p.borrowdate,&p.returndate); if(p.NO==numbers){ printf(“nt***************圖書信息*******************n”);printf(“nt借書人姓名:%20s”,p.name);printf(“nt----------”);printf(“nt借書人班級:%20s”,p.classes);printf(“nt----------”);printf(“nt借書人學號:%20d”,p.number);printf(“nt----------”);printf(“nt借書人聯(lián)系電話:%20s”,p.telephone);printf(“nt----------”);printf(“nt圖書編號:%24d”,p.NO);printf(“nt----------”);printf(“nt圖書名稱:%23s”,p.bookname);printf(“nt----------”);printf(“nt借書日期:%25d”,p.borrowdate);printf(“nt----------”);printf(“nt還書日期:%25d”,p.returndate); 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 } } } printf(“nt----------”); deletereturnbook(); printf(“nt您想繼續(xù)嗎?(y/n)”);scanf(“ %c”,&choice);if(choice=='Y'||choice=='y'){ } system(“cls”);delete_returnbook();fclose(fp);void deletereturnbook(){ FILE *fp,*fp1,*fp2,*fp3;struct person p; int numbers;printf(“nn確認刪除?請再次輸入書編號:”); 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 scanf(“%d”,&numbers);if((fp=fopen(“jieshujilu.txt”,“r”))==NULL){ } if((fp1=fopen(“tempbook.txt”,“w”))==NULL){ } printf(“不能打開此文件!n”);exit(0);printf(“不能打開此文件!n”);exit(0);while(!feof(fp)){ fscanf(fp,“%s %s %d %s %d %s %d %d”,p.name,p.classes,&p.number,p.telephone,&p.NO,p.bookname,&p.borrowdate,&p.returndate); if(p.NO==numbers)continue;else fprintf(fp1,“%s %s %d %s %d %s %d %d”,p.name,p.classes,p.number,p.telephone,p.NO,p.bookname,p.borrowdat 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 e,p.returndate); fscanf(fp2,“%s %s %d %s %d %s %d %d”,p.name,p.classes,while(!feof(fp2)){ //將臨時文件寫人源文件 if((fp2=fopen(“tempbook.txt”,“r”))==NULL){ } if((fp3=fopen(“jieshujilu.txt”,“w”))==NULL){ } printf(“不能打開此文件!n”);exit(0);printf(“不能打開此文件!n”);exit(0);fclose(fp);fclose(fp1);} &p.number,p.telephone,&p.NO,p.bookname,&p.borrowdate,&p.returndate); fprintf(fp3,“%s %s %d %s %d %s %d %d”,p.name,p.數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 classes,p.number,p.telephone,p.NO,p.bookname,p.borrowdate,p.returndate); } printf(“n 刪除成功!n”);fclose(fp2);fclose(fp3);} 5)Main函數(shù) int main(void){ do{ printf(“nnn 圖書館管理系統(tǒng)na”);printf(“ *******************************************************n”);int choice;char choice2;struct book;struct person; 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 printf(“ ***朱老師您好吖********功能選項: 登記******請按1,******n”);printf(“ ******************************* 查看/查詢*請按2 ******n”);printf(“ ******************************* 刪除***** 請按3 ******n”);printf(“ ******************************* 退出***** 請按0 ******n”);printf(“ *******************************************************nnn”);printf(“ 請選擇功能:”);scanf(“%d”,&choice);switch(choice){ case 1: printf(“ 登記選項:新書登記請按1,借書登記請按2,返回請按3n”);printf(“請選擇:”);scanf(“%d”,&choice);switch(choice){ case 1: system(“cls”); //清屏 printf(“新書資料登記:nn”);new_book(); //新書登記 printf(“登記完畢!n”);printf(“n”);scanf(“ %c”,&choice2);system(“cls”);break; 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 case 2: system(“cls”);printf(“借書資料登記:nn”);new_person(); //借書登記 printf(“n press anykey ”);scanf(“ %c”,&choice2);system(“cls”);break;case 3: } break;system(“cls”);break; case 2: printf(“ 查看/查詢選項:書庫查看請按1,總借書記錄查看請按2,到期記錄查詢請按3,返回請按4n”); printf(“請選擇:”);scanf(“%d”,&choice);switch(choice){ case 1: system(“cls”);printf(“歡迎朱老師進入書庫!nn”); 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 printf(“書名 書編號 類型 到書日期n”);printf(“-----------n”);see_book(); //書庫顯示 printf(“n press anykey ”);scanf(“ %c”,&choice2);system(“cls”);break;case 2: system(“cls”);printf(“歡迎朱老師進入借書記錄!nn”);printf(“姓名 班級 學號 聯(lián)系電話 書編號 書名 借書日期 到書日期n”); printf(“-------------------------n”);see_person(); //借書記錄顯示 printf(“n press anykey ”);scanf(“ %c”,&choice2);system(“cls”);break;case 3: system(“cls”);search_person(); //顯示符合記錄 printf(“n press anykey ”); 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 scanf(“ %c”,&choice2);system(“cls”);break;case 4: } break;system(“cls”);break;case 3: printf(“ 刪除選項:舊書刪除請按1,借書記錄刪除請按2,返回請按3n”); printf(“請選擇:”);scanf(“%d”,&choice);switch(choice){ case 1: system(“cls”);delete_books(); //刪除ing printf(“n press anykey ”);scanf(“ %c”,&choice2);system(“cls”);break;case 2: 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 } system(“cls”);delete_returnbook(); //刪除ing printf(“n press anykey ”);scanf(“ %c”,&choice2);system(“cls”);break;case 3: } break;system(“cls”);break;case 0: } system(“cls”);}while(choice!= 0);return 0; 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 四、調(diào)試與測試 主菜單 登記 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊 查看 刪除 生成的文件內(nèi)信息 數(shù)據(jù)結(jié)構(gòu)大作業(yè) 121279044 伍楊五、五心得體會 經(jīng)過這次大作業(yè),我覺得代碼的編寫,最主要的的是編程思想,語言其實不是太重要,思路最重要! 六、用戶手冊 程序執(zhí)行文件為 lib sys.exe,打開執(zhí)行文件后按提示操作即可 停車場管理系統(tǒng) ——數(shù)據(jù)結(jié)構(gòu)課程設(shè)計程序設(shè)計書 小組成員: 彭路 20131344031 崔琦 20131344028 徐佳 20131344027 范福龍 20121344024 班級 : 13軟件工程1班 時間:2014.12.22 目錄 一、程序設(shè)計目標 二、問題描述 三、需求分析 四、概要設(shè)計 五、詳細設(shè)計 六、源程序清單 七、軟件說明書 八、測試報告 九、課程設(shè)計總結(jié) 一、程序設(shè)計目標 本管理程序由c/c++語言完成,實現(xiàn)了對停車場收費問題的處理。本程序保證了程序的健壯性和操作性,在閱讀過使用說明書之后可以輕松使用。本管理系統(tǒng)假設(shè)車輛在停車場時一直有人在駕駛,或者說停車場的每塊停車位均可智能移動。并假設(shè)車輛進出場耗時不計,且時間均為整數(shù)類型。最后自動或者人工完成收費。 二、問題描述 設(shè)停車場內(nèi)只有一個可停放n輛汽車的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內(nèi)按車輛到達時間的先后順序,依次由北向南排列(大門在最南端,最先到達的第一輛車停放在車場的最北端),若車場內(nèi)已停滿n輛汽車,則后來的汽車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當停車場內(nèi)某輛車要離開時,在它之后開入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其它車輛再按原次序進入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費用。試為停車場編制按上述要求進行管理的模擬程序。 三、需求分析 根據(jù)問題描述,可把本停車場抽象成一個棧存儲類型s1,需要輸入最大停車容量n。每當輸入’A’時即為有車輛申請進入停車場操作,此時需要判斷停車場是否有空位,如果有空位,那么這輛車可以進入停車場,即為執(zhí)行一次壓棧操作(push),并記錄進入停車場的時間t1,并輸出位置p1;如果停車場沒有空位,那么這輛車在門外便道等候,并輸出位置p2。根據(jù)問題描述,可以把此門外便道抽象成一個隊列存儲類型q,而每有一輛車進入門外便道,即相當于進行一次插入隊列操作(push)。每當輸入’D’時即為有車輛申請離開停車場操作,此時需要判斷該車輛在停車場的位置。如果該車位于停車場最外側(cè)即相當于棧頂,那么該車可以直接批準離開并根據(jù)輸入的離開時間t2計算出停車時間t2-t1,根據(jù)該車本次停車時間完成收費后即可成功駛出停車場,即相當于成功彈出棧頂元素(pop);如果該車沒有位于停車場最外側(cè),事實上,這也是大多數(shù)的情況,那么需要將該車外側(cè)的車依次(即為擋路的車)移動進一個臨時停車場,根據(jù)問題描述,可以將該臨時停車場抽象成另一個棧存儲類型s2,那么此次移動操作相當于將棧中某元素以上的元素依次壓入另一個棧(push)。當申請離開的車駛出停車場后,在臨時停車場的車輛依次進入停車場,此操作相當于將棧s2內(nèi)元素依次彈出棧(pop)并壓入棧s1(push)。此時判斷門外便道上有無等待進入停車場的車輛,如果有的話,門外便道上第一輛車可以進入停車場,并記錄進入時間t1,此次操作相當于取出隊列q的隊首元素并將其壓入棧s1中。而輸入’E’時,即退出系統(tǒng)。至此,所有分析結(jié)束。 四、概要設(shè)計 根據(jù)需求分析,解決此問題需要構(gòu)建一個Cars類型的結(jié)構(gòu)體,構(gòu)建一個CarNode類型的節(jié)點結(jié)構(gòu)體以構(gòu)建SQueue類型的隊列結(jié)構(gòu)體,并需要構(gòu)建一個SQstack類型的棧結(jié)構(gòu)體。接下來,分別定義隊列和棧的各項基本操作函數(shù)。最后,完成菜單函數(shù)以實現(xiàn)各項操作。 五、詳細設(shè)計 本程序定義了三個頭文件,manager_cars.h、manager_stack.h、manager_queue.h。分別實現(xiàn)了Cars類型的結(jié)構(gòu)體、SQueue類型的隊列結(jié)構(gòu)體、SQstack類型的棧結(jié)構(gòu)體以及隊列的相關(guān)操作函數(shù)和棧的相關(guān)操作函數(shù)。具體如下: 1、manager_cars.h sq->lastCar=car;sq->firstCar->nextCar=NULL;sq->length=0;} //進入隊列操作 void enterSQueue(SQueue *sq,int num,int t){ CarNode *car=(CarNode *)malloc(sizeof(CarNode));car->headCar.condition='D';car->headCar.number=num;car->headCar.time=t;car->headCar.position=2; car->nextCar=NULL;sq->lastCar->nextCar=car;sq->lastCar=car;sq->length++;} //出隊列操作 void exceedSQueue(SQueue *sq){ if(sq->firstCar==sq->lastCar) return;CarNode *car=(CarNode *)malloc(sizeof(CarNode));car=sq->firstCar->nextCar;sq->firstCar->nextCar=car->nextCar;sq->length--;if(sq->lastCar==car) sq->lastCar=sq->firstCar;free(car); } //檢測隊列存在 int SQueueEmpty(SQueue sq){ if(sq.firstCar==sq.lastCar) return 1;else return 0;} //獲取隊首元素 void getSQueue(SQueue sq,Cars *e){ if(sq.firstCar==sq.lastCar) return;*e=sq.firstCar->nextCar->headCar;S.base;} extern int GetTop(SQstack S,Cars *e)//若棧不為空,則用e返回S的棧頂元素,并返回OK;否則返回ERROR { if(S.top == S.base)return 0; *e = *(S.top-1); return 1; } extern int Push(SQstack*S,Cars e)//插入元素e為新的棧頂元素 { if(S->top cout<<“請正確輸入Y或N:”< scanf(“%c”,&flag); getchar();} while(flag=='Y'){ flag='C'; Cars car; SQstack park;//定義棧并初始化 InitStack(&park); SQueue street;//定義隊列并初始化 setSQueue(&street); cout<<“請輸入本停車場最多可提供的車位數(shù):”; scanf(“%d”,&maxNum); getchar(); cout<<“請輸入每小時停車費:”; cin>>Pprice; cout< cout<<“請輸入到達(A)/離開(D)信息,車牌號,時間(格式為A 1 5):”; cin>>car.condition>>car.number>>car.time; //scanf(“%c %d %d”,&car.condition,&car.number,&car.time); //getchar(); while(car.condition!='E'&&car.number!=0&&car.time!=0) { switch(car.condition) { case 'A': { enterPark(car,park,street); break; } case 'D': { int lasttime; lasttime=outOfPark(car,park,street,car.number,car.time); cout< cout<<“此車在停車場停留了”< } default :cout<<“請輸入正確的格式!”< } cin>>car.condition>>car.number>>car.time; //scanf(“%c %d %d”,&car.condition,&car.number,&car.time); Cars headCar;struct CarNode *nextCar;}CarNode; typedef struct { CarNode *firstCar;CarNode *lastCar; int length;}SQueue;//建隊列鏈表 void setSQueue(SQueue *sq){ CarNode *car=(CarNode *)malloc(sizeof(CarNode));sq->firstCar=car;sq->lastCar=car;sq->firstCar->nextCar=NULL;sq->length=0;} //進入隊列操作 void enterSQueue(SQueue *sq,int num,int t){ CarNode *car=(CarNode *)malloc(sizeof(CarNode));car->headCar.condition='D';car->headCar.number=num;car->headCar.time=t;car->headCar.position=2; car->nextCar=NULL;sq->lastCar->nextCar=car;sq->lastCar=car;sq->length++;} //出隊列操作 void exceedSQueue(SQueue *sq){ if(sq->firstCar==sq->lastCar) return;CarNode *car=(CarNode *)malloc(sizeof(CarNode));car=sq->firstCar->nextCar;sq->firstCar->nextCar=car->nextCar;sq->length--;if(sq->lastCar==car) sq->lastCar=sq->firstCar;free(car); } //檢測隊列存在 int SQueueEmpty(SQueue sq){ if(sq.firstCar==sq.lastCar) return 1;else return 0;} //隊首元素 void getSQueue(SQueue sq,Cars *e){ if(sq.firstCar==sq.lastCar) return;*e=sq.firstCar->nextCar->headCar;} //隊列長度 int SQueueLength(SQueue sq){ int len=0;if(sq.firstCar!=sq.lastCar)len=sq.length;return len;} #endif manager_stack.h #include #ifndef manager_stack_h #define manager_stack_h #define STACK_INIT_SIZE 100 //棧的存儲空間初始分配量 #define STACKINCREMENT 10 //棧的存儲空間分配增量 typedef struct SQstack //棧的結(jié)構(gòu)體 { Cars * base;Cars * top;int stacksize;S.base;} extern int GetTop(SQstack S,Cars *e)//若棧不為空,則用e返回S的棧頂元素,并返回OK;否則返回ERROR { if(S.top == S.base)return 0; *e = *(S.top-1); return 1; } extern int Push(SQstack*S,Cars e)//插入元素e為新的棧頂元素 { if(S->top-S->base >= S->stacksize) { S->base =(Cars *)realloc(S->base,(S->stacksize + STACKINCREMENT)*sizeof(Cars)); if(!S->base)return 0; S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } *S->top++ = e; return 1; } extern int Pop(SQstack *S,Cars *e)//若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK,否則返回ERROR { if(S->top == S->base)return 0; *e = *--S->top; return 1; } #endif 七、軟件說明書 1、打開系統(tǒng),輸入Y進入管理系統(tǒng)。 2、接下來按提示輸入停車場的可供使用的車位數(shù)。 3、按提示輸入該停車場每小時收費標準。 4、按提示輸入到達后者離開信息,例如A 1 5,D 1 10。 5、輸入E 0 0并輸入N,退出系統(tǒng)。 八、測試報告 1、如圖,當打開系統(tǒng)時出現(xiàn)此界面,輸入Y為進入系統(tǒng),輸入N為退出系統(tǒng)。 2、如圖,如果輸入錯誤會提示出錯,并重新輸入。 3、如圖,輸入Y后,按提示依次輸入停車場可提供的最大車位數(shù)和每小時的停車費。 4、如圖,輸入A 1 5后,提示進入停車場的信息。 5、如圖,輸入A 2 10,A 3 15后,依次顯示提示信息。 6、如圖,輸入D 1 20后,分別顯示便道進入停車場的3號車和1號車的收費情況。 7、如圖,輸入E 0 0,再按提示輸入N,即可退出系統(tǒng)。 九、課程設(shè)計總結(jié) 通過團隊對該問題分析,互相補充了觀點,增強了對該題目正確認識。隊員們進行了縝密的需求分析,并分工完成各文件和函數(shù)的編寫。隊員們紛紛表示,這絕對是一個以前不能想象到的任務(wù)。通過對該系統(tǒng)的編寫、實現(xiàn),著實增強了隊員們的團隊意識以及對數(shù)據(jù)結(jié)構(gòu)的進一步的理解。當程序成功運行后,隊員們都非常興奮,雖然本系統(tǒng)仍有瑕疵,但是可以說這是隊員們的心血。 0第二篇:圖書管理系統(tǒng) 數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計
第三篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計—西文圖書管理系統(tǒng)
第四篇:圖書管理系統(tǒng)(含源代碼)c語言_數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
第五篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告_15_停車場管理