圖書管理系統C語言課程設計2

#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(); /*調用主菜單*/

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章