這只是一個簡易的圖書管理系統,雖然它有千余行代碼,不過終究是個簡單基本的東西。
在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 }
