这只是一个简易的图书管理系统,虽然它有千余行代码,不过终究是个简单基本的东西。
在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 }