📄 计算机模拟.cpp
字号:
#include "stdio.h"
#include "math.h"
#include "malloc.h"
//定义顾客的数据结构
typedef struct node{
float at; //顾客到达店铺时间
float pt; //顾客到达收款台时间
int n; //顾客购买商品数量
struct node *next;
}guest;
//混合线性同余法产生随机数Xi
int a=2053;
int c=13849;
int m=1024*64;
int getVar(int xi)
{
int x;
x=(xi*a+c)%m;
return x;
}
void main()
{
float t=0; //现在时刻
int tgn=0; //总共的顾客数
//创建顾客链表
guest *head,*r,*p;
head=(guest *)malloc(sizeof(guest));
head->next=NULL;
r=head;
//产生顾客链表
int time=8*60*60;
int xp=1; //计算顾客到达间隔用到的随机数
float up;
float tp;
while (t<time)
{
p=(guest *)malloc(sizeof(guest)); //将新到的顾客插入到顾客链表
p->at=t;
r->next=p;
r=p;
p->next=NULL;
tgn++;
//下一个顾客到达经历的时间间隔
xp=getVar(xp);
up=xp*1.0/m;
tp=-75*log(up);
t=t+tp;
}
//计算顾客在通道上所花时间和顾客买的商品数量
int i=1;
//判断是否进入通道的随机数
int xt1=32;
int xt2=26367;
int xt3=2737;
//计算在通道里所花时间的随机数
int t1=7215;
int t2=626;
int t3=46156;
//计算顾客在通道购买的商品数的随机数
int num1=15463;
int num2=23;
int num3=6264;
int num=0;
//顾客在收银台购买的商品数的随机数
int n1=123;
int n=0;
float ut;
float vt;
int flag;
p=head;
while (i<=tgn)
{
n=0;
num=0;
p=p->next;
float totalt=0;
/* 是否进入通道1: 0 否,1 是 */
xt1=getVar(xt1);
ut=xt1*1.0/m;
if (ut>0.25) flag=1;
else flag=0;
/* 进入通道1,计算时间 */
if (flag==1)
{
t1=getVar(t1);
ut=t1*1.0/m;
vt=60+120*ut;
totalt=totalt+vt;
num1=getVar(num1);
ut=num1*1.0/m;
if (ut<0.3333) num=num+2;
else if(ut<0.6666) num=num+3;
else num=num+4;
}
/* 判断是否进入通道2: 0 否,1 是 */
xt2=getVar(xt2);
ut=xt2*1.0/m;
if (ut>0.25) flag=1;
else flag=0;
/* 进入通道2,计算时间 */
if (flag==1)
{
t2=getVar(t2);
ut=t2*1.0/m;
vt=120+60*ut;
totalt=totalt+vt;
num2=getVar(num2);
ut=num2*1.0/m;
if (ut<0.3333) num=num+3;
else if(ut<0.6666) num=num+4;
else num=num+5;
}
/* 是否进入通道3: 0 否,1 是 */
xt3=getVar(xt3);
ut=xt3*1.0/m;
if (ut>0.25) flag=1;
else flag=0;
/* 进入通道3,计算时间 */
if (flag==1)
{
t3=getVar(t3);
ut=t3*1.0/m;
vt=75+90*ut;
totalt=totalt+vt;
num3=getVar(num3);
ut=num3*1.0/m;
if (ut<0.3333) num=num+4;
else if(ut<0.6666) num=num+5;
else num=num+6;
}
/* 在收银台购买商品数 */
n1=getVar(n1);
ut=n1*1.0/m;
if (ut<0.3333) n=1;
else if(ut<0.6666) n=2;
else n=3;
p->n=num+n;
p->pt=p->at+totalt;
i++;
}
int gn=0; //顾客数
int maxgn=0; //篮子最大需求量
int tn=0; //所有顾客购买商品总数
int wn=0; //等待队列的长度
int maxwn=0; //等待队列的最大长度
float plt=head->next->at; //顾客离开时间,初始值为第一个顾客到达收银台的时间
guest *s;
s=(guest *)malloc(sizeof(guest));
p=head->next;
while(p!=NULL)
{
gn=0;wn=0;
if(p->pt<plt)
plt=plt+p->n*3; //顾客离开时间=上位顾客离开时间+购买商品数量*3
else
plt=p->pt+p->n*3; //顾客离开时间=到达收银台时间+购买商品数量*3
tn=tn+p->n;
head->next=p->next; //将离开的顾客从链表中删除
p=head->next;
s=p;
while(s!=NULL && s->at<plt) //计算在店铺中的顾客数量
{
gn++;
s=s->next;
}
if(gn>maxgn)
maxgn=gn;
s=p;
while(s!=NULL && s->pt<plt) //计算等待队列长度
{
wn++;
s=s->next;
}
if(wn>maxwn)
maxwn=wn;
}
//输出结果
float eff;
eff=tn*3.0/time;
printf("\n收银台工作效率是%f\n",eff);
printf("\n等待队列的最大长度是%d\n",maxwn);
printf("\n篮子的最大需求量是%d\n",maxgn);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -