#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Max 3
typedef struct book
{
char book_num[10];
char book_name[20];
char book_writer[10];
int book_kc;
int book_xy;
struct book *next;
}BK;
typedef struct borrow
{
char borrow_book_num[10];
char limit_date[8];
}BO;
typedef struct reader
{
char reader_num[10];
char reader_name[10];
int right;
BO borrow[Max];
struct reader *next;
}RD;
BK *h_book;
RD *h_reader;
void Login(); /*登陸*/
int Menu(); /*主菜單*/
void Menu_select(); /*主菜單選擇函數*/
void Init(); /*初始化*/
void Init_reader(); /*初始化讀者*/
void Init_book(); /*初始化圖書*/
void Insert_New_Book(); /*新書入庫*/
int Find(); /*查找菜單*/
void Find_Select(); /*查找菜單選擇函數*/
void Find_Reader(); /*查找讀者信息*/
void Find_Book(); /*查找圖書信息*/
void Print_reader(); /*打印讀者信息*/
void Print_book(); /*打印圖書信息*/
void Borrow_Book(); /*借書函數*/
void Return_Book(); /*還書函數*/
void Save(); /*保存信息*/
void Save_Reader(); /*保存讀者信息*/
void Save_Book(); /*保存圖書信息*/
void Load(); /*加載信息*/
void Load_Reader(); /*加載讀者信息*/
void Load_Book(); /*加載圖書信息*/
void Login()/*登陸*/
{
system("cls");
printf("\n\n\n\t\t\t歡迎登陸本系統\n");
printf("\n\n\t\t 系統版權所有\n\n\n\n\n\n\n");
printf("\n\n\n\t\t 按 任 意 鍵 進 入 系 統 ...");
getchar(); system("cls");
}
int Menu() /*主菜單*/
{ int sn;
printf("\n\t\t圖書管理系統主菜單\n");
printf("=================================================\n");
printf("*\t0----退出系統 *\n");
printf("*\t1----新書入庫 *\n");
printf("*\t2---- 查詢 *\n");
printf("*\t3----借書登記 *\n");
printf("*\t4----還書管理 *\n");
printf("=================================================\n");
printf("請選擇相應代碼:");
for(;;)
{ scanf("%d",&sn);
fflush(stdin);
if(sn<0||sn>4)
printf("\n錯誤!請重新輸入:");
else break;
}
return sn;
}
void Menu_select()/*主菜單選擇函數*/
{
for(;;) /*循環調用模式,保證能進行重複操作*/
{
switch(Menu()) /*功能選擇*/
{ case 0:
system("cls");/*清楚屏幕先前的顯示內容*/
Save();
printf("\n\n\t文件保存成功!\n");
printf("\n\n\t歡迎下次使用本系統!\n");
getchar();
exit(0);
case 1:Insert_New_Book();break;
case 2:Find_Select();break;
case 3:Borrow_Book();break;
case 4:Return_Book();break;
default:printf("\n錯誤!");exit(0);
}
}
}
void Init() /*初始化*/
{
Init_reader();
Init_book();
}
void Init_reader() /*初始化讀者信息*/
{
RD *p0;
int i;
printf("\n讀者初始化開始,請輸入讀者信息..\n包括編號.姓名..\n");
p0=(RD*)malloc(sizeof(RD));
h_reader=p0;
printf("\n請輸入讀者的信息:\n");
printf("ReaderNo.:"); /*輸入讀者編號(唯一)*/
scanf("%s",p0->reader_num);
printf("ReaderName:"); /*輸入讀者姓名(不唯一)*/
scanf("%s",p0->reader_name);
p0->right=0;
for(i=0;i<Max;i++)
{
strcpy(p0->borrow[i].borrow_book_num,"0"); /*所借圖書直接置爲0(即沒有借書)*/
strcpy(p0->borrow[i].limit_date,"0");
}
p0->next=NULL;
printf("\n讀者信息初始化完畢!按任意鍵繼續下一步操作..\n");
getchar();
system("cls");
}
void Init_book() /*初始化圖書信息*/
{
BK *p0;
printf("\n圖書初始化開始,請輸入圖書信息..\n包括編號.書名.數量..\n");
p0=(BK*)malloc(sizeof(BK));
h_book=p0;
printf("\n請輸入圖書信息:\n");
printf("BookNo.:"); /*輸入圖書編號(唯一)*/
scanf("%s",p0->book_num);
printf("BookName:"); /*輸入圖書名稱*/
scanf("%s",p0->book_name);
printf("BookWriter:"); /*輸入圖書作者*/
scanf("%s",p0->book_writer);
printf("Number:"); /*輸入圖書數量*/
scanf("%d",&p0->book_kc);
p0->book_xy=p0->book_kc; /*開始時圖書現有量和庫存量相等*/
p0->next=NULL;
printf("\n圖書信息初始化完畢!按任意鍵繼續下一步操作..\n");
getchar();
system("cls");
}
void Insert_New_Book()/*新書入庫*/
{
BK *p,*p0,*p1;
p=p1=h_book;
printf("\n新書入庫模塊...\n");
printf("\n請輸入新書信息..\n包括書號.書名.數量..\n");
p0=(BK *)malloc(sizeof(BK));
printf("BookNo.:");
scanf("%s",p0->book_num);
while(strcmp(p0->book_num,p1->book_num)!=0&&p1->next!=NULL)
p1=p1->next;
if(strcmp(p0->book_num,p1->book_num)==0) /*此處分兩種情況,若圖書編號存在,則直接進庫,只須輸入書的數量*/
{
printf("\n此編號圖書已存在!!直接入庫!\n");
printf("Number:");
scanf("%d",&p0->book_kc);
p1->book_kc+=p0->book_kc;
p1->book_xy+=p0->book_kc;
}
else/*若不存在,則需要輸入其他的信息 ,然後在進行插入操作*/
{
printf("BookName:");
scanf("%s",p0->book_name);
printf("BookWriter:");
scanf("%s",p0->book_writer);
printf("Number:");
scanf("%d",&p0->book_kc);
while(p->next)
{
p=p->next;
}
if(h_book==NULL) h_book=p0; /*此處分兩種情況,鏈表中沒有數據,head直接指向p0處*/
else p->next=p0; /*此處分兩種情況,鏈表中有數據,鏈表中最後元素的next指向p0處*/
p0->next=NULL;
p0->book_xy=p0->book_kc;
}
printf("\n新書入庫完畢!按任意鍵繼續下一步操作..\n");
getchar();
system("cls");
}
int Find() /*查找菜單*/
{
int sn;
printf("\n\t\t信息查詢菜單\n");
printf("=================================================\n");
printf("*\t0----返回上級 \t*\n");
printf("*\t \t*\n");
printf("*\t1----查找圖書 2----查找讀者 \t*\n");
printf("*\t \t*\n");
printf("*\t3----打印圖書 4----打印讀者 \t*\n");
printf("=================================================\n");
printf("請選擇相應代碼:");
for(;;) /*循環調用模式,保證能進行重複操作*/
{
scanf("%d",&sn);
fflush(stdin);
if(sn<0||sn>4)
printf("\n錯誤!請重新輸入:");
else break;
}
return sn;
}
void Find_Select() /*查找菜單選擇函數*/
{
system("cls");
for(;;) /*循環調用模式,保證能進行重複操作*/
{
switch(Find()) /*功能選擇*/
{
case 0:system("cls"); Menu_select(); break;
case 1:Find_Book();break;
case 2:Find_Reader();break;
case 3:Print_book();break;
case 4:Print_reader();break;
default:printf("\n錯誤!");exit(0);
}
}
}
void Find_Reader() /*查找讀者信息*/
{
RD *p;
int i;
char find_reader[10];
p=h_reader;
printf("\n讀者信息查詢模塊\n");
printf("\n請輸入你要查詢讀者編號:");
scanf("%s",find_reader);
while(strcmp(p->reader_num,find_reader)!=0&&p->next)
p=p->next;
if(strcmp(p->reader_num,find_reader)==0)
{
printf("\n讀者編號:%s的信息爲:\n",find_reader);
printf("ReaderNo.\tReaderName"); /*此處這樣處理,是爲了能實現一個讀者能借多本書 Max 可以改*/
printf("\n");
printf("\t%s\t\t%s",p->reader_num,p->reader_name);
for(i=0;i<Max;i++)
{
printf("\n");
printf("BorrowBookNum%d",i+1);
printf("\tReturn%dLimitDate",i+1);
printf("\n");
printf("\t%s",p->borrow[i].borrow_book_num);
printf("\t\t%s",p->borrow[i].limit_date);
}
printf("\n");
}
else
printf("\n此讀者編號不存在,請覈對!按任意鍵返回...");
getchar();
system("cls");
}
void Find_Book() /*查找圖書信息*/
{
BK *p;
char find_book[10]; /*功能很簡單,讀者編號唯一,查找只須一次遍歷*/
p=h_book;
printf("\n圖書信息查詢模塊\n");
printf("\n請輸入你要查詢圖書編號:");
scanf("%s",find_book);
while(strcmp(p->book_num,find_book)!=0&&p->next)
p=p->next;
if(strcmp(p->book_num,find_book)==0)
/*找到了就打印,否則提示不存在,或出錯*/
{
printf("\n圖書編號:%s的信息爲:\n",find_book);
printf("\nBookNo.\t\tBookName\tBookWriter\tXianYou \tKuCun\n");
printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xy,p->book_kc);
}
else
printf("\n此圖書編號不存在,請覈對!按任意鍵返回...");
getchar(); system("cls");
}
void Print_reader() /*打印讀者信息*/
{
RD *p;
int i;
p=h_reader;
printf("\n讀者信息如下:\n\n");
printf("ReaderNo.\tReaderName"); /*此處這樣處理,是爲了能實現一個讀者能借多本書 Max 可以改*/
printf("\n");
while(p!=NULL) /*遍歷鏈表一次就可以了*/
{
printf("\t%s\t\t%s",p->reader_num,p->reader_name);
for(i=0;i<Max;i++)
{
printf("\n");
printf("BorrowBookNum%d",i+1);
printf("\tReturn%dLimitDate",i+1);
printf("\n");
printf("\t%s",p->borrow[i].borrow_book_num);
printf("\t\t%s",p->borrow[i].limit_date);
}
printf("\n");
p=p->next;
}
printf("\n讀者信息打印完畢!按任意鍵繼續下一步操作..");
getchar();
system("cls");
}
void Print_book() /*打印圖書信息*/
{
BK *p;
p=h_book;
printf("\n圖書信息如下:\n\n");
printf("BookNo.\t\tBookName\tBookWriter\tXianYou \tKuCun\n");
/*直接打印所有圖書的信息,遍歷鏈表一次就可*/
while(p!=NULL)
{
printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xy,p->book_kc);
p=p->next;
}
printf("\n圖書信息打印完畢!按任意鍵繼續下一步操作..");
getchar();
system("cls");
}
void Borrow_Book() /*借書模塊*/
{
BK *p0; RD *p1;
char bo_num[10],rea_num[10],lim_date[8];
int i;
p0=h_book; p1=h_reader;
printf("\n借書模塊...\n");
printf("\n請輸入借書的讀者編號:"); /*先輸入借書的讀者信息*/
scanf("%s",rea_num);
while(p1->next!=NULL&&strcmp(rea_num,p1->reader_num)!=0) /*遍歷一次讀者鏈表,判斷讀者是否存在*/
p1=p1->next;
if(p1->next==NULL&&strcmp(rea_num,p1->reader_num)!=0) /*如果存在,則繼續,不存在就、則提示錯誤!*/
{
printf("\n此讀者編號不存在!按任意鍵返回..\n");
goto END;
}
printf("\n請輸入你要借的書的編號:");
scanf("%s",bo_num);
while(strcmp(bo_num,p0->book_num)!=0&&p0->next!=NULL) /*遍歷一次圖書鏈表,判斷此圖書是否存在*/
p0=p0->next;
if(p0->next==NULL&&strcmp(bo_num,p0->book_num)!=0) /*如果存在,則繼續,不存在就、則提示錯誤!*/
{
printf("\n此圖書編號不存在!按任意鍵返回..\n");
}
else if(p0->book_xy<=0) /*判斷此圖書現在是否還有庫存*/
{
printf("\n抱歉,此書已借完!請等待新書的到來!!\n按任意鍵返回....");
}
else if(p1->right>=Max) /*判斷此讀者借書權限是否已達最大*/
{
printf("\n不好意思,借書數目已滿!不能借書!\n按任意鍵返回....");
}
else if(strcmp(p1->borrow[0].borrow_book_num,"0")!=0) /*此讀者若已經借書,再判斷此讀者是否要借兩本一樣的書*/
{
for(i=0;i<Max;i++) /*遍歷一次讀者所借的書,如果發現有重複,則結束*/
{
if(strcmp(p1->borrow[i].borrow_book_num,bo_num)==0)
{
printf("\n抱歉!同一個讀者不能同借兩本相同的書!\n");
}
else if(strcmp(p1->borrow[i].borrow_book_num,"0")==0) /*如果沒有重複*/
{
printf("\n請輸入你要歸還圖書的日期:");
scanf("%s",lim_date);
strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num); /*記錄所借書號,並且借書數目加一,現存量減一*/
strcpy(p1->borrow[p1->right-1].limit_date,lim_date);
p0->book_xy--;
printf("\n讀者編號%s借書完畢!按任意鍵繼續下步操作..",p1->reader_num);
}
}
}
else /*此讀者從未借過書*/
{
printf("\n請輸入你要歸還圖書的日期:");
scanf("%s",lim_date);
strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num); /*記錄所借書號,並且借書數目加一,現存量減一*/
strcpy(p1->borrow[p1->right-1].limit_date,lim_date);
p0->book_xy--;
printf("\n讀者編號%s借書完畢!按任意鍵繼續下步操作..",p1->reader_num);
}
END:getchar(); system("cls");
}
void Return_Book() /*還書模塊*/
{
BK *p; RD *q;
int i,j,find=0;
char return_book_num[10],return_reader_num[10];
p=h_book; q=h_reader;
printf("\n還書模塊...\n");
printf("\n請輸入要還書的讀者編號:"); /*基本同上*/
scanf("%s",return_reader_num); /*注意:數組的輸入沒有&*/
while(q->next!=NULL&&strcmp(return_reader_num,q->reader_num)!=0)
q=q->next;
if(q->next==NULL&&strcmp(return_reader_num,q->reader_num)!=0)
{
find=2;/*設置標誌,用於判斷讀者是否借了此書或是否出錯提前結束,若提前出錯,則find=2,若借了,則find=1,若沒借爲find=0*/
printf("\n此讀者編號不存在!按任意鍵返回..\n");
goto end;
}
printf("\n請輸入讀者還書的編號:");
scanf("%s",return_book_num);
while(p->next!=NULL&&strcmp(return_book_num,p->book_num)!=0)
p=p->next;
if(p->next==NULL&&strcmp(return_book_num,p->book_num)!=0)
{
find=2;/*設置標誌,用於判斷讀者是否借了此書或是否出錯提前結束,若提前出錯,則find=2,若借了,則find=1,若沒借爲find=0*/
printf("\n錯誤!此圖書編號不存在!按任意鍵返回..\n");
goto end;
}
for(i=0;i<Max;i++)
if(strcmp(return_book_num,q->borrow[i].borrow_book_num)==0) /*如果此讀者借了此書*/
{
find=1; /*設置標誌,用於判斷讀者是否借了此書或是否出錯提前結束,若提前出錯,則find=2,若借了,則find=1,若沒借爲find=0*/
for(j=i;j<Max-1;j++)
{
strcpy(q->borrow[j].borrow_book_num,q->borrow[j+1].borrow_book_num);
strcpy(q->borrow[j].limit_date,q->borrow[j+1].limit_date);
}
strcpy(q->borrow[Max-1].borrow_book_num,"0");
strcpy(q->borrow[Max-1].limit_date,"0");
p->book_xy++;
q->right--;
printf("\n編號%s的讀者還書完畢!按任意鍵繼續下步操作..",return_reader_num);
}
if(find==0) /*爲什麼有個find==0,因爲遍歷時循環Max次,如循環完畢還沒有找到,則說明讀者沒有藉此書,find用來保證只打印一次結果,否則每循環一次就會打印一個結果*/
printf("\n錯誤!此讀者未藉此書!按任意鍵返回..\n"); /*如果遍歷讀者所借的書號,發現讀者未藉此書,則提示錯誤!*/
end: getchar(); system("cls");
}
void Save() /*保存信息*/
{
Save_Reader();
Save_Book();
}
void Save_Reader() /*保存讀者信息*/
{
FILE *fp_reader; /*創建文件型指針*/
RD *p,*p0;
p=h_reader;
if((fp_reader=fopen("Reader.dat","wb"))==NULL) /*創建文件,進行保存*/
{
printf("\n文件保存失敗!\n請重新啓動本系統...\n");
exit(0);
}
while(p!=NULL)
{
if(fwrite(p,sizeof(RD),1,fp_reader)!=1) /*將鏈表中的信息寫入文件中*/
printf("\n寫入文件失敗!\n請重新啓動本系統!\n");
p0=p;
p=p->next;
free(p0); /*釋放所有結點*/
}
h_reader=NULL;
fclose(fp_reader); /*關閉文件*/
}
void Save_Book() /*保存圖書信息*/
{
FILE *fp_book; /*創建文件型指針*/
BK *p,*p0;
p=h_book;
if((fp_book=fopen("Book.dat","wb"))==NULL) /*創建文件,進行保存*/
{
printf("\n文件保存失敗!\n請重新啓動本系統...\n");
exit(0);
}
while(p!=NULL)
{
if(fwrite(p,sizeof(BK),1,fp_book)!=1) /*將鏈表中的信息寫入文件中*/
printf("\n寫入文件失敗!\n請重新啓動本系統!\n");
p0=p;
p=p->next;
free(p0);
}
h_book=NULL;
fclose(fp_book); /*關閉文件*/
}
void Load() /*加載信息*/
{
Load_Reader();
Load_Book();
}
void Load_Reader() /*加載讀者信息*/
{
RD *p1,*p2,*p3;
FILE *fp; /*創建文件型指針*/
fp=fopen("Reader.dat","rb"); /*打開文件*/
p1=(RD *)malloc(sizeof(RD));
fread(p1,sizeof(RD),1,fp);
h_reader=p3=p2=p1;
while(! feof(fp)) /*讀出信息,重新鏈入鏈表*/
{ p1=(RD *)malloc(sizeof(RD));
fread(p1,sizeof(RD),1,fp);
p2->next=p1;
p3=p2;
p2=p1;
}
p3->next=NULL;
free(p1);
fclose(fp); /*關閉文件*/
}
void Load_Book() /*加載圖書信息*/
{
BK *p1,*p2,*p3;
FILE *fp; /*創建文件型指針*/
fp=fopen("Book.dat","rb"); /*打開文件*/
p1=(BK *)malloc(sizeof(BK));
fread(p1,sizeof(BK),1,fp);
h_book=p3=p2=p1;
while(! feof(fp)) /*讀出信息,重新鏈入鏈表*/
{ p1=(BK *)malloc(sizeof(BK));
fread(p1,sizeof(BK),1,fp);
p2->next=p1;
p3=p2;
p2=p1;
}
p3->next=NULL;
free(p1);
fclose(fp); /*關閉文件*/
}
void main()
{
FILE *fp_book,*fp_reader; /*創建文件型指針*/
Login();
if((fp_book=fopen("Book.dat","rb"))==NULL||(fp_reader=fopen("Reader.dat","rb"))==NULL)
{
Init();
}
else Load();
Menu_select(); /*調用主菜單*/
}