1、一是两个到达事件之间的间隔很短,而客户的交易时间很长;另一个正好相反,设置两个到达事件的间隔时间很长,而客户之间交易的时间很短。实现提示事件有两类:到达银行和离开银行。初始时银行现存资金总额为Total。开始营业后的第一个事件是客户到达,营业时间从0到Closetime。到达事件发生时随机地设置各客户的交易时间和距下一次到达时间之间的时间间隔。每个客户要办理的款项也是随机确定的,用负值和正值分别表示第一类和第二类业务。变量Total、CloseTime以及上述两个随机量的上下界均交互地从终端读入,作为模拟参数。两个队列和一个事件表均要用动态的存储结构实现。注意弄清应该在什么条件下设置离开事件,
2、以及第二个队列用怎样的存储结构实现可以获得较高的效率。时间表是按照时间顺序有序的。#include stringtime.husing namespace std;int total; /初始时银行现存资金总额int closeTime; /营业结束时间int arriveTime; /两个到达事件之间的间隔上限int dealTime; /客户之间交易的时间上限int dealMoney = 5000; /交易额上限int currentTime = 0; /当前时间int totalTime = 0; /客户逗留总时间int counter = 0; /客户总数int number = 1
3、; /初始客户序列号+struct serviceint num; /客户号string type; /到达或离开int beginTime;int endTime;int money; /正数为存款,负数为取款service* next;struct queue /队列service* head;service* rear;void push(queue &q,int d)/ 插入元素d为Q的新的队尾元素service* temp = new service;temp-money = d;next = NULL;if(NULL = q.head)/队列为空,初始化q. head = temp
4、;q. rear = temp;/ifelse /队列不为空,插入元素dq. rear-next = temp;q. rear = q.rear-next;/elsevoid pop(queue &q)/ 若队列不空,出对列函数service* temp;temp = q. head;if(NULL =q. head-next)q.head = q. rear =NULL;elseq. head=q. head-delete temp;service* front(queue &/返回队首元素return q. head;service* back(queue &/返回队尾元素return q
5、. rear;service* searchAndDel(queue &q,int m)/在对列中寻找可处理元素service* sign = q. head; /标记头节点while(NULL != q. head)if(-(q. head-money) / 首节点后移一位,返回原首节点/while/队首元首不能被处理if(q. head = q. rear)/首节点移到队列尾部next = q. head;q. rear = q. rear-q. head =q. head-if(q. head = sign)/队列循环一周时停止return NULL;bool state =1; /用于
6、判断是否有窗口在处理int currentTimeOfDeal = 0;int theArriveTime = 0;queue eq; /事件队列queue fq; /队列一queue sq; /对列二/初始化三个队列void arrive()/*到达函数 随机产生顾客,进入队列一产生到达事件 进入事件队列*/push(fq,(rand()% (2*dealMoney) -dealMoney); /随机产生顾客加入第一队列back(fq)-beginTime = currentTime;num = number;push(eq,(back(fq)-money); /将产生事件加入事件队列bac
7、k(eq)-type = ;+number;void putMoney() /存款函数total += front(fq)-money; /更新资金总额push(eq,front(fq)-money); /加入事件队列 离开离开num = front(fq)-num;endTime = (front(fq)-beginTime + rand()%dealTime +1);+counter; /更新客户总数totalTime += (back(eq)-endTime - front(fq)-beginTime); /更新逗留时间pop(fq); /删除第一队列第一个业务currentTimeOf
8、Deal = back(eq)-endTime;state =0;void getMoney()/取款函数if( (-fq.head-money) total ) /资金短缺 加入第二队列push( sq,front(fq)-money );back(sq)-beginTime = front(fq)-beginTime;total += back(fq)-beginTime = 0; /更新客户总数 totalTime += ( back(eq)-endTime - back(fq)-beginTime );service* temped ;int randomTemp;void findA
9、ndDeal()/在对列中寻找可处理元素,对其进行处理while( (temped= searchAndDel(sq,total)&NULL != temped ) /查找可处理取款total += temped-push(eq,temped- /加入事件队列训 离开num = temped-randomTemp = rand()%dealTime +1;endTime = currentTime + randomTemp ;currentTimeOfDeal += randomTemp;endTime - temped- /更新逗留时间 delete temped; /删除节点temped = NULL;state = 0;int main() printf( *n); 欢迎进入银行模拟系统n1.开始模拟 0.退出nint n;scanf(%d,&n);while(n=1)srand(time(NULL); /初始化随机函数输入银行的初始存款:ntotal);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1