银行业务模拟与离散事件

上传人:ji****72 文档编号:39553203 上传时间:2018-05-17 格式:DOC 页数:14 大小:92.18KB
返回 下载 相关 举报
银行业务模拟与离散事件_第1页
第1页 / 共14页
银行业务模拟与离散事件_第2页
第2页 / 共14页
银行业务模拟与离散事件_第3页
第3页 / 共14页
银行业务模拟与离散事件_第4页
第4页 / 共14页
银行业务模拟与离散事件_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《银行业务模拟与离散事件》由会员分享,可在线阅读,更多相关《银行业务模拟与离散事件(14页珍藏版)》请在金锄头文库上搜索。

1、 14信计信计2015-2016(一)(一)数数 据据 结结 构构 课课 程程 设设 计计设计题目 银行业务模拟与离散事件 设计时间 2016 1.112016 1.15 学生姓名 张超 学生学号 20140401207 所在班级 14 信计 2 指导教师 刘刘 风风 华华 徐徐州工程学院数学与物理科学学院州工程学院数学与物理科学学院成成 绩绩数据结构课程设计报告一、需求分析一、需求分析客户的业务分为两种:第一种是申请从银行得到一笔资金,即取款或借款;第二种是向银行中投入一笔资金,即存款或还款。银行有两个服务窗口,相应地有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种

2、,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队等候,直至满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立刻离开银行。 要求:写一个上述银行业务的事件驱动模拟

3、系统,模拟出并输出系统处理所有客户的流程,并计算出所有客户在银行内逗留的平均时间。2、问题描述问题描述1. 假设某银行有 4 个窗口对外接待客户,从早晨银行开门(开门 9:00am,关门 5:00pm)起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进入银行的客户(建议:客户进入时间使用随机函数产生),若某个窗口的业务员正空闲,则上前办理业务;反之,若 4 个窗口均有窗户所占,他便会排在人数最少的队伍后面。2. 编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。建议有如下设置:(1) 客户到达时间随机产生

4、,一天客户的人数设定为 100 人。(2) 银行业务员处理时间随机产生,平均处理时间 10 分钟。(3) 将一天的数据(包括业务员和客户)以文件方式输出。数据结构课程设计报告三、算法的思想与算法实现步骤三、算法的思想与算法实现步骤1. 基本思想通过队列数据类型进行基本操作,主要有三个模块:分别是主函数模块、主要操作函数及基本操作函数。其中,主函数负责其他子函数的调用实现以及基本界面的操作,主要函数包括开门函数的实现:OpenForDay,顾客到达函数:CustomerArrived,顾客离开的函数:CustomerDepartion 等;而基本操作函数就是对其中牵扯到的操作进行具体的实现,如按

5、时间先后插入队列OrderInsert、寻求最短的队列 MinCuQueue、删除队列元素以及销毁等。2. 实现步骤首先,分析题目要求划分实现模块、画出大致的流程图,定义基本数据类型,诸如结构体、队列等;其次,考虑基本大致的操作,比如要拟定开门的时间、顾客到来为其提供服务以及离开时的操作等;再次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能;最后,编写主函数对每个实现进行按需调用,实现操作。3.概要设计本问题主要需要处理两个交易队列(fq,sq)和一个事件队列(eq)。当有客户来交易时,让客户先进队列一 fq,然后让事件队列 eq

6、记下客户随机产生的到达时间,如果客户办理存款,则更新银行的资金并且记下客户随机产生的逗留时间,办理完后让事件队列记录客户的离开时间,然后从队列一中删除该客户的结点;如果客户办理取款,当银行此刻的金额可以满足该客户,则更新银行的资金并且记下客户随机产生的逗留时间,办理完后让事件队列记录客户的离开时间,然后从队列一中删除该客户的结点,当银行此刻的金额不能够满足该客户,则将该客户转移到队列二等待,直到下一个办理存款的客户办理完存款后,从队列二的头结点开始搜索,看看有没有可以满足其取款的客户,如果队列二的头结点客户能满足,则为其办理取款,然后从队列二中删除该节点,并让事件队列记录该客户的离开时间,如果

7、队列二的头结点客户仍然不能满足,数据结构课程设计报告则搜索下一个客户直到将队列二搜索完。等到银行的营业时间到了后,输出事件队列,需要办理两种业务的顾客数,已成功办理两种业务的顾客数,两种业务的成功办理率,客户在银行内的平均逗留时间和下班时银行所剩余的资金总额。实现:输入:用户需要在程序运行开始时输入以下数据:银行初始资金 total;银行营业时间 closetime;客户交易时间上下界 dealmaxtime 和 dealmintime,用于给随机数产生函数传递参数,产生一个介于这两个值之间的值;客户到达时间间隔上界 arrivemaxtime arrivemintime,用于给随机数产生函数

8、传递参数,产生一个介于这两个值之间的值;交易额的最大上限 dealMaxMoney.用于给随机函产生函数参数,产生一个介于-dealMaxMoney 和 dealMaxMoney 之间的值,作为顾客到银行办理业务的交易额,。输出:本程序用 dos 界面模拟输出整个银行业务办理及排队的结果,最后给出一下数据:分别列出需要办理两种业务的顾客数;分别列出已成功办理两种业务的顾客数;分别列出两种业务的成功办理率;客户在银行内的平均逗留时间;数据结构课程设计报告3. 流程图是否否 图-1事件流程图排队开始客户到 达窗口 忙选择服务 窗口服务并展 开窗口闲 置时间 到结 束队列 空处理并 离开队头取 客户

9、数据结构课程设计报告图-2 主函数流程图开始结束Customerarri ve()进入 or 离开CutomDepati on() ()main()队列是否为空输出结果数据结构课程设计报告四、四、源代码源代码#include #include #include #include #define NULL 0typedef struct LNodeint OccurTime;int NType;struct LNode *next; *LinkList;typedef LinkList EventList;typedef struct QNodeint ArrvalTime; int Durat

10、ion; struct QNode *next; *Queue;struct QueueList Queue front; Queue rear; ;typedef int Status;EventList ev; /事件表 LNode en; /事件 QueueList q5; /四个窗口队列 int TotalTime,CustomerNum; /逗留时间和总人数 int CloseTime; /银行关门时间Status OrderInsert(EventList /插入事件到事件表函数 bool ListEmpty(EventList ev); /判断事件表是否为空数据结构课程设计报告S

11、tatus GetLinkHead(EventList ev,LNode /取出事件表头事件,并在 事件表中删去头事件 int QLength(QueueList q); /返回队列长度 int Mininum(QueueList q); /判断最短队列 Status EnQueue(QueueList /插入客户到 队列 Status CustomerArrived(EventList /客户到银行 函数 bool QueueEmpty(QueueList q); /判断队列是否为空 Status CustomerDeparture(EventList /客户出银行函数Status main

12、() printf(“输入银行关门时间n“); scanf(“%d“, ev=(EventList)malloc(sizeof(LNode); /分配事件表空间 ev-next=NULL; for(int i=1;inext=qi.rear-next=NULL; TotalTime=0; /逗留时间初始化为 0 CustomerNum=0; /总人数初始化为 0 en.NType=0; /初始化事件为客户到达 en.OccurTime=0; /初始化事件发生时间为 0 OrderInsert(ev,en); /插入事件到事件表 while(!ListEmpty(ev) GetLinkHead(

13、ev,en);if(en.NType=0)CustomerArrived(ev,en);elseCustomerDeparture(ev,en); ; printf(“总人数:n%d“,CustomerNum); printf(“平均逗留时间:n%f“,(float)(TotalTime/CustomerNum); return 0; Status OrderInsert(EventList LNode *node=(EventList)malloc(sizeof(LNode);probe=ev;node-NType=en.NType;node-OccurTime=en.OccurTime;n

14、ode-next=NULL;if(probe-next=NULL)probe-next=node;elsewhile(probe-nextnode-next=probe-next;probe-next=node;return 0; Status CustomerArrived(EventList CustomerNum+;int durtime=rand()%30+1; /处理时间int intertime=rand()%5+1; /下个客户达到时间间隔/插入到队列int i=Mininum(q); printf(“%dn“,en.OccurTime);EnQueue(qi,en.OccurT

15、ime,durtime);LNode event;event.NType=0;event.next=NULL;event.OccurTime=en.OccurTime+intertime;if(event.OccurTimenext;TotalTime+=en.OccurTime-node-ArrvalTime;printf(“*顾客离开*n“);printf(“%dn“,en.OccurTime);qi.front-next=node-next;if(!QueueEmpty(qi)en.NType=i;en.OccurTime+=qi.front-next-Duration;en.next=NULL;OrderInsert(ev,en);for(int a=1;aArrvalTime=Occurtime; node-Duration=durtime; node-next=NULL; if(q.front-next=NULL) q.front-next=node; q.rear

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号