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 }

 

猜你喜欢

转载自www.cnblogs.com/notfound/p/9098452.html