
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
char fruit[5][10]={"苹果","桔子","香蕉","柚子","芒果"};
float Price[5]={4.5,2.3,5.4,1.8,4};
float M[10000]={0};
typedef struct _CARD
{
int no;//卡号
float money[2];//购物前 购物后
}CARD;
typedef struct _RECORD
{
int no;//序号
int time[5];//时间
int buy_count;//购买数量
int fruit_style[5];//水果种类
float price[5];//价格
float num[5];//重量
int pay_style;//付款方式
float money[2];//付款 找零
CARD card;//使用会员卡
}RECORD;
typedef struct _List
{
RECORD rec;
struct _List* next;
}List;
RECORD rec[100];
int NUM=0;
int COUNT=1000;
void Input_Record()
{
int i,j=-1;
char str[20];
float sum=0;
time_t tmpcal_ptr;
struct tm *tmp_ptr = NULL;
system("cls");
rec[NUM].buy_count=0;
do
{
rec[NUM].buy_count++;
j++;
printf("请选择购买水果种类:\n");
for(i=0;i<5;i++)
{
printf("%d:%s 单价:%.2f元/斤\n",i+1,fruit[i],Price[i]);
}
fflush(stdin);
scanf("%d",&rec[NUM].fruit_style[j]);
while(rec[NUM].fruit_style[j]<1||rec[NUM].fruit_style[j]>5)
{
printf("没有该选项\n");
fflush(stdin);
scanf("%d",&rec[NUM].fruit_style[j]);
}
rec[NUM].price[j]=Price[rec[NUM].fruit_style[j]-1];//水果单价
printf("请选择购买重量:\n");
fflush(stdin);
scanf("%f",&rec[NUM].num[j]);
printf("是否继续购买(Y/N)?:\n");
fflush(stdin);
scanf("%s",str);
while(strcmp(str,"Y")&&strcmp(str,"y")&&strcmp(str,"N")&&strcmp(str,"n"))
{
printf("输入错误,重新输入(Y/N)?:\n");
fflush(stdin);
scanf("%s",str);
}
}while(!strcmp(str,"Y")||!strcmp(str,"y"));
for(i=0;i<rec[NUM].buy_count;i++)
{
sum+=rec[NUM].num[i]*rec[NUM].price[i];
}
printf("需要付款%.2f\n",sum);
printf("请选择付款方式\n");
printf("1:现金\n");
printf("2:会员卡\n");
fflush(stdin);
scanf("%d",&rec[NUM].pay_style);
while(rec[NUM].pay_style<1||rec[NUM].pay_style>2)
{
printf("没有该选项\n");
fflush(stdin);
scanf("%d",&rec[NUM].pay_style);
}
if(sum>1000&&rec[NUM].pay_style==2)
{
printf("单次会员卡不能消费超过1000元!请现金付款!\n");
rec[NUM].pay_style=1;
}
S0:
switch(rec[NUM].pay_style)
{
case 1:
printf("请输入付款总额:\n");
fflush(stdin);
scanf("%f",&rec[NUM].money[0]);
while(rec[NUM].money[0]<sum)
{
printf("付款金额不足!请重新付款!\n");
fflush(stdin);
scanf("%f",&rec[NUM].money[0]);
}
rec[NUM].money[1]=rec[NUM].money[0]-sum;
printf("找零:%.2f\n",rec[NUM].money[1]);
break;
case 2:
printf("请输入会员卡号:\n");
fflush(stdin);
scanf("%d",&rec[NUM].card.no);
if(M[rec[NUM].card.no]+10000-sum<0)
{
printf("会员卡余额不足!请现金付款!\n");
rec[NUM].pay_style=1;
goto S0;
}
rec[NUM].card.money[0]=M[rec[NUM].card.no]+10000;
M[rec[NUM].card.no]-=sum;
rec[NUM].card.money[1]=M[rec[NUM].card.no]+10000;
break;
}
time(&tmpcal_ptr);
tmp_ptr = gmtime(&tmpcal_ptr);
rec[NUM].time[0]=tmp_ptr->tm_hour+8;
rec[NUM].time[1]=tmp_ptr->tm_min;
rec[NUM].time[2]=tmp_ptr->tm_year+1900;
rec[NUM].time[3]=tmp_ptr->tm_mon+1;
rec[NUM].time[4]=tmp_ptr->tm_yday-333;
rec[NUM].no=COUNT;
COUNT++;
NUM++;
printf("记录成功!\n");
system("pause");
}
void Modify_Record()
{
int n,i,j=-1,k;
char str[20];
float sum=0;
time_t tmpcal_ptr;
struct tm *tmp_ptr = NULL;
system("cls");
printf("请输入要修改的记录序号\n");
scanf("%d",&n);
for(i=0;i<NUM;i++)
{
if(rec[i].no==n)
{
break;
}
}
if(i==NUM)
{
printf("无该序号信息!\n");
system("pause");
return ;
}
rec[i].buy_count=0;
do
{
rec[i].buy_count++;
j++;
printf("请选择购买水果种类:\n");
for(k=0;k<5;k++)
{
printf("%d:%s 单价:%.2f元/斤\n",k+1,fruit[k],Price[k]);
}
fflush(stdin);
scanf("%d",&rec[i].fruit_style[j]);
while(rec[i].fruit_style[j]<1||rec[i].fruit_style[j]>5)
{
printf("没有该选项\n");
fflush(stdin);
scanf("%d",&rec[i].fruit_style[j]);
}
rec[i].price[j]=Price[rec[i].fruit_style[j]-1];//水果单价
printf("请选择购买重量:\n");
fflush(stdin);
scanf("%f",&rec[i].num[j]);
printf("是否继续购买(Y/N)?:\n");
fflush(stdin);
scanf("%s",str);
while(strcmp(str,"Y")&&strcmp(str,"y")&&strcmp(str,"N")&&strcmp(str,"n"))
{
printf("输入错误,重新输入(Y/N)?:\n");
fflush(stdin);
scanf("%s",str);
}
}while(!strcmp(str,"Y")||!strcmp(str,"y"));
for(j=0;j<rec[i].buy_count;j++)
{
sum+=rec[i].num[j]*rec[i].price[j];
}
printf("需要付款%.2f\n",sum);
printf("请选择付款方式\n");
printf("1:现金\n");
printf("2:会员卡\n");
fflush(stdin);
scanf("%d",&rec[i].pay_style);
while(rec[i].pay_style<1||rec[i].pay_style>2)
{
printf("没有该选项\n");
fflush(stdin);
scanf("%d",&rec[i].pay_style);
}
if(sum>1000&&rec[i].pay_style==2)
{
printf("单次会员卡不能消费超过1000元!请现金付款!\n");
rec[i].pay_style=1;
}
S1:
switch(rec[i].pay_style)
{
case 1:
printf("请输入付款总额:\n");
fflush(stdin);
scanf("%f",&rec[i].money[0]);
while(rec[i].money[0]<sum)
{
printf("付款金额不足!请重新付款!\n");
fflush(stdin);
scanf("%f",&rec[i].money[0]);
}
rec[i].money[1]=rec[i].money[0]-sum;
printf("找零:%.2f\n",rec[i].money[1]);
break;
case 2:
printf("请输入会员卡号:\n");
fflush(stdin);
scanf("%d",&rec[i].card.no);
if(M[rec[i].card.no]+10000-sum<0)
{
printf("会员卡余额不足!请现金付款!\n");
rec[i].pay_style=1;
goto S1;
}
rec[i].card.money[0]=M[rec[i].card.no]+10000;
M[rec[i].card.no]-=sum;
rec[i].card.money[1]=M[rec[i].card.no]+10000;
break;
}
time(&tmpcal_ptr);
tmp_ptr = gmtime(&tmpcal_ptr);
rec[i].time[0]=tmp_ptr->tm_hour+8;
rec[i].time[1]=tmp_ptr->tm_min;
rec[NUM].time[2]=tmp_ptr->tm_year+1900;
rec[NUM].time[3]=tmp_ptr->tm_mon+1;
rec[NUM].time[4]=tmp_ptr->tm_yday-333;
system("pause");
}
void Del_Record()
{
int n,i,j;
system("cls");
printf("请输入要删除的记录序号\n");
scanf("%d",&n);
for(i=0;i<NUM;i++)
{
if(rec[i].no==n)
{
break;
}
}
if(i==NUM)
{
printf("无该序号信息!\n");
system("pause");
return ;
}
for(j=i;j<NUM;j++)
{
rec[j]=rec[j+1];
}
printf("删除成功!\n");
system("pause");
}
void Sreach_Record()
{
int i,style,j;
system("cls");
printf("请选择购买水果种类:\n");
for(i=0;i<5;i++)
{
printf("%d:%s\n",i+1,fruit[i]);
}
fflush(stdin);
scanf("%d",&style);
while(style<1||style>5)
{
printf("没有该选项\n");
fflush(stdin);
scanf("%d",&style);
}
printf("%-6s%-20s%-6s%-6s%-6s%-12s%-12s%-12s\n","序号","时间","种类","单价","重量","支付方式","支付/刷前","找零/刷后");
for(i=0;i<NUM;i++)
{
for(j=0;j<rec[i].buy_count;j++)
{
if(style==rec[i].fruit_style[j])
{
printf("%-04d %4d/%2d/%2d %02d:%-02d %-6s",rec[i].no,rec[i].time[2],rec[i].time[3],rec[i].time[4],rec[i].time[0],rec[i].time[1],fruit[rec[i].fruit_style[j]-1]);
printf("%-4.2f %-4.2f",rec[i].price[j],rec[i].num[j]);
if(rec[i].pay_style==1)
{
printf("%-12s"," 现金");
printf("%10.2f%10.2f\n",rec[i].money[0],rec[i].money[1]);
}
else
{
printf("%-12s"," 刷卡");
printf("%10.2f%10.2f\n",rec[i].card.money[0],rec[i].card.money[1]);
}
break;
}
}
}
system("pause");
}
int menu()
{
char chioce[20];
int flag=1;
system("cls");
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("0:退出\n");
scanf("%s",chioce);
while(flag)
{
if(strlen(chioce)!=1)
{
printf("输入错误,请重新输入!\n");
scanf("%s",chioce);
continue;
}
switch(chioce[0])
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
flag=0;
break;
default:
printf("输入错误,请重新输入!\n");
scanf("%s",chioce);
break;
}
}
return chioce[0]-'0';
}
void sort()
{
int i,j;
RECORD temp;
for(i=0;i<NUM;i++)
{
for(j=i+1;j<NUM;j++)
{
if(rec[i].no>rec[j].no)
{
temp=rec[i];
rec[i]=rec[j];
rec[j]=temp;
}
}
}
}
void Total_Record()
{
int i,style,j;
float sum[5]={0};
system("cls");
printf("%-6s%-20s%-6s%-6s%-6s%-12s%-12s%-12s\n","序号","时间","种类","单价","重量","支付方式","支付/刷前","找零/刷后");
for(i=0;i<NUM;i++)
{
printf("%-04d %4d/%2d/%2d %02d:%-02d ",rec[i].no,rec[i].time[2],rec[i].time[3],rec[i].time[4],rec[i].time[0],rec[i].time[1]);
printf("%-6s%-4.2f %-4.2f",fruit[rec[i].fruit_style[0]-1],rec[i].price[0],rec[i].num[0]);
if(rec[i].pay_style==1)
{
printf("%-12s"," 现金");
printf("%10.2f%10.2f\n",rec[i].money[0],rec[i].money[1]);
sum[rec[i].fruit_style[0]-1]+=rec[i].price[0]*rec[i].num[0];
}
else
{
printf("%-12s"," 刷卡");
printf("%10.2f%10.2f\n",rec[i].card.money[0],rec[i].card.money[1]);
sum[rec[i].fruit_style[0]-1]+=rec[i].price[0]*rec[i].num[0];
}
for(j=1;j<rec[i].buy_count;j++)
{
printf("%-26s"," ");
printf("%-6s%-4.2f %-4.2f\n",fruit[rec[i].fruit_style[j]-1],rec[i].price[j],rec[i].num[j]);
sum[rec[i].fruit_style[j]-1]+=rec[i].price[j]*rec[i].num[j];
}
printf("\n");
}
printf("\n\n");
for(i=0;i<5;i++)
{
printf("%s总销额:%.2f元\n",fruit[i],sum[i]);
}
system("pause");
}
void Sreach_Card()
{
int i,num,j;
system("cls");
printf("请输入查找的会员卡号:\n");
fflush(stdin);
scanf("%d",&num);
printf("%-6s%-20s%-6s%-6s%-6s%-12s%-12s%-12s\n","序号","时间","种类","单价","重量","支付方式","支付/刷前","找零/刷后");
for(i=0;i<5;i++)
{
if(num==rec[i].card.no&&rec[i].pay_style==2)
{
printf("%-04d %4d/%2d/%2d %02d:%-02d ",rec[i].no,rec[i].time[2],rec[i].time[3],rec[i].time[4],rec[i].time[0],rec[i].time[1]);
printf("%-6s%-4.2f %-4.2f%",fruit[rec[i].fruit_style[0]-1],rec[i].price[0],rec[i].num[0]);
printf("%-12s"," 刷卡");
printf("%10.2f%10.2f\n",rec[i].card.money[0],rec[i].card.money[1]);
for(j=1;j<rec[i].buy_count;j++)
{
printf("%-26s"," ");
printf("%-6s%-4.2f %-4.2f\n",fruit[rec[i].fruit_style[j]-1],rec[i].price[j],rec[i].num[j]);
}
printf("\n");
}
}
printf("会员卡当前余额:%.2f\n",M[num]+10000);
system("pause");
}
void Print_List(List* node)
{
int i;
List *p=node;
if(node==NULL)
{
printf("无符合信息\n");
system("pause");
return ;
}
printf("%-6s%-20s%-6s%-6s%-6s%-12s%-12s%-12s\n","序号","时间","种类","单价","重量","支付方式","支付/刷前","找零/刷后");
while(p)
{
printf("%-04d %4d/%2d/%2d %02d:%-02d ",p->rec.no,p->rec.time[2],p->rec.time[3],p->rec.time[4],p->rec.time[0],p->rec.time[1]);
printf("%-6s%-4.2f %-4.2f%",fruit[p->rec.fruit_style[0]-1],p->rec.price[0],p->rec.num[0]);
if(p->rec.pay_style==1)
{
printf("%-12s"," 现金");
printf("%10.2f%10.2f\n",p->rec.money[0],p->rec.money[1]);
}
else
{
printf("%-12s"," 刷卡");
printf("%10.2f%10.2f\n",p->rec.card.money[0],p->rec.card.money[1]);
}
for(i=1;i<p->rec.buy_count;i++)
{
printf("%-26s"," ");
printf("%-6s%-4.2f %-4.2f\n",fruit[p->rec.fruit_style[i]-1],p->rec.price[i],p->rec.num[i]);
}
printf("\n");
p=p->next;
}
system("pause");
}
List* Add_List(List* node,RECORD temp)
{
List* p=node;
if(node==NULL)
{
node=(List*)malloc(sizeof(List));
node->next=NULL;
node->rec=temp;
return node;
}
while(p->next!=NULL)
{
p=p->next;
}
p->next=(List*)malloc(sizeof(List));
p=p->next;
p->next=NULL;
p->rec=temp;
return node;
}
void Del_List(List* node)
{
List *p=node;
List *q=node;
if(node==NULL)
return ;
while(p->next)
{
q=p->next;
free(p);
p=q;
}
free(p);
}
void Sreach_Between()
{
int i;
float min,max;
List* node=NULL;
system("cls");
printf("请输入最低钱数:\n");
fflush(stdin);
scanf("%f",&min);
printf("请输入最大钱数:\n");
fflush(stdin);
scanf("%f",&max);
for(i=0;i<NUM;i++)
{
if(rec[i].pay_style==1)
{
if(min<rec[i].money[0]-rec[i].money[1]&&max>rec[i].money[0]-rec[i].money[1])
{
node=Add_List(node,rec[i]);
}
}
else
{
if(min<rec[i].card.money[0]-rec[i].card.money[1]&&max>rec[i].card.money[0]-rec[i].card.money[1])
{
node=Add_List(node,rec[i]);
}
}
}
Print_List(node);
Del_List(node);
}
void Sreach_Time()
{
int i,flag;
int time[4];
List* node=NULL;
system("cls");
printf("请输入开始时间(xx:xx):\n");
fflush(stdin);
scanf("%d:%d",&time[0],&time[1]);
printf("请输入结束时间(xx:xx):\n");
fflush(stdin);
scanf("%d:%d",&time[2],&time[3]);
printf("请输入付款方式1:现金 2:刷卡 3:全部\n");
fflush(stdin);
scanf("%d",&flag);
for(i=0;i<NUM;i++)
{
if(flag==3)
{
if(time[0]<=rec[i].time[0]&&time[2]>=rec[i].time[0])
{
node=Add_List(node,rec[i]);
}
}
else
{
if(time[0]<=rec[i].time[0]&&time[2]>=rec[i].time[0]&&flag==rec[i].pay_style)
{
node=Add_List(node,rec[i]);
}
}
}
Print_List(node);
Del_List(node);
}
void Save_Info()
{
FILE* fp;
fp=fopen("rec_info.dat","w");
if(fp==NULL)
{
return ;
}
for(int i=0;i<NUM;i++)
{
fwrite(&rec[i],sizeof(RECORD),1,fp);
}
fclose(fp);
}
void Load_Info()
{
FILE* fp;
fp=fopen("rec_info.dat","r");
if(fp==NULL)
{
return ;
}
while(fread(&rec[NUM],sizeof(RECORD),1,fp))
{
NUM++;
}
fclose(fp);
}
void Save_M()
{
FILE* fp;
fp=fopen("M_info.dat","w");
if(fp==NULL)
{
return ;
}
for(int i=0;i<10000;i++)
{
fwrite(&M[i],sizeof(float),1,fp);
}
fclose(fp);
}
void Load_M()
{
FILE* fp;
int i=0;
fp=fopen("M_info.dat","r");
if(fp==NULL)
{
return ;
}
while(i<10000)
{
fread(&M[i++],sizeof(float),1,fp);
}
fclose(fp);
}
int main()
{
int chioce;
Load_Info();
Load_M();
COUNT=NUM+1000;
do
{
chioce=menu();
switch(chioce)
{
case 1:
Input_Record();
Save_Info();
Save_M();
break;
case 2:
Modify_Record();
Save_Info();
Save_M();
break;
case 3:
Del_Record();
Save_Info();
Save_M();
break;
case 4:
sort();
Sreach_Record();
break;
case 5:
sort();
Total_Record();
break;
case 6:
Sreach_Card();
break;
case 7:
Sreach_Between();
break;
case 8:
Sreach_Time();
break;
}
}while(chioce!=0);
Save_Info();
Save_M();
return 0;
}