银行业务的模拟程序
来源:互联网 发布:js怎么查看dom元素属性 编辑:程序博客网 时间:2024/06/11 02:16
银行业务的模拟程序:
假设某银行有四个窗口对外接待客户,且每个窗口在某时刻只能接待一位客户,客户在银行工作时间内进入银行后选择最短的一队进行排队等候。现在编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的时间。
前期准备:
1)客户逗留时间=客户离开银行时间-客户进入银行时间
2)称客户到达银行和客户离开银行这两个时刻发生的事情为“事件”
3)将上述所有事件按照先后顺序插入事件表
假设某银行有四个窗口对外接待客户,且每个窗口在某时刻只能接待一位客户,客户在银行工作时间内进入银行后选择最短的一队进行排队等候。现在编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的时间。
前期准备:
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 0int 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);}//OpenForDayStatus 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;}}//forreturn 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);}}//CustomerArrivedvoid 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}//CustomerDeparturevoid 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);elseCustomerDeparture(even);}//whilecout<<"************"<<"TotalTime= "<<TotalTime<<"**************"<<endl;cout<<"************"<<"CustomerNum= "<<CustomerNum<<"**************"<<endl;}//BankSimulationvoid 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;}//cmpStatus 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;}//ifelse//p->data.OccurTime小于当前遍历的结点时刻{InsFirst(L,h,p);//将结点p按时间大小插入到当前结点之前break;}}//whileif(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
0 0
- 银行业务的模拟程序
- 银行业务的模拟程序
- 3.5 离散事件模拟--银行业务模拟程序
- 离散事件模拟(银行业务模拟。实现算法3.6、3.7的程序)
- 银行业务模拟
- 银行业务模拟
- 银行业务模拟
- 银行业务模拟
- SHH数据结构-【实训-银行业务的模拟系统 】
- 银行业务调度系统-java并发程序模拟解决方案
- 银行业务模拟系统
- 模拟银行业务调度系统
- 数据结构-模拟银行业务
- 模拟银行业务调度系统
- 【数据结构】银行业务模拟
- PAT银行业务简单模拟
- 对“银行业务调度系统模拟实现”的一点改进
- 银行业务调度系统模拟实现
- Struts2 s:property标签的escapeHtml属性
- Android学习路线(一)开发环境搭建
- NSArray中存的是实体时的排序
- 【2056】不敢死队问题(循环链表)SDUT
- 全自动软化水设备:锅炉全自动软化水设备的应用范围
- 银行业务的模拟程序
- 关于伪代码的一些思考
- iText 操作Pdf之模版01
- Android中R.styleable 无法解析时候的解决办法
- DOS命令大全(经典收藏)
- 杭电A+B problem1002 (大数)
- 《Struts2技术内幕》 (六)—— XWork容器概览
- Cocos2d-x Lua 读取Csv文件,更方便的使用数据
- iframe应用背景色