數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)圖書管理系統(tǒng)實(shí)驗(yàn)報(bào)告(共33頁)
精選優(yōu)質(zhì)文檔-傾情為你奉上Beijing Institute of Petrochemical Technology數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告 院(系、部):信息工程學(xué)院 姓 名:計(jì)141范文虎 指導(dǎo)教師簽名:2016年 6月29日·北京目錄一. 設(shè)計(jì)題目····································二. 設(shè)計(jì)目的····································三. 實(shí)驗(yàn)分工····································四. 算法思想分析································五. 算法描述實(shí)現(xiàn)································1.數(shù)據(jù)結(jié)構(gòu)類型定義 2.算法流程圖 3.程序代碼六. 運(yùn)行結(jié)果····································七.結(jié)論········································一. 設(shè)計(jì)題目圖書管理基本業(yè)務(wù)模擬圖書管理一般包括圖書采編、圖書編目、圖書查詢及圖書流通(借、還書)等基本業(yè)務(wù)。要求設(shè)計(jì)一個(gè)圖書管理信息系統(tǒng),用計(jì)算機(jī)模擬實(shí)現(xiàn)上述系統(tǒng)功能。(1)書的登記內(nèi)容包括書號(hào)、書名、著作者、現(xiàn)存量和庫存量等;學(xué)生信息包括借書證號(hào)、借閱信息等;(2)以書號(hào)建立索引表(線性表)以提高查找效率;(3)主要功能如下:a) 采編入庫:新購一種書,確定書號(hào)后,登記到圖書帳目表中,如果表中已有,則只將庫存量增加;b) 借閱:如果一種書的現(xiàn)存量大于0,則借出一本,登記借閱者的書號(hào)和歸還期限,改變現(xiàn)存量;c) 歸還:注銷對(duì)借閱者的登記,改變?cè)摃默F(xiàn)存量。(4)輸出形式:能按書號(hào)、書名、著作者查找?guī)齑娴臅畔?能按學(xué)生的借書證號(hào)顯示學(xué)生信息和借閱信息 書籍入庫 借書功能實(shí)現(xiàn) 還書功能實(shí)現(xiàn)二. 設(shè)計(jì)目的1 了解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計(jì)方法,具備初步的獨(dú)立分析和設(shè)計(jì)能力;2初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設(shè)計(jì)、程序編碼、測試等基本方法和技能;3提高綜合運(yùn)用所學(xué)的理論知識(shí)和方法獨(dú)立分析和解決問題的能力;4訓(xùn)練用系統(tǒng)的觀點(diǎn)和軟件開發(fā)一般規(guī)范進(jìn)行軟件開發(fā),培養(yǎng)軟件工作者所應(yīng)具備的科學(xué)的工作方法和作風(fēng)。2 開發(fā)環(huán)境:VC6.0或者DEV C+.三. 實(shí)驗(yàn)分工范文虎:總體程序框架構(gòu)思,算法分析,主程序編寫,子函數(shù)調(diào)用,圖書信息記錄存儲(chǔ)子函數(shù)編寫,結(jié)合,主控制面板編寫,哈希函數(shù),結(jié)構(gòu)體定義。算法實(shí)現(xiàn),添加圖書信息子函數(shù)編寫,借閱圖書字函數(shù)編寫,查詢子函數(shù)設(shè)計(jì)編寫,還書子函數(shù)設(shè)計(jì)編寫,最終程序調(diào)試,寫報(bào)告。算法實(shí)現(xiàn),刪除圖書子函數(shù)設(shè)計(jì)編寫,查找圖書信息子函數(shù)編寫,測試整體程序,程序缺陷糾正,最終修改后程序綜合。算法實(shí)現(xiàn),查詢圖書信息子函數(shù)設(shè)計(jì)編寫,程序缺陷修改和測試。四. 算法思想分析用線性表進(jìn)行存儲(chǔ),充分利用它易添加、易刪除、查找方便的特點(diǎn),進(jìn)行程序的編寫,符合題目的需求。而線性表是最基本、最簡單、也是最常用的一種數(shù)據(jù)結(jié)構(gòu)。五. 算法描述實(shí)現(xiàn)1. 數(shù)據(jù)結(jié)構(gòu)類型定義typedefstruct int year; int month; int day; data;typedefstruct char num5; /讀者編號(hào)記錄data bro; data back; ReaderNode;typedefstructchar title15; char writer15; int current; int total; int key; /書的編號(hào)ReaderNode reader10; /記錄借讀該書的讀者記錄BookNode;typedefstructBookNode *elem; int count; /記錄節(jié)點(diǎn)中的總數(shù)HashTable;2. 算法流程圖建立哈希表刪除函數(shù)添加函數(shù)查找函數(shù)添加圖書增量子函數(shù)借閱書子函數(shù)添加書子函數(shù)查看已添加書子函數(shù)歸還書子函數(shù)查看已借閱書子函數(shù)查找書子函數(shù)主函數(shù)完成3. 程序代碼#include"stdafx.h"#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<string.h>#include<conio.h>#define SUCCESS 1#define UNSUCCESS 0#define DUPLICATE -1#define NULL_KEY 0/無記錄元素 int hashsize=17,19,23,29;/存儲(chǔ)容量 int m=0;/表長 typedef struct int year; int month; int day; data;typedef struct char num5; /讀者編號(hào)記錄 data bro; data back; ReaderNode;typedef struct char title15; char writer15; int current; int total; int key; int more;/書的編號(hào) ReaderNode reader10; /記錄借讀該書的讀者記錄 BookNode;typedef struct BookNode *elem; int count; /記錄節(jié)點(diǎn)中的總數(shù) HashTable;void InitHashTable(HashTable *H) int i; (*H).count=0; m=hashsize0; (*H).elem=(BookNode *)malloc(m*sizeof(BookNode); for(i=0;i<m;i+) (*H).elemi.key=NULL_KEY; unsigned Hash(int K)/哈希函數(shù),自己設(shè)定 return K%m; void collision(int *p,int d) / 開放定址法處理沖突 *p=(*p+d)%m; int SearchHash(HashTable H,int K,int *p,int *c)/p為數(shù)據(jù)的地址位置,返回 *p=Hash(K); while(H.elem*p.key != NULL_KEY && (K != H.elem*p.key) (*c)+; if(*c<m) collision(p,*c); /下一地址 else break; if (K = H.elem*p.key) return SUCCESS; else return UNSUCCESS; int InsertHash(HashTable *H,BookNode e) int c,p; c=0; if(SearchHash(*H,e.key,&p,&c) return DUPLICATE; else if(c<hashsize0/2) (*H).elemp=e; +(*H).count; return 1; return 0;int DeleteHash(HashTable *H,BookNode e) int c,p; c=0; if(SearchHash(*H,e.key,&p,&c) (*H).elemp.key=NULL_KEY; -(*H).count; return 1; else printf("不好意思,不存在n"); return 0;void AddBook(HashTable *H) BookNode e; int i; system("CLS"); printf("nn*n"); printf("t你能在此目錄下添加圖書信息"); printf("n*n"); printf("nt 請(qǐng)輸入書的編號(hào)(形如: 1*): "); scanf("%d",&e.key); getchar(); printf("nt 請(qǐng)輸入書名: "); gets(e.title); printf("nt 請(qǐng)輸入該書作者: "); gets(e.writer); printf("nt 請(qǐng)輸入該書現(xiàn)庫存量: "); scanf("%d",&e.current); printf("nt 請(qǐng)輸入該書總庫存量: "); scanf("%d%*c",&e.total); for(i=0;i<10;i+) (e.readeri).num0='0' /用'0'來初始化借該書的讀者證號(hào),表示一開始時(shí)沒人借書 if(InsertHash(&(*H),e) printf("圖書添加成功!n"); (*H).count+; void ShowBook(HashTable H) int i; system("CLS"); printf("nn*n"); printf("t你能在此目錄查看圖書信息"); printf("n*n"); for(i=0;i<m;i+) if(H.elemi.key != NULL_KEY) /* 有數(shù)據(jù) */ printf("圖書編號(hào):%dn",H.elemi.key); printf("書名: %sn",H.elemi.title); printf("作者: %sn",H.elemi.writer); printf("圖書現(xiàn)存量: %dn",H.elemi.current); printf("圖書總量 : %dn",H.elemi.total); printf("*n"); void BoSearch(HashTable *H)/借閱查詢 int e,r,t; system("CLS"); printf("nn*n"); printf("t你能在此目錄下按借書證號(hào)查找圖書信息"); printf("n*n"); printf("nt 請(qǐng)輸入你的借書證號(hào): "); scanf("%d%*c",&e); if(SearchHash(*H,e,&r,&t) printf("借書證編號(hào): %dn",(*H).eleme.key); printf("書名: %sn",(*H).eleme.title); printf("作者: %sn",(*H).eleme.writer); printf("圖書現(xiàn)存量:%dn",(*H).eleme.current); printf("圖書總量 :%dn",(*H).eleme.total); else printf("您沒有借過書!");void Find(HashTable *H) int x,p,c; system("CLS"); printf("nn*n"); printf("t你能在此目錄下按編號(hào)查找圖書信息"); printf("n*n"); printf("nt 請(qǐng)輸入你想查找的書的編號(hào): "); scanf("%d%*c",&x); if(SearchHash(*H,x,&p,&c) printf("圖書編號(hào):%dn",(*H).elemp.key); printf("書名: %sn",(*H).elemp.title); printf("作者: %sn",(*H).elemp.writer); printf("圖書現(xiàn)存量: %dn",(*H).elemp.current); printf("圖書總量 : %dn",(*H).elemp.total); else printf("對(duì)不起,不存在該書!n"); void BorrowBook(HashTable *H) int i,k, x, f,t; system("CLS"); printf("nn*n"); printf("t你能在此目錄下按編號(hào)借閱圖書"); printf("n*n"); printf("nt 請(qǐng)輸入你想借的書編號(hào): "); scanf("%d%*c",&x); if(SearchHash(*H,x,&k,&f) printf("nt 你想借這本書嗎 ?(y/n)"); printf("nt 書名: %s",(*H).elemk.title); printf("nt 作者: %s",(*H).elemk.writer); printf("nt 現(xiàn)庫存量: %d",(*H).elemk.current); printf("nt 總庫存量: %d",(*H).elemk.total); t=getch(); if(t='y'|t='Y') if( (*H).elemk.current)=0) printf("nt對(duì)不起,這本書已經(jīng)被借光了."); else for(i=0;i<10;i+) if( (*H).elemk.readeri).num0='0') break; printf("nt 請(qǐng)輸入你的借書證號(hào): "); scanf("%s",(*H).elemk.readeri).num); printf("nt 請(qǐng)輸入借書日期: "); /輸入借書日期 printf("nt 年: "); scanf("%d",&(*H).elemk.readeri).bro.year); printf("t 月: "); scanf("%d",&(*H).elemk.readeri).bro.month); printf("t 日: "); scanf("%d",&(*H).elemk.readeri).bro.day); printf("nt 輸入應(yīng)還書日期: "); /輸入應(yīng)還書日期 printf("nt 年: "); scanf("%d",&(*H).elemk.readeri).back.year); printf("t 月: "); scanf("%d",&(*H).elemk.readeri).back.month); printf("t 日: "); scanf("%d%*c",&(*H).elemk.readeri).back.day); (*H).elemk.current-; /現(xiàn)存書量減1 printf("nt 你已借了該書."); else printf("nt 這本書不存在!n"); void ReturnBook(HashTable *H) int i,k, x, f,t,j; int year,month,day,d; float pay; char temp20; system("CLS"); printf("nn*n"); printf("t你能在此目錄下按編號(hào)歸還圖書"); printf("n*n"); printf("nt 請(qǐng)輸入你還的書: "); scanf("%d%*c",&x); if(SearchHash(*H,x,&k,&f) printf("nt 你想還這本書嗎 ?(y/n)"); printf("nt 書名: %s",(*H).elemk.title); printf("nt 作者: %s",(*H).elemk.writer); printf("nt 現(xiàn)庫存量: %d",(*H).elemk.current); printf("nt 總庫存量: %d",(*H).elemk.total); t=getch(); if(t='y'|t='Y') printf("nt 請(qǐng)輸入你的借書證號(hào): "); scanf("%s",temp); j=0; for(i=0;i<5;i+) if(!(strcmp(temp,(*H).elemk.readeri).num) j=1;break; /查看是否有借書 if(j=0) printf("nt 你沒有借書.");return; /該借書證號(hào)的人沒借書 printf("nt 今天是:"); printf("nt 年: "); scanf("%d",&year); printf("t 月: "); scanf("%d",&month); printf("t 日: "); scanf("%d%*c",&day); d=0; if(year<(*H).elemk.readeri).back.year) d=1; /判斷是否已過了還書日期,d=1還沒過期,d=0過期 if(year<=(*H).elemk.readeri).back.year && month<(*H).elemk.readeri).back.month) d=1; if(year<=(*H).elemk.readeri).back.year && month<=(*H).elemk.readeri).back.month && day<(*H).elemk.readeri).back.day) d=1; if(d=0) pay=(year-(*H).elemk.readeri).back.year)*365+(month-(*H).elemk.readeri).back.month)*30+(day-(*H).elemk.readeri).back.day); printf("nt 你在 %d-%d-%d 借了這本書",(*H).elemk.readeri).bro.year,(*H).elemk.readeri).bro.month,(*H).elemk.readeri).bro.day); printf("nt 你應(yīng)該在 %d-%d-%d 還這本書",(*H).elemk.readeri).back.year,(*H).elemk.readeri).back.month,(*H).elemk.readeri).back.day); printf("nt 今天是 %d-%d-%d",year,month,day); printf("nnt 所以你超出了還書日期"); printf("nt 你應(yīng)該被罰款 %2.1f 元.",0.1*pay); /過期一天還1角錢 (*H).elemk.readeri).num0='0' /已還,清除該讀者借書記錄 (*H).elemk.current+; /現(xiàn)存書量加1 printf("nt 你已經(jīng)還了這本書.n"); else printf("nt 你要還一本沒庫存的書 ?n"); void SaveBook(HashTable H) FILE *fp1; int i; fp1=fopen("C:/record.txt","w"); fprintf(fp1,"= 圖書信息記錄表 =n"); for(i=0;i<m;i+) if(H.elemi.key != NULL_KEY) fprintf(fp1,"=n"); fprintf(fp1,"圖書編號(hào):%dn",H.elemi.key); fprintf(fp1,"書名:%sn",H.elemi.title); fprintf(fp1,"作者:%sn",H.elemi.writer); fprintf(fp1,"現(xiàn)庫存量:%dn",H.elemi.current); fprintf(fp1,"總庫存量:%dn",H.elemi.total); fprintf(fp1,"*n"); fclose(fp1); printf("nn成功儲(chǔ)存!你能在C:/record.txt找到相應(yīng)紀(jì)錄n"); printf("*n");void AddTatol(HashTable *H)BookNode e; int k, x, f,t; int m; int r,i; system("CLS"); printf("nn*n"); printf("t你能在此目錄下按編號(hào)修改圖書信息"); printf("n*n"); printf("nt 輸入你想增加的圖書量:"); scanf("%d",&e.more);printf("nt 請(qǐng)輸入你要修改的書的編號(hào): "); scanf("%d%*c",&x); if(SearchHash(*H,x,&k,&f) printf("nt 書名: %s",(*H).elemk.title); printf("nt 作者: %s",(*H).elemk.writer); printf("nt 現(xiàn)庫存量: %d",(*H).elemk.current); printf("nt 總庫存量: %d",(*H).elemk.total); printf("nt 增加圖書量成功!"); for(i=0;i<=(e.more);i+) (*H).elemk.total+; /(*H).elemk.total=r; else printf("nt 這本書不存在!n");void DeleteBook(HashTable H) int x,p,c,t; system("CLS"); printf("nn*n"); printf("t你能在此目錄下按編號(hào)刪除圖書信息"); printf("n*n"); printf("nt 請(qǐng)輸入你想刪除的書的編號(hào): "); scanf("%d%*c",&x); if(SearchHash(H,x,&p,&c) printf("nt 你想刪除這本書嗎 ?(y/n)n"); printf("圖書編號(hào): %dn",(H).elemp.key); printf("書名: %sn",(H).elemp.title); printf("作者: %sn",(H).elemp.writer); printf("圖書現(xiàn)存量: %dn",(H).elemp.current); printf("圖書總量 : %dn",(H).elemp.total); else printf("對(duì)不起,不存在該書!n"); t=getch(); if(t='y'|t='Y') (H).elemp.key=NULL_KEY; printf("刪除成功!n"); void menu(void) system("cls"); system("color 3f");/改變顏色 system("cls"); printf("*n"); printf("*n"); printf("* 圖書管理系統(tǒng) *n"); printf("*n"); printf("*n"); printf("nnt選擇你需要操作的功能:(現(xiàn)無記錄,請(qǐng)先添加信息)n"); printf("n"); printf("tt1.添加圖書信息n"); printf("tt2.顯示圖書信息n"); printf("tt3.查找圖書信息n"); printf("tt4.刪除圖書n"); printf("tt5.借閱圖書n"); printf("tt6.借閱信息并歸還圖書n"); printf("tt7.保存圖書信息到指定文件中n");printf("tt8.借閱查詢n"); printf("tt9.添加圖書增量n"); printf("n*n"); int main() int n,i,c; int year,month,day; BookNode book; HashTable H; system("cls"); system("color 1c");/改變顏色 system("cls"); printf("* 圖書管理系統(tǒng) *n"); printf("* 數(shù)據(jù)結(jié)構(gòu) *n"); printf("* 范文虎小組 *n"); printf("* 計(jì)算機(jī)科學(xué)與技術(shù)1班*n"); printf("nntttt歡迎您!n"); printf("請(qǐng)按ENTER進(jìn)入主菜單n"); getchar(); InitHashTable(&H); while(1) menu(); printf("選擇你需要操作的功能號(hào)碼:"); scanf("%d",&c); getchar(); switch(c) case 1: AddBook(&(H);break; case 2: ShowBook(H);break; case 3: Find(&(H);break; case 4: DeleteBook(H);break; case 5: BorrowBook(&(H);break; case 6: ReturnBook(&(H);break; case 7: SaveBook(H);break; case 8: BoSearch(&H);break; case 9: AddTatol(&(H);break; default : printf("Enter error!n"); printf("請(qǐng)按ENTER返回主菜單n"); getchar(); system("CLS"); 六. 運(yùn)行結(jié)果七. 結(jié)論通過此次課設(shè)小組的密切配合,小組成員每個(gè)人在編程上都有了長足的進(jìn)步。專心-專注-專業(yè)