早餐店(ADT-FIFO)-C-20211116

这几天想根据17.5的队列ADT-FIFO模拟实际情形:

题目:
一家早餐店,拥有以下商品(生产时间*价格):“肉包(3mins*2¥)、油条(5mins*5¥)、牛奶(1mins*8¥)、豆腐脑(2mins*12¥)”,随机点单。(生产时间和价格与现实不符)
早餐店所处位置决定了客流量,队伍最长为10人,客流量代表着人进入队伍的概率。早晨客流量(繁华街为30%,偏僻小巷为10%),中午客流量*0.5,晚上客流量*0.1,关店客流量*0。
目标是计算每小时商品数量、营业额、客流量、被拒人数。
//队伍后5人中,每分钟会有一定的概率(第5位5%,按照位次递增至10%)离开队伍。(这个目前还不会,以后再说)

问题1(solved):物品数量统计总是为一个相同的负数

后来发现是统计数据时指向了数组的地址而不是具体项的地址。

问题2(solved):每小时物品数量统计时,每种物品数量相同。

后来发现是统计每种物品数量时,未把count[i]++代码放入if括号,造成每种物品都是同数量增加。

有些代码懒得用函数封包了。

/*声明接口*/

/*
题目:
一家早餐店,拥有以下商品(生产时间*价格):“肉包(3mins*2¥)、油条(5mins*5¥)、牛奶(1mins*8¥)、豆腐脑(2mins*12¥)”,随机点单。(生产时间和价格与现实不符)
早餐店所处位置决定了客流量,队伍最长为10人,客流量代表着人进入队伍的概率。早晨客流量(繁华街为30%,偏僻小巷为10%),中午客流量*0.5,晚上客流量*0.1,关店客流量*0。
目标是计算每小时商品数量、营业额、客流量、被拒人数。
<队伍后5人中,每分钟会有一定的概率(第5位5%,按照位次递增至10%)离开队伍。(这个目前还不会,以后再说)>
*/

/*声明接口*/

#ifndef QUEUE_H
#define QUEUE_H
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>

#define MAX_QUEUE 10
#define BUN_NAME "肉包"
#define BUN_TIME 3
#define BUN_PRICE 2
#define STICK_NAME "油条"
#define STICK_TIME 5
#define STICK_PRICE 5
#define MILK_NAME "牛奶"
#define MILK_TIME 1
#define MILK_PRICE 8
#define BEANCURD_NAME "豆腐脑"
#define BEANCURD_TIME 2
#define BEANCURD_PRICE 12

typedef struct menu
{
	char *name;
	short time;
	short price;
}Menu;

const Menu menus[4]={
{BUN_NAME,BUN_TIME,BUN_PRICE},
{STICK_NAME,STICK_TIME,STICK_PRICE},
{MILK_NAME,MILK_TIME,MILK_PRICE},
{BEANCURD_NAME,BEANCURD_TIME,BEANCURD_PRICE},
};

typedef struct item
{
	short order[4];
	short time;
	short price;
}Item;

typedef struct node
{
	Item item;
	struct node *next;
}Node;

typedef struct queue
{
	Node *front;
	Node *rear;
	short nodes;
}Queue;

typedef struct record
{
	short count[4];
	short turnover;
	short flows;
	short reject;
}Record;

void exit_normal(void);
void exit_abnormal(void);
char *s_gets(char *p,int n);
void InitializeQueue(Queue *pqueue);
short IsQueueEmpty(const Queue *pqueue);
short IsQueueFull(const Queue *pqueue);
short EnQueue(Item *item,Queue *pqueue);
short DeQueue(Item *item,Queue *pqueue);
void EmptyQueue(Item *item,Queue *pqueue);

#endif

/*定义接口*/

/*定义接口*/

#include"queue.h"

void exit_normal(void)
{
	fputs("Done!ProgramOver!\n",stderr);
}

void exit_abnormal(void)
{
	fputs("Error!ProgramOver!\n",stderr);
}

char *s_gets(char *p,int n)
{
	char *gets=NULL,*find=NULL;
	if(*(gets=fgets(p,n,stdin))!=10&&gets)
	{
		if(find=strchr(gets,10))
			*find=0;
		else
			while(getchar()!=10);
	}
	else
		return 0;
return gets;}

void InitializeQueue(Queue *pqueue)
{
	pqueue->front=pqueue->rear=NULL;
	pqueue->nodes=0;
}

short IsQueueEmpty(const Queue *pqueue)
{
	return (!pqueue->nodes?1:0);
}

short IsQueueFull(const Queue *pqueue)
{
	return (pqueue->nodes==MAX_QUEUE?1:0);
}

short EnQueue(Item *item,Queue *pqueue)
{
	if(IsQueueFull(pqueue))
		return 0;
	Node *pnew=NULL;
	if(!(pnew=(Node *)calloc(1,sizeof(Node))))
		return 0;
	pnew->item=*item;
	pnew->next=NULL;
	if(IsQueueEmpty(pqueue))
		pqueue->front=pnew;
	else
		pqueue->rear->next=pnew;
	pqueue->rear=pnew;
	pqueue->nodes++;
return 1;}

short DeQueue(Item *item,Queue *pqueue)
{
	if(IsQueueEmpty(pqueue))
		return 0;
	Node *ptemp=pqueue->front;
	*item=ptemp->item;
	pqueue->front=pqueue->front->next;
	free(ptemp);
	pqueue->nodes--;
	if(!pqueue->nodes)
		pqueue->rear=NULL;
return 1;}

void EmptyQueue(Item *item,Queue *pqueue)
{
	short temp=pqueue->nodes;
	while(DeQueue(item,pqueue));
	printf("%d名顾客全部被驱赶.\n",temp);
}

/*使用接口*/

/*使用接口*/

#include"queue.h"

#define TIME_WHOLE 1440
#define TIME_N 480
#define TIME_E 960
#define TIME_C 1200
#define PCUS_H_M 0.3
#define PCUS_H_N (PCUS_H_M*0.5)
#define PCUS_H_E (PCUS_H_M*0.1)
#define PCUS_L_M 0.1
#define PCUS_L_N (PCUS_L_M*0.5)
#define PCUS_L_E (PCUS_L_M*0.1)

typedef struct flow
{
	float pcus_m;
	float pcus_n;
	float pcus_e;
}Flow;

int main(int argc,char *argv[])
{
	/*系统环境初始化*/
	atexit(exit_normal);
	srand((unsigned int)time(NULL)*100);
	/*定义变量*/
	short time_now=0;//当前计数时间
	short time_wait=0;//首名顾客等待时间,用于启动Dequeue()
	float pcus=0;//当前客流量概率值
	
	Item item={0};
	Flow flow={0};
	Queue queue={0};
	//Queue *qscan;
	Record records[25]={0};//统计数据结构体数组
	short records_index=1;//统计数据结构体数组索引,0为全天数据总和

	int ch,choice;
	for(fputs("选择你想经营早餐店的地点:1.繁华街,2.偏僻小巷\n你的选择是:",stdout),ch=scanf("%d",&choice);
		ch!=1||choice!=1&&choice!=2;
		fputs("选择你想经营早餐店的地点:1.繁华街,2.偏僻小巷\n你的选择是:",stdout),ch=scanf("%d",&choice))
	{
		fputs("WrongAnswer!Again!\n",stdout);
		while(getchar()!=10);
	}
	while(getchar()!=10);
	system("cls");
	printf("你选择了%s经营早餐店。\n",(choice==1?"繁华街":"偏僻小巷"));
	if(choice==1)
	{
		flow.pcus_m=(float)PCUS_H_M;
		flow.pcus_n=(float)PCUS_H_N;
		flow.pcus_e=(float)PCUS_H_E;
	}
	else
	{
		flow.pcus_m=(float)PCUS_L_M;
		flow.pcus_n=(float)PCUS_L_N;
		flow.pcus_e=(float)PCUS_L_E;
	}
	/*计时开始*/
	while(time_now<TIME_WHOLE&&records_index<25)
	{
		if(time_now<TIME_N)
		{
			pcus=flow.pcus_m;
			fputs("现在是早晨,生意兴隆。\n",stdout);
		}
		else if(time_now<TIME_E)
		{
			pcus=flow.pcus_n;
			fputs("现在是中午,生意一般。\n",stdout);
		}
		else if(time_now<TIME_C)
		{
			pcus=flow.pcus_e;
			fputs("现在是晚上,生意清淡。\n",stdout);
		}
		else
		{
			pcus=0;
			fputs("早餐店关门了。\n",stdout);
			if(!IsQueueEmpty(&queue))
				EmptyQueue(&item,&queue);
		}
		for(short time_hour=0;time_hour<60;time_hour++,time_now++)
		{
			/*循环初始化*/
			memset(&item,0,sizeof(Item));
			//qscan=&queue;
			/*循环开始*/
			printf("时间->%hd:%hd.\n",(time_now/60+6)<24?(time_now/60+6):(time_now/60-18),time_now%60);//起点时间定为6点
			choice=rand()%100;//此分钟客流量概率
			if(choice>pcus*100)//此分钟客流量比较
			{
				if(!pcus)//如果为零
					printf("由于早餐店已关门,1名顾客离开了。\n");
				else
				{
					for(int i=0;i<4;
						item.order[i]=(short)rand()%2,i++);//生成购买菜单
					for(int i=0;i<4;
						item.time+=(menus[i].time)*(item.order[i]),item.price+=(menus[i].price)*(item.order[i]),i++);//计算购买金额与等待时间
					if(item.time)//如果购买为真
					{
						if(EnQueue(&item,&queue))//如果加入队列成功
						{
							fputs("1名顾客进入了队伍,想购买:",stdout);
							for(int i=0;i<4;i++)
								if(item.order[i])
									printf("%s,",menus[i].name);
							fputs("\b.\n",stdout);
							if(queue.nodes==1)//如果为队列唯一
								time_wait=item.time;
						}				
						else//如果加入队列失败
						{
							records[records_index].reject++;
							printf("由于队列已满,1名顾客被拒,本小时共有%hd名顾客被拒。\n",records[records_index].reject);
						}
					}
					else//如果购买为假
						fputs("1名顾客未找到想买的东西,离开了。\n",stdout);
				}
			}
			if(!IsQueueEmpty(&queue))
			{
				time_wait--;
				if(!time_wait)
				{
					if(DeQueue(&item,&queue))
					{
						fputs("1名顾客购买了:",stdout);
						for(int i=0;i<4;i++)
						{
							if(item.order[i])
							{
								printf("%s,",menus[i].name);
								(records[records_index].count[i])++;
								//粗心错误:未把这行代码放入if括号,造成物品数量相同
							}
						}
						fputs("\b.",stdout);
						printf("共支付%hd¥.离开了队伍.\n",item.price);
						records[records_index].turnover+=item.price;
						records[records_index].flows++;
						time_wait=queue.front->item.time;//更新等待时间
					}
				}
			}
		Sleep(500);
		}
		records_index++;
	}
	fputs("每小时数据统计如下:\n",stdout);
	for(int i=1;i<25;i++)
	{
		printf("第%d个小时:\n售出商品:",i);
		for(int j=0;j<4;j++)
		{
			printf("%s:%hd个,",menus[j].name,records[i].count[j]);
			//粗心错误原为:printf("%s:%hd个,",menus[j].name,records[j].count);造成物品数量统计总是为一个相同的负数
			records[0].count[j]+=records[i].count[j];
		}
		
		fputs("\b.\n",stdout);
		printf("营业额:%hd\n",records[i].turnover);
		records[0].turnover+=records[i].turnover;
		printf("客流量:%hd\n",records[i].flows);
		records[0].flows+=records[i].flows;
		printf("拒客数:%hd\n",records[i].reject);
		records[0].reject+=records[i].reject;
	}
	fputs("全天数据:\n",stdout);
	fputs("全天营业额:",stdout);
	for(int j=0;j<4;j++)
		printf("%s:%hd个,",menus[j].name,records[0].count[j]);
	printf("营业额:%hd\n",records[0].turnover);
	printf("客流量:%hd\n",records[0].flows);
	printf("拒客数:%hd\n",records[0].reject);
return 0;}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fleet1126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值