|
复制代码 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> /*屏幕操作函数库*/
/*主管权限数据格式化*/ #define HEADER1_zg "-----------------------------货物管理系统(主管)--------------------------------n" #define HEADER2_zg "| 编号 | 名称 | 进价 | 售价 | 产地 | 生产日期 |保质期| 库存 | 销量 | 收入 |n" #define HEADER3_zg "|------|--------|------|------|------|----------|------|------|------|--------|n" #define FORMAT_zg "|%-6s|%-8s|%.2f |%.2f |%6s|%-4d%3d%3d| %4d | %4d | %4d |%.2f |n" #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 #define END_zg "-------------------------------------------------------------------------------n"
/*普通权限数据格式化*/ #define HEADER1_pt "----------------货物管理系统(普通)--------------------n" #define HEADER2_pt "| 编号 | 名称 | 售价 | 产地 | 生产日期 |保质期| 销量 |n" #define HEADER3_pt "|------|--------|------|------|----------|------|------|n" #define FORMAT_pt "|%-6s|%-8s| %.2f|%6s|%-4d%3d%3d| %4d | %4d |n" #define DATA_pt p->data.numbs,p->data.salesnumb #define END_pt "--------------------------------------------------------n"
int yhflag=0; /*是否优惠*/ int incomflag=0; /*是否计算收入*/ int dateflag=0; /*是否输入日期*/ int saveflag=0; /*是否需要保存*/ char zg[]="zg"; char pt[]="pt";
struct date { int year; int mouth; int day; };
/*货物基本信息*/ struct goods { char numbs[6]; /*编号*/ char name[10]; /*名称*/ float purchase; /*进价*/ float sales; /*售价*/ char place[10]; /*产地*/ struct date Date; /*生产日期*/ int days; /*保质期*/ int datecha; /*保质期截止日期差*/ int stock; /*库存量*/ int salesnumb; /*销量*/ float income; /*收入*/ }; typedef struct node { struct goods data; struct node *next; }Node,*Link;
/*格式化输出主管表头*/ void printheader_zg() { printf(HEADER1_zg); printf(HEADER2_zg); printf(HEADER3_zg); } /*格式化输出普通表头*/ void printheader_pt() { printf(HEADER1_pt); printf(HEADER2_pt); printf(HEADER3_pt); } /*格式化输出主管表中数据*/ void printdata_zg(Node *pp) { Node *p; p=pp; printf(FORMAT_zg,DATA_zg); } /*格式化输出普通表中数据*/ void printdata_pt(Node *pp) { Node *p; p=pp; printf(FORMAT_pt,DATA_pt); } /*输出案件错误信息*/ void wrong() { printf("nnnn*******错误:输入错误,按任意键继续*******n"); getchar(); } /*输出为查找到货物的信息*/ void Nofind() { printf("n*****无此货物信息!*****n"); getchar(); } /*主管显示菜单*/ void Disp(Link L,char s[]) { Node *p; p=L->next; if (!p) /*空,则*/ { printf("n没有录入货物信息n"); getchar(); return ; } printf("nn"); if (strcmp(zg,s)==0) { printheader_zg(); while (p) { printdata_zg(p); p=p->next; printf(HEADER3_zg); } } else { printheader_pt(); while (p) { printdata_pt(p); p=p->next; printf(HEADER3_pt); } }
getchar(); } /*返回链表中符合要求的节点的指针,s[]保存用户查找内容,NaorNum[]保存按什么查找”name,num“*/ Node *Locate(Link L,char s[],char NaorNum[] ) { Node *p; if (strcmp(NaorNum,"num")==0) { p=L->next; while (p) { if (strcmp(p->data.numbs,s)==0) return p; p=p->next; } } else if (strcmp(NaorNum,"name")==0) { p=L->next; while (p) { if (strcmp(p->data.name,s)==0) return p; p=p->next; } } return 0; /*未找到,返回空指针*/ } /*平润年判断*/ int Year_pd(int year) { int flag; if ((year%4==0&&year%100!=0)||year%400==0) {/*闰年*/ flag=0; } else {/*平年*/ flag=1; } return flag; } /*月份对应的天数*/ int Day_pd(int mouth,int flag) { int day; switch(mouth) { case 1: case 3: case 5: case 7: case 8: case 10: case 12:day=31;break; case 4: case 6: case 9: case 11:day=30;break; case 2:if (flag) day=28; else day=29;break; } return day; } /*输入字符串,并进行验证,用户的输入通过*t输出*/ void S_input(char *t,int lens,char *notice) { char str[255]; do { printf(notice); scanf("%s",str); if(strlen(str)>lens) printf("n超过了要求长度,重新输入n"); } while (strlen(str)>lens); strcpy(t,str); }
int Num_input(char *notice) { int a; do { printf(notice); scanf("%d",&a); if(a<0) printf("n数字必须大于零n"); } while (a<0); return a; } /*输入月份进行验证*/ int Mou_input(char *notice) { int mouth=0; do { printf(notice); scanf("%d",&mouth); if (mouth>12||mouth<0) printf("n月份必须在(1~12)之间!n"); } while (mouth>12||mouth<0); return mouth; } /*输入天数进行验证*/ int Day_input(char *notice,int year,int mouth) { int day=0; int nlimit,flag; flag=Year_pd(year); do { printf(notice); scanf("%d",&day); nlimit=Day_pd(mouth,flag); if (day>nlimit||day<0) printf("n日期必须在(1~%d)之间!n",nlimit); } while (day>nlimit||mouth<0); return day; } /*增加货物记录*/ void Add_goods(Link L) { Node *p,*r,*s; char ch,flag=0,num[10]; r=L; s=L->next; system("cls"); Disp(L,zg); while (1) { while (1) /*输入编号,保证没有被使用,若输入为0,则推出*/ { S_input(num,6,"输入货物编号(按‘0'返回菜单界面):"); flag=0; if (strcmp(num,"0")==0) return; s=L->next; while (s) /*查询货物编号是否存在,若存在,要去输入新编号*/ { if (strcmp(s->data.numbs,num)==0) { flag=1; break; } s=s->next; } if (flag) { getchar(); printf("货物编号:%s已存在,是否要重新输入?(y/n)",num); scanf("%c",&ch); if(ch=='y'||ch=='Y') continue; else return; } else break; } p=(Node *)malloc(sizeof(Node)); if (!p) { printf("n没有申请到"); return; /*返回到主界面*/ } strcpy(p->data.numbs,num); S_input(p->data.name,8,"名称:"); p->data.purchase=Num_input("进价:"); p->data.sales=Num_input("售价:"); S_input(p->data.place,"产地:"); p->data.Date.year=Num_input("成产日期:年:"); p->data.Date.mouth=Mou_input(" 月:"); p->data.Date.day=Day_input(" 日:",p->data.Date.mouth); p->data.days=Num_input("保质期(天):"); p->data.stock=Num_input("库存:"); p->data.salesnumb=Num_input("销量:"); p->data.income=00; p->next=r->next; r->next=p; /*前插*/ } return ; } int select(int a,int b) /*菜单选择*/ { int n; do { printf("nn"); printf("%15s"," "); printf("请输入一个数(%d~%d): [ ]bb",a,b); scanf("%d",&n); } while (n<a||n>b); return n; } /*实时计算实际收益*/ void Sum_Income(Link L) { Node *p; p=L->next; while (p) { p->data.income=p->data.salesnumb*(p->data.sales-p->data.purchase); p=p->next; } incomflag=1; return ; } /*查询的通用方法*/ void Sea_by_ways(Link L,Node *p,char s[]) { if (p) { if (strcmp(zg,s)==0) { printheader_zg(); printdata_zg(p); printf(END_zg); printf("按任意键返回..."); getchar(); } else { printheader_pt(); printdata_pt(p); printf(END_pt); printf("按任意键返回..."); getchar(); } } else { Nofind(); getchar(); } } /*按编号或货物名称查询*/ void Sea_by_name(Link L,char s[]) { Node *p; char ss[20]; system("cls"); S_input(ss,10,"请输入要查找的货物名称:"); p=Locate(L,ss,"name"); Sea_by_ways(L,p,s); } void Sea_by_num(Link L,"请输入要查找的货物编号:"); p=Locate(L,"num"); Sea_by_ways(L,s); } /*日期相对于本年的天数*/ int Sum_day(int year,int mouth,int day) { int i,flag,days,sum=0; flag=Year_pd(year); for (i=1;i<mouth;i++) { days=Day_pd(i,flag); sum+=days; } return sum+day; } /*两个日期差值*/ void Datecha(Link L) { int year,mouth,day; Node *p; p=L->next; year=Num_input("今天日期:年:"); mouth=Mou_input("月:"); day=Day_input("日:",year,mouth); dateflag=1; if (!p) { printf("***无货物信息,不用输入日期***n"); getchar(); return ; } else { while (p) { p->data.datecha=Sum_day(year,day)-Sum_day(p->data.Date.year,p->data.Date.day); p=p->next; } } }
void Dz_by_data( Link L) { Node *p,*r; Link l; int year,day,count=0; p=L->next; l=(Node *)malloc(sizeof(Node)); l->next=NULL; system("cls"); if (!dateflag) { Datecha(L); } printf("| 编号 | 名称 |过期差值|n"); while (p) { printf("|%-6s|%-8s| %4d |",p->data.numbs,p->data.datecha); if (p->data.days>=p->data.datecha) { /*优惠的标示优惠*/ if (p->data.days-p->data.datecha<=10) { count++; p->data.sales=p->data.sales/2; printf("已优惠n"); /* Ltol(l,p->next);*/ } else { printf("n"); } } else { printf("该商品过期,请删除n"); } p=p->next; }
if(!count) { printf("/n***没有差10天过期的货物***/n"); getchar(); return; } else { printf("共有%d中商品打折",count); yhflag=1; saveflag=1; Disp(L,zg); } } /*删除*/ void Del_by_ways(Link L,Node *p) { Node *q; char ch; if (p) { q=L; while(q->next!=p) q=q->next; printheader_zg(); printdata_zg(p); printf(END_zg); getchar(); printf("请确定是否要删除该货物信息(y/n):"); scanf("%c",&ch); if (ch=='y'||ch=='Y') { q->next=p->next; free(p); printf("n成功删除该货物信息n"); saveflag=1; getchar(); return; } else { printf("n没有删除该货物信息n"); getchar(); return; } } else { Nofind(); getchar(); } } /*通过名称删除*/ void Del_by_name(Link L) { Node *p; char s[20]; system("cls"); S_input(s,"请输入要查删除的货物名称:"); p=Locate(L,s,"name"); Del_by_ways(L,p); } /*通过编号删除*/ void Del_by_num(Link L) { Node *p; char s[20]; system("cls"); S_input(s,"请输入要查删除的货物的编号:"); p=Locate(L,"num"); Del_by_ways(L,p); }
/*补货信息*/ void Buhuo(Link L) { Node *p,*q; int i=0; p=L->next; system("cls"); if (p) { q=L->next; printf("| 编号 | 名称 |库存|销量|剩余| n"); while (q) { /*统计库存,销量,剩余*/ 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); q=q->next; } while (p) { if ((p->data.stock-p->data.salesnumb)<100) { if (i==0) { printf("需要补货的货物分别是n"); printf("| 编号 |商品名称|n"); } printf("|%-8s|%8s|n",p->data.name); i++; } p=p->next; } if (i) { printf("共%d种货物n",i); getchar(); return; } else { printf("没有需要补充的货物种类n"); getchar(); return; } } else { printf("n***没有货物信息***n"); printf("n按任意键返回...n"); getchar(); return ; } }
void Sort_by_ways(Link L,int n) { int flag=0,a; Node *p,*q,*lq,*fq; /*fq记下节点前驱,lq记下节点的后驱,q每次冒泡遍历,p控制遍历,qq用来交换地址*/ p=L->next; system("cls"); while (p) { fq=L; q=fq->next; while (lq=q->next) { if (strcmp(zg,s)==0) { switch (n) { case 1:a=strcmp(q->data.name,lq->data.name);break; case 2:a=strcmp(q->data.numbs,lq->data.numbs);break; case 3:a=(q->data.salesnumb>lq->data.salesnumb);break; case 4:if(!incomflag) Sum_Income(L); a=(q->data.income>lq->data.income);break; case 5:if (!dateflag) Datecha(L);a=(q->data.datecha>lq->data.datecha);break; } } else { switch (n) { case 1:a=strcmp(q->data.name,lq->data.numbs);break; case 3:a=(q->data.sales>lq->data.sales);break; case 4:a=(q->data.salesnumb>lq->data.salesnumb);break; case 5:if (!dateflag) Datecha(L);a=(q->data.datecha>lq->data.datecha);break; } }
/*if ((n==1)?(strcmp(q->data.name,lq->data.name)):(strcmp(q->data.numbs,q->data.numbs)))*/ if(a>0) { flag=1; q->next=lq->next; lq->next=q; fq->next=lq; } fq=fq->next; q=fq->next; } if(flag==0) break; p=p->next; } if (strcmp(zg,s)==0) Disp(L,zg); else Disp(L,pt); }
void Wb_Save(Link L) { FILE *out; Node *p; int count=0; if ((out=fopen("d:Goods.txt","w"))==NULL) { printf("打开文件失败!n"); getchar(); return; } p=L->next; fprintf(out,HEADER1_zg); fprintf(out,HEADER2_zg); fprintf(out,HEADER3_zg); while (p) { fprintf(out,FORMAT_zg,DATA_zg); p=p->next; fprintf(out,HEADER3_zg); count++; } if (count>0) { getchar(); printf("nnn***文本文件保存完成,共%d条货物信息保存***n",count); getchar(); saveflag=0; } else { system("cls"); printf("没有货物信息,没有货物信息保存n"); getchar(); } fclose(out); /*关闭此文件*/ } void Er_Save(Link L) { FILE *out; Node *p; int count=0; if ((out=fopen("d:Goods","wb"))==NULL) { printf("打开文件失败!n"); getchar(); return; } p=L->next;
while (p) { if (fwrite(p,sizeof(Node),1,out)) { p=p->next; count++; } else { break; } } if (count>0) { getchar(); printf("nnn***二进制文件保存完成,共%d条货物信息保存***n",count); getchar(); saveflag=0; } else { system("cls"); printf("没有货物信息,没有货物信息保存n"); getchar(); } fclose(out); /*关闭此文件*/ } void Menu_sort_zg() { system("cls"); printf("nnn"); printf("%30s%s"," "," 排序货物信息 nn"); printf("%30s%s","********功能*******nn"); printf("%30s%s","* 1.按名称 *nn"); printf("%30s%s","* 2.按编号 *nn"); printf("%30s%s","* 3.按销量*nn"); printf("%30s%s","* 4.按利润*nn"); printf("%30s%s","* 5.按保期 *nn"); printf("%30s%s","* 6.返回 *nn"); printf("%30s%s","* 7.退出 *nn"); printf("%30s%s","********************n"); } void Menu_sort_pt() { system("cls"); printf("nnn"); printf("%30s%s","* 3.按售价 *nn"); printf("%30s%s","* 4.按销量 *nn"); printf("%30s%s","********************n"); } void Menu_del() { system("cls"); printf("nnn"); printf("%30s%s"," 删除货物信息 nn"); printf("%30s%s","* 3.返回 *nn"); printf("%30s%s","* 4.退出 *nn"); printf("%30s%s","********************n"); } void Menu_Sea() { system("cls"); printf("nnn"); printf("%30s%s"," 查询货物信息 nn"); printf("%30s%s","********************n"); } void Menu_Qx() /*权限菜单*/ { system("cls"); printf("nnn"); printf("%25s%s"," 欢迎进入 n"); printf("%25s%s"," 货物管理体统 nnn"); printf("%25s%s","**********功能*********nn"); printf("%25s%s","* 1.主管 *nn"); printf("%25s%s","* 2.普通用户 *nn"); printf("%25s%s","* 3.退出 *nn"); printf("%25s%s","***********************n"); } void Menu_zg() /*主管菜单*/ { system("cls"); printf("nnn"); printf("%15s%s"," 货物管理体统 nnn"); printf("%15s%s","*****************主管功能******************nn"); printf("%15s%s","* 1.录入货物信息 *n"); printf("%15s%s","* 2.删除货物信息 *n"); printf("%15s%s","* 3.查找货物信息 *n"); printf("%15s%s","* 4.显示货物信息 *n"); printf("%15s%s","* 5.差10天过物信息(促销) *n"); printf("%15s%s","* 6.统计货物数量(补货) *n"); printf("%15s%s","* 7.实时收益 *n"); printf("%15s%s","* 9.排序日期差 *n"); printf("%15s%s","* 10.保存文件 *n"); printf("%15s%s","* 11.返回 *n"); printf("%15s%s","* 12.退出 *n"); printf("%15s%s","*******************************************n"); } void Menu_pt() /*普通菜单*/ { printf("%15s%s","*****************普通用户功能***************nn"); printf("%15s%s","* 1.查找货物信息 *n"); printf("%15s%s","* 2.显示货物信息 *n"); printf("%15s%s","* 3.排序货物销量 *n"); printf("%15s%s","* 4.返回 *n"); printf("%15s%s","* 5.退出 *n"); printf("%15s%s","*************************************************n"); } void Isaveflag(Link L) { char ch; if (saveflag) { printf("您已经修改数据了,是否要保存退出(y/n):"); getchar(); scanf("%c",&ch); if (ch=='y'||ch=='Y') { Wb_Save(L); Er_Save(L); exit(0); } else exit(0); } else exit(0); } int IsPassword() /*密码是否通过*/ { char password[7]; char mypassword[]="123456"; static int n=3; int i; system("cls"); for (;n>0;n--) { switch(n) { case 1: case 2: printf("密码错误,您还有%d次机会,请再输入:",n);break; case 3: printf("请输入6位进入主管功能的密码:");getchar();break; } for ( i=0;i<6;i++) { password[i]=getch(); printf("*"); } getchar(); password[6]=' '; if (strcmp(mypassword,password)==0) { printf("***密码正确***"); getchar(); return 1; } } printf("恭喜你,三次都输错了,无法再输入密码,按任意键返回..."); getchar(); return 0; }
void Sort_goods(Link L,char s[]) { if (!L->next) { system("cls"); printf("n没有货物信息,无法使用排序功能n"); getchar(); return; } else { if (strcmp(zg,s)==0) { system("cls"); for (;;) { Menu_sort_zg(); switch(select(1,7)) { case 1:Sort_by_ways(L,zg,1);break; /*名称*/ case 2:Sort_by_ways(L,2);break; /*编号*/ case 3:Sort_by_ways(L,3);break; /*销量*/ case 4:Sort_by_ways(L,4);break; /*利润*/ case 5:Sort_by_ways(L,5);break; /*保期*/ case 6:return;break; case 7:Isaveflag(L);break; } getchar(); } } else { system("cls"); for (;;) { Menu_sort_pt(); switch(select(1,pt,1);break; /*名称*/ case 2:Sort_by_ways(L,2);break; /*编号*/ case 3:Sort_by_ways(L,3);break; /*售价*/ case 4:Sort_by_ways(L,4);break; /*销量*/ case 5:Sort_by_ways(L,5);break; /*销量*/ case 6:return;break; case 7:Isaveflag(L);break; } getchar(); } } } } void Sea_goods(Link L,char s[]) { if (!L->next) { system("cls"); printf("n***没有货物记录,不能进入查询功能***n"); return ; } else { system("cls"); for (;;) { Menu_Sea(); switch(select(1,4)) { case 1:Sea_by_name(L,s);break; case 2:Sea_by_num(L,s);break; case 3:return;break; case 4:Isaveflag(L);break; } getchar(); } } } void Del_goods(Link L) { if (!L->next) { system("cls"); printf("n***没有货物记录,不能使用删除功能***n"); return ; } else { system("cls"); for (;;) { Menu_del(); switch (select(1,4)) { case 1:Del_by_name(L);break; case 2:Del_by_num(L);break; case 3:return;break; case 4:Isaveflag(L);break; } getchar(); } } } void main_zg(Link L) /*主管功能*/ { system("cls"); for (;;) { Menu_zg(); switch (select(1,12)) { case 1:Add_goods(L);saveflag=1;break; /*增加货物信息*/ case 2:Del_goods(L);break; /*删除学生信息*/ case 3:Sea_goods(L,zg);break; /*按编号名字查询*/ case 4:system("cls");Disp(L,zg);break; case 5:Dz_by_data(L);break; case 6:Buhuo(L);break; case 7:Disp(L,zg);Sum_Income(L);Disp(L,zg);break; case 9:Sort_goods(L,zg);break; case 10:Wb_Save(L);Er_Save(L);break; case 11:return;break; case 12:Isaveflag(L);break; } getchar(); } } void main_pt(Link L) /*普通功能*/ { system("cls"); for (;;) { Menu_pt(); switch (select(1,5)) { case 1:Sea_goods(L,pt);break; /*按编号名字查询*/ case 2:system("cls");Disp(L,pt);break; case 3:Sort_goods(L,pt);break; case 4:return;break; case 5:Isaveflag(L);break; } getchar(); system("cls"); } } int main() { Link L; FILE *in; Node *p,*r; int count=0; L=(Node *)malloc(sizeof(Node)); L->next=NULL; r=L; if ((in=fopen("d:Goods","ab+"))==NULL) /*以追加方式打开二进制文件*/ { printf("n***打开文件失败***n"); exit(0); } while (!feof(in)) { p=(Node *)malloc(sizeof(Node)); if (fread(p,in)) { p->next=r->next; r->next=p; count++; } } fclose(in); for (;;) { Menu_Qx(); switch (select(1,3)) { case 1:if(IsPassword()) { main_zg(L); } break; case 2:main_pt(L);break; case 3:Isaveflag(L);break; } getchar(); } return 0; }
您可能感兴趣的文章:- C语言实现学生成绩管理系统
- C语言图书管理系统简洁版
- C语言图书管理系统课程设计
- C语言实现图书管理系统
- C语言数据结构之学生信息管理系统课程设计
- C语言学生管理系统源码分享
- C语言职工管理系统设计
- C语言设计图书登记系统与停车场管理系统的实例分享
- 使用C语言打造通讯录管理系统和教学安排系统的代码示例
- 学生成绩管理系统C语言代码实现
(编辑:安卓应用网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|