⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 计算机模拟.cpp

📁 利用计算机模拟实现超市购物篮数量
💻 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 + -