#include"stdio.h"
#include"stdlib.h"
#include"math.h"
#include"time.h"
#define maxsize 300//设定每个队的最大长度为300,实际情况每个队不可能排300个人
#define mu 2.0 //平均两分钟
#define sigma 1.0 //方差为1
int unsat=0;//不满意顾客数
int total=0;//总顾客数
int randomtime=0;
FILE * fp;
typedef struct customer
{
int number;//第几号顾客
int EnQueueTime;//进队时间
}customer;
typedef struct Queue
{
int rear,front;
customer element[maxsize];
}Queue;
//-------------------------------------------------------------------------------
double random(void)
{
int a;
double r;
a=rand()%32767;
r=(a+0.00)/32767.00;
return r;
}
int Random()
{
int i,m;
shang:
{
double r,sum=0.0;
for(i=1;i<=12;i++)
sum=sum+random();
r=(sum-6.00)*sigma+mu;
m=(int)(r*60);//转化成整数秒
}
if(m<60||m>180)
goto shang;//若产生的随机时间小于60秒或者大于180秒则重新产生
return m;
} //这段产生随机数的代码是网上找的
//-------------------------------------------------------------------------------
void converttime(int time)//转换时间
{//将循环中i对应的时间转换成为几点几分几秒
int a,b,c;
a=(time/3600+8)%24;//时
b=(time%3600)/60;//分
c=time%60;//秒
if(a<10)//小时
{
printf("0%d:",a);
fprintf(fp,"0%d:\r",a);
}
else
{
printf("%d:",a);
fprintf(fp,"%d:\r",a);
}
if(b<10)//分钟
{
printf("0%d:",b);
fprintf(fp,"0%d:\r",b);
}
else
{
printf("%d:",b);
fprintf(fp,"%d:\r",b);
}
if(c<10)//秒
{
printf("0%d ",c);
fprintf(fp,"0%d \r",c);
}
else
{
printf("%d ",c);
fprintf(fp,"%d \r",c);
}
}//-------------------------------------------------------------------------------
void initQueue(Queue *Q)//初始化队列
{
Q->front=Q->rear=0;
}//-------------------------------------------------------------------------------
int length(Queue *Q)//求队列长度
{
return (Q->rear+maxsize-Q->front)%maxsize;
}//-------------------------------------------------------------------------------
int EnQueue(Queue *Q,int num,int time)//进队
{
if((Q->rear+1)%maxsize==Q->front)
return 0;
Q->element[Q->rear].number=num;
Q->element[Q->rear].EnQueueTime=time;//存储进队时间
Q->rear=(Q->rear+1)%maxsize;
return 1;
}//-------------------------------------------------------------------------------
int DeQueue1(Queue *Q,int time,int order)//闲时对应的出队函数,order为队列的序号
{
if(length(Q)==0)
return 0;
converttime(time);//转换时间
printf("第%d号顾客出第%d队 这位顾客开始排队的时间是:",Q->element[Q->front].number,order);
fprintf(fp,"第%d号顾客出第%d队\r",Q->element[Q->front].number,order);
fprintf(fp," 这位顾客开始排队的时间是:\r");
converttime(Q->element[Q->front].EnQueueTime);
if(time-Q->element[Q->front].EnQueueTime>180)
{
unsat++;//如果排队的时间超过180秒则不满意数加1
fprintf(fp," 不满意!\r\n");
printf(" 不满意!\n");
}
else
{
fprintf(fp," 满意!\r\n");
printf(" 满意!\n");
}
Q->front=(Q->front+1)%maxsize;
return 1;
}//-------------------------------------------------------------------------------
int DeQueue2(Queue *Q,int time,int order)////忙时对应的出队函数
{
if(length(Q)==0)
return 0;
converttime(time);//转换时间
printf("第%d号顾客出第%d队 这位顾客开始排队的时间是:",Q->element[Q->front].number,order);
fprintf(fp,"第%d号顾客出第%d队\r",Q->element[Q->front].number,order);
fprintf(fp," 这位顾客开始排队的时间是:\r");
converttime(Q->element[Q->front].EnQueueTime);
if(time-Q->element[Q->front].EnQueueTime>300)
{
unsat++;//如果排队的时间超过300秒则不满意数加1
fprintf(fp," 不满意!\r\n");
printf(" 不满意!\n");
}
else
{
fprintf(fp," 满意!\r\n");
printf(" 满意!\n");
}
Q->front=(Q->front+1)%maxsize;//front后移
return 1;
}//-------------------------------------------------------------------------------
void main()
{
fp = fopen("三个出口时的排队情况.txt","a");//以追加方式写入
fprintf(fp,"超市有三个出口时的排队情况\r\n");
int i=1;
int timeflagA=Random();//时间标记
int timeflagB=Random();
int timeflagC=Random();
Queue A,B,C;
initQueue(&A);
initQueue(&B);
initQueue(&C);
int customertime;//=60;
while(i<=70000)//8:00-19:00之间的四个小时共39600秒,加5分钟300秒
{
if(i<=39600)//i=39600对应时间是19:00,之后没有顾客进队
{
if(i<=14400||(i>21600&&i<=32400))//闲时
customertime=60;
else //if((i>14400&&i<=21600)||(i>32400&&i<=39600))//忙时
customertime=12;
if(i%customertime==0)//有人来排队,customertime为一个人来排队到另外一个人来排队之间的间隔时间
{
if(length(&A)<=length(&B)&&length(&A)<=length(&C))
{
total++;
EnQueue(&A,total,i);//A队最短
}
else if(length(&B)<=length(&A)&&length(&B)<=length(&C))
{
total++;
EnQueue(&B,total,i);//B队最短,total表示来的第几个顾客,i为进队时间
}
else
{
total++;
EnQueue(&C,total,i);//C队最短
}
}
}//if(i<=39600)
if(i==timeflagA)
{
if(i<=14400||(i>21600&&i<=32400))
DeQueue1(&A,i,1); //i为出队时间
else
DeQueue2(&A,i,1);
randomtime=Random();//randomtime即为下一名顾客的服务时间
timeflagA=randomtime+timeflagA;
}
if(i==timeflagB)
{
if(i<=14400||(i>21600&&i<=32400))
DeQueue1(&B,i,2);
else
DeQueue2(&B,i,2);
randomtime=Random();
timeflagB=randomtime+timeflagB;
}
if(i==timeflagC)
{
if(i<=14400||(i>21600&&i<=32400))
DeQueue1(&C,i,3);
else
DeQueue2(&C,i,3);
randomtime=Random();
timeflagC=randomtime+timeflagC;
}
i++;
}//while(i<=79900)
printf("不满意的顾客数为:%d,总的顾客数为:%d\n",unsat,total);
printf("不满意率为:%4.2f%%\r\n",((double)unsat/(double)total)*100);
fprintf(fp,"总顾客数为%d,其中不满意的顾客数为:%d\r\n",total,unsat);
fprintf(fp,"不满意率为:%4.2f%%\r\n",((double)unsat/(double)total)*100);
fprintf(fp,"循环结束后的时间为:\r");//连续两个%输出一个%
converttime(i);
fclose(fp);
}
来源:https://www.cnblogs.com/umgsai/p/11673143.html