
问题描述:
已知一公司有10种产品(产品编号,产品名称,产品价格,产品产地,库存数量(最开始为1000个)),设计一程序,完成以下功能:
1)1)销售:从键盘输入顾客姓名,销售数量、销售日期,实现销售功能。需要判断产品是否存在,销售数量是否小于库存数量,销售日期格式是否合法(格式为:YYYY-MM-DD,如2009-01-02))
2)2)能根据产品编号查询产品的销售历史
3)3)计算时间段内各个产品的销售总额
4)4)能根据顾客姓名,查询购买历史
5)5)能显示所有顾客的姓名
提示:
●●定义一个日期结构体保存日期,具体信息为:年、月、日
●●判断存款日期和取款日期的格式是否合法时,需要判断长度是否为10,第5位和第8位是否为’-’,字符,将1-4位表示的年份,6-7位表示的月份,9-10位表示的日期分别转换成整数。判断是否满足构成日期的条件闰年月份只能是1-12之间的数,如果是闰年,二月可以是29天否则不能大于28,1,3,5,7,8,10,12月可以是31天,其余只能小于等于30(建议写成函数)。
●●定义一个结构体数组保存10种产品信息,具体信息为:产品编号,产品名称,产品价格,产品产地,库存数量(最开始为1000个)
●●定义一个链表,保存销售信息,具体为:顾客代码,销售数量、销售日期。
●●定义一个链表保存顾客信息,具体为:顾客代码,顾客姓名
●●当输入销售信息时查询顾客链表,如果在链表中存在该姓名的顾客记录,则将其代码在该销售链表中插入一条记录,如果不存在,则在顾客链表中插入一条记录,(顾客代码需要自动生成)。
#include "stdio.h" /*I/O函数*/
#include "stdlib.h" /*标准库函数*/
#include "string.h"/*字符串函数*/
#include "ctype.h" /*字符操作函数*/
#include "time.h" /*时钟函数*/
#include "cstdlib"
#include "conio.h"
int x,k;/*定义全局变量用于保存当前商品种类*/
struct product /*定义商品数据结构*/
{
int num; /*商品编号*/
char name[20]; /*商品名称*/
float price; /*商品售价*/
char place[10]; /*商品名称*/
int storage; /*商品库存*/
}_product[10],product1[10];//定义主结构体数组和备用结构体数组
struct data//定义日期结构体
{ int year,month,day;
};
struct sell /*定义销售数据结构*/
{
int cus; /*顾客代码*/
int num; /*商品编号*/
float sells;/*销售数量*/
char data1[12];/*日期*/
struct sell * next;
}*head_s,*pp,*tail_s;//定义头指针操、作指针以及尾指针
struct customer /*定义销售数据结构*/
{
int cus; /*顾客代码*/
char name[10]; /*顾客姓名*/
struct customer * next;
}*head_c,*qq,*tail_c;//定义头指针操、作指针以及尾指针
void load();//读取文件函数
void add();//添加销售信息函数
int search_num();//根据商品编号查询商品的销售历史
void cal();//计算时间段内各个商品的销售总额
int search_name();//根据顾客姓名,查询购买历史
void list_name();//显示所有顾客的姓名
void main();//主函数
int judge();//主体判断函数
int judge_data(char *data1);//细节判断函数,用于判断日期是否合法
void download_s();//写入销售信息(顾客代码,销售数量、销售日期)文件
void download_c();//导出顾客购买记录
void display();//显示现在的商品信息
//主函数
void main()
{
int choice;
struct customer * head;//定义结构指针
head=malloc(sizeof(struct customer));//申请动态存储空间
head->next=NULL;
do
{
printf("***********************欢迎使用商品销售管理系统!!!*******************\\n\\n");
printf(" 1. 导入商品信息\\n");
printf(" 2. 显示商品信息\\n");
printf(" 3. 输入销售记录记录\\n");
printf(" 4. 按编号查寻商品销售历史\\n");
printf(" 5. 计算时间段内各个销售总额\\n");
printf(" 6. 按顾客姓名查找购买历史\\n");
printf(" 7. 显示顾客姓名\\n");
printf(" 8. 导出销售信息(顾客代码,销售数量、销售日期)文件\\n");
printf(" 9. 导出顾客信息文件\\n");
printf(" 0. 退出\\n");
printf("***********************************************************************\\n");
printf("请选择不同功能 输入0----9的数字\\n 若输入其它值会提前退出\\n");
scanf("%d",&choice);
system("cls");
switch(choice)
{
case 1:
load();
system("cls");
break;
case 2:
display();
break;
case 3:
add();
break;
case 4:
search_num();
break;
case 5:
cal();
break;
case 6:
search_name();
break;
case 7:
list_name(head);
break;
case 8:
download_s();
break;
case 9:
download_c();
break;
case 0:
printf("\\n\\n\\n\\n");
printf("*************谢谢使用************\\n\\n\\n\\n");
break;
}
}while(choice>0&&choice<=9);
}
void display()
{
int code,i=0;
pp=(struct sell *)malloc(sizeof(struct sell));//申请动态存储空间并将指针转变为结构类型
qq=(struct customer *)malloc(sizeof(struct customer));//申请动态存储空间并将指针转变为结构类型
pp->next=NULL;
qq->next=NULL;
system("cls"); /*清屏*/
printf("**************************商品信息**************************\\n\\n\\n");
printf(" 商品编号 商品名称 商品价格 商品产地 库存数量\\n");
while(i<10)
{ //输出商品记录
printf("%8d%12s %12.2f%10s%14d\\n",_product[i].num,_product[i].name,_product[i].price,
_product[i].place,_product[i].storage);
i++;
}
printf("\\n\\n查询完毕,请按任意键继续......");
getch();
system("cls");
}
void load(){//读取文件函数
int i=0,n=0,a,b,j;
FILE *fp; //指向文件的指针
do{
printf("请选择导入商品信息的方法\\n1:通过键盘输入\\n2:通过文件导入\\n");
scanf("%d",&a);
if(a==2){
if((fp=fopen("商品信息.txt","rb"))==NULL)//打开文件
{
printf("不能打开文件,请检查文件路径\\n"); //不能打开
exit(0); //退出*/
}printf("*****************88商品信息88*******************\\n");
printf("编号 名称 价格 产地 库存数量\\n");
while(!feof(fp))
{ //读入文件
fscanf(fp,"%d%s%f%s%d",&_product[i].num,_product[i].name,&_product[i].price,_product[i].place,&_product[i].storage);
printf("%-10d%-10s %-10.2f%-12s%-12d\\n",_product[i].num,_product[i].name,_product[i].price,_product[i].place,_product[i].storage);
i++;
}
for(i=0;i<10;i++)
product1[i]=_product[i]; //对备用结构体数组赋值
fclose(fp); //关闭文件
printf("\\数据读入成功!按任意键继续......\\n");
}
if(a==1)
{ if((fp=fopen("商品信息1.txt","w"))==NULL)//打开文件
{
printf("不能打开文件,请检查文件路径\\n"); //不能打开
exit(0); //退出*/
}
printf("请输入商品种数");
scanf("%d",&b);
printf("*************商品信息***************\\n");
printf("编号 名称 价格 产地 库存数量\\n");
for(j=1;j<=b;j++){
scanf("%d%s%f%s%d",&_product[i].num,_product[i].name,&_product[i].price,_product[i].place,&_product[i].storage);
fprintf(fp,"%-6d%-6s%-6.2f%-6s%-6d\\n",_product[i].num,_product[i].name,_product[i].price,_product[i].place,_product[i].storage);
}
fclose(fp); //关闭文件
printf("\\数据读入成功!按任意键继续......\\n");
}
}while(a!=1&&a!=2);}
//细节判断函数,用于判断日期是否合法
int judge_data(char *data1)
{
int n=1,m,year=(data1[0]-48)*1000+(data1[1]-48)*100+(data1[2]-48)*10+(data1[3]-48),
month=(data1[5]-48)*10+(data1[6]-48),day=(data1[8]-48)*10+(data1[9]-48);
m=strlen(data1);
if(m!=10)
n=0;
if(data1[4]!='-'||data1[7]!='-')
n=0;
if(year>10000||year<1000||month>12||month<1||day>31||day<1) n=0;
if(((year%4==0&&year%100!=0)||(year%400==0))&&month==2)
if(day>30) n=0;
if(month==2&&day>=29) n=0;
if(month==4||month==6||month==9||month==11)
if(day>30) n=0;
return n;
}
//判断函数
int judge()//判断商品编号 数量 日期是否正确
{
int i,j=0,k,temp;
for(i=0;i<10;i++)
if(pp->num==_product[i].num)
{
j++;
x=k=i;
temp=_product[k].storage;
if((_product[k].storage-(int)pp->sells)>=0)
_product[k].storage-=(int)pp->sells;//判断计算剩余量
break;
}
if(j==0) return 3;//判断是否存在输入编号的商品
else if(temp-(int)pp->sells<0) return 2;//判断输入量是否大于剩余库存量
else if(pp->sells-(int)pp->sells>=1e-6) return 4;//商品量
else if(judge_data(pp->data1)==0) return 0;//判断日期
else return 1;//完全正确
}
//添加销售信息函数
void add()
{
int code,i=0,n,m;
pp=(struct sell *)malloc(sizeof(struct sell));//申请动态存储空间并将指针转变为结构类型
qq=(struct customer *)malloc(sizeof(struct customer));//申请动态存储空间并将指针转变为结构类型
srand(time(0));
code=rand();
pp->next=NULL;
qq->next=NULL;
system("cls"); /*清屏*/
printf("请输入销售记录\\n\\n\\n"); /*提示输入记录*/
printf("顾客姓名 商品编号 销售数量 销售日期\\n");
printf("-----------------------------------------------------------\\n");
scanf("%s%d%f%s",qq->name,&pp->num,&pp->sells,pp->data1); /*输入记录*/
n=(int)pp->sells;
if(n<=0)
{
printf("商品数量有误!!!请从新输入");
scanf("%f",&pp->sells);
}
while(1)
{
m=judge();//判断商品编号 数量 日期是否正确
if(m==1){
// pp=(struct sell *)malloc(sizeof(struct sell));//申请动态存储空间并将指针转变为结构类型
// qq=(struct customer *)malloc(sizeof(struct customer));
pp->cus=qq->cus=code;//随机数
if(head_s==NULL)
head_s=pp;
else
tail_s->next=pp;
tail_s=pp;
if(head_c==NULL) head_c=qq;
else tail_c->next=qq;
tail_c=qq;
printf("\\销售信息输入成功!按任意键继续......\\n");
getch();
system("cls");
break;
}
else if(m==2)
{
system("cls");
printf("销售数量已大于库存数量,请重新输入:\\n\\n\\n");
printf("请输入销售数量\\n\\n\\n"); /*提示输入记录*/
printf("销售数量 \\n");
scanf("%f",&pp->sells); /*输入记录*/
continue;
}
else if(m==3){
system("cls");
printf("无此商品,请重新输入:\\n\\n\\n");
printf("请输入销售记录\\n\\n\\n"); /*提示输入记录*/
printf(" 商品编号 \\n");
scanf("%d",&pp->num); /*输入记录*/
continue;
}
else if(m==4){
system("cls");
printf("商品数量输入错误,请重新输入商品数量:\\n\\n\\n");
printf("请输入销售记录\\n\\n\\n"); /*提示输入记录*/
printf("销售数量:\\n");
scanf("%f",&pp->sells); /*输入记录*/
continue;
}
else if(m==0){
system("cls");
printf("销售日期不合法,请重新输入销售日期:\\n\\n\\n");/*提示输入记录*/
printf("销售日期\\n");
scanf("%s",pp->data1); /*输入记录*/
continue;}
k++;}
}
//根据商品编号查询商品的销售历史
search_num()
{
int i,num,k=0,flag=1,n=0;
struct sell * ptr;
system("cls");
printf("请输入商品编号:\\n");
scanf("%d",&num);
for(i=0;i<10;i++)
if(num==_product[i].num) {flag=0;break;}
if(flag==1)
{ system("cls");
printf("无此商品,请查实商品编号后按任意键准备重新输入!!!");
getch();
system("cls");
return 0;
}
for(ptr=head_s;ptr;ptr=ptr->next)
if(num==ptr->num)
{ if(k==0)
{
printf("商品编号 销售数量 销售总额 销售日期\\n");
printf("-----------------------------------------------------------\\n");
k++;
}
printf("%5d%20d%20.2f%15s\\n",ptr->num,(int)ptr->sells,
(int)ptr->sells*_product[i].price,ptr->data1);
}
if(k==0) { printf("该商品记录为空!!!按任意键继续......");
getch();
system("cls");
return 0;
}
else
{
printf("\\n\\n查询完毕,请按任意键继续......");
getch();
system("cls");
return 0;
}
}
//计算时间段内各个商品的销售总额
void cal()
{
int i,n=0;
struct sell s1,s2,*p=&s1,*q=&s2,*ptr;
system("cls");
printf("请输入开始日期:");
scanf("%s",p->data1);
system("cls");
do{
if(judge_data(pp->data1)!=1)
{ printf("输入日期不合法,请重新输入:");
scanf("%s",p->data1);
system("cls");
n=1;
}
else
n=0;
}while(n==1);
printf("请输入结束日期:");
scanf("%s",q->data1);
system("cls");
do{
if(judge_data(q->data1)!=1)
{ printf("输入日期不合法,请重新输入:");
scanf("%s",q->data1);
system("cls");
n=1;
}
else
n=0;
}while(n==1);
printf("销售记录如下:\\时间:%s至%s\\n",p->data1,q->data1);
printf("\\n\\n\\商品编号 销售总额\\n");
printf("\\---------------------------\\n\\n");
for(ptr=head_s;ptr;ptr=ptr->next)
{
for(i=0;i<10;i++)
if(product1[i].num==ptr->num) break;
product1[i].storage-=(int)ptr->sells;
}
for(i=0;i<10;i++)
printf("\\%2d\\%.2f\\n",product1[i].num,product1[i].price*(1000-product1[i].storage));
printf("\\n\\n查询完毕,请按任意键继续......");
getch();
system("cls");
}
//根据顾客姓名,查询购买历史
int search_name()
{
int i,k=1;
char name[10];
struct customer * ptr1;
struct sell * ptr2;
system("cls");
printf("请输入顾客姓名:\\n");
scanf("%s",name);
for(ptr1=head_c;ptr1;ptr1=ptr1->next)
{ for(ptr2=head_s;ptr2;ptr2=ptr2->next)
if(ptr1->cus==ptr2->cus) break;
for(i=0;i<10;i++)
if(ptr2->num==_product[i].num) break;
if(strcmp(name,ptr1->name)==0)
{
// if(k==0||k%8==0)
{ printf("顾客姓名 顾客代码 商品编号 购买数量 购买总额 购买日期\\n");
printf("---------------------------------------------------------------------------------\\n");
}
printf("%2s%15d%15d%10d%15.2f%15s\\n",ptr1->name,ptr1->cus,ptr2->num,(int)ptr2->sells,((int)ptr2->sells)*product1[i].price,ptr2->data1);
//k++;
}
k=0;
}
if(k==0)
{
printf("不存在此顾客!!!按任意键继续......");
getch();
system("cls");
return 0;
}
else{
printf("\\n\\n查询完毕,请按任意键继续......");
getch();
system("cls");
return 0;
}
}
//显示所有顾客的姓名
void list_name()
{ int n=1;
struct customer * ptr;
system("cls");
if(head_c!=NULL)//判断链表是否为空
{
printf("顾客姓名如下:\\n");//用来显示所有顾客的姓名
for(ptr=head_c;ptr;ptr=ptr->next)
{ printf("\\%s\\n",ptr->name);
n++;
}
printf("\\n\\n顾客姓名查询完毕,请按任意键继续......");
getch();
system("cls");
}
else
{
printf("顾客链表为空!!!请按任意键继续......");
getch();
system("cls");
}
}
void download_s()//写入销售信息(顾客代码,销售数量、销售日期)文件
{
int i=0;
FILE *fp;
struct customer *ptr1;
struct sell *ptr2;
system("cls");
if((fp=fopen("销售信息文件.txt","w"))==NULL)
{ printf("销售信息文件无法生成!\\n");
exit(0);
}
if(qq!=NULL)
{
fprintf(fp," 顾客代码 销售数量 购买日期\\n");
for(ptr1=head_c;ptr1;ptr1=ptr1->next)
{ for(ptr2=head_s;ptr2;ptr2=ptr2->next)
if(ptr1->cus==ptr2->cus)
{ for(i=0;i<10;i++)
if(ptr2->num==_product[i].num)
break;
break;
}
fprintf(fp,"%8d%10d %10s\\n",ptr1->cus,(int)ptr2->sells,ptr2->data1);
}
fclose(fp);
printf("文件保存完毕!“销售信息文件.txt”文件.\\n");
printf("按任意键继续......\\n");
getch();
system("cls");
}
else
{
printf("顾客记录为空!!!按任意键继续......");
getch();
system("cls");
}
}
void download_c()//导出顾客购买记录
{
int i=0;
FILE *fp;
struct customer *ptr1;
struct sell *ptr2;
system("cls");
if((fp=fopen("顾客信息文件.txt","w"))==NULL)
{ printf("顾客信息文件无法生成!\\n");
exit(0);
}
if(qq!=NULL)
{
fprintf(fp,"顾客姓名 顾客代码 \\n");
for(ptr1=head_c;ptr1;ptr1=ptr1->next)
{ for(ptr2=head_s;ptr2;ptr2=ptr2->next)
if(ptr1->cus==ptr2->cus)
{ for(i=0;i<10;i++)
if(ptr2->num==_product[i].num)
break;
break;
}
fprintf(fp,"%5s%10d\\n",ptr1->name,ptr1->cus);
}
fclose(fp);
printf("文件保存完毕!“顾客信息文件.txt”文件.\\n");
printf("按任意键继续......\\n");
getch();
system("cls");
}
else
{
printf("顾客记录为空!!!按任意键继续......");
getch();
system("cls");
