#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