📄 shop2.cpp
字号:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#define scan_cost 2 //扫描一个物品的时间
#define start_cost 4 //打招呼的时间
#define close_cost 92 //找钱的时间
#define max_operator_number 5 //最大的柜台数
#define TIME 2*60*60 //给定的时间,单位是秒
#define max_minutes 2*60 //在0到2分钟内生成一个顾客
#define max_items 45 //每个顾客买5到50件商品
using namespace std;
struct shopper
{
int id;
int item; //携带的物品数
int counter_munber; //在哪个柜台结的帐
int arrivetime; //到达柜台的时间
int departtime; //结完帐离开的时间
int wait_time; //在队列中等待的时间
int pay_time; //交费时的时刻
struct shopper *next; //指向下个顾客的指针
};
//该函数始终在一个数据链表上操作,这个数据链表就是在主函数中生成的所有顾客队列。
void serve(struct shopper *p,int shopper_number)
{
int counter,min,i;
int finish_time[max_operator_number]; //动态存放在每个顾客选择柜台时,各个柜台将在何时可以对他服务
float wait_number=0.0;
int max_wait_time=0,ave_wait_time=0;
int serve_munber=0;
struct shopper *present,*temp;
present=p;
for(;present!=NULL;present=present->next) //确定每个顾客在哪个柜台结帐个
{
min=24*60*60;
for(i=0;i<max_operator_number;i++)
{
if(min>finish_time[i])
{
min=finish_time[i];
counter=i;
}
}
temp=p;
for(;temp!=present;temp=temp->next) //确定每个顾客出现在通道时,所有通道等待的人数
{
if(temp->departtime>present->arrivetime) { wait_number++; }
}
if(finish_time[counter]<present->arrivetime) //确定每个顾客的等待时间,离开的时间
{
present->wait_time=0;
present->pay_time=present->arrivetime;
}
else
{
present->wait_time=finish_time[counter]-present->arrivetime;
present->pay_time=finish_time[counter];
}
present->departtime=present->pay_time+start_cost+scan_cost*present->item+close_cost;
finish_time[counter]=present->departtime;
present->counter_munber=counter;
}
present=p;
for(;present!=NULL&&present->pay_time<=TIME;present=present->next)//确定平均等待时间和最大等待时间
{
if(max_wait_time < present->wait_time) { max_wait_time=present->wait_time; }
ave_wait_time=ave_wait_time+present->wait_time;
serve_munber++;
}
wait_number=wait_number/serve_munber/max_operator_number;
ave_wait_time=ave_wait_time/serve_munber;
cout<<"ID "<<" item "<<"arrivte_time "<<"depart_time "<<"wait_time"<<" "<<"counter_number"<<endl;
cout<<"-----------------------------------------------------------------------"<<endl;
present=p;
while(present!=NULL) //打印所有信息
{
cout<<present->id<<" "<<present->item<<" "<<present->arrivetime
<<" "<<present->departtime<<" "<<present->wait_time
<<" "<<present->counter_munber+1<<endl;
present=present->next;
}
cout<<"-------------------------------------------------------------------------"<<endl;
cout<<"the average wait time for acustomer: "<<ave_wait_time<<endl;
cout<<"the maximum wait time for a customer: "<<max_wait_time<<endl;
cout<<"the average number of customers waiting in the queue: "<< wait_number<<endl;
// cout<<"the total time where there more than 3 customers: "<<more_3_time<<endl;
cout<<"the total number of customers serviced: "<<serve_munber<<endl;
cout<<"number of customers that haven't served: "<<shopper_number-serve_munber<<endl;
}
//建立主函数,并在主函数中生成一列随机顾客
void main()
{
struct shopper *pthis,*pformer,*front;
int shopper_number=0,items,interal;
int remaintime;
remaintime=TIME;
//在给定的2小时内随机生成顾客,并随机得到每个顾客到达柜台的时间和所携带的物品数
while(remaintime>0) //
{
items=rand()%max_items+6;
interal=rand()%max_minutes+1;
remaintime=remaintime-interal;
if(remaintime<=0)
{
break;
}
shopper_number++;
//建立顾客队列。把在2小时之内生成的顾客组成一个链表,该链表按时间顺序连接
pthis=(struct shopper*)malloc(sizeof(struct shopper));
if(shopper_number==1)
{
front=pformer=pthis;
pthis->id=shopper_number;
pthis->arrivetime=TIME-remaintime;
pthis->item=items;
pthis->next=NULL;
}
else
{
pformer->next=pthis;
pthis->id=shopper_number;
pthis->item=items;
pthis->arrivetime=TIME-remaintime;
pthis->next=NULL;
pformer=pthis;
}
}
serve(front,shopper_number);//调用子函数,参数为指向队列弟一个元素的指针和队列元素的个数
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -