C語言: 簡易圖書管理系統


  這只是一個簡易的圖書管理系統,雖然它有千余行代碼,不過終究是個簡單基本的東西。

  在Linux系統下,用Vim編寫,如要在Windows上運行則需要一些改動,主要是一些調用系統函數的改動。如Windows下的cls命令在Linux下是clear,延時所用到的Sleep()函數在Windows和Linux下調用的頭文件不同(unistd.h為Linux系統所用,windows.h為Windows系統所用)。在代碼已用注釋標識,如要在Windows下運行的話,只需要將注釋內容交換即可。

   個人就簡單的管理系統進行的一個擴展和完善:

    首先是健壯性,對於輸入的數據不符合或非法,筆者都進行了一個判斷和對話詢問,盡量做到人性化。

    其次,使用字符的輸入然后對其進行判斷和返回值,避免了造成崩潰的情況發生。

    充分發揮函數作用,將每一個函數做好分工,方便調試和調用。

    界面進行了適當的美化,保證人機的友好交互。

    使用了一些實用的擴展功能。

  對於一些擴展的說明:

    清空輸入緩存區方法,比如我們之用使用了回車符確認了某操作,那么下一次使用gets()或其它的函數如會吸收到這個回車符並執行。那么我們如何將這個回車符清掉呢,如我們想要暫停而不要調用系統函數呢,是要寫兩次getch()么,這樣也不美觀吧。那么我們在頭文件定義下方定義以下內容的宏定義。需要調用時,只需輸入Clear_buffer就可以了,當然名稱可以自定義。(注意以下內容中的 "\" 是一個連接符,也就是 #define 宏定義是一行定義,而這樣不美觀,因此使用此來連接語句)

1    #define Clear_buffer\
2  {\ 3        char ch;\ 4        while((ch = getchar()) != EOF && ch != '\n');\ 5        }

   當然,你也可以使用setbuf();fflush(stdin); rewind(stdin)等函數來清空,不過因為編程環境不同,此函數在Linux系統下無效,因此以上的方法為萬全之策。

   大概就這樣吧,上完整代碼吧。

 1 // 圖書管理系統 V1.0  2 //
 3 // -by 404NotFound945  4 //--------------------------------------------  5 //
 6 // Linux系統下使用Vim編寫  7 // 作者: 404NotFound945  8 // 時間: 2018/05/10  9 //
 10 // 注意:  11 // 若要在DOS內核中運行部分命令需改動  12 // 如system("clear") > system("cls")  13 // 需改動部分已用//注明  14 // 且使用在Windows系統下的命令時代替  15 //--------------------------------------------
 16 
 17 #include <stdio.h>
 18 #include <stdlib.h>//system()函數庫
 19 #include <string.h>//strcmp(), strcpy()函數庫
 20 #include <unistd.h>//Linux下sleep()函數庫  21 //#include <windows.h>//Windows下Sleep()函數庫
 22 
 23 #define BN BookNumber//宏定義增加圖書的數量
 24 #define RN RealNumber//宏定義存在圖書的數量
 25 // 將清空緩存區封裝成一個函數方便調用  26 // 注意:  27 // 根據C99規定最外層的花括號前必須有空格  28 // 其中 '\' 為語句連接符 為了解決單行寫多個語句的尷尬
 29 #define Clear_buffer\
 30  {\  31     char ch;\  32     while((ch = getchar()) != EOF && ch != '\n');\  33  }  34 
 35 int BN; //增加圖書的數量使用全局變量方便
 36 int RN = 0;//實際庫存圖書數量
 37 
 38 typedef struct books //定義圖書結構體
 39 {  40     char name[20];  41     char isn[20];  42     char author[20];  43     float price;  44     int number;  45 }book;  46 book books[100000];  47 
 48 void border_x()//x軸邊框模板
 49 {  50     printf("\n\t\t\t -------------------------------------------------\n");  51 }  52 
 53 void border_y()//y軸邊框模板
 54 {  55     printf("\t\t\t |");  56 }  57 
 58 void project()//信息名稱模板
 59 {  60     printf("\n\t\t序號\t\t 名稱\t\t ISN\t\t 作者\t\t 價格\t\t 數量\n");  61 }  62 
 63 void info(int n)//信息模板
 64 {  65      printf("\t\t %2d \t\t %6s \t %6s \t %6s \t %5.2f \t %4d\n", n+1, books[n].name, books[n].isn, books[n].author, books[n].price, books[n].number);  66 }  67 
 68 void save()//保存數據
 69 {  70     FILE *fp;  71     fp = fopen("book.bin", "wb+");//以可追加數據的方式打開二進制文件  72     //判斷是否寫入文件成功  73     //fwrite 有兩種調用方式如下  74     //fwrite(buf, 1, sizeof(buf), fp) 和 fwirte(buf, sizeof(buf), 1, fp)  75     //網絡收集資料說 區別是前者寫入成功返回實際寫入的數據個數 后者是返回值 1  76     //
 77     //疑惑:  78     // 然而筆者按照此用法運用時,發現並非這樣,如下筆者調用的方式是返回值都為 1  79     // 但是在實際運用中卻是返回實際寫入數據的個數 RN
 80     if(((fwrite(&RN, sizeof(int), 1, fp)) == 1) && (fwrite(books, sizeof(book), RN, fp) == RN))  81         printf("寫入文件成功.\n\n");  82     else
 83  {  84         printf("寫入文件失敗.\n\n");  85         return;  86  }  87  fclose(fp);  88 }  89 
 90 void load()//載入數據
 91 {  92     int i;  93     FILE *fp;  94     fp = fopen("book.bin", "rb"); //以只讀方式打開二進制文件
 95     if(fp != NULL)  96  {  97         fread(&RN, sizeof(int), 1, fp);  98         fread(books, sizeof(book), RN, fp);  99         printf("載入文件成功.\n");  100  }  101     else 
 102  {  103         printf("\n\n未找到數據文件book.bin,載入文件失敗.\n\n");  104         printf("將新建數據文件book.bin .\n\n");  105         return;  106  }  107  fclose(fp);  108 }  109 
 110 void delete_file()//刪除歷史文件 
 111 {  112     FILE *fp;  113     if(ask() == 1)  114  {  115         system("rm book.bin");  116         //linux系統下的刪除文件命令  117         //system("del /q /f book.bin");
 118         fp = fopen("book.bin", "r");  119         if(fp == NULL)  120  {  121             printf("刪除數據文件成功.\n\n");  122             printf("但緩存中結構體數據依然存在.\n");  123             printf("是否清空這些緩存的數據?\n");  124             if(ask() == 1)  125  {  126                 memset(books, 0, sizeof(books));//清空結構體數據
 127                 RN = 0;//清空庫存數量
 128                 printf("緩存數據已清空.\n\n");  129  }  130             else
 131  {  132                 printf("緩存數據未清空.\n\n");  133  }  134  }  135         else
 136             printf("刪除數據文件失敗.\n\n");  137  }  138     else
 139         printf("文件保留成功.\n\n");  140     printf("回車符返回主菜單.\n");  141  getchar();  142  getchar();  143 
 144 }  145 
 146 int ask()//用於確認操作
 147 {  148     char choice[10];  149     printf("是否執行該操作? y/n\n");  150     scanf("%s", choice);  151     if(strcmp(choice, "y") == 0 || strcmp(choice, "Y") == 0)  152         return 1;  153     else
 154         return 0;  155 }  156 
 157 int choice()//用於選擇操作
 158 {  159     char choice[20];  160     printf("請輸入:\n");  161     scanf("%s", choice);  162     if(strcmp(choice, "1") == 0)  163         return 1;  164     else if(strcmp(choice, "2") == 0)  165         return 2;  166     else if(strcmp(choice, "3") == 0)  167         return 3;  168     else if(strcmp(choice, "4") == 0)  169         return 4;  170     else if(strcmp(choice, "5") == 0)  171         return 5;  172     else if(strcmp(choice, "6") == 0)  173         return 6;  174     else if(strcmp(choice, "7") == 0)  175         return 7;  176     else if(strcmp(choice, "8") == 0)  177         return 8;  178     else if(strcmp(choice, "9") == 0)  179         return 9;  180     else if(strcmp(choice, "10") == 0)  181         return 10;  182     else
 183         printf("輸入格式有誤,請重試.\n");  184 }  185 
 186 void display()  187 {  188     int i;  189  project();  190     for(i = 0; i < RN; i++)  191  {  192  info(i);  193  }  194     printf("\n回車符返回主菜單\n");  195 // getchar();//用於吸收上一次輸入到緩存區的數據  196 // fflush(stdin);//清空上一次輸入緩存區 Linux系統下無效  197 // while((ch = getchar() != '\n' && ch != EOF));  198 // setbuf(stdin, NULL);
 199     Clear_buffer//調用宏定義的函數清空上一次輸入緩存區數據 與上兩注釋語句等效
 200  getchar();  201 
 202 }  203 
 204 int check_name(char name[])//檢查輸入書名是否與庫存圖書相同
 205 {  206     int i, flag = 0;  207     for(i = 0; i < RN; i++)  208  {  209         if(strcmp(name, books[i].name) == 0)  210             flag++;  211  }  212     if(flag != 0)  213  {  214         printf("\n圖書名稱錄入失敗.\n");  215         printf("圖書名稱已存在,請重新輸入.\n\n");  216         return 1;  217  }  218      else
 219         return 0;  220 }  221 
 222 int check_isn(char isn[])//檢查圖書ISN碼
 223 {  224     int i, flag = 0;  225     for(i = 0; i < RN; i++)  226  {  227         if(strcmp(isn, books[i].isn) == 0)  228             flag++;  229  }  230     if(flag != 0)  231  {  232         printf("\n圖書ISN碼錄入失敗.\n");  233         printf("此圖書ISN碼已存在,請重新輸入.\n\n");  234         return 1;  235  }  236     else
 237         return 0;  238 }  239 int check_data(char data[], int judge)//判斷輸入數據是否合法 judge用來判斷是否為浮點型 1 為浮點型 0 為整型
 240 {  241     int i, n, flag = 0;  242     n = strlen(data);  243     for(i = 0; i < n; i++)  244  {  245         if(judge == 1)  246  {  247             if((data[i] != '.') && (data[i] != '0') && (data[i] != '1') && (data[i] != '2') && (data[i] != '3') && (data[i] != '4') && (data[i] != '5') && (data[i] != '6') && (data[i] != '7') && (data[i] != '8') && (data[i] != '9'))  248             flag++;  249  }  250         else
 251  {  252             if((data[i] != '0') && (data[i] != '1') && (data[i] != '2') && (data[i] != '3') && (data[i] != '4') && (data[i] != '5') && (data[i] != '6') && (data[i] != '7') && (data[i] != '8') && (data[i] != '9'))  253             flag++;  254  }  255  }  256     if(flag != 0)  257  {  258         printf("\n輸入數據不合法,請檢查后重試.\n");  259         return 1;  260  }  261     else
 262         return 0;  263 }  264 
 265 void addition()//增加數據
 266 {  267     BN = 0;  268     char price[10], number[10];  269     while(1)//循環輸入 直到滿足條件再退出 
 270  {  271         while(1)//檢查圖書庫中是否存在相同名稱圖書
 272  {  273             printf("請輸入第 %d 本圖書的名稱:\n", BN+1);  274             scanf("%s", books[RN].name);//RN為庫存圖書數量
 275             if(check_name(books[RN].name) == 0)  276             break;  277  }  278         while(1)//檢查圖書庫中是否存在相同ISN碼圖書
 279  {  280             printf("ISN 碼:\n");  281             scanf("%s", books[RN].isn);  282             if(check_isn(books[RN].isn) == 0)  283             break;  284  }  285         printf("作者:\n");  286         scanf("%s", books[RN].author);  287         while(1)//檢查輸入是否有效
 288  {  289             printf("價格:\n");  290             scanf("%s", price);  291             if((check_data(price, 1)) == 0)  292             break;  293  }  294         books[RN].price = atof(price);//字符轉浮點型
 295         while(1)  296  {  297             printf("數量:\n");  298             scanf("%s", number);  299             if((check_data(number, 0)) == 0)  300             break;  301  }  302         books[RN].number = atoi(number);//字符轉整型
 303         RN++;  304         BN++;  305         printf("圖書已添加成功.\n\n");  306         if(RN >= 100000)  307  {  308             printf("已達庫存上限 100000 本圖書.\n");  309             printf("請清理后再錄入.\n");  310             printf("回車符返回主菜單.\n");  311  Clear_buffer  312  getchar();  313  }  314         else
 315  {  316             printf("是否繼續添加圖書?\n");  317             if(ask() != 1)  318                 break;  319  }  320  }  321     printf("已成功添加了 %d 本圖書.\n\n", BN);  322 }  323 
 324 void delete()//刪除數據
 325 {  326     int i, mark = -1, flag = 0;//檢查點 標記點
 327     char name[20];  328     mark = seek(2);  329     if(mark != -1)  330  {  331         printf("是否刪除此圖書?\n");  332         if(ask() == 1)  333  {  334            for( i = 0; i < RN; i++)  335  {  336                 strcpy(books[mark].name, books[mark+1].name);  337                 strcpy(books[mark].isn, books[mark+1].isn);  338                 strcpy(books[mark].author, books[mark+1].author);  339                 books[mark].price = books[mark+1].price;  340                 books[mark].number = books[mark+1].number;  341  }  342            RN--;//圖書數量減少
 343            printf("圖書刪除成功.\n\n");  344            printf("是否繼續進行刪除操作?\n");  345            if(ask() == 1)  346  delete();  347            else
 348  {  349                printf("回車符返回主菜單.\n");  350  getchar();  351  getchar();  352  }  353  }  354         else
 355  {  356            printf("已保留此圖書.\n\n");  357            printf("是否繼續進行刪除操作?\n");  358            if(ask() == 1)  359  delete();  360            else
 361  {  362                 printf("回車符返回主菜單...\n");  363  getchar();  364  getchar();  365  }  366  }  367  }  368     else
 369  {  370         printf("未找到此圖書,請檢查輸入信息.\n\n");  371         printf("是否繼續進行刪除操作?\n");  372         if(ask() == 1)  373  delete();  374         else
 375  {  376             printf("回車符退出操作,返回主菜單\n");  377  getchar();  378  getchar();  379  }  380  }  381 }  382 
 383 int seek(int state)//查找數據  384 // state 為狀態標志  385 // 1 為單純使用本函數查找  386 // 2 為刪除函數使用此函數查找  387 // 3 為修改函數使用此函數查找
 388 {  389     int i, mark = -1,flag = 0, option, flags[1000];  390     //flags[1000]用來統計同一作者圖書的序號 option用於選擇操作 flag用來判斷是否有結果 
 391     char name[20], author[20], isn[20], choices[10];//choices[10]選擇操作序號 與choice() 不一樣序號大小范圍大  392     //判斷是否有其它函數進行調用 如有則返回對應值
 393     for(i = 0; i < 1000; i++)  394         flags[i] = -1;//初始化其中的值全為-1 以免與圖書的序號沖突
 395     if(state == 1)  396         printf("\n||無其它函數調用此函數.\n\n");  397     else if(state == 2)  398         printf("\n||正在調用查找函數...\n\n");  399     else if(state == 3)  400         printf("\n||正在調用查找函數...\n\n");  401     printf("請選擇查找信息的條件:\n");  402     printf("\t\t\t 1.名稱 2.作者 3.ISN碼\n");  403     option = choice();  404     switch(option)  405  {  406         case 1:  407             printf("按圖書名稱查找\n");  408             printf("請輸入查找圖書名稱:\n");  409             scanf("%s", name);  410             for(i = 0; i < RN; i++)  411  {  412                 if(strcmp(name, books[i].name) == 0)  413  {  414                     flag++;  415                     mark = i;  416  }  417  }  418             if(flag != 0)  419  {  420                 printf("已找到此信息匹配的圖書\n");  421                 printf("該圖書信息如下:\n");  422  project();  423  info(mark);  424                 printf("\n");  425                 if(state != 1)  426                    return mark;  427                 else
 428  {  429                     printf("是否繼續進行查找圖書?\n");  430                     if(ask() == 1)  431                        seek(1);  432                     else
 433  {  434                        printf("回車符返回主菜單.\n");  435  getchar();  436  getchar();  437  }  438  }  439  }  440             else
 441  {  442                 printf("未找到與此信息匹配的圖書.\n\n");  443                 printf("請檢查輸入信息.\n");  444                 if(state != 1)  445  {  446                      printf("是否繼續進行查找來選擇需要操作的圖書?\n");  447                      if(ask() == 1)  448  seek(state);  449                      else
 450  {  451                         printf("回車符返回上一步.\n");  452  getchar();  453  getchar();  454                         return -1;  455  }  456  }  457                 else
 458  {  459                     printf("是否繼續進行查找操作?\n");  460                     if(ask() == 1)  461                          seek(1);  462                     else
 463  {  464                          printf("回車符返回主菜單.\n");  465  getchar();  466  getchar();  467  }  468  }  469  }  470             break;  471         case 2://考慮多個同名作者的情況
 472             printf("按圖書作者查找.\n");  473             printf("請輸入查找圖書作者:\n");  474             scanf("%s", author);  475             for(i = 0; i < RN; i++)  476  {  477                 if(strcmp(author, books[i].author) == 0)  478  {  479                     flag++;  480                     if(flag != 0)  481  {  482                         flags[i] = i;  483  }  484  }  485  }  486             if(flag != 0)  487  {  488                 printf("已找到此信息匹配的圖書\n");  489                 printf("該圖書信息如下:\n");  490  project();  491                 for(i = 0; i < 1000; i++)  492  {  493                     if(flags[i] != -1)  494  info(flags[i]);  495  }  496                 if(state != 1)  497  {  498                     printf("請選擇你要操作的圖書序號:\n");  499                     while(1)  500  {  501                         scanf("%s", choices);  502                         if(check_data(choices, 0) == 0)  503  {  504                             for(i = 0; i < 1000; i++)  505  {  506                                 if(flags[i] == atoi(choices) - 1)  507                                     mark = flags[i];  508  }  509                             if(mark != -1)//mark 初始值為 -1 如改變則返回值
 510                                 return mark;//實際的存儲地址從0地址開始 因此-1
 511                             else
 512  {  513                                 printf("沒有那個選項.\n");  514                                 printf("是否重試?\n");  515                                 if(ask() == 0)  516                                     return -1;  517                                 printf("請重試輸入:\n");  518  }  519  }  520                         else
 521  {  522                             printf("沒有那個選項.\n");  523                             printf("是否重試?\n");  524                             if(ask() == 0)  525                                 return -1;  526                             printf("請重新輸入:\n");  527  }  528  }  529  }  530                 else
 531  {  532                     printf("是否繼續進行查找圖書?\n");  533                     if(ask() == 1)  534                        seek(1);  535                     else
 536  {  537                        printf("回車符返回主菜單.\n");  538  getchar();  539  getchar();  540  }  541  }  542  }  543             else
 544  {  545                 printf("未找到與此信息匹配的圖書.\n\n");  546                 printf("請檢查輸入信息.\n");  547                 if(state != 1)  548  {  549                      printf("是否繼續進行查找來選擇需要操作的圖書?\n");  550                      if(ask() == 1)  551  seek(state);  552                      else
 553  {  554                         printf("回車符返回上一步.\n");  555  getchar();  556  getchar();  557                         return -1;  558  }  559  }  560                 else
 561  {  562                     printf("是否繼續進行查找操作?\n");  563                     if(ask() == 1)  564                          seek(1);  565                     else
 566  {  567                          printf("回車符返回主菜單.\n");  568  getchar();  569  getchar();  570  }  571  }  572  }  573             break;  574          case 3:  575             printf("按圖書ISN碼查找.\n");  576             printf("請輸入查找圖書ISN碼:\n");  577             scanf("%s", isn);  578             for(i = 0; i < RN; i++)  579  {  580                 if(strcmp(isn, books[i].isn) == 0)  581  {  582                     flag++;  583                     mark = i;  584  }  585  }  586             if(flag != 0)  587  {  588                 printf("已找到此信息匹配的圖書\n");  589                 printf("該圖書信息如下:\n");  590  project();  591  info(mark);  592                 printf("\n");  593                 if(state != 1)  594                    return mark;  595                 else
 596  {  597                     printf("是否繼續進行查找圖書?\n");  598                     if(ask() == 1)  599                        seek(1);  600                     else
 601  {  602                        printf("回車符返回主菜單.\n");  603  getchar();  604  getchar();  605  }  606  }  607  }  608             else
 609  {  610                 printf("未找到與此信息匹配的圖書.\n\n");  611                 printf("請檢查輸入信息.\n");  612                 if(state != 1)  613  {  614                      printf("是否繼續進行查找來選擇需要操作的圖書?\n");  615                      if(ask() == 1)  616  seek(state);  617                      else
 618  {  619                         printf("回車符返回上一步.\n");  620  getchar();  621  getchar();  622                         return -1;  623  }  624  }  625                 else
 626  {  627                     printf("是否繼續進行查找操作?\n");  628                     if(ask() == 1)  629                          seek(1);  630                     else
 631  {  632                          printf("回車符返回主菜單.\n");  633  getchar();  634  getchar();  635  }  636  }  637  }  638             break;  639          default:  640             printf("輸入有誤,請重新輸入.\n");  641             printf("請檢查后重新輸入.\n");  642             if(state != 1)  643  {  644                 printf("是否繼續進行查找來選擇需要操作的圖書?\n");  645                 if(ask() == 1)  646  seek(state);  647                 else
 648  {  649                     printf("回車符返回上一步.\n");  650  getchar();  651  getchar();  652                     return -1;  653  }  654  }  655             else
 656  {  657                 printf("是否繼續進行查找操作?\n");  658                 if(ask() == 1)  659                     seek(1);  660                 else
 661  {  662                     printf("回車符返回主菜單.\n");  663  getchar();  664  getchar();  665  }  666  }  667             break;  668  }  669 }  670 
 671 void modify()//修改數據
 672 {  673     int n, option;  674     char name[20], isn[20], author[20], price[10], number[10];  675     n = seek(3);  676     if( n != -1)  677  {  678         printf("請選擇要修改圖書的項目:\n");  679         printf("\t\t\t1.名稱 2.ISN 3.作者 4.價格 5.數量\n");  680         option = choice();  681         switch(option)  682  {  683             case 1:  684                 printf("修改此圖書名稱.\n");  685                 while(1)  686  {  687                       printf("請輸入修改后的名稱:\n");  688                       scanf("%s", name);  689                       if(check_name(name) == 0)  690                       break;  691  }  692  strcpy(books[n].name, name);  693                 if(strcmp(books[n].name, name) == 0)  694                     printf("圖書名稱修改成功.\n\n");  695                 else
 696                     printf("圖書名稱修改失敗.\n\n");  697                 printf("是否繼續修改操作?\n");  698                 if(ask() == 1)  699  modify();  700                 else
 701  {  702                     printf("回車符返回主菜單.\n");  703  getchar();  704  getchar();  705  }  706                 break;  707             case 2:  708                 printf("修改此圖書ISN碼.\n");  709                 while(1)  710  {  711                     printf("請輸入修改后的ISN碼:\n");  712                     scanf("%s", isn);  713                     if(check_isn(isn) == 0)  714                     break;  715  }  716  strcpy(books[n].isn, isn);  717                 if(strcmp(books[n].isn, isn) == 0)  718                     printf("圖書ISN碼修改成功.\n\n");  719                 else
 720                     printf("圖書ISN碼修改失敗.\n\n");  721                 printf("是否繼續進行查找操作? \n");  722                 printf("是否繼續修改操作?\n");  723                 if(ask() == 1)  724  modify();  725                 else
 726  {  727                     printf("回車符返回主菜單.\n");  728  getchar();  729  getchar();  730  }  731                 break;  732             case 3:  733                 printf("修改此圖書作者.\n");  734                 printf("請輸入修改后的作者:\n");  735                 scanf("%s", author);  736  strcpy(books[n].author, author);  737                 if(strcmp(books[n].author, author) == 0)  738                     printf("圖書作者修改成功.\n\n");  739                 else
 740                     printf("圖書作者修改失敗.\n\n");  741                 printf("是否繼續進行修改操作?\n");  742                 if(ask() == 1)  743  modify();  744                 else
 745  {  746                     printf("回車符返回主菜單.\n");  747  getchar();  748  getchar();  749  }  750                 break;  751             case 4:  752                 printf("修改此圖書價格,\n");  753                 while(1)//檢查修改輸入數據是否有效
 754  {  755                     printf("請輸入修改后的價格:\n");  756                     scanf("%s", price);  757                     if(check_data(price, 1) == 0)  758  {  759                         books[n].price = atof(price);  760                         break;  761  }  762  }  763                 //不判斷是否修改成功 因為浮點型不好比較 精度高
 764                 printf("圖書價格修改成功.\n\n");  765                 printf("是否繼續進行修改操作?\n");  766                 if(ask() == 1)  767  modify();  768                 else
 769  {  770                     printf("回車符返回主菜單.\n");  771  getchar();  772  getchar();  773  }  774                 break;  775             case 5:  776                 printf("修改此圖書數量.\n");  777                 while(1)  778  {  779                     printf("請輸入修改后的數量:\n");  780                     scanf("%s", number);  781                     if(check_data(number, 0) == 0)  782  {  783                         books[n].number = atoi(number);  784                         break;  785  }  786  }  787                 if(books[n].number == atoi(number))  788                     printf("圖書價格修改成功.\n\n");  789                 else
 790                     printf("圖書價格修改失敗.\n\n");  791                 printf("是否繼續進行修改操作?\n");  792                 if(ask() == 1)  793  modify();  794                 else
 795  {  796                     printf("回車符返回主菜單.\n");  797  getchar();  798  getchar();  799  }  800                 break;  801             default:  802                 printf("輸入錯誤,沒有那個選項.\n");  803                 printf("請重新輸入.\n");  804                 printf("是否繼續進行修改操作?\n");  805                 if(ask() == 1)  806  modify();  807                 else
 808  {  809                     printf("回車符返回主菜單.\n");  810  getchar();  811  getchar();  812  }  813                 break;  814  }  815  }  816     else
 817  {  818         printf("未找到與此信息匹配的圖書.\n\n");  819         printf("是否繼續進行修改操作?\n");  820         if(ask() == 1)  821  modify();  822         else
 823  {  824             printf("回車符返回主菜單.\n");  825  getchar();  826  getchar();  827  }  828  }  829 }  830 
 831 void sort_number()  832 {  833     int i, j;  834     book temp;//中間臨時結構體
 835     float price;  836     for(i = 0; i < RN-1; i++)//冒泡排序
 837  {  838         for(j = 0; j < RN-i-1; j++)  839  {  840             if(books[j].number > books[j+1].number)  841  {  842                 temp = books[j];  843                 books[j] = books[j+1];  844                 books[j+1] = temp;  845  }  846  }  847  }  848  project();  849     for(i = 0; i < RN; i++)  850  {  851  info(i);  852  }  853     printf("所做的更改僅存在於緩存區內和打印在屏幕上.\n");  854     printf("那么,是否將這些改動寫入文件?\n");  855     if(ask() == 1)  856  save();  857     else
 858  {  859         printf("文件內容未改動.\n\n");  860  }  861     printf("回車符返回主菜單.\n");  862  Clear_buffer  863  getchar();  864 }  865 
 866 void sort_price()  867 {  868     int i, j;  869  book temp;  870     float price;  871     for(i = 0; i < RN-1; i++)  872  {  873         for(j = 0; j < RN-i-1; j++)  874  {  875             if(books[j].price > books[j+1].price)  876  {  877                 temp = books[j];  878                 books[j] = books[j+1];  879                 books[j+1] = temp;  880  }  881  }  882  }  883  project();  884     for(i = 0; i < RN; i++)  885  {  886  info(i);  887  }  888     printf("所做的更改僅存在於緩存區內和打印在屏幕上.\n");  889     printf("並不會寫入文件中.");  890     printf("那么,是否將這些改動寫入文件?\n");  891     if(ask() == 1)  892  save();  893     else
 894  {  895         printf("文件內容未改動.\n\n");  896  }  897     printf("回車符返回主菜單.\n");  898  Clear_buffer  899  getchar();  900 }  901 
 902 
 903 void quit()  904 {  905     sleep(2);//sleep(*)以秒為單位  906     //Sleep(2000);Sleep(*)以毫秒為單位  907     //system("clss");
 908     system("clear");  909 }  910 
 911 void menu()//菜單列表
 912 {  913     int option;  914     printf("\t\t\t\t --圖書管理系統--\n");  915     printf("\t\t\t\t**************************\n");  916     printf("\t\t\t\t* 1.查看圖書信息 *\n");  917     printf("\t\t\t\t* 2.增加圖書信息 *\n");  918     printf("\t\t\t\t* 3.刪除圖書信息 *\n");  919     printf("\t\t\t\t* 4.查找圖書信息 *\n");  920     printf("\t\t\t\t* 5.修改圖書信息 *\n");  921     printf("\t\t\t\t* 6.刪除圖書數據 *\n");  922     printf("\t\t\t\t* 7.圖書數量排序 *\n");  923     printf("\t\t\t\t* 8.圖書價格排序 *\n");  924     printf("\t\t\t\t* 9.退出圖書系統 *\n");  925     printf("\t\t\t\t* *\n");  926     printf("\t\t\t\t* --@phl *\n");  927     printf("\t\t\t\t**************************\n");  928     option = choice();//由選擇函數賦值
 929     switch(option)  930  {  931             case 1:  932                 system("clear");  933                 //system("cls");
 934  border_x();  935  border_y();  936                 printf("\t\t圖書信息展示");  937  border_y();  938  border_x();  939  display();  940                 break;  941             case 2:  942  border_x();  943  border_y();  944                 printf("\t\t增加圖書操作");  945  border_y();  946  border_x();  947  addition();  948  save();  949                 break;  950             case 3:  951  border_x();  952  border_y();  953                 printf("\t\t圖書刪除操作");  954  border_y();  955  border_x();  956  delete();  957  save();  958                 break;  959             case 4:  960  border_x();  961  border_y();  962                 printf("\t\t圖書查找操作");  963  border_y();  964  border_x();  965                 seek(1);  966                 break;  967             case 5:  968  border_x();  969  border_y();  970                 printf("\t\t圖書修改操作");  971  border_y();  972  border_x();  973  modify();  974  save();  975                 break;  976             case 6:  977  border_x();  978  border_y();  979                 printf("\t\t數據刪除操作");  980  border_y();  981  border_x();  982  delete_file();  983                 break;  984             case 7:  985                 system("clear");  986                 //system("cls");
 987  border_x();  988  border_y();  989                 printf("\t\t圖書數量排序");  990  border_y();  991  border_x();  992  sort_number();  993                 break;  994             case 8:  995                 system("clear");  996                 //system("cls");
 997  border_x();  998  border_y();  999                 printf("\t\t圖書價格排序"); 1000  border_y(); 1001  border_x(); 1002  sort_price(); 1003                 break; 1004             case 9: 1005                 system("clear"); 1006                 //system("cls");
1007  border_x(); 1008  border_y(); 1009                 printf("\t\t系統退出操作"); 1010  border_y(); 1011  border_x(); 1012  quit(); 1013                 exit(1); 1014                 break; 1015             default: 1016                 system("clear"); 1017                 //system("cls");
1018                 printf("沒有那個選項.\n"); 1019                 printf("請檢查后重新輸入.\n\n"); 1020  menu(); 1021                 break; 1022  } 1023 } 1024 
1025 void main() 1026 { 1027     load();//載入歷史文件
1028     while(1) 1029  { 1030  menu(); 1031  } 1032 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM