银行业务模拟系统的实现Word文档下载推荐.docx
- 文档编号:1503959
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:16
- 大小:152.92KB
银行业务模拟系统的实现Word文档下载推荐.docx
《银行业务模拟系统的实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《银行业务模拟系统的实现Word文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。
每个队列中的队头客户即为正在窗口办理事务的客户,他办完业务离开队列的时刻就是即将发生的客户离开事件的时刻,这就是说,对每个队头客户都存在一个将要驱动的客户离开事件。
因此在任何时刻即将发生的事伯只有5种可能:
1)新的客户到达;
2)1号窗口的客户离开;
3)2号窗口的客户离开;
4)3号窗口的客户离开;
5)4号窗口的客户离开;
从以上分析可知,在模拟程序中只需要两种数据结构:
有序链表和队列。
程序中用到的头文件、类型定义及主要的函数原型如下:
#include"
stdio.h"
malloc.h"
time.h"
stdlib.h"
int
OccurTime;
//
事件发生时刻
NType;
事件类型,Qu表示到达事件,0至Qu-1表示Qu个窗口的离开事件
}Event,ElemType;
事件类型,有序链表LinkList的数据元素类型
typedef
struct
LNode
//定义事件表的结点类型
{
ElemType
data
*next;
}
LNode,
*LinkList;
LinkList
EventList;
事件链表类型,定义为有序链表
//定义客户队列的元素类型
ArrivalTime;
到达时刻
Duration;
办理事务所需时间
}QElemType;
定义QElemType(队列的数据元素类型)为结构体类型;
QNode
//定义客户队列的结点类型
QElemType
QNode,
*Queue;
Queue
head;
tail;
LinkQueue;
LinkQueue
q[Qu+1];
Qu个客户队列
void
OpenForDay();
//模拟银行开门的动作,即初始化操作
CustomerArrived()
处理客户到达事件
CustomerDeparture()
处理客户离开事件
(2)各模块之间的调用与设计
a主程序模块:
voidmain()
{
输出主界面:
选择操作:
进入银行模拟系统/退出程序;
While(进入银行业务模拟窗口)
OpenForDay();
进入初始化操作;
输出格式控制;
{银行业务模拟:
While(有要处理的时间时)
DeQueuel();
If(客户到达)
CustomerArrived();
Else
CustomerDeparture();
}
计算出客户的平均逗留时间并输出
b函数调用关系图
3.详细设计
OpenForDay()
i;
InitList(ev);
初始化事件链表为空
en.OccurTime=0;
设定第一个客户到达事件
en.NType=0;
客户到达事件
Insert_EventList(ev,
en);
//插入事件
q=(LinkQueue*)malloc((Qu+1)*sizeof(LinkQueue));
//为队列申请Qu+1个队头指针,第0个不用
for(i=1;
i<
Qu+1;
++i)
置空队列
InitQueue(q[i]);
f;
durtime,intertime,i;
++CustomerNum;
Random(durtime,intertime);
生成随机数
//printf("
%d
%d\n"
durtime,intertime);
et.OccurTime=en.OccurTime+intertime;
下一客户到达时刻
et.NType=0;
队列中只有一个客户到达事件
et.NType,et.OccurTime);
if(et.OccurTime<
CloseTime)
银行尚未关门,插入事件表
Insert_EventList(ev,et);
i=Minimum(q);
求长度最短队列的序号,等长为最小的序号
f.ArrivalTime=en.OccurTime;
f.Duration=durtime;
EnQueue(q[i],f);
if(QueueLength(q[i])==1)
et.OccurTime=en.OccurTime+durtime;
et.NType=i;
设定第i队列的一个离开事件并插入事件表
处理客户离开事件,
en.NTyPe!
=0
i=en.NType;
DelQueue(q[i],customer);
删除第i队列的排头客户
TotalTime+=en.OccurTime-customer.ArrivalTime;
累计客户逗留时间
if(!
QueueEmpty(q[i]))
GetHead_q(q[i],customer);
et.OccurTime=en.OccurTime+customer.Duration;
Bank_Simulation()
OpenForDay(
);
初始化
while(!
ListEmpty(ev))
//output_ev(ev);
//for(i=1;
QU+1;
i++)
output_q(q[i]);
//getchar();
//为观察执行结果用
Gethead(ev,en);
事件%d
%d\n
"
en.NType,en.OccurTime);
if(en.NType==0)
else
计算并输出平均逗留时间
printf("
顾客总数:
%d,
所有顾客共耗时:
%d分钟,
平均每人耗时:
%d分钟\n"
CustomerNum,TotalTime,TotalTime/CustomerNum);
4.测试与分析
利用随机产生的种子进行事件的模拟,即到达时间和办理业务的时间都是随机产生。
如果事件尚未到达下班时间,则将其插入到空队列或者是人数(元素)最少的队列,通过检验,算出在不同的服务窗口数下的等待时间以及服务时间,基本上实现了银行事件的模拟。
5.总结
该实验涉及到线性表的建立、插入、删除等操作,涉及到了队列的建立、插入、删除,
涉及到了离散事件的应用思想,还涉及到了排序的概念。
完成这个实验对线性表、队列及C语言编程等多方面的知识将是一个很好的利用,对离散事件也将有一个初步的认识。
通过本次实验,提高了自已调试程序的能力。
充分体会到了在程序执行时的提示性输出的重要性。
6.附录
源程序清单:
#defineOK1
#defineTRUE1
#defineFALSE0
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;
//-----------------银行排队模拟
//事件和事件表
typedefstructQCuEvent
intOccurTime;
intNType;
structQCuEvent*next;
}QCuEvent,*EventList;
//窗口前队列元素
typedefstructQCuElem
intArrivalTime;
intDuration;
structQCuElem*next;
}QCuElem,*QEptr;
//窗口指针
typedefstruct{
QEptrfront;
QEptrrear;
}QCustomerp,*QCupp;
//主要操作函数
StatusOpenForDay(EventList&
ev,QCuEventen,QCupp&
q);
//开门
StatusCustomerArrived(EventList&
ev,QCupp&
q,QCuEventen);
//顾客到达
StatusCustomerDeparture(EventList&
//顾客离开
voidCloseForDay();
//基本操作函数
StatusOrderInser(EventList&
ev,QCuEventen);
//按时间顺序插入事件到事件表
intQLength(QCustomerpqn);
//求窗口队列长度
intMinCuQueue(QCuppq);
//求队最短的窗口
StatusDelFirstEvent(EventList&
ev);
//删除事件表中的第一个事件
StatusInitCuQueue(QCustomerp&
qn);
//初始化窗口队列
StatusEnCuQueue(QCustomerp&
qn,QEptrQ);
//进入队列
StatusDeCuQueue(QCustomerp&
qn,QCuElem&
Q);
//删除队列中的元素
StatusGetQHead(QCustomerpqn,QCuElem&
//获得队列中的第一个元素
StatusDestoryQueue(QCustomerpqn);
//销毁队列
voidPtint_QStatus(QCustomerpQCu[]);
//打印队列长度
voidBank_SimulationFunc();
voidtest(charstr[]);
#include<
stdio.h>
stdlib.h>
time.h>
inti=0,e=0,counter=0;
intTotalTime=0,CustomerNum=0;
//累计客户逗留时间,客户数
intCloseTime;
//关门时间
intwindowsnum=0;
//主函数
voidmain(){
EventListev;
//事件表
QCuEventen;
QCuppQCu=NULL;
OpenForDay(ev,en,QCu);
while(ev->
next)
{
en.NType=ev->
next->
en.OccurTime=ev->
DelFirstEvent(ev);
if(en.NType==0)
CustomerArrived(ev,QCu,en);
else
CustomerDeparture(ev,QCu,en);
Ptint_QStatus(QCu);
}
CloseForDay();
//主要功能子函数
q)
{
inttemp=0;
printf("
请输入随机数种子(或输入0使用随机种子):
scanf("
%d"
&
temp);
if(temp==0)srand((unsigned)time(NULL));
elsesrand(temp);
请输入营业时间(单位:
分钟):
CloseTime=temp;
TotalTime=0;
CustomerNum=0;
en.OccurTime=0;
en.NType=0;
en.next=NULL;
ev=(EventList)malloc(sizeof(QCuEvent));
ev->
next=NULL;
OrderInser(ev,en);
请输入办理业务的窗口数(至少1个):
windowsnum);
q=(QCustomerp*)malloc((windowsnum+1)*sizeof(QCustomerp));
for(inti=1;
=windowsnum;
i++)
InitCuQueue(q[i]);
returnOK;
q,QCuEventen)
test("
顾客到达处理<
<
CustomerNum++;
//产生随机数
//srand(54);
intdurtime=rand()%30+1;
intintertime=rand()%5+1;
//插入到达事件表
QCuEventenTemp;
intt=en.OccurTime+intertime;
enTemp.OccurTime=t;
enTemp.NType=0;
enTemp.next=NULL;
if(t<
CloseTime) OrderInser(ev,enTemp);
时间%d\n"
t);
//插入最短队
QEptrQ;
Q=(QEptr)malloc(sizeof(QCuElem));
Q->
ArrivalTime=en.OccurTime;
Duration=durtime;
inti=MinCuQueue(q);
EnCuQueue(q[i],Q);
//插入离开事件
enTemp.OccurTime=en.OccurTime+durtime;
enTemp.NType=i;
if(QLength(q[i])==1) OrderInser(ev,enTemp);
>
顾客离开处理"
inti=en.NType;
离开时间%d\n"
en.OccurTime);
if(en.OccurTime>
CloseTime)
DestoryQueue(q[i]);
else{
QCuElemcustomer;
DeCuQueue(q[i],customer);
//客户逗留时间
TotalTime+=en.OccurTime-customer.ArrivalTime;
printf("
总时间为%d\n"
TotalTime);
if(q[i].front->
{
GetQHead(q[i],customer);
QCuEventenTemp;
enTemp.OccurTime=en.OccurTime+customer.Duration;
enTemp.NType=i;
OrderInser(ev,enTemp);
}
voidCloseForDay()
***************************************\n"
*\n"
*所有顾客业务办理总时间:
TotalTime);
*业务办理顾客数:
CustomerNum);
*平均每人办理时间:
%f\n"
(float)TotalTime/(float)CustomerNum);
//功能实现子函数
ev,QCuEventen)
EventListentemp,qtemp;
entemp=(EventList)malloc(sizeof(QCuEvent));
entemp->
OccurTime=en.OccurTime;
NType=en.NType;
if(!
ev->
ev->
next=entemp;
returnOK;
qtemp=ev;
while(qtemp->
next&
&
qtemp->
OccurTime<
en.OccurTime)
qtemp=qtemp->
next;
next=qtemp->
qtemp->
intQLength(QCustomerpqn)
QEptrqtemp;
inti=0;
qtemp=qn.front->
while(qtemp)
i++;
returni;
intMinCuQueue(QCuppq)
inti,min;
for(i=1,min=1;
min=QLength(q[min])<
=QLength(q[i])?
min:
returnmin;
ev)
EventListp;
p=ev->
next=p->
free(p);
qn)
qn.front=(QEptr)malloc(sizeof(QCuElem));
qn.front->
qn.rear=qn.front;
qn,QEptrQ)
qn.rear->
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行业务 模拟 系统 实现