银行业务模拟与离散事件模拟Word文档下载推荐.docx
- 文档编号:19778977
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:17
- 大小:139KB
银行业务模拟与离散事件模拟Word文档下载推荐.docx
《银行业务模拟与离散事件模拟Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《银行业务模拟与离散事件模拟Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
客户在银行里从排队到办理完银行业务的功能,借助函数CustomerArrive()来实现;
3、顾客离开函数,该模块主要实现:
银行下班时间及顾客全部离开的功能,借助函数CustomerDepart()来实现。
三、系统的设计与实现
【流程图】
(一)开门函数:
OpenForDay()
分析:
首先输入随机数种子,然后输入银行办理时的基本信息。
如下图所示。
voidOpenForDay()
{/*初始化事件链表*/
inti;
InitList(ev);
en.OccurTime=0;
en.NType=Qu;
/*到达*/
OrderInsert(ev,en,cmp);
for(i=0;
i<
Qu;
++i)
InitQueue(q[i]);
}
voidRandom(int&
d,int&
i)
{/*生成两个随机数*/
d=rand()%chuli+1;
/*到处理的随机数*/
i=rand()%(jiange+1);
/*到间隔之间的随机数*/
intMinimum(LinkQueueQ[])
{/*返回最短序列的序号*/
intl[Qu];
inti,k=0;
i++)
l[i]=QueueLength(Q[i]);
for(i=1;
if(l[i]<
l[0])
{
l[0]=l[i];
k=i;
}
returnk;
该模块的具体代码如下所示。
(二)顾客到达函数CustomerArrived()
该模块的具体代码如下所示:
voidCustomerArrived()
{/*处理客户到达事件*/
QElemTypef;
intdurtime,intertime,i;
++CustomerNum;
/*客户数增加1*/
Random(durtime,intertime);
et.OccurTime=en.OccurTime+intertime;
/*下一客户到达时刻=当前客户的到达时间+时间间隔*/
et.NType=Qu;
/*下一客户到达事件*/
i=Minnimum(q);
if(et.OccurTime<
CloseTime)/*下一客户到达银行还未关门*/
OrderInsert(ev,et,cmp);
f.ArrivalTime=en.OccurTime;
f.Duration=durtime;
EnQueue(q[i],f);
if(QueueLength(q[i])==1)
{
et.OccurTime=en.OccurTime+durtime;
/*设定一个离开事件*/
et.NType=i;
}
(三)顾客离开函数CustomerDeparture()
voidCustomerDeparture()
{/*处理客户离开事件*/
i=en.NType;
DeQueue(q[i],customer);
/*删除队列排头客户*/
TotalTime+=en.OccurTime-customer.ArrivalTime;
if(!
QueueEmpty(q[i]))
GetHead(q[i],customer);
et.OccurTime=en.OccurTime+customer.Duration;
四、系统测试
(一)测试函数
测试该函数使用的测试方法,测试的具体步骤,测试用例的选取,测试的结果。
(二)
(三)
(四)
五、总结
通过此次实验,熟悉了链表在实际应用中的简单操作,通过实际数产生函数,完成了一系列银行活动的模拟,可以给银行业务的办理提供更大的便利。
实验中,存在问题,在进行了一系列的修改和请教下,解决了问题。
利用随机产生种子进行事件的模拟,即到达和办理业务的时间都是随机产生。
如果事件尚未到达下班时间,则将插入到空列队或者是人数(元素)最少的列队,通过检验,算出在不同服务窗口数下的等待时间以及服务时间,基本实现了银行业务的模拟。
六、附件(代码、部分图表)
LinkList.h
#defineQu2
#definejiange5
#definechuli10
#include<
string.h>
malloc.h>
stdlib.h>
math.h>
process.h>
iostream>
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
typedefintStatus;
typedefintBoolean;
typedefstruct
{
intOccurTime;
intNType;
}Event,ElemType;
typedefstructLNode/*结点类型*/
ElemTypedata;
LNode*next;
}*Link,*Position;
structLinkList/*链表类型*/
Linkhead,tail;
intlen;
};
typedefLinkListEventList;
EventListev;
Eventen,et;
voidInitList(LinkList&
L)
{/*构造一个空的线性表*/
Linkp;
p=(Link)malloc(sizeof(LNode));
if(p)
p->
next=NULL;
Lhead=Ltail=p;
Llen=0;
else
exit(ERROR);
StatusDelFirst(LinkList&
L,Linkh,Link&
q)
q=h->
next;
if(q)/*链表非空*/
h->
next=q->
if(!
h->
next)/*删除尾结点*/
Ltail=h;
/*修改尾指针*/
Llen--;
returnOK;
returnFALSE;
ElemTypeGetCurElem(Linkp)
{/*已知P指向线性链表中的一个结点,返回P所指结点中数据元素的值*/
returnp->
data;
StatusListEmpty(LinkListL)
if(L.len)
returnTRUE;
PositionGetHead(LinkListL)
{/*返回线性链表L中头结点的位置*/
returnL.head;
voidOrderInsert(LinkList&
L,ElemTypee,int(*comp)(ElemType,ElemType))
Linko,p,q;
q=Lhead;
p=q->
while(p!
=NULL&
&
comp(p->
data,e)<
0)/*P不是表尾且元素值小于E*/
q=p;
p=p->
o=(Link)malloc(sizeof(LNode));
o->
data=e;
/*赋值*/
q->
next=o;
/*插入*/
next=p;
L.len++;
/*表长加一*/
p)/*插在表尾*/
L.tail=o;
/*修改尾结点*/
Queue.h
typedefstruct
intArrivalTime;
intDuration;
/*办理事务所需时间*/
}QElemType;
/*定义队列的数据元素类型为结构体类型*/
typedefstructQNode
QElemTypedata;
QNode*next;
}*QueuePtr;
structLinkQueue
QueuePtrfront,rear;
/*队头队尾指针*/
voidInitQueue(LinkQueue&
Q)
{/*构造一个空队列Q*/
(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode))))
exit(OVERFLOW);
Q.front->
voidDestroyQueue(LinkQueue&
while(Q.front)
Q.rear=Q.front->
free(Q.front);
Q.front=Q.rear;
StatusQueueEmpty(LinkQueueQ)
if(Q.front->
next==NULL)
intQueueLength(LinkQueueQ)
{/*求队列的长度*/
inti=o;
QueuePtrp;
p=Q.front;
while(Q.rear!
=p)
i++;
returni;
StatusGetHead(LinkQueueQ.QElemType&
e)
QueuePtrp;
if(Q.front==Q.rear)
returnERROR;
p=Q.front->
e=p->
returnOK;
voidEnQueue(LinkQueue&
Q.QElemTypee)
(p=(QueuePtr)malloc(sizeof(QNode))))/*存贮分配失败*/
p->
Q.rear->
Q.rear=p;
StatusDeQueue(LinkQueue&
Q.QElemType&
if(Q.front==Q.rear)
returnERROR;
p=Q.front->
e=p->
next=p->
if(Q.rear==p)
Q.rear=Q.front;
free(p);
returnOK;
#include"
LinkList.h"
Queue.h"
longintTotalTime=0;
/*累计客户逗留时间,初值为0*/
intCloseTime,CustomerNum=0;
Main.h
LinkQueueq[Qu];
/*客户队列*/
QElemTypecustomer;
/*客户记录,临时变量*/
intcmp(Eventa,Eventb)
if(a.QccurTime==b.QccurTime)
return0;
return(a.OccurTime-b.OccurTime)/abs(a.OccurTime-b.OccurTime);
voidBank_Simulation()
{/*银行业务模拟*/
OpenForDay();
while(!
ListEmpty(ev))
DelFirst(ev,ev,head,p);
en.OccurTime=GetCurElem(p).OccurTime;
en.NType=GetElem(p).NType;
if(en.NType==Qu)/*到达事件*/
CustomerArrived();
else
CustomerDeparture();
printf("
窗口数:
%d两相邻到达的客户时间间隔0~%d分钟每个客户办理的时间:
1~%d分钟\n"
Qu,jiange,chuli);
客户总数:
%d\n"
CustomerNum);
所有客户共耗时:
%ld分钟\n"
TotalTime);
平均每人耗时:
%d分钟\n"
TotalTime/CustomerNum);
最后一个客户离开的时间:
en,OccurTime);
voidmain()
请输入银行营业时间长度(分):
"
);
scanf("
%d"
&
CloseTime);
Bank_Simulation();
getchar();
getcher();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行业务 模拟 离散 事件