标签:环境 #define choices vim 存在 函数赋值 函数 单列 menu
这只是一个简易的图书管理系统,虽然它有千余行代码,不过终究是个简单基本的东西。
在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_buffer2 {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 }
标签:环境 #define choices vim 存在 函数赋值 函数 单列 menu
原文地址:https://www.cnblogs.com/notfound/p/9098452.html