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