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 }