基本要求:
1)采用鏈式存儲結構實現
2)圖書信息:每種書的登記內容包括書號、書名、著作者、現存量和庫存量等信息;
3)讀者信息:每個讀者的登記內容包括讀者號、姓名、性別等信息
4)借閱信息:每條借閱信息包括讀者號、書號、借閱時間、歸還時間
5)系統主要功能如下:
a)讀者的增刪改,圖書信息的增刪改,其中圖書的增加(采編入庫):新購一種書,確定書號后,登記到圖書帳目表中,如果表中已有,則只將庫存量增加;
b)借閱:如果一種書的現存量大於0,則借出一本,在借閱信息中登記讀者號、書號、借閱時間,改變圖書現存量;
c)歸還:填寫對應借閱記錄的歸還時間,改變該書的現存量。
d)查詢:可查詢書籍信息、讀者信息、借閱信息等
e)圖書、讀者、借閱信息均可保存在文件中,可從文件中調入
學校實驗專周比較水,出的都是一些小題目, 從中挑了一個工程量最大的也只是這個小實驗,然后我就盡量寫的詳細一點,把各個功能分開。
文件調用不是很熟悉,倉促學了一點皮毛就用上了,有興趣以后自行擴展。
實驗大致思路和順序表差不多,多了一些鏈表基本操作,分別存儲圖書信息和讀者信息,初始化並插入數據后開始用第三個結構體存儲借閱信息,通過判斷輸入法內容和讀者號、圖書號是否一致來決定借閱成功或失敗。
鏈式結構體中的數組是為了方便存儲字符串。
#include <cstdio> #include <cstdlib> #include <string.h> #define ERROR 0 #define OK 1 #define MAXSIZE 50//字符串容納最大長度 50 typedef int Status; typedef int ElemType; //圖書信息 typedef struct Book{ char book_id[MAXSIZE];//圖書序號 char book[MAXSIZE];//書名 char author[MAXSIZE];//作者 int num;//現存量 int kucun;//庫存量 char read_id[MAXSIZE];//借閱者的id struct Book *next; }LBook,*LinkBook; //讀者信息 typedef struct Reader{ char read_id[MAXSIZE];//讀者號 char reader[MAXSIZE];//讀者姓名 char ssex[MAXSIZE];//讀者性別 // char borrow_book[10]; struct Reader *next; }LReader,*LinkReader; //查閱信息 typedef struct info{ char book_id[MAXSIZE];//圖書序號 char book_name[MAXSIZE];//圖書名稱 char read_id[MAXSIZE];//讀者序號 char reader[MAXSIZE];//讀者名字 char time1[MAXSIZE];//借閱時間 char time2[MAXSIZE];//歸還時間 struct info *next; }*information,Info; Status InitBook(LinkBook &L){ L=new Book; if(!L) return ERROR; L->next=NULL; L->kucun=0; L->num=0; return OK; } //初始化讀者信息 Status InitReader(LinkReader &L){ L=new Reader; if(!L) return ERROR; L->next=NULL; return OK; } //初始化借閱信息 Status Information(information &C){ C=new Info; if(!C) return ERROR; C->next=NULL; return OK; } //遍歷圖書信息 void DisBook(LinkBook L){//不改動數值可以不引用& LBook *p; p=L->next;//指向第一個節點 printf("開始展開所有圖書信息\n"); printf("------------------>\n"); while(p)//p!=NULL { printf("圖書序號:%s\n圖書名稱:%s\n圖書作者:%s\n現存量:%d\n庫存量:%d\n",p->book_id,p->book,p->author,p->num,p->kucun); printf("------------------>\n"); p=p->next; } } //遍歷讀者信息 void DisReader(LinkReader L){//不改動數值可以不引用& LReader *p; p=L->next;//指向第一個節點 printf("開始展開所有讀者信息\n"); printf("------------------>\n"); while(p)//p!=NULL { printf("讀者號:%s\n姓名:%s\n性別:%s\n",p->read_id,p->reader,p->ssex); printf("------------------>\n"); p=p->next; } } //遍歷借閱信息 void DisBorrow(information L) { Info *p; p=L->next; printf("展開所有訂閱信息:\n"); printf("------------------>\n"); while(p)//p!=NULL { printf("圖書:%s\n讀者:%s\n借閱日期:%s\n歸還日期:%s\n",p->book_name,p->reader,p->time1,p->time2); printf("------------------>\n"); p=p->next; } } //刪除讀者操作 Status DelReader(LinkReader &L,char *i) { LReader *p=L; while(p->next)// { if(strcmp(p->next->read_id,i)==0){ Reader *s=p->next; p->next=s->next;//p->next=p->next->next delete s; return OK; } p=p->next; } return ERROR; } //刪除圖書信息操作 Status DelBook(LinkBook &L,char *i) { LBook *p=L; while(p->next)// { if(strcmp(p->next->book_id,i)==0){ Book *s=p->next; p->next=s->next;//p->next=p->next->next delete s; return OK; } p=p->next; } return ERROR; } //添加讀者信息(前插法)--量插 void AddReader(LinkReader &L,int n){ LReader *p; L=new Reader; L->next=NULL; int i; p=L->next; printf("請輸入讀者號,姓名和性別:\n"); for(i=n;i>0;--i) { p=new Reader; scanf("%s %s %s",p->read_id,p->reader,p->ssex); p->next=L->next; L->next=p; } } //初始添加圖書信息(前插法)--單插 Status AddBook(LinkBook &L,ElemType e){ LBook *p; L=new Book; L->next=NULL; int i,j; p=L->next; for(i=0;i<e;i++){ p=new LBook; p->num=p->kucun=0; printf("請選擇圖書編號和數量:\n"); scanf("%s%d",p->book_id,&j); printf("請插入圖書的名字和作者名:\n"); scanf("%s%s",p->book,p->author); p->num+=j; p->kucun+=j; p->next=L->next; L->next=p; } } //Insert 后續添加圖書 Status InsertBook(LinkBook &L,char *n,ElemType e) { LBook *p,*s; p=L->next; while(p){ if(strcmp(p->book_id,n)==0){//如果存在過這本書 p->kucun+=e; p->num+=e; return OK; } p=p->next; } p=new LBook; p->num=p->kucun=0; printf("請插入圖書的名字和作者名:\n"); scanf("%s%s",p->book,p->author); p->num=e; p->kucun=e; p->next=L->next; L->next=p; } //后續添加讀者號 Status InsertReader(LinkReader &L,char *n) { LReader *p,*s; p=L->next; while(p){ if(strcmp(p->read_id,n)==0){//如果讀者號已存在 printf("該賬戶已經被注冊!\n"); return OK; } p=p->next; } p=new LReader; strcpy(p->read_id,n); printf("請插入讀者的名字和性別:\n"); scanf("%s%s",p->reader,p->ssex); p->next=L->next; L->next=p; } //按圖書序號查找圖書信息 Status GetBook(LinkBook L,char *n) { LBook *p = L->next; while(p)//p!=NULL { if(strcmp(p->book_id,n)==0) { printf("查找的結果為:\n"); printf("圖書序號:%d\n圖書名稱:%s\n圖書作者:%s\n現存量:%d\n庫存量:%d\n",p->book_id,p->book,p->author,p->num,p->kucun); printf("------------------>\n"); return OK; } p=p->next; } printf("沒找到該圖書,請核對輸入是否正確\n"); } //搜索圖書序號修改圖書信息 Status AlterBook(LinkBook L,char *n) { LBook *p = L->next; while(p)//p!=NULL { if(strcmp(p->book_id,n)==0) { printf("圖書查到,請修改:\n"); printf("圖書序號為:%s\n請修改:",p->book_id); scanf("%s",p->book_id); printf("書名為:%s\n請修改:",p->book); scanf("%s",p->book); printf("作者:%s\n請修改:",p->author); scanf("%s",p->author); printf("現存量和庫存量為%d和%d\n請修改:",p->num,p->num); scanf("%d,%d",&p->num,&p->kucun); printf("------------------>\n"); return OK; } p=p->next; } printf("沒找着該圖書,請重新檢查!\n"); return ERROR; } //按讀者號查找讀者信息 Status GetReader(LinkReader L,char *n) { LReader *p = L->next; while(p)//p!=NULL { if(strcmp(p->read_id,n)==0) { printf("查找的結果為:\n"); printf("讀者號:%s\n姓名:%s\n性別:%s\n",p->read_id,p->reader,p->ssex); printf("------------------>\n"); return OK; } p=p->next; } printf("沒找到該讀者,請核對輸入是否正確\n"); } //通過讀者號修改讀者信息 Status AlterReader(LinkReader L,char *n) { LReader *p = L->next; while(p)//p!=NULL { if(strcmp(p->read_id,n)==0) { printf("讀者信息查到,請修改:\n"); printf("讀者號:\n"); scanf("%s",&p->read_id); printf("讀者名:\n"); scanf("%s",p->reader); printf("讀者性別:\n"); scanf("%s",p->ssex); printf("------------------>\n"); return OK; } p=p->next; } printf("沒找到該讀者,請核對輸入是否正確\n"); } //借閱書 Status Borrow(LinkBook &L,LinkReader &S,information &C ){ LBook *p=L->next; LReader *q=S->next; Info *s=C->next; char n[10],m[10]; printf("請輸入讀者證號和圖書號進行借閱:\n"); scanf("%s%s",m,n); while(p){ if(strcmp(p->book_id,n)==0){ s=new Info; strcpy(s->book_id,n); //字符串賦值,需要函數 strcpy(s->book_name,p->book); if(p->kucun>0){//判斷是否還有庫存 p->kucun--; //借走了,該書庫存-1 } else { printf("這本書已經被借完了!\n"); delete s; return ERROR; } break; } p=p->next; } while(q){ if(strcmp(q->read_id,m)==0){ strcpy(s->read_id,m);//字符串賦值 strcpy(s->reader,q->reader); // strcpy(q->borrow_book,p->book); break; } q=q->next; } if(q==NULL){ printf("讀者號或者圖書號錯誤,請檢查輸入是否有誤!\n"); return ERROR; } printf("請填寫借閱和歸還日期:\n"); scanf("%s%s",s->time1,s->time2); s->next=C->next; C->next=s; return OK; } //歸還書 Status Return(LinkBook &L,LinkReader &S,information &C ){ LBook *p=L->next; LReader *q=S->next; Info *s=C->next; char n[10],m[10]; printf("請輸入讀者證號和圖書號進行歸還:\n"); scanf("%s%s",m,n); while(p){ if(strcmp(p->book_id,n)==0){ s=new Info; strcpy(s->book_id,"已歸還"); //原來的信息填寫為已歸還,做個記錄,也可以刪掉 都行啊; strcpy(s->book_name,"已歸還");//刪掉代碼:略了 p->kucun++; //歸還了,庫存+1 Info *S=C; Info *P=S->next; S->next=P->next; delete P; break; while(q){ if(strcmp(s->read_id,m)==0){ // strcpy(q->borrow_book,"暫無"); strcpy(p->book_id,0); return OK; } q=q->next; } } p=p->next; } return ERROR; } //保存到txt中 --路徑默認選擇到我的桌面,可更改 void saveBook(LinkBook L,LinkReader S,information &C) { FILE *fp=NULL; LBook *p=L->next; LReader *q=S->next; Info *s=C->next; fp=fopen("C:/Users/23211/Desktop/books.txt","w+"); while(p){ fprintf(fp,"%s %s %s %d %d\n",p->book_id,p->author,p->book,p->num,p->kucun); p=p->next; } fp=fopen("C:/Users/23211/Desktop/Readers.txt","w+"); while(q){ fprintf(fp,"%s %s %s\n",q->read_id,q->reader,q->ssex); q=q->next; } fp=fopen("C:/Users/23211/Desktop/Borrow.txt","w+"); while(s){ fprintf(fp,"%s %s %s %s %s %s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2); s=s->next; } printf("更新完成!\n"); } //從文件中讀取 void ReadBook(LinkBook L,LinkReader S,information &C) { LBook *p=L->next; LReader *q=S->next; Info *s=C->next; p=new LBook; q=new LReader; s=new Info; FILE * fp=NULL; printf("--------------------------------------------------->\n"); printf("展開圖書信息:\n"); fp=fopen("C:/Users/23211/Desktop/books.txt","r"); while(fscanf(fp,"%s%s%s%d%d",p->book_id,p->author,p->book,&p->num,&p->kucun)!=EOF){ printf("圖書序號:%s,作者:%s,書名:%s,數量:%d,庫存:%d\n",p->book_id,p->author,p->book,p->num,p->kucun); p-p->next; } printf("--------------------------------------------------->\n"); printf("展開讀者信息:\n"); fp=fopen("C:/Users/23211/Desktop/Readers.txt","r"); while(fscanf(fp,"%s%s%s\n",q->read_id,q->reader,q->ssex)!=EOF){ printf("讀者號:%s,姓名:%s,性別:%s\n",q->read_id,q->reader,q->ssex); // q=q->next; } printf("--------------------------------------------------->\n"); printf("展開借閱信息\n"); fp=fopen("C:/Users/23211/Desktop/Borrow.txt","r"); while(fscanf(fp,"%s%s%s%s%s%s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2)!=EOF){ printf("圖書號:%s\n,圖書名:%s\n,讀者號:%s\n,讀者姓名:%s\n,借閱日期:%s\n,歸還日期:%s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2); s=s->next; } printf("--------------------------------------------------->\n"); printf("提取完成完成!\n"); } void function(){//功能菜單 printf("<------------------------------------------------>\n"); printf("<-----------0-歡迎來到鱔溪校區閱覽室!-0---------->\n"); printf("<------------------------------------------------>\n"); printf("<---------------請選擇以下功能------------------->\n"); printf("<---------------1.初始圖書信息------------------->\n"); printf("<---------------2.初始讀者信息------------------->\n"); printf("<---------------3.查看所有圖書信息--------------->\n"); printf("<---------------4.查看所有讀者信息--------------->\n"); printf("<---------------5.添加讀者借閱信息--------------->\n"); printf("<---------------6.刪除讀者信息------------------->\n"); printf("<---------------7.刪除圖書信息------------------->\n"); printf("<---------------8.修改讀者信息------------------->\n"); printf("<---------------9.修改圖書信息------------------->\n"); printf("<---------------10.查詢讀者信息------------------>\n"); printf("<---------------11.查詢圖書信息------------------>\n"); printf("<---------------12.查詢借閱信息------------------>\n"); printf("<---------------13.導出讀者、圖書和借閱信息------>\n"); printf("<---------------14.導入讀者,圖書和借閱信息------>\n"); printf("<---------------15.查看功能菜單------------------>\n"); printf("<---------------16.添加圖書信息------------------>\n"); printf("<---------------17.添加讀者信息------------------>\n"); printf("<---------------18.歸還圖書---------------------->\n"); printf("<-------------------0.退出----------------------->\n"); } void tool(LinkBook L,LinkReader S,information &C){//功能實現 int i,choose; char n[MAXSIZE]; ElemType e; while(1){ printf("請輸入你要選擇的功能:\n請選擇:"); scanf("%d",&choose); switch(choose){ case 1: printf("請插入多少種不同的圖書:\n"); scanf("%d",&e); AddBook(L,e); break; case 2: printf("請選擇插入讀者數量:\n"); scanf("%d",&e); AddReader(S,e); break; case 3: DisBook(L); break; case 4: DisReader(S); break; case 5://添加讀者借閱信息 if(Borrow(L,S,C)) printf("添加成功!\n"); else printf("添加失敗!\n"); break; case 6: printf("請輸入要刪除的讀者號:\n"); scanf("%s",n); if(DelReader(S,n)){ printf("刪除成功!\n"); } else{ printf("該讀者號不存在,請檢查是否有這個讀者號!\n"); } break; case 7: printf("請輸入要刪除的圖書序號:\n"); scanf("%s",n); if(DelBook(L,n)){ printf("刪除成功!\n"); } else{ printf("該圖書不存在,請檢查是否有這個圖書號!\n"); } break; case 8: printf("請輸入要修改的讀者號:\n"); scanf("%s",n); AlterReader(S,n); break; case 9: printf("請輸入要修改的圖書號:\n"); scanf("%s",n); AlterBook(L,n); break; case 10: printf("請輸入要查詢的讀者號:\n"); scanf("%s",n); GetReader(S,n); break; case 11: printf("請輸入要查詢的圖書序號:\n"); scanf("%s",n); GetBook(L,n); break; case 12://遍歷借閱信息 DisBorrow(C); break; case 13://導出讀者、圖書和借閱信息 saveBook(L,S,C); break; case 14://導入讀者、圖書和借閱信息 ReadBook(L,S,C); break; case 15://功能菜單 function(); break; case 16: printf("插入圖書信息:\n"); printf("請輸入圖書號和數量:\n"); scanf("%s%d",n,&e); InsertBook(L,n,e); break; case 17: printf("插入讀者信息:\n"); printf("請輸入讀者號:\n"); scanf("%s",n); InsertReader(S,n); break; case 18://歸還 Return(L,S,C); break; case 0://退出程序 printf("拜拜!\n"); exit(0); default: printf("不在選擇范圍內,更多功能請等待擴展。\n請重新選擇!\n"); } } } int main() { LinkBook L; LinkReader S; information C; InitReader(S); InitBook(L); Information(C); function(); tool(L,S,C); }
寫的比較基礎,也更容易擴展。