银行业务的模拟程序

Posted helenandyoyo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了银行业务的模拟程序相关的知识,希望对你有一定的参考价值。

银行业务的模拟程序:
假设某银行有四个窗口对外接待客户,且每个窗口在某时刻只能接待一位客户,客户在银行工作时间内进入银行后选择最短的一队进行排队等候。现在编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的时间。

前期准备:
1)客户逗留时间=客户离开银行时间-客户进入银行时间
2)称客户到达银行和客户离开银行这两个时刻发生的事情为“事件”
3)将上述所有事件按照先后顺序插入事件表

4)客户选择最短窗口进行排队,类似于将客户入队,且客户办理业务满足先排先办,即“先进先出”的原则

#include<iostream>
#include<cstdlib>
#include<ctime>
#include"LinkList.h"
#include"LinkQueue.h"
using namespace std;
#define CloseTime 100
#define B1 31
#define A1 0
#define B2 6
#define A2 0
int TotalTime,CustomerNum;	//累计客户逗留事件,客户数
int DurTime,InterTime;//DurTime表示办理业务所需时间,InterTime表示下一个客户将到达的时间间隔
EvenList eventlist;//事件表
Event even;//事件
LinkQueue Q[4];//4个客户队列


void OpenForDay()//初始化操作

	//初始化操作要完成的任务包括:
	//1:初始化累计时间和客户数为0
	//2:初始化时间链表为空表
	//3:初始化4个队列为空队列
	//4:设定第一个客户到达事件
	//5:将客户到达事件顺序插入事件表
	
	/*完成任务1*/
	TotalTime=0;CustomerNum=0;
	/*完成任务2*/
	LOP.InitList(eventlist);
	/*完成任务3*/
	for(int i=0;i<4;i++)
		QOP.InitQueue(Q[i]);
	/*完成任务4*/
	Event firstevent;//第一个客户到达事件
	Link firstlink=NULL;//事件插入事件表需转换的类型
	firstevent.OccurTime=0;firstevent.Ntype=0;
	//firstlink->data=firstevent;
	LOP.MakeNode(firstlink,firstevent);
	Status (*cmp)(ElemType,ElemType);
	cmp=compare1;
	LOP.OrderInsert(eventlist,firstlink,cmp);
//OpenForDay

Status Minimum(LinkQueue Q[])//返回长度最短队列的标号

	int min=QOP.QueueLength(Q[0]),flag=1;
	for(int i=0;i<4;i++)
		
		if(min>QOP.QueueLength(Q[i]))
		
			min=QOP.QueueLength(Q[i]);
			flag=i+1;
				
	//for
	return flag;
		

void CustomerArrived(Event even)//处理客户到达事件

	//客户到达之后需做的任务包括:
	//1:客户数加1
	//2:随机产生下个客户到达的时间间隔和该客户办理业务所需时间
	//3:将下个客户到达事件插入事件表
	//4:选择最短队列排队
	//5:若该队列只有该客户排队,则将客户离开队列事件插入事件表

	/*完成任务1*/
	CustomerNum++;
	/*完成任务2*/
	//srand((unsigned)time(0));//产生随机种子
	//DurTime=rand()%(B-A)+A;//随机设定客户办理业务所需的时间,为[A,B]上的随机整数
	DurTime=rand()%(B1-A1)+A1;
	cout<<"DurTime: "<<DurTime<<"  ";
	//InterTime=rand()%(B-A)+A;//随机设定下一个客户到达的时间间隔,为[A,B]上的随机整数
	InterTime=rand()%(B2-A2)+A2;
	cout<<"InterTime: "<<InterTime<<endl;
	/*完成任务3*/
	Event nextevent;//下个客户到达事件
	nextevent.OccurTime=even.OccurTime+InterTime;
	nextevent.Ntype=0;
	Link nextlink=NULL;//事件插入事件表需转换的类型
	//nextlink->data=nextevent;
	LOP.MakeNode(nextlink,nextevent);
	Status (*cmp)(ElemType,ElemType);
	cmp=compare1;
	if(nextevent.OccurTime<CloseTime)//银行尚未关门,插入事件表
		
		LOP.OrderInsert(eventlist,nextlink,cmp);
	//if
	/*完成任务4*/
	int i=Minimum(Q);//求最短长度队列的下标号
	QElemType eventQElem;//事件插入队列需转换的类型
	eventQElem.ArrivalTime=even.OccurTime;
	eventQElem.DurTime=DurTime;
	QOP.EnQueue(Q[i-1],eventQElem);//当i为1时表示在第1窗口排队,则实际进入Q[0]队列排队
	/*完成任务5*/
	if(1==QOP.QueueLength(Q[i-1]))
	
		//nextlink->data.OccurTime=even.OccurTime+DurTime;//将nextlink设定为插入客户离开事件类型
		ElemType nextElem;
		nextElem.OccurTime=even.OccurTime+DurTime;
		nextElem.Ntype=i;
		LOP.MakeNode(nextlink,nextElem);
		LOP.OrderInsert(eventlist,nextlink,cmp);
		
//CustomerArrived

void CustomerDeparture(Event even)//处理客户离开事件

	//客户离开时所需完成的任务包括:
	//1:删除该客户在队列中的信息
	//2:累计客户的逗留时间
	//3:将该客户离开事件插入事件表

	/*完成任务1*/
	int i=even.Ntype;//定义i为队列的下标号
	QElemType customer;
	QOP.DeQueue(Q[i-1],customer);//用customer返回该客户信息
	/*完成任务2*/
	TotalTime+=even.OccurTime-customer.ArrivalTime;//客户离开队列时间-客户进入队列时间
	/*完成任务3*/
	Link deparlink=NULL;//客户离开事件插入事件表转换类型
	Status (*cmp)(ElemType,ElemType);
	cmp=compare1;
	if(!QOP.QueueEmpty(Q[i-1]))//将此时队头元素的离开事件插入事件表中
	
		QOP.GetHead(Q[i-1],customer);
		ElemType deparevent;
		//deparlink->data.OccurTime=customer.ArrivalTime+DurTime;
		//deparlink->data.Ntype=i;
		deparevent.OccurTime=customer.ArrivalTime+DurTime;
		deparevent.Ntype=i;
		LOP.MakeNode(deparlink,deparevent);
		LOP.OrderInsert(eventlist,deparlink,cmp);
	//if
//CustomerDeparture

void BankSimulation()

	OpenForDay();
	Link eventlink;
	Event even;
	while(!LOP.ListEmpty(eventlist))
	
		LOP.DelFirst(eventlist,LOP.GetHead(eventlist),eventlink);
		even=eventlink->data;
		if(0==even.Ntype)
			CustomerArrived(even);
		else
			CustomerDeparture(even);
	//while
	cout<<"************"<<"TotalTime= "<<TotalTime<<"**************"<<endl;
	cout<<"************"<<"CustomerNum= "<<CustomerNum<<"**************"<<endl;
//BankSimulation

void main()

	srand((unsigned)time(0));//产生随机种子
	BankSimulation();
//main 


/*LinkList.h*/  
#include<iostream>  
#ifndef _LINKLIST_H_  
#define _LINKLIST_H_  
#define ok 1  
#define error 0  
using namespace std;  
  
typedef int Status;  
//typedef int ElemType;  
typedef struct  
    int OccurTime;//事件发生时刻(客户进入银行或离开窗口的时刻)
	int Ntype;//事件类型,0表示客户到达银行事件,1-4表示四个窗口的离开事件
 Event,ElemType; //有序链表的LinkList的数据元素类型
typedef struct Lnode  
    ElemType data;  
    Lnode    *next;  
 *Link,*Position;  
typedef struct  
    Link head,tail;  
    int len;  
 LinkList; 
typedef LinkList EvenList;//事件链表类型定义为有序链表类型
  
typedef LinkList polynomial;  
  

Status compare1(ElemType a,ElemType b)

	if(a.OccurTime<b.OccurTime)
		return -1;
	else if(a.OccurTime==b.OccurTime)
		return 0;
	else//(a.OccurTime>b.OccurTime)
		return 1;
//cmp
Status ListOperation::OrderInsert(LinkList &L,Link p,Status (*compare1)(ElemType,ElemType))

	Link h=L.head,pt=L.head->next;
	Status (*cmp)(ElemType,ElemType);
	cmp=compare1;
	while(pt)
	
		if(1==cmp(p->data,pt->data)||0==cmp(p->data,pt->data))//p->data.OccurTime大于或等于当前遍历的结点时刻
		h=pt;pt=pt->next;//if	
		else//p->data.OccurTime小于当前遍历的结点时刻
		
			InsFirst(L,h,p);//将结点p按时间大小插入到当前结点之前
			break;
		
	//while
	if(pt==NULL)
		InsFirst(L,h,p);
	return ok;
//OrderInsert
  

#include<iostream>  
/*LinkQueue.h*/  
#include<iostream>  
#ifndef _LINKQUEUE_H_  
#define _LINKQUEUE_H_  
using namespace std;  
  
//-----------------单链队列——队列的链式存储结构-----------------  
#define ok 1  
#define error 0  
#define COUNT 5  
//typedef int QElemType;  
typedef  int Status;  
typedef struct

	int ArrivalTime;//到达队列的时刻(开始排队的时刻)
	int DurTime;//办理事务所需时间
QElemType;
typedef struct QNode  
  
    QElemType data;  
    QNode *next;  
QNode,*QueuePtr;  
typedef struct  
  
    QueuePtr front;//对头指针  
    QueuePtr rear;//队尾指针  
LinkQueue;  

两个自定义头文件出处:http://blog.csdn.net/u014033518/article/details/38041503

http://blog.csdn.net/u014033518/article/details/38260845


以上是关于银行业务的模拟程序的主要内容,如果未能解决你的问题,请参考以下文章

第三章:6.栈和队列 -- 离散事件模拟

[HAOI2017模拟]囚人的旋律

21数据结构笔记之十九列队实现离散事件模拟

[模拟] aw3758. 距离零点的时刻(模拟+aw周赛007_1)

JMeter笔记12 | JMeter集合点

标号1-n的n个人首尾相接,1到3报数,报到3的退出,求最后一个人的标号