#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#include<process.h>
#include<time.h>
#define Null 0
struct goods*input(void);
struct goods*open(void);
void add(struct goods*head);
struct goods*delete(struct goods*head);
struct goods*amend(struct goods*head);
void print(struct goods*head);
void find(struct goods*head);
void statistics(struct goods*head);
void list1(struct goods*head);
struct goods*search(struct goods*head);
struct goods*incr1(struct goods*head);
void list2(struct goods*head);
struct goods*incr2(struct goods*head);
struct goods*sort1(struct goods*head);
struct goods*sort2(struct goods*head);
struct goods*sort3(struct goods*head);
struct goods*sort4(struct goods*head);
struct goods /*定义货物数据结构体*/
{
char number[20]; /*编号*/
char name[20]; /*名称*/
float Pprice; /*进货价*/
float Sprice; /*销售价*/
char ori[30]; /*产地*/
struct
{
int year;
int month;
int day;
}Pdate; /*生产日期*/
int Slife; /*保质期*/
int tim; /*过期时间*/
int inv; /*库存量*/
int left; /*剩余量*/
int Bsold; /*已销售量*/
float income; /*收益*/
struct goods*next;
};
int main(void)
{
struct goods*head;
char choose='\0',yes_no='\0';
do{
system("cls");
printf("|--------------------------------|\n");
printf("| 欢迎来到商店货物管理系统 |\n");
printf("| 请输入菜单选项编号(0~9) |\n");
printf("|--------------------------------|\n");
printf("| A---输入货物信息 |\n");
printf("| B---从文件读取货物信息 |\n");
printf("| C---添加一条货物信息 |\n");
printf("| D---删除一条货物信息 |\n");
printf("| E---修改一条货物信息 |\n");
printf("| F---显示所有货物信息 |\n");
printf("| G---显示差10天过期的货物信息 |\n");
printf("| H---按照货物编号查找货物信息 |\n");
printf("| I---统计全仓库各种货物库存总数、已销售数量和剩余总数 |\n");
printf("| J---增加货物促销信息 |\n");
printf("| K---增加货物补货信息 |\n");
printf("| L---按照货物编号排序 |\n");
printf("| M---按照货物名称排序 |\n");
printf("| N---按照货物剩余总数排序 |\n");
printf("| P---按照保质期截至日前排序 |\n");
printf("| 0---退出 |\n");
printf("|--------------------------------|\n");
printf(" \n");
choose=getche();
printf("\n");
switch(choose)
{
case'A':{head=input();list1(head);break;}
case'B':{head=open();list1(head);break;}
case'C':{add(head);list1(head);break;}
case'D':{head=delete(head);list1(head);break;}
case'E':{head=amend(head);list1(head);break;}
case'F':{print(head);break;}
case'G':{head=search(head);list2(head);break;}
case'H':{find(head);break;}
case'I':{statistics(head);break;}
case'J':{head=incr1(head);list2(head);break;}
case'K':{head=incr2(head);list2(head);break;}
case'L':{head=sort1(head);print(head);list2(head);break;}
case'M':{head=sort2(head);print(head);list2(head);break;}
case'N':{head=sort3(head);print(head);list2(head);break;}
case'P':{head=sort4(head);print(head);list2(head);break;}
case'0':{break;}
default:printf(" %c为非法选项!\n",choose);
}
if(choose=='0')break;
printf("\n 要继续选择吗(Y/N)?\n");
do
{
yes_no=getch();
}
while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
}
while(yes_no=='Y'||yes_no=='y');
}
/*
函数功能:输入货物信息
函数入口参数:空
函数返回值:结构体指针
*/
struct goods*input(void)
{
struct goods *head,*p,*s;
int i,n;
printf("请问有多少个货物信息需要输入?\n");
scanf("%d",&n);
getchar(); /*吸收输入n时的回车*/
for(i=1;i<=n;i++)
{
if(i==1)
{
printf("==============请输入%d个货物信息===============\n",i);
p=(struct goods*)malloc(sizeof(struct goods));
printf("编号:");
scanf("%s",p->number);
printf("名称:");
scanf("%s",p->name);
printf("进货价:");
scanf("%f",&p->Pprice);
printf("销售价:");
scanf("%f",&p->Sprice);
printf("产地:");
scanf("%s",p->ori);
printf("生产日期(年 月 日):");
scanf("%d %d %d",&p->Pdate.year,&p->Pdate.month,&p->Pdate.day);
printf("保质期(月):");
scanf("%d",&p->Slife);
printf("库存量:");
scanf("%d",&p->inv);
printf("已销售数量:");
scanf("%d",&p->Bsold);
p->income=(p->inv-p->Bsold)*(p->Sprice-p->Pprice);
p->left=p->inv-p->Bsold;
head=p;
}
else
{
printf("==============请输入%d个货物信息===============\n",i);
s=(struct goods*)malloc(sizeof(struct goods));
printf("编号:");
scanf("%s",s->number);
printf("名称:");
scanf("%s",s->name);
printf("进货价:");
scanf("%f",&s->Pprice);
printf("销售价:");
scanf("%f",&s->Sprice);
printf("产地:");
scanf("%s",s->ori);
printf("生产日期(年 月 日):");
scanf("%d %d %d",&s->Pdate.year,&s->Pdate.month,&s->Pdate.day);
printf("保质期(月):");
scanf("%d",&s->Slife);
printf("库存量:");
scanf("%d",&s->inv);
printf("已销售数量:");
scanf("%d",&s->Bsold);
s->income=(s->inv-s->Bsold)*(s->Sprice-s->Pprice);
s->left=s->inv-s->Bsold;
p->next=s;
p=s;
}
}
s->next=Null;
return head;
}
/*
函数功能:从文件读取货物信息
函数入口参数:空
函数返回值:结构体指针
*/
struct goods*open(void)
{
struct goods *head,*p,*s;
int i,n;
printf("将信息按:'编号 名称 进货价 销售价 产地 生产日期 保质期库存量 已销售数量'输入\n");
printf("\n");
printf("请问有多少个货物信息需要输入?\n");
scanf("%d",&n);
getchar(); /*吸收输入n时的回车*/
char ad[]="D:\\goods.txt";
FILE * fp;
while((fp=fopen(ad,"r+"))==NULL)
{
printf("没有找到输入的文件请重新输入文件名及其所在地址:\n");
gets(ad);
}
for(i=1;i<=n;i++)
{
if(i==1)
{
p=(struct goods*)malloc(sizeof(struct goods));
fscanf(fp,"%s %s %f %f %s %d %d %d %d %d %d",p->number,p->name,&p->Pprice,&p->Sprice,p->ori,&p->Pdate.year,&p->Pdate.month,&p->Pdate.day,&p->Slife,&p->inv,&p->Bsold);
p->income=(p->inv-p->Bsold)*(p->Sprice-p->Pprice);
p->left=p->inv-p->Bsold;
head=p;
}
else
{
s=(struct goods*)malloc(sizeof(struct goods));
fscanf(fp,"%s %s %f %f %s %d %d %d %d %d %d",s->number,s->name,&s->Pprice,&s->Sprice,s->ori,&s->Pdate.year,&s->Pdate.month,&s->Pdate.day,&s->Slife,&s->inv,&s->Bsold);
s->income=(s->inv-s->Bsold)*(s->Sprice-s->Pprice);
s->left=s->inv-s->Bsold;
p->next=s;
p=s;
}
}
s->next=Null;
fclose(fp);
return head;
}
/*
函数功能:增加一条货物信息
函数入口参数:结构体指针
函数返回值:空
*/
void add(struct goods*head)
{
struct goods*p,*pi,*pl;
char num[20];
printf("请问要在哪个货物后面添加记录(输入货物编号):\n");
scanf("%s",num);
pi=(struct goods *)malloc(sizeof(struct goods));
p=pl=head;
while((strcmp(pl->number,num)!=0)&&(pl->next!=Null))
{
pl=pl->next;
}
if(strcmp(pl->number,num)==0)
{
printf("========请输入新货物的信息===========\n");
printf("编号:");
scanf("%s",pi->number);
printf("名称:");
scanf("%s",pi->name);
printf("进货价:");
scanf("%f",&pi->Pprice);
printf("销售价:");
scanf("%f",&pi->Sprice);
printf("产地:");
scanf("%s",pi->ori);
printf("生产日期(年 月 日):");
scanf("%d %d %d",&pi->Pdate.year,&pi->Pdate.month,&pi->Pdate.day);
printf("保质期(月):");
scanf("%d",&pi->Slife);
printf("库存量:");
scanf("%d",&pi->inv);
printf("已销售数量:");
scanf("%d",&pi->Bsold);
pi->income=(pi->inv-pi->Bsold)*(pi->Sprice-pi->Pprice);
pi->left=pi->inv-pi->Bsold;
if(head=Null)
{
head=pi;
pi->next=Null;
}
else
{
while((strcmp(p->number,num)!=0)&&(p->next!=Null))
{
p=p->next;
}
if(p->next!=Null)
{
pi->next=p->next;
p->next=pi;
}
else
{
p->next=pi;
pi->next=Null;
}
}
}
else
printf("没有找到相应的货物信息记录,请重试!\n");
}
/*
函数功能:删除一条货物信息
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*delete(struct goods*head)
{
struct goods*p,*q;
char num[20];
p=head;
printf("请输入要删除货物的编号:\n");
scanf("%s",num);
if(head==Null)
{
printf("没有要删除的货物信息!\n");
return head;
}
while((strcmp(p->number,num)!=0)&&(p->next!=Null))
{
q=p;
p=p->next;
}
if(strcmp(p->number,num)==0)
{
if(p==head)
head=p->next;
else
q->next=p->next;
free(p);
}
else
printf("没有找到相应货物信息,请重试!\n");
return head;
}
/*
函数功能:修改一条货物信息
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*amend(struct goods*head)
{
struct goods*p,*q;
int flag=0;
char num[20];
p=head;
printf("请输入要修改货物的编号:\n");
scanf("%s",num);
if(head==Null)
{
printf("没有要修改的货物信息!\n");
return head;
}
while(p!=Null)
{
if(strcmp(p->number,num)==0)
{
flag=1;
printf("============请输入新的货物信息==========\n");
printf("编号:");
scanf("%s",p->number);
printf("名称:");
scanf("%s",p->name);
printf("进货价:");
scanf("%f",&p->Pprice);
printf("销售价:");
scanf("%f",&p->Sprice);
printf("产地:");
scanf("%s",p->ori);
printf("生产日期(年 月 日):");
scanf("%d %d %d",&p->Pdate.year,&p->Pdate.month,&p->Pdate.day);
printf("保质期(月):");
scanf("%d",&p->Slife);
printf("库存量:");
scanf("%d",&p->inv);
printf("已销售数量:");
scanf("%d",&p->Bsold);
p->income=(p->inv-p->Bsold)*(p->Sprice-p->Pprice);
p->left=p->inv-p->Bsold;
}
p=p->next;
}
if(flag==0)
printf("没有找到要修改的货物信息,请重试!\n");
return head;
}
/*
函数功能:查看所有货物信息记录
函数入口参数:结构体指针
函数返回值:无
*/
void print(struct goods*head)
{
struct goods*p;
p=head;
printf("==========================货物信息========================================\n");
printf("编号 名称 进货价 销售价 产地 生产日期 保质期 库存量 已销售数量 剩余量 收益\n");
while(p!=Null)
{
printf("%s %s %.2f %.2f %s %d %d %d %d %d %d %d %.2f\n",p->number,p->name,p->Pprice,p->Sprice,p->ori,p->Pdate.year,p->Pdate.month,p->Pdate.day,p->Slife,p->inv,p->Bsold,p->left,p->income);
p=p->next;
}
}
/*
函数功能:按编号查找一条货物信息
函数入口参数:结构体指针
函数返回值:无
*/
void find(struct goods*head)
{
struct goods*p;
char num[20];
int flag=0;
p=head;
printf("请输入要查找货物的编号:\n");
scanf("%s",num);
while(p!=Null)
{
if(strcmp(p->number,num)==0)
{
flag=1;
printf("==============================货物信息====================================\n");
printf("\n");
printf("编号 名称 进货价 销售价 产地 生产日期 保质期 库存量 已销售数量 剩余量 收益\n");
printf("%s %s %.2f %.2f %s %d %d %d %d %d %d %d %.2f",p->number,p->name,p->Pprice,p->Sprice,p->ori,p->Pdate.year,p->Pdate.month,p->Pdate.day,p->Slife,p->inv,p->Bsold,p->left,p->income);
}
p=p->next;
}
if(flag==0)
printf("没有找到该编号的货物信息,请重试!\n");
}
/*
函数功能:统计全仓库各种货物库存总数、已销售数量和剩余总数
函数入口参数:结构体指针
函数返回值:无
*/
void statistics(struct goods*head)
{
struct goods*p;
int sum1=0,sum2=0,sum3=0;
p=head;
printf("======全仓库各种货物库统计======\n");
printf("\n");
printf("库存总数 已销售数量 剩余总数\n");
while(p!=Null)
{
sum1=sum1+p->inv;
sum2=sum2+p->Bsold;
sum3=sum3+p->left;
p=p->next;
}
printf("%d %d %d\n",sum1,sum2,sum3);
}
/*
函数功能:显示差10天过期的货物信息
函数入口参数:结构体指针
函数返回值:无
*/
struct goods*search(struct goods*head)
{
int flag=0;
struct goods*p,*q;
p=head,q=head;
int y,m,d;
struct tm *t;
time_t tt;
time(&tt);
t=localtime(&tt);
printf("当前时间为%d年%d月%d日\n",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
y=t->tm_year+1900;
m=t->tm_mon+1;
d=t->tm_mday;
while(p!=Null)
{
p->tim=(p->Pdate.year*365+p->Pdate.month*30+p->Pdate.day+p->Slife*30)-(y*365+m*30+d);
if(p->tim==10)
flag=1;
p=p->next;
}
if(flag==0)
printf("货物中没有找到指定差10天过期的货物信息");
else
{
printf("===============================货物信息===========================================\n");
printf("编号 名称 进货价 销售价 产地 生产日期 保质期 过期日期 库存量 已销售数量 剩余量 收益\n");
while(q!=Null)
{
if(q->tim==10)
{
printf("%s %s %.2f %.2f %s %d %d %d %d %d %d %d %d %.2f\n",q->number,q->name,q->Pprice,q->Sprice,q->ori,q->Pdate.year,q->Pdate.month,q->Pdate.day,q->Slife,q->tim,q->inv,q->Bsold,q->left,q->income);
}
q=q->next;
}
}
return head;
}
/*
函数功能:增加促销信息
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*incr1(struct goods*head)
{
int flag=0;
struct goods*p;
p=head;
while(p!=Null)
{
if(p->tim==10)
{
flag=1;
p->Sprice=p->Sprice/2;
}
p=p->next;
}
if(flag==0)
printf("没有找到指定差10天过期的物品,请重试!\n");
else
printf("已将指定差10天过期的物品以半价出售!");
return head;
};
/*
函数功能:增加补货信息
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*incr2(struct goods*head)
{
int flag=0,add;
struct goods*q;
q=head;
while(q!=Null)
{
if(q->left<100)
{
printf("======================货物信息=============================\n");
printf("编号 名称 进货价 销售价 产地 库存量 已销售数量 剩余量 收益\n");
printf("%s %s %.2f %.2f %s %d %d %d %.2f\n",q->number,q->name,q->Pprice,q->Sprice,q->ori,q->inv,q->Bsold,q->left,q->income);
printf("请输入该货物需要补货的量\n");
scanf("%d",&add);
q->inv=q->inv+add;
q->income=(q->inv-q->Bsold)*(q->Sprice-q->Pprice);
q->left=q->inv-q->Bsold;
flag=1;
}
q=q->next;
}
if(flag==0)
printf("没有找到剩余量少于100的货物信息\n");
return head;
};
/*
函数功能:按照货物编号
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*sort1(struct goods*head)
{
struct goods*p,*p1,*p2,*p3;
struct goods h, t;
if (head == Null)
return Null;
h.next=head;
p=&h; //使用头结点,避免特殊情况的处理,因为代价太高
while (p->next!=Null)
{
p=p->next;
}
p=p->next=&t; //!!!链表的尾节点可能被交换到链表中间去,这里使用了一个固定的节点
while (p!=h.next)
{
p3=&h;
p1=p3->next;
p2=p1->next;
while (p2!=p) //p指向的是已就序的节点
{
if (strcmp(p1->number,p2->number)>0)
{//避免在双层循环内进行特殊情况的判断,因为这里的时间复杂度是O(n^2)
p1->next=p2->next;
p2->next=p1;
p3->next=p2;
p3=p2; //由于加了表头和表尾,整个交换过程更简洁
p2=p1->next;
} else {
p3=p1;
p1=p2;
p2=p2->next;
}
}
p=p1;
}
while (p->next!=&t)
{
p=p->next; //虽然这里复杂度是O(n),但是远比在双层循环内的特殊处理要高效的多
}
p->next=Null;
return h.next;
};
/*
函数功能:按照货物名称
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*sort2(struct goods*head)
{
struct goods*p,*p1,*p2,*p3;
struct goods h, t;
if (head == Null)
return Null;
h.next=head;
p=&h; //使用头结点,避免特殊情况的处理,因为代价太高
while (p->next!=Null)
{
p=p->next;
}
p=p->next=&t; //!!!链表的尾节点可能被交换到链表中间去,这里使用了一个固定的节点
while (p!=h.next)
{
p3=&h;
p1=p3->next;
p2=p1->next;
while (p2!=p) //p指向的是已就序的节点
{
if (strcmp(p1->name,p2->name)>0)
{//避免在双层循环内进行特殊情况的判断,因为这里的时间复杂度是O(n^2)
p1->next=p2->next;
p2->next=p1;
p3->next=p2;
p3=p2; //由于加了表头和表尾,整个交换过程更简洁
p2=p1->next;
} else {
p3=p1;
p1=p2;
p2=p2->next;
}
}
p=p1;
}
while (p->next!=&t)
{
p=p->next; //虽然这里复杂度是O(n),但是远比在双层循环内的特殊处理要高效的多
}
p->next=Null;
return h.next;
};
/*
函数功能:按照货物剩余总数
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*sort3(struct goods*head)
{
struct goods*p,*p1,*p2,*p3;
struct goods h, t;
if (head == Null)
return Null;
h.next=head;
p=&h; //使用头结点,避免特殊情况的处理,因为代价太高
while (p->next!=Null)
{
p=p->next;
}
p=p->next=&t; //!!!链表的尾节点可能被交换到链表中间去,这里使用了一个固定的节点
while (p!=h.next)
{
p3=&h;
p1=p3->next;
p2=p1->next;
while (p2!=p) //p指向的是已就序的节点
{
if ((p1->left)>(p2->left))
{//避免在双层循环内进行特殊情况的判断,因为这里的时间复杂度是O(n^2)
p1->next=p2->next;
p2->next=p1;
p3->next=p2;
p3=p2; //由于加了表头和表尾,整个交换过程更简洁
p2=p1->next;
} else {
p3=p1;
p1=p2;
p2=p2->next;
}
}
p=p1;
}
while (p->next!=&t)
{
p=p->next; //虽然这里复杂度是O(n),但是远比在双层循环内的特殊处理要高效的多
}
p->next=Null;
return h.next;
};
/*
函数功能:按照保质期截至日前排序
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*sort4(struct goods*head)
{
struct goods*p,*p1,*p2,*p3;
struct goods h, t;
if (head == Null)
return Null;
h.next=head;
p=&h; //使用头结点,避免特殊情况的处理,因为代价太高
while (p->next!=Null)
{
p=p->next;
}
p=p->next=&t; //!!!链表的尾节点可能被交换到链表中间去,这里使用了一个固定的节点
while (p!=h.next)
{
p3=&h;
p1=p3->next;
p2=p1->next;
while (p2!=p) //p指向的是已就序的节点
{
if ((p1->tim)>(p2->tim))
{//避免在双层循环内进行特殊情况的判断,因为这里的时间复杂度是O(n^2)
p1->next=p2->next;
p2->next=p1;
p3->next=p2;
p3=p2; //由于加了表头和表尾,整个交换过程更简洁
p2=p1->next;
} else {
p3=p1;
p1=p2;
p2=p2->next;
}
}
p=p1;
}
while (p->next!=&t)
{
p=p->next; //虽然这里复杂度是O(n),但是远比在双层循环内的特殊处理要高效的多
}
p->next=Null;
return h.next;
};
/*
函数功能:将数据从缓冲区存储到硬盘文件中
函数入口参数:结构体指针
函数返回值:无
*/
void list1(struct goods*head)
{
char ad[]="D:\\goods.txt";;
FILE * fp;
struct goods*p;
p=head;
fp=fopen(ad,"w+");
fprintf(fp,"==============================货物信息=====================================\n");
fprintf(fp,"编号 名称 进货价 销售价 产地 生产日期 保质期 库存量 已销售数量 剩余量 收益\n");
while(p!=Null)
{
fprintf(fp,"%s %s %.2f %.2f %s %d %d %d %d %d %d %d %.2f\n",p->number,p->name,p->Pprice,p->Sprice,p->ori,p->Pdate.year,p->Pdate.month,p->Pdate.day,p->Slife,p->inv,p->Bsold,p->left,p->income);
p=p->next;
}
fclose(fp);
}
/*
函数功能:将数据从缓冲区存储到硬盘文件中
函数入口参数:结构体指针
函数返回值:无
*/
void list2(struct goods*head)
{
char ad[]="D:\\goods.txt";
FILE * fp;
struct goods*p;
p=head;
fp=fopen(ad,"w+");
fprintf(fp,"===============================货物信息============================================\n");
fprintf(fp,"编号 名称 进货价 销售价 产地 生产日期 保质期 过期日期 库存量 已销售数量 剩余量 收益\n");
while(p!=Null)
{
fprintf(fp,"%s %s %.2f %.2f %s %d %d %d %d %d %d %d %d %.2f\n",p->number,p->name,p->Pprice,p->Sprice,p->ori,p->Pdate.year,p->Pdate.month,p->Pdate.day,p->Slife,p->tim,p->inv,p->Bsold,p->left,p->income);
p=p->next;
}
fclose(fp);
}