

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <conio.h> /*屏幕操作函数库*/
5
6 /*主管权限数据格式化*/
7 #define HEADER1_zg "-----------------------------货物管理系统(主管)--------------------------------\n"
8 #define HEADER2_zg "| 编号 | 名称 | 进价 | 售价 | 产地 | 生产日期 |保质期| 库存 | 销量 | 收入 |\n"
9 #define HEADER3_zg "|------|--------|------|------|------|----------|------|------|------|--------|\n"
10 #define FORMAT_zg "|%-6s|%-8s|%.2f |%.2f |%6s|%-4d%3d%3d| %4d | %4d | %4d |%.2f |\n"
11 #define DATA_zg p->data.numbs,p->data.name,p->data.purchase,p->data.sales,p->data.place,p->data.Date.year,p->data.Date.mouth,p->data.Date.day,p->data.days,p->data.stock,p->data.salesnumb,p->data.income
12 #define END_zg "-------------------------------------------------------------------------------\n"
13
14 /*普通权限数据格式化*/
15 #define HEADER1_pt "----------------货物管理系统(普通)--------------------\n"
16 #define HEADER2_pt "| 编号 | 名称 | 售价 | 产地 | 生产日期 |保质期| 销量 |\n"
17 #define HEADER3_pt "|------|--------|------|------|----------|------|------|\n"
18 #define FORMAT_pt "|%-6s|%-8s| %.2f|%6s|%-4d%3d%3d| %4d | %4d |\n"
19 #define DATA_pt p->data.numbs,p->data.name,p->data.sales,p->data.place,p->data.Date.year,p->data.Date.mouth,p->data.Date.day,p->data.days,p->data.salesnumb
20 #define END_pt "--------------------------------------------------------\n"
21
22 int yhflag=0; /*是否优惠*/
23 int incomflag=0; /*是否计算收入*/
24 int dateflag=0; /*是否输入日期*/
25 int saveflag=0; /*是否需要保存*/
26 char zg[]="zg";
27 char pt[]="pt";
28
29 struct date
30 {
31 int year;
32 int mouth;
33 int day;
34 };
35
36 /*货物基本信息*/
37 struct goods
38 {
39 char numbs[6]; /*编号*/
40 char name[10]; /*名称*/
41 float purchase; /*进价*/
42 float sales; /*售价*/
43 char place[10]; /*产地*/
44 struct date Date; /*生产日期*/
45 int days; /*保质期*/
46 int datecha; /*保质期截止日期差*/
47 int stock; /*库存量*/
48 int salesnumb; /*销量*/
49 float income; /*收入*/
50 };
51 typedef struct node
52 {
53 struct goods data;
54 struct node *next;
55 }Node,*Link;
56
57 /*格式化输出主管表头*/
58 void printheader_zg()
59 {
60 printf(HEADER1_zg);
61 printf(HEADER2_zg);
62 printf(HEADER3_zg);
63 }
64 /*格式化输出普通表头*/
65 void printheader_pt()
66 {
67 printf(HEADER1_pt);
68 printf(HEADER2_pt);
69 printf(HEADER3_pt);
70 }
71 /*格式化输出主管表中数据*/
72 void printdata_zg(Node *pp)
73 {
74 Node *p;
75 p=pp;
76 printf(FORMAT_zg,DATA_zg);
77 }
78 /*格式化输出普通表中数据*/
79 void printdata_pt(Node *pp)
80 {
81 Node *p;
82 p=pp;
83 printf(FORMAT_pt,DATA_pt);
84 }
85 /*输出案件错误信息*/
86 void wrong()
87 {
88 printf("\n\n\n\n*******错误:输入错误,按任意键继续*******\n");
89 getchar();
90 }
91 /*输出为查找到货物的信息*/
92 void Nofind()
93 {
94 printf("\n*****无此货物信息!*****\n");
95 getchar();
96 }
97 /*主管显示菜单*/
98 void Disp(Link L,char s[])
99 {
100 Node *p;
101 p=L->next;
102 if (!p) /*空,则*/
103 {
104 printf("\n没有录入货物信息\n");
105 getchar();
106 return ;
107 }
108 printf("\n\n");
109 if (strcmp(zg,s)==0)
110 {
111 printheader_zg();
112 while (p)
113 {
114 printdata_zg(p);
115 p=p->next;
116 printf(HEADER3_zg);
117 }
118 }
119 else
120 {
121 printheader_pt();
122 while (p)
123 {
124 printdata_pt(p);
125 p=p->next;
126 printf(HEADER3_pt);
127 }
128 }
129
130 getchar();
131 }
132 /*返回链表中符合要求的节点的指针,s[]保存用户查找内容,NaorNum[]保存按什么查找”name,num“*/
133 Node *Locate(Link L,char s[],char NaorNum[] )
134 {
135 Node *p;
136 if (strcmp(NaorNum,"num")==0)
137 {
138 p=L->next;
139 while (p)
140 {
141 if (strcmp(p->data.numbs,s)==0)
142 return p;
143 p=p->next;
144 }
145 }
146 else if (strcmp(NaorNum,"name")==0)
147 {
148 p=L->next;
149 while (p)
150 {
151 if (strcmp(p->data.name,s)==0)
152 return p;
153 p=p->next;
154 }
155 }
156 return 0; /*未找到,返回空指针*/
157 }
158 /*平润年判断*/
159 int Year_pd(int year)
160 {
161 int flag;
162 if ((year%4==0&&year%100!=0)||year%400==0)
163 {/*闰年*/
164 flag=0;
165 }
166 else
167 {/*平年*/
168 flag=1;
169 }
170 return flag;
171 }
172 /*月份对应的天数*/
173 int Day_pd(int mouth,int flag)
174 {
175 int day;
176 switch(mouth)
177 {
178 case 1:
179 case 3:
180 case 5:
181 case 7:
182 case 8:
183 case 10:
184 case 12:day=31;break;
185 case 4:
186 case 6:
187 case 9:
188 case 11:day=30;break;
189 case 2:if (flag) day=28;
190 else day=29;break;
191 }
192 return day;
193 }
194 /*输入字符串,并进行验证,用户的输入通过*t输出*/
195 void S_input(char *t,int lens,char *notice)
196 {
197 char str[255];
198 do
199 {
200 printf(notice);
201 scanf("%s",str);
202 if(strlen(str)>lens)
203 printf("\n超过了要求长度,重新输入\n");
204 } while (strlen(str)>lens);
205 strcpy(t,str);
206 }
207
208 int Num_input(char *notice)
209 {
210 int a;
211 do
212 {
213 printf(notice);
214 scanf("%d",&a);
215 if(a<0) printf("\n数字必须大于零\n");
216 } while (a<0);
217 return a;
218 }
219 /*输入月份进行验证*/
220 int Mou_input(char *notice)
221 {
222 int mouth=0;
223 do
224 {
225 printf(notice);
226 scanf("%d",&mouth);
227 if (mouth>12||mouth<0)
228 printf("\n月份必须在(1~12)之间!\n");
229 } while (mouth>12||mouth<0);
230 return mouth;
231 }
232 /*输入天数进行验证*/
233 int Day_input(char *notice,int year,int mouth)
234 {
235 int day=0;
236 int nlimit,flag;
237 flag=Year_pd(year);
238 do
239 {
240 printf(notice);
241 scanf("%d",&day);
242 nlimit=Day_pd(mouth,flag);
243 if (day>nlimit||day<0)
244 printf("\n日期必须在(1~%d)之间!\n",nlimit);
245 } while (day>nlimit||mouth<0);
246 return day;
247 }
248 /*增加货物记录*/
249 void Add_goods(Link L)
250 {
251 Node *p,*r,*s;
252 char ch,flag=0,num[10];
253 r=L;
254 s=L->next;
255 system("cls");
256 Disp(L,zg);
257 while (1)
258 {
259 while (1) /*输入编号,保证没有被使用,若输入为0,则推出*/
260 {
261 S_input(num,6,"输入货物编号(按‘0’返回菜单界面):");
262 flag=0;
263 if (strcmp(num,"0")==0) return;
264 s=L->next;
265 while (s) /*查询货物编号是否存在,若存在,要去输入新编号*/
266 {
267 if (strcmp(s->data.numbs,num)==0)
268 {
269 flag=1;
270 break;
271 }
272 s=s->next;
273 }
274 if (flag)
275 {
276 getchar();
277 printf("货物编号:%s已存在,是否要重新输入?(y/n)",num);
278 scanf("%c",&ch);
279 if(ch=='y'||ch=='Y')
280 continue;
281 else
282 return;
283 }
284 else
285 break;
286 }
287 p=(Node *)malloc(sizeof(Node));
288 if (!p)
289 {
290 printf("\n没有申请到");
291 return; /*返回到主界面*/
292 }
293 strcpy(p->data.numbs,num);
294 S_input(p->data.name,8,"名称:");
295 p->data.purchase=Num_input("进价:");
296 p->data.sales=Num_input("售价:");
297 S_input(p->data.place,6,"产地:");
298 p->data.Date.year=Num_input("成产日期:年:");
299 p->data.Date.mouth=Mou_input(" 月:");
300 p->data.Date.day=Day_input(" 日:",p->data.Date.year,p->data.Date.mouth);
301 p->data.days=Num_input("保质期(天):");
302 p->data.stock=Num_input("库存:");
303 p->data.salesnumb=Num_input("销量:");
304 p->data.income=00;
305 p->next=r->next;
306 r->next=p; /*前插*/
307 }
308 return ;
309 }
310 int select(int a,int b) /*菜单选择*/
311 {
312 int n;
313 do
314 {
315 printf("\n\n");
316 printf("%15s"," ");
317 printf("请输入一个数(%d~%d): [ ]\b\b",a,b);
318 scanf("%d",&n);
319 } while (n<a||n>b);
320 return n;
321 }
322 /*实时计算实际收益*/
323 void Sum_Income(Link L)
324 {
325 Node *p;
326 p=L->next;
327 while (p)
328 {
329 p->data.income=p->data.salesnumb*(p->data.sales-p->data.purchase);
330 p=p->next;
331 }
332 incomflag=1;
333 return ;
334 }
335 /*查询的通用方法*/
336 void Sea_by_ways(Link L,Node *p,char s[])
337 {
338 if (p)
339 {
340 if (strcmp(zg,s)==0)
341 {
342 printheader_zg();
343 printdata_zg(p);
344 printf(END_zg);
345 printf("按任意键返回...");
346 getchar();
347 }
348 else
349 {
350 printheader_pt();
351 printdata_pt(p);
352 printf(END_pt);
353 printf("按任意键返回...");
354 getchar();
355 }
356 }
357 else
358 {
359 Nofind();
360 getchar();
361 }
362 }
363 /*按编号或货物名称查询*/
364 void Sea_by_name(Link L,char s[])
365 {
366 Node *p;
367 char ss[20];
368 system("cls");
369 S_input(ss,10,"请输入要查找的货物名称:");
370 p=Locate(L,ss,"name");
371 Sea_by_ways(L,p,s);
372 }
373 void Sea_by_num(Link L,char s[])
374 {
375 Node *p;
376 char ss[20];
377 system("cls");
378 S_input(ss,10,"请输入要查找的货物编号:");
379 p=Locate(L,ss,"num");
380 Sea_by_ways(L,p,s);
381 }
382 /*日期相对于本年的天数*/
383 int Sum_day(int year,int mouth,int day)
384 {
385 int i,flag,days,sum=0;
386 flag=Year_pd(year);
387 for (i=1;i<mouth;i++)
388 {
389 days=Day_pd(i,flag);
390 sum+=days;
391 }
392 return sum+day;
393 }
394 /*两个日期差值*/
395 void Datecha(Link L)
396 {
397 int year,mouth,day;
398 Node *p;
399 p=L->next;
400 year=Num_input("今天日期:年:");
401 mouth=Mou_input("月:");
402 day=Day_input("日:",year,mouth);
403 dateflag=1;
404 if (!p)
405 {
406 printf("***无货物信息,不用输入日期***\n");
407 getchar();
408 return ;
409 }
410 else
411 {
412 while (p)
413 {
414 p->data.datecha=Sum_day(year,mouth,day)-Sum_day(p->data.Date.year,p->data.Date.mouth,p->data.Date.day);
415 p=p->next;
416 }
417 }
418 }
419
420 void Dz_by_data( Link L)
421 {
422 Node *p,*r;
423 Link l;
424 int year,mouth,day,count=0;
425 p=L->next;
426 l=(Node *)malloc(sizeof(Node));
427 l->next=NULL;
428 system("cls");
429 if (!dateflag)
430 {
431 Datecha(L);
432 }
433 printf("| 编号 | 名称 |过期差值|\n");
434 while (p)
435 {
436 printf("|%-6s|%-8s| %4d |",p->data.numbs,p->data.name,p->data.datecha);
437 if (p->data.days>=p->data.datecha)
438 {
439 /*优惠的标示优惠*/
440 if (p->data.days-p->data.datecha<=10)
441 {
442 count++;
443 p->data.sales=p->data.sales/2;
444 printf("已优惠\n");
445 /* Ltol(l,p,p->next);*/
446 }
447 else
448 {
449 printf("\n");
450 }
451 }
452 else
453 {
454 printf("该商品过期,请删除\n");
455 }
456 p=p->next;
457 }
458
459 if(!count)
460 {
461 printf("/n***没有差10天过期的货物***/n");
462 getchar();
463 return;
464 }
465 else
466 {
467 printf("共有%d中商品打折",count);
468 yhflag=1;
469 saveflag=1;
470 Disp(L,zg);
471 }
472 }
473 /*删除*/
474 void Del_by_ways(Link L,Node *p)
475 {
476 Node *q;
477 char ch;
478 if (p)
479 {
480 q=L;
481 while(q->next!=p)
482 q=q->next;
483 printheader_zg();
484 printdata_zg(p);
485 printf(END_zg);
486 getchar();
487 printf("请确定是否要删除该货物信息(y/n):");
488 scanf("%c",&ch);
489 if (ch=='y'||ch=='Y')
490 {
491 q->next=p->next;
492 free(p);
493 printf("\n成功删除该货物信息\n");
494 saveflag=1;
495 getchar();
496 return;
497 }
498 else
499 {
500 printf("\n没有删除该货物信息\n");
501 getchar();
502 return;
503 }
504 }
505 else
506 {
507 Nofind();
508 getchar();
509 }
510 }
511 /*通过名称删除*/
512 void Del_by_name(Link L)
513 {
514 Node *p;
515 char s[20];
516 system("cls");
517 S_input(s,10,"请输入要查删除的货物名称:");
518 p=Locate(L,s,"name");
519 Del_by_ways(L,p);
520 }
521 /*通过编号删除*/
522 void Del_by_num(Link L)
523 {
524 Node *p;
525 char s[20];
526 system("cls");
527 S_input(s,10,"请输入要查删除的货物的编号:");
528 p=Locate(L,s,"num");
529 Del_by_ways(L,p);
530 }
531
532
533 /*补货信息*/
534 void Buhuo(Link L)
535 {
536 Node *p,*q;
537 int i=0;
538 p=L->next;
539 system("cls");
540 if (p)
541 {
542 q=L->next;
543 printf("| 编号 | 名称 |库存|销量|剩余| \n");
544 while (q)
545 {
546 /*统计库存,销量,剩余*/
547 printf("|%-8s|%-8s|%-4d|%4d|%4d|\n",q->data.numbs,q->data.name,q->data.stock,q->data.salesnumb,q->data.stock-q->data.salesnumb);
548 q=q->next;
549 }
550 while (p)
551 {
552 if ((p->data.stock-p->data.salesnumb)<100)
553 {
554 if (i==0)
555 {
556 printf("需要补货的货物分别是\n");
557 printf("| 编号 |商品名称|\n");
558 }
559 printf("|%-8s|%8s|\n",p->data.numbs,p->data.name);
560 i++;
561 }
562 p=p->next;
563 }
564 if (i)
565 {
566 printf("共%d种货物\n",i);
567 getchar();
568 return;
569 }
570 else
571 {
572 printf("没有需要补充的货物种类\n");
573 getchar();
574 return;
575 }
576 }
577 else
578 {
579 printf("\n***没有货物信息***\n");
580 printf("\n按任意键返回...\n");
581 getchar();
582 return ;
583 }
584 }
585
586 void Sort_by_ways(Link L,char s[],int n)
587 {
588 int flag=0,a;
589 Node *p,*q,*lq,*fq; /*fq记下节点前驱,lq记下节点的后驱,q每次冒泡遍历,p控制遍历,qq用来交换地址*/
590 p=L->next;
591 system("cls");
592 while (p)
593 {
594 fq=L;
595 q=fq->next;
596 while (lq=q->next)
597 {
598 if (strcmp(zg,s)==0)
599 {
600 switch (n)
601 {
602 case 1:a=strcmp(q->data.name,lq->data.name);break;
603 case 2:a=strcmp(q->data.numbs,lq->data.numbs);break;
604 case 3:a=(q->data.salesnumb>lq->data.salesnumb);break;
605 case 4:if(!incomflag) Sum_Income(L); a=(q->data.income>lq->data.income);break;
606 case 5:if (!dateflag) Datecha(L);a=(q->data.datecha>lq->data.datecha);break;
607 }
608 }
609 else
610 {
611 switch (n)
612 {
613 case 1:a=strcmp(q->data.name,lq->data.name);break;
614 case 2:a=strcmp(q->data.numbs,lq->data.numbs);break;
615 case 3:a=(q->data.sales>lq->data.sales);break;
616 case 4:a=(q->data.salesnumb>lq->data.salesnumb);break;
617 case 5:if (!dateflag) Datecha(L);a=(q->data.datecha>lq->data.datecha);break;
618 }
619 }
620
621 /*if ((n==1)?(strcmp(q->data.name,lq->data.name)):(strcmp(q->data.numbs,q->data.numbs)))*/
622 if(a>0)
623 {
624 flag=1;
625 q->next=lq->next;
626 lq->next=q;
627 fq->next=lq;
628 }
629 fq=fq->next;
630 q=fq->next;
631 }
632 if(flag==0) break;
633 p=p->next;
634 }
635 if (strcmp(zg,s)==0)
636 Disp(L,zg);
637 else
638 Disp(L,pt);
639 }
640
641 void Wb_Save(Link L)
642 {
643 FILE *out;
644 Node *p;
645 int count=0;
646 if ((out=fopen("d:\\Goods.txt","w"))==NULL)
647 {
648 printf("打开文件失败!\n");
649 getchar();
650 return;
651 }
652 p=L->next;
653 fprintf(out,HEADER1_zg);
654 fprintf(out,HEADER2_zg);
655 fprintf(out,HEADER3_zg);
656 while (p)
657 {
658 fprintf(out,FORMAT_zg,DATA_zg);
659 p=p->next;
660 fprintf(out,HEADER3_zg);
661 count++;
662 }
663 if (count>0)
664 {
665 getchar();
666 printf("\n\n\n***文本文件保存完成,共%d条货物信息保存***\n",count);
667 getchar();
668 saveflag=0;
669 }
670 else
671 {
672 system("cls");
673 printf("没有货物信息,没有货物信息保存\n");
674 getchar();
675 }
676 fclose(out); /*关闭此文件*/
677 }
678 void Er_Save(Link L)
679 {
680 FILE *out;
681 Node *p;
682 int count=0;
683 if ((out=fopen("d:\\Goods","wb"))==NULL)
684 {
685 printf("打开文件失败!\n");
686 getchar();
687 return;
688 }
689 p=L->next;
690
691 while (p)
692 {
693 if (fwrite(p,sizeof(Node),1,out))
694 {
695 p=p->next;
696 count++;
697 }
698 else
699 {
700 break;
701 }
702 }
703 if (count>0)
704 {
705 getchar();
706 printf("\n\n\n***二进制文件保存完成,共%d条货物信息保存***\n",count);
707 getchar();
708 saveflag=0;
709 }
710 else
711 {
712 system("cls");
713 printf("没有货物信息,没有货物信息保存\n");
714 getchar();
715 }
716 fclose(out); /*关闭此文件*/
717 }
718 void Menu_sort_zg()
719 {
720 system("cls");
721 printf("\n\n\n");
722 printf("%30s%s"," "," 排序货物信息 \n\n");
723 printf("%30s%s"," ","********功能*******\n\n");
724 printf("%30s%s"," ","* 1.按名称 *\n\n");
725 printf("%30s%s"," ","* 2.按编号 *\n\n");
726 printf("%30s%s"," ","* 3.按销量*\n\n");
727 printf("%30s%s"," ","* 4.按利润*\n\n");
728 printf("%30s%s"," ","* 5.按保期 *\n\n");
729 printf("%30s%s"," ","* 6.返回 *\n\n");
730 printf("%30s%s"," ","* 7.退出 *\n\n");
731 printf("%30s%s"," ","********************\n");
732 }
733 void Menu_sort_pt()
734 {
735 system("cls");
736 printf("\n\n\n");
737 printf("%30s%s"," "," 排序货物信息 \n\n");
738 printf("%30s%s"," ","********功能*******\n\n");
739 printf("%30s%s"," ","* 1.按名称 *\n\n");
740 printf("%30s%s"," ","* 2.按编号 *\n\n");
741 printf("%30s%s"," ","* 3.按售价 *\n\n");
742 printf("%30s%s"," ","* 4.按销量 *\n\n");
743 printf("%30s%s"," ","* 5.按保期 *\n\n");
744 printf("%30s%s"," ","* 6.返回 *\n\n");
745 printf("%30s%s"," ","* 7.退出 *\n\n");
746 printf("%30s%s"," ","********************\n");
747 }
748 void Menu_del()
749 {
750 system("cls");
751 printf("\n\n\n");
752 printf("%30s%s"," "," 删除货物信息 \n\n");
753 printf("%30s%s"," ","********功能*******\n\n");
754 printf("%30s%s"," ","* 1.按名称 *\n\n");
755 printf("%30s%s"," ","* 2.按编号 *\n\n");
756 printf("%30s%s"," ","* 3.返回 *\n\n");
757 printf("%30s%s"," ","* 4.退出 *\n\n");
758 printf("%30s%s"," ","********************\n");
759 }
760 void Menu_Sea()
761 {
762 system("cls");
763 printf("\n\n\n");
764 printf("%30s%s"," "," 查询货物信息 \n\n");
765 printf("%30s%s"," ","********功能*******\n\n");
766 printf("%30s%s"," ","* 1.按名称 *\n\n");
767 printf("%30s%s"," ","* 2.按编号 *\n\n");
768 printf("%30s%s"," ","* 3.返回 *\n\n");
769 printf("%30s%s"," ","* 4.退出 *\n\n");
770 printf("%30s%s"," ","********************\n");
771 }
772 void Menu_Qx() /*权限菜单*/
773 {
774 system("cls");
775 printf("\n\n\n");
776 printf("%25s%s"," "," 欢迎进入 \n");
777 printf("%25s%s"," "," 货物管理体统 \n\n\n");
778 printf("%25s%s"," ","**********功能*********\n\n");
779 printf("%25s%s"," ","* 1.主管 *\n\n");
780 printf("%25s%s"," ","* 2.普通用户 *\n\n");
781 printf("%25s%s"," ","* 3.退出 *\n\n");
782 printf("%25s%s"," ","***********************\n");
783 }
784 void Menu_zg() /*主管菜单*/
785 {
786 system("cls");
787 printf("\n\n\n");
788 printf("%15s%s"," "," 货物管理体统 \n\n\n");
789 printf("%15s%s"," ","*****************主管功能******************\n\n");
790 printf("%15s%s"," ","* 1.录入货物信息 *\n");
791 printf("%15s%s"," ","* 2.删除货物信息 *\n");
792 printf("%15s%s"," ","* 3.查找货物信息 *\n");
793 printf("%15s%s"," ","* 4.显示货物信息 *\n");
794 printf("%15s%s"," ","* 5.差10天过物信息(促销) *\n");
795 printf("%15s%s"," ","* 6.统计货物数量(补货) *\n");
796 printf("%15s%s"," ","* 7.实时收益 *\n");
797 printf("%15s%s"," ","* 9.排序日期差 *\n");
798 printf("%15s%s"," ","* 10.保存文件 *\n");
799 printf("%15s%s"," ","* 11.返回 *\n");
800 printf("%15s%s"," ","* 12.退出 *\n");
801 printf("%15s%s"," ","*******************************************\n");
802 }
803 void Menu_pt() /*普通菜单*/
804 {
805 printf("%15s%s"," "," 货物管理体统 \n\n\n");
806 printf("%15s%s"," ","*****************普通用户功能***************\n\n");
807 printf("%15s%s"," ","* 1.查找货物信息 *\n");
808 printf("%15s%s"," ","* 2.显示货物信息 *\n");
809 printf("%15s%s"," ","* 3.排序货物销量 *\n");
810 printf("%15s%s"," ","* 4.返回 *\n");
811 printf("%15s%s"," ","* 5.退出 *\n");
812 printf("%15s%s"," ","*************************************************\n");
813 }
814 void Isaveflag(Link L)
815 {
816 char ch;
817 if (saveflag)
818 {
819 printf("您已经修改数据了,是否要保存退出(y/n):");
820 getchar();
821 scanf("%c",&ch);
822 if (ch=='y'||ch=='Y')
823 {
824 Wb_Save(L);
825 Er_Save(L);
826 exit(0);
827 }
828 else
829 exit(0);
830 }
831 else
832 exit(0);
833 }
834 int IsPassword() /*密码是否通过*/
835 {
836 char password[7];
837 char mypassword[]="123456";
838 static int n=3;
839 int i;
840 system("cls");
841 for (;n>0;n--)
842 {
843 switch(n)
844 {
845 case 1:
846 case 2: printf("密码错误,您还有%d次机会,请再输入:",n);break;
847 case 3: printf("请输入6位进入主管功能的密码:");getchar();break;
848 }
849 for ( i=0;i<6;i++)
850 {
851 password[i]=getch();
852 printf("*");
853 }
854 getchar();
855 password[6]='\0';
856 if (strcmp(mypassword,password)==0)
857 {
858 printf("***密码正确***");
859 getchar();
860 return 1;
861 }
862 }
863 printf("恭喜你,三次都输错了,无法再输入密码,按任意键返回...");
864 getchar();
865 return 0;
866 }
867
868 void Sort_goods(Link L,char s[])
869 {
870 if (!L->next)
871 {
872 system("cls");
873 printf("\n没有货物信息,无法使用排序功能\n");
874 getchar();
875 return;
876 }
877 else
878 {
879 if (strcmp(zg,s)==0)
880 {
881 system("cls");
882 for (;;)
883 {
884 Menu_sort_zg();
885 switch(select(1,7))
886 {
887 case 1:Sort_by_ways(L,zg,1);break; /*名称*/
888 case 2:Sort_by_ways(L,zg,2);break; /*编号*/
889 case 3:Sort_by_ways(L,zg,3);break; /*销量*/
890 case 4:Sort_by_ways(L,zg,4);break; /*利润*/
891 case 5:Sort_by_ways(L,zg,5);break; /*保期*/
892 case 6:return;break;
893 case 7:Isaveflag(L);break;
894 }
895 getchar();
896 }
897 }
898 else
899 {
900 system("cls");
901 for (;;)
902 {
903 Menu_sort_pt();
904 switch(select(1,7))
905 {
906 case 1:Sort_by_ways(L,pt,1);break; /*名称*/
907 case 2:Sort_by_ways(L,pt,2);break; /*编号*/
908 case 3:Sort_by_ways(L,pt,3);break; /*售价*/
909 case 4:Sort_by_ways(L,pt,4);break; /*销量*/
910 case 5:Sort_by_ways(L,pt,5);break; /*销量*/
911 case 6:return;break;
912 case 7:Isaveflag(L);break;
913 }
914 getchar();
915 }
916 }
917 }
918 }
919 void Sea_goods(Link L,char s[])
920 {
921 if (!L->next)
922 {
923 system("cls");
924 printf("\n***没有货物记录,不能进入查询功能***\n");
925 return ;
926 }
927 else
928 {
929 system("cls");
930 for (;;)
931 {
932 Menu_Sea();
933 switch(select(1,4))
934 {
935 case 1:Sea_by_name(L,s);break;
936 case 2:Sea_by_num(L,s);break;
937 case 3:return;break;
938 case 4:Isaveflag(L);break;
939 }
940 getchar();
941 }
942 }
943 }
944 void Del_goods(Link L)
945 {
946 if (!L->next)
947 {
948 system("cls");
949 printf("\n***没有货物记录,不能使用删除功能***\n");
950 return ;
951 }
952 else
953 {
954 system("cls");
955 for (;;)
956 {
957 Menu_del();
958 switch (select(1,4))
959 {
960 case 1:Del_by_name(L);break;
961 case 2:Del_by_num(L);break;
962 case 3:return;break;
963 case 4:Isaveflag(L);break;
964 }
965 getchar();
966 }
967 }
968 }
969 void main_zg(Link L) /*主管功能*/
970 {
971 system("cls");
972 for (;;)
973 {
974 Menu_zg();
975 switch (select(1,12))
976 {
977 case 1:Add_goods(L);saveflag=1;break; /*增加货物信息*/
978 case 2:Del_goods(L);break; /*删除学生信息*/
979 case 3:Sea_goods(L,zg);break; /*按编号名字查询*/
980 case 4:system("cls");Disp(L,zg);break;
981 case 5:Dz_by_data(L);break;
982 case 6:Buhuo(L);break;
983 case 7:Disp(L,zg);Sum_Income(L);Disp(L,zg);break;
984 case 9:Sort_goods(L,zg);break;
985 case 10:Wb_Save(L);Er_Save(L);break;
986 case 11:return;break;
987 case 12:Isaveflag(L);break;
988 }
989 getchar();
990 }
991 }
992 void main_pt(Link L) /*普通功能*/
993 {
994 system("cls");
995 for (;;)
996 {
997 Menu_pt();
998 switch (select(1,5))
999 {
1000 case 1:Sea_goods(L,pt);break; /*按编号名字查询*/
1001 case 2:system("cls");Disp(L,pt);break;
1002 case 3:Sort_goods(L,pt);break;
1003 case 4:return;break;
1004 case 5:Isaveflag(L);break;
1005 }
1006 getchar();
1007 system("cls");
1008 }
1009 }
1010 int main()
1011 {
1012 Link L;
1013 FILE *in;
1014 Node *p,*r;
1015 int count=0;
1016 L=(Node *)malloc(sizeof(Node));
1017 L->next=NULL;
1018 r=L;
1019 if ((in=fopen("d:\\Goods","ab+"))==NULL) /*以追加方式打开二进制文件*/
1020 {
1021 printf("\n***打开文件失败***\n");
1022 exit(0);
1023 }
1024 while (!feof(in))
1025 {
1026 p=(Node *)malloc(sizeof(Node));
1027 if (fread(p,sizeof(Node),1,in))
1028 {
1029 p->next=r->next;
1030 r->next=p;
1031 count++;
1032 }
1033 }
1034 fclose(in);
1035 for (;;)
1036 {
1037 Menu_Qx();
1038 switch (select(1,3))
1039 {
1040 case 1:if(IsPassword())
1041 {
1042 main_zg(L);
1043 }
1044 break;
1045 case 2:main_pt(L);break;
1046 case 3:Isaveflag(L);break;
1047 }
1048 getchar();
1049 }
1050 return 0;
1051 }View Code
















