




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、湖南科技大學計算機學院數據結構課程設計報告湖南科技大學課 程 設 計 報 告題目: 圖書館管理基本業務模擬 院 系: 計算機學院 專業年紀: 0 學 號: 學生姓名: 指導老師: 2010年12月30日目 錄1設計任務書31.1題目與要求31.2涉及知識點31.3輸入輸出分析31.4測試數據分析32概要設計4 2.1結構體類型定義及函數聲明4 2.2主程序流程5 3詳細設計73.1數據類型實現73.2程序偽碼3.3程序主要流程圖4調試分析 4.1問題分析及回顧 4.2算法時空分析 4.3設想改進 4.4經驗和體會5用戶使用說明 5.1操作說明及詳細步驟6測試結果 6.1測試數據及結果7參考文獻
2、8致謝1、 設計任務書1.1題目與要求 題目:編寫程序實現圖書館管理業務的模擬。 要求:書的登記內容包括書號、書名、著作者、出版社、現存量和庫存量。并且按書號建立索引表以提高索引效率。程序要能夠實現一下功能:a.采編入庫:新購一本書,確定書號后,則登記到圖書賬目中,如果表中以有,則只將庫存增加。b.借閱:如果書的庫存量大于0,則借出一本書,登記借閱者的借書證號和歸還日期,改變現存量。c.歸還:注銷對借閱者的登記,改變書的現存量。1.2設計知識點 系統時間函數、系統調用庫函數、索引表建立、文件、結構體、指針、鏈表、數組、循環語句、選擇語句、輸入輸出控制、宏定義、自定義類型等。1.3輸入輸出分析
3、普通輸入:對于書籍內容登記及讀者信息宜采用結構體進行存儲,其中的具體單項信息則采用字符數組或整形變量直接存續,考慮到書籍及讀者信息的具體內容,字符數組長度為20較為合適。 對話式輸入:為便于轉換及比較,對話式輸入采用字符數組進行存儲.為保障程序的健壯性,同時限制對話式輸入的格式,對于非法的會話式輸入則提示用戶操作失敗的原因;此外為保障用戶在任意一步回話操作中都能任意退出,在程序中設計一“特殊按鍵”,當輸入時,則程序返回上一層。程序輸出:對于書籍信息及讀者借閱信息的顯示,考慮到美觀及直觀的因素,則采用表格的形式進行顯示;此外對于借書及還書過程中,為保障操作無誤,則在用戶選擇后,對用戶的操作進行輸
4、出,并請用戶進行確認;在對話式輸入中,對于非法輸入,程序顯示的提示信息采用下劃線進行強調,以引起用戶的注意。1.4測試數據分析書籍登記入庫操作中如果書籍登錄號超過六位則應提示”格式錯誤”;如果書號或書名已存在,則應提示”書籍已存在”。如果操作正確,則提示“書籍已登記入庫”。在書刊檢索中,如果書刊存在則應顯示書籍信息,如果不存在則應提示“書籍不存在”。在讀者信息登記操作中,如果讀者以存在,則應提示”讀者已存在”.否則,提示“成功添加讀者”。在讀者登錄過程中,如果讀者信息錯誤,則提示“用戶名或密碼錯誤”,否則登錄操作。借書還書中的輸出類似于檢索中的提示。2、 概要設計2.1結構體類型及函數聲明結構
5、體: 圖書信息結構體類型 book 讀者信息結構體類型reader 日期結構體類型 date索引項結構體類型idxtype 索引表結構體類型 isxlist函數聲明:int info_show(book *p,int n)/書籍信息顯示函數int bsave(book *l)/書籍信息導出函數int bload(book *l)/書籍信息導入函數int book_sort(book *b,book *p)/按照書號排序函數int store_in_lib(book *b)/書籍登記入庫函數int rsave(reader *r)/讀者信息導出函數 int rload(reader *r)/讀者
6、信息導入函數reader* search_r(reader *r,reader t)/查找讀者函數book* search_writer(book *b)/按作者查找函數book* search_name(book *b,int n)/按書名查找函數idx_list* idx_form(book *b)/索引表生成函數book* search_num(book *b,int n)/按書號查找函數int search_menu(book *b)/書籍檢索菜單int if_stop(date *time)/判斷時間循環是否停止函數date* rtime()/還書日期函數int lend(reade
7、r *tp,book *b)/借書函數int return(reader *tp,book *b)/還書模塊int log_menu(reader *r,reader *tp,book *b)/讀者登錄函數int log_in(reader *r,book *b)/讀者登錄模塊reader* rea_sort(reader *r,reader *p)/讀者排序函數int teacher_log()/管理員登錄函數int rea_insert(reader *r)/讀者信息插入函數int teacher(reader *r)/管理員登錄主調函數int library_menu(void)/管理函
8、數主菜單int welcome()/系統歡迎菜單int show_all(book *b)/藏書一覽函數int choice(book *b,reader *r)/函數主調菜單2.2主程序流程2.2.1主程序利用switch()語句實現各個模塊的調用,主函數調用如下圖所示。主程序根據不同值主調函數1調用登記入庫函數3調用書刊檢索模塊4調用教師登錄模塊5調用書籍顯示模塊6退出系統2調用讀者登錄模塊2.3各模塊的層次關系 主函數對各主要模塊進行調用,各個主要模塊又分別調用其他子模塊。下面用各主要模塊簡要流程圖表示說明。詢問讀者是否繼續此操作用戶確認后調用book_sort()函數調用info_sh
9、ow()函數由鍵盤讀取書籍信息登記入庫主模塊 登記入庫主模塊 用戶登錄主模塊錄入借書號及密碼,并保存在讀者指針中用戶登錄主模塊 調用search_r()函數,如存在則返回讀者指針驗證用戶后調用log_menu()函數,再根據用戶操作,調用lend(),rturn(),及search_num()等函數真書刊檢索主模塊錄入讀者的檢索方式,并返回選項書刊檢索主函數根據讀者的選擇,分別調用search_num(),search_name(),search()等書刊檢索函數,如找到則返回指針,否則返回空指針;在每個函數中分別調用info_show()函數教師登錄模塊調用rea_insert()函數,進行
10、添加讀者操作調用teacher_log(),確認用戶權限,如果認證通過,則返回1,否則返回0管理員登錄模塊真3、 詳細設計3.1數據類型實現 - 17 -圖書信息結構體 讀者信息結構體typedef struct book_info typedef struct readerchar b_num20; char rea_name20; char b_name20; char rea_code20;char b_writer20; char rea_num20;char b_publer20; book lenb5; char b_ptime20; date rtime5;int now_sto
11、re; struct reader *next;int total_store; reader; struct book_info *next; book;還書日期結構體 索引表結構體typedef struct typedef struct int year; idxtype idxterm100; int month; int len; int day; idx_list; date;索引項結構體typedef struct idx_termchar num8; int len; book *p; idxtype;3.2程序偽碼 int y_n()/根據讀取的字符給flag賦不同值,并返回
12、flag的值scanf(ch);if(ch0=y|ch0=y) flag=1;if(ch0!=y&ch0!=y&ch0!=n&ch0!=n)flag=0;if(ch0=n|ch0=n) flag=-1;int store_in_lib(book *b)/讀取書籍信息并經用戶確認后插入書籍鏈表b中q=b;doif(!(tp=(book*)malloc(sizeof(book)return error;*tp=nulb;/所用信息都為空的書籍宏定義doscanf(tp-b_num);while(strlen(tp-b_num)!=6); for(exit=b-next;exit&strcmp(ex
13、it-b_num,tp-b_num);exit=exit-next);/判斷書號是否已經存在 if(!exit) scanf(tp-b_name); for(exit=b-next;exit&strcmp(exit-b_name,tp-b_name);exit=exit-next);/判斷書是否已經存在 if(exit) exit-now_store+; exit-total_store+; else scanf(tp);tp-next=null;info_show(tp,0);do/確認是否登記入庫flag=y_n();while(!flag);if(flag=1)book_sort(b,t
14、p);/插入鏈表if(flag=-1) free(tp);/釋放空間do/確認是否繼續flag=y_n();while(!flag);while(flag=1);return 0;book* search_writer(book *b)/從鍵盤讀取著作者的名字,在書籍鏈表中查找,如果存在則返回滿足/條件的指針,否則返回空指針scanf(writer);p=b-next;while(p)if(!(strcmp(p-b_writer,writer)break;p=p-next;if(p)info_show(p,0);return p; book* search_name(book *b)/從鍵盤讀
15、取書籍名稱,如果書籍存在,則返回書記信息指針,否則返/回空指針scanf(name);p=b;while(p)if(!(strcmp(p-b_name,name)break;p=p-next;if(p)p-next=null;info_show(p,0);return p;idx_list* idx_form(book *b)/根據書籍信息鏈表b建立書號索引表,并返回索引表的頭指針if(!(list=(idx_list*)malloc(sizeof(idx_list)return null;list-len=0;list-idxterm0.len=0;/初始化tp=b-next;if(tp)d
16、oif(i=0&list-idxterm0.len=0)strcpy(list-idxtermi.num,tp-b_num);memcpy(flag,tp-b_num,2);list-idxtermi.len=1;list-len=1;tp=tp-next;continue;/將第一本書的書號做為索引表的第一項并以第一項/的前兩個字符作為關鍵字memcpy(temp,tp-b_num,2);/將tp-b_num的前兩個字符賦值/給temp if(strcmp(flag,temp) i+;strcpy(list-idxtermi.num,tp-b_num);memcpy(flag,tp-b_nu
17、m,2);list-idxtermi.len=1;/增加新的索引項elselist-idxtermi.len+;/記錄關鍵字相同的數量list-len=i+1;tp=tp-next;while(tp);return list;book* search_num(book *b,int n)/根據書號查找書籍,如果找到則返回書籍指針,并使書籍的現存量n;/否則返回空指針book *tp;int i,j,len=0,flag=0;char num8;idx_list *ilist;if(!(ilist=(idx_list*)malloc(sizeof(idx_list)return null;ili
18、st-len=0; tp=b-next;if(tp)ilist=idx_form(b);elsetp=null;return tp;scanf(num);for(i=0;ilen&!flag;i+)if(strcmp(num,ilist-idxterm0.num)idxtermi+1.num)len-1)/比較與索引表下一項的大小for(j=0;jidxtermj.len;/計算指針移動的次數for(j=1;jnext;/移動指針for(j=1;jidxtermi.len;j+)if(!strcmp(tp-b_num,num)if(!(nnow_store=0)tp-now_store+=n;
19、/根據主調函數改變現存量flag=1;break;tp=tp-next;if(j-1=ilist-idxtermi.len&!flag)/沒找到tp=null;return tp;return tp;int search_menu(book *b)/根據用戶的選擇對書籍信息鏈表b進行不同方式的查找doscanf(ch);op=atoi(ch);while(op3); switch(op)case 1: search_num(b,0);break;case 2: search_name(b);break;case 3: search_writer(b);break;return 0;int if
20、_stop(date *time)/判斷時間time是否符合實際if(time-month=4|time-month=6|time-month=9|time-month=11) if(time-dayyear%4)&(time-year%100)|!(time-year%400) num=29; else num=28;/判斷2月的天數if(time-month=2&time-daydaytm_year+1900;m=timeinfo-tm_mon+1;d=timeinfo-tm_mday;rtime-year=y;rtime-month=m;rtime-day=d;rtime-day+=60
21、;do switch(rtime-month)case 4:case 6:case 9:case 11: if(rtime-day30) rtime-month+; rtime-day-=30; break; case 2:if(!(rtime-year%4)&(rtime-year%100)|!(rtime-year%400) num=29; else num=28; if(rtime-daynum) rtime-month+; rtime-day-=num; break; default:if(rtime-day31) rtime-month+; rtime-day-=31; if(rti
22、me-month12) rtime-year+; rtime-month-=12; while (if_stop(rtime);return rtime;int lend(reader *tp,book *b)/在圖書鏈表b中查找用戶的書籍,找到后將書籍登記到讀者tp名下/并將書籍存量減一book *btp=null;int i=0;while(strcmp(tp-lenbi.b_num,nul)&inow_store!=0)tp-lenbi=*btp;tp-rtimei=*rtime();return 0;int return(reader *tp,book *b)/在圖書鏈表b中查找用戶的
23、書籍,找到后將書籍從讀者tp名下刪除/并將書籍存量減一int i=0;book *p;p=search_num(b,1);while(strcmp(p-b_num,tp-lenbi.b_num)i+;if(i4)for(;ilenbi=tp-lenbi+1;tp-rtimei=tp-rtimei+1;tp-lenb4=nulb;return 0;reader* rea_sort(reader *r,reader *p)reader *tp;tp=r;while(tp-next)if(strcmp(p-rea_num,tp-next-rea_num)next;return tp;int teac
24、her_log()/教師登錄驗證,通過則返回0,否則返回1 scanf(name);scanf(code);if(!strcmp(name,李云高)&!strcmp(code,121513)return 0;elsereturn 1;int rea_insert(reader *r)/從鍵盤錄入讀者信息,并以指針存放,經用戶確認后插入讀者信息鏈/表r中do p=r;while(p-next)p=p-next;if(!(tp=(reader*)malloc(sizeof(reader)return error;scanf(tp);tp-next=null;p=rea_sort(r,tp);tp-
25、next=p-next;p-next=tp;do flag=y_n();while(!flag); while (flag=1);return 0;int teacher(reader *r)/登陸后,如確認要添加用戶,則將用戶順序插入讀者鏈表r中 if(!teacher_log()rea_insert(r);return 0;3.3程序主要流程圖 登記入庫流程圖:繼續?free(tp)book_sort()入庫?info_show(tp)strcmp(tp,exit)exit-b_now+讀取書籍信息10011返回主函數書刊檢索模塊流程圖:根據檢索菜單進行選擇search_num(b)sea
26、rch_writer(b);search_name(b)是否繼續?10返 回借書模塊流程圖進 入 模 塊是否達到上限?0btp=search_num(b)btp返回主函數tp-lenbi=*btp;tp-rtimei=*rtime();4.調試分析 4.1問題分析與回顧 問題1:先后輸入兩個字符串,后者自動連接到前者,從而影響前者的值。 分析: 輸入字符串越界,導致編譯器錯誤。 解決: 增加字符數組的長度。 問題2:當進行選擇時,輸入為亂碼時,程序崩潰。 分析: 讀取選項的為字符變量,導致編譯錯誤。 解決: 利用字符串存儲選項。 問題3:文件存儲時,導致程序崩潰。 分析: 不同模塊中都有存儲操作,導致文件存儲混亂。 解決: 盡在程序正常退出時,進行文件存儲操作。 問題4:利用索引表搜索書時,程序崩潰! 分析:在指針移動過程中出現空指針的調用。 解決:仔細設置,在必要出添加判斷。 4.2算法時空分析 建立索引表的算法: 建立索引表達算法的空間復雜度取決于書籍登錄號的具體情況,在最差的情況下,即每本書的書號前兩位都不同,則空間復雜度s(n)=o(o); 就時間復雜度而言,由于建立過程中,需要訪問所有的書籍鏈表節點,所以時間復雜度t(n)=o(n). 書號查找的算法分析 書號查找借助于索引表來實現,在查找過程中,由于需要和索引表中每一個索引項進行比較,則在最壞的情況下,時間復雜度為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 歷年高考各省語文作文范文5篇
- 旅游度假區項目風險評估與對策
- 2025年上海奉賢區機關事業單位招聘考試筆試試題(含答案)
- 老年期課件教學課件
- 老年護理課件教學
- 老師課件導入方法
- 老師安全課堂課件
- 裝修工程驗收及保修個人服務合同
- 高端人才招聘標準勞動合同范本
- 車輛指標租賃與城市交通擁堵治理協議
- GB/T 15561-2024數字指示軌道衡
- 中醫證素評分表yyy
- 課內外文言文對比閱讀專題練(八上)2023年初中語文中考一輪教材復習
- 吸氧標準操作流程
- 抹灰施工人員培訓方案
- 法律職業資格-客觀卷二-執行程序
- 醫院安全生產隱患排查獎勵制度
- 皮膚科進修后匯報
- 鋁的基礎知識
- 自然災害應急演練方案及流程
- 《鐵路軌道維護》課件-混凝土枕硫磺改錨作業
評論
0/150
提交評論