银行业务的模拟程序

来源:互联网 发布:js怎么查看dom元素属性 编辑:程序博客网 时间:2024/06/11 02:16
银行业务的模拟程序:
假设某银行有四个窗口对外接待客户,且每个窗口在某时刻只能接待一位客户,客户在银行工作时间内进入银行后选择最短的一队进行排队等候。现在编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的时间。

前期准备:
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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 四维胎儿有问题怎么办 怀孕70天没有胎心怎么办 怀孕20天不想要怎么办 换轮胎胎压监测怎么办 怀孕了吐的厉害该怎么办 怀孕吐完嗓子疼怎么办 怀孕16周不想要怎么办 怀孕四个月胎盘低置怎么办 孕37周胎盘三级怎么办 孕37周胎盘老化怎么办 怀孕22周胎盘1级怎么办 婴儿吃奶粉吐奶怎么办 宝宝吐奶又拉稀怎么办 羊水穿刺21三体怎么办 开始长妊娠纹了怎么办 已经长了妊娠纹怎么办 孕晚期长妊娠纹怎么办 妊娠纹长出来了怎么办 没提前预约四维怎么办 ct检查冠脉钙化怎么办 残角子宫有内膜怎么办 怀孕了长痔疮了怎么办 人流后子宫内膜薄怎么办 多囊子宫内膜薄怎么办 6岁儿童不爱睡觉怎么办 初生儿嗓子哑了怎么办 6岁儿童睡眠不好怎么办 8岁儿童睡眠不好怎么办 1个月婴儿睡眠少怎么办 三岁宝宝心跳快怎么办 宝宝右心房稍大怎么办 胎儿右心房偏大怎么办 胎心监测波动小怎么办 怀孕6个月不想要了怎么办 高敏肌钙蛋白t高怎么办 龟头沟槽里长疙瘩怎么办 肝郁气滞的体质怎么办 手指甲长在肉里怎么办 甲床与指甲脱离怎么办 指甲往肉里面长怎么办 指甲和肉分离是怎么办