ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:138.76KB ,
资源ID:23761221      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23761221.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(银行业务模拟系统的实现.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

银行业务模拟系统的实现.docx

1、银行业务模拟系统的实现程序设计与算法综合训练设计报告3学号:E* 姓名:汪泓章 年级: 大一 专 业:计科项目名称:银行业务模拟系统的设计与实现 完成日期:2016年7月1日1需求分析(1) 问题描述:假设某银行有四个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正空闲,则可上前办理业务,反之,若四个窗口均有客户所占,他便会排在人数最少的队伍后面。现在需要编制程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。 (2)基本要求1)初始化(OpenF

2、orDay),模拟银行开门时各数据结构的状态。2)事件驱动(EventDrived), 对客户到达和离开事件做相应处理。3)下班处理(CloseForDay),模拟银行关门时的动作,统计客户平均逗留时间。4)按照题意要求独立进行设计,设计结束后按要求写出设计报告。输入的形式和输入值的范围:规定银行一天的营业时间为480分钟。输出的形式:所有顾客业务办理的总时间;办理业务的总顾客数;平均每人办理时间程序所能达到的功能:通过队列的知识完成离散时间模拟,即已知窗口数和一天的营业时间可以求得平均每人办理的时间。2概要设计总体设计思想:为了计算这个平均的逗留时间,自然需要知道每个客户到达银行和离开银行这

3、两个时刻,后者减去前者即为每个客户在银行的逗留时间。所有客户逗留时间的总和被一天内进入银行的客户数除便是所求的平均时间。称客户到达银行和离开银行这两个时间发生的事情为“事件”,则整个模拟程序将按事件的先后顺序进行处理。这样一种程序称做事件驱动模拟。下面是上述银行客户的离散事件驱动的模拟算法(1)数据结构和程序模块:下面是模拟程序中需要的数据结构及其操作。a模拟算法的主要处理对象是“事件”,事件的主要信息是事件的类型和事件的发生时刻。算法中处理的事件有两类:一类是客户到达事件;另一类是客户离开事件。前一类事件发生的时刻随客户的到来自然形成;后一类事件发生的时刻由客户办理业务所需时间和等待时间而定

4、。由于程序驱动是按事件发生时刻的先后顺序进行的,所以事件表应是有序表,其主要操作是插入和删除事件,用一个单链表表示。b模拟程序中需要的另一数据结构是表示客户排队的队列,由于假设银行有4个窗口,因此程序中需要4个队列,队列中有关客户的信息是客户到达的时刻和客户办理业务所需要的时间。每个队列中的队头客户即为正在窗口办理事务的客户,他办完业务离开队列的时刻就是即将发生的客户离开事件的时刻,这就是说,对每个队头客户都存在一个将要驱动的客户离开事件。因此在任何时刻即将发生的事伯只有5种可能:1)新的客户到达;2)1号窗口的客户离开;3)2号窗口的客户离开;4)3号窗口的客户离开;5)4号窗口的客户离开;

5、从以上分析可知,在模拟程序中只需要两种数据结构:有序链表和队列。程序中用到的头文件、类型定义及主要的函数原型如下:#includestdio.h#includemalloc.h#includetime.h#includestdlib.hintOccurTime;/事件发生时刻intNType;/事件类型,Qu表示到达事件,0至Qu-1表示Qu个窗口的离开事件Event,ElemType;/事件类型,有序链表LinkList的数据元素类型typedefstructLNode/定义事件表的结点类型ElemTypedatastructLNode*next;LNode,*LinkList;typede

6、fLinkListEventList;/事件链表类型,定义为有序链表typedefstruct/定义客户队列的元素类型intArrivalTime;/到达时刻intDuration;/办理事务所需时间QElemType;/定义QElemType(队列的数据元素类型)为结构体类型;typedefstructQNode/定义客户队列的结点类型QElemTypedatastructQNode*next;QNode,*Queue;typedefstructQueuehead;Queuetail;LinkQueue;LinkQueueqQu+1;/Qu个客户队列voidOpenForDay();/模拟银

7、行开门的动作,即初始化操作voidCustomerArrived()/处理客户到达事件voidCustomerDeparture()/处理客户离开事件(2)各模块之间的调用与设计a 主程序模块:void main()输出主界面:选择操作:进入银行模拟系统/退出程序;While(进入银行业务模拟窗口)OpenForDay();进入初始化操作;输出格式控制;银行业务模拟:While(有要处理的时间时)DeQueuel();If(客户到达)CustomerArrived();ElseCustomerDeparture();计算出客户的平均逗留时间并输出b 函数调用关系图3. 详细设计voidOpen

8、ForDay()/模拟银行开门的动作,即初始化操作inti;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;iQu+1;+i)/置空队列InitQueue(qi);voidCustomerArrived()/处理客户到达事件QElemTypef;intdurtime,intertime,i;+Custom

9、erNum;Random(durtime,intertime);/生成随机数/printf(%d%dn,durtime,intertime);et.OccurTime=en.OccurTime+intertime;/下一客户到达时刻et.NType=0;/队列中只有一个客户到达事件/printf(%d%dn,et.NType,et.OccurTime);if(et.OccurTimeCloseTime)/银行尚未关门,插入事件表Insert_EventList(ev,et);i=Minimum(q);/求长度最短队列的序号,等长为最小的序号f.ArrivalTime=en.OccurTime;

10、f.Duration=durtime;EnQueue(qi,f);if(QueueLength(qi)=1)et.OccurTime=en.OccurTime+durtime;et.NType=i;Insert_EventList(ev,et);/设定第i队列的一个离开事件并插入事件表voidCustomerDeparture()/处理客户离开事件,en.NTyPe!=0inti;i=en.NType;DelQueue(qi,customer);/删除第i队列的排头客户TotalTime+=en.OccurTime-customer.ArrivalTime;/累计客户逗留时间if(!Queue

11、Empty(qi)/设定第i队列的一个离开事件并插入事件表GetHead_q(qi,customer);et.OccurTime=en.OccurTime+customer.Duration;et.NType=i;Insert_EventList(ev,et);voidBank_Simulation()inti;OpenForDay();/初始化while(!ListEmpty(ev)/output_ev(ev);/for(i=1;iQU+1;i+)output_q(qi);/getchar();/为观察执行结果用Gethead(ev,en);/printf(事件%d%dn,en.NType,

12、en.OccurTime);if(en.NType=0)CustomerArrived();/处理客户到达事件elseCustomerDeparture();/处理客户离开事件/计算并输出平均逗留时间printf(顾客总数:%d,所有顾客共耗时:%d分钟,平均每人耗时:%d分钟n,CustomerNum,TotalTime,TotalTime/CustomerNum);4. 测试与分析利用随机产生的种子进行事件的模拟,即到达时间和办理业务的时间都是随机产生。如果事件尚未到达下班时间,则将其插入到空队列或者是人数(元素)最少的队列,通过检验,算出在不同的服务窗口数下的等待时间以及服务时间,基本上

13、实现了银行事件的模拟。5. 总结该实验涉及到线性表的建立、插入、删除等操作,涉及到了队列的建立、插入、删除,涉及到了离散事件的应用思想,还涉及到了排序的概念。完成这个实验对线性表、队列及C语言编程等多方面的知识将是一个很好的利用,对离散事件也将有一个初步的认识。通过本次实验,提高了自已调试程序的能力。充分体会到了在程序执行时的提示性输出的重要性。6. 附录源程序清单: #define OK 1#define TRUE 1#define FALSE 0#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status

14、;/-银行排队模拟/事件和事件表typedef struct QCuEvent int OccurTime; int NType; struct QCuEvent *next;QCuEvent, *EventList;/窗口前队列元素typedef struct QCuElem int ArrivalTime; int Duration; struct QCuElem *next;QCuElem,*QEptr;/窗口指针typedef struct QEptr front; QEptr rear;QCustomerp,*QCupp;/主要操作函数Status OpenForDay(EventL

15、ist &ev, QCuEvent en, QCupp &q);/开门Status CustomerArrived(EventList &ev, QCupp &q, QCuEvent en);/顾客到达Status CustomerDeparture(EventList &ev, QCupp &q, QCuEvent en);/顾客离开void CloseForDay();/基本操作函数Status OrderInser(EventList &ev, QCuEvent en);/按时间顺序插入事件到事件表int QLength(QCustomerp qn);/求窗口队列长度int MinCuQ

16、ueue(QCupp q);/求队最短的窗口Status DelFirstEvent(EventList &ev);/删除事件表中的第一个事件Status InitCuQueue(QCustomerp &qn);/初始化窗口队列Status EnCuQueue(QCustomerp &qn,QEptr Q);/进入队列Status DeCuQueue(QCustomerp &qn,QCuElem &Q);/删除队列中的元素Status GetQHead(QCustomerp qn,QCuElem &Q);/获得队列中的第一个元素Status DestoryQueue(QCustomerp qn

17、);/销毁队列void Ptint_QStatus(QCustomerp QCu);/打印队列长度void Bank_SimulationFunc();void test(char str);#include #include #include int i=0,e=0,counter=0;int TotalTime=0,CustomerNum=0; /累计客户逗留时间,客户数int CloseTime; /关门时间int windowsnum = 0;/主函数void main() EventList ev; / 事件表 QCuEvent en; QCupp QCu = NULL; OpenF

18、orDay(ev, en, QCu); while (ev-next) en.NType = ev-next-NType; en.OccurTime = ev-next-OccurTime; DelFirstEvent(ev); if (en.NType = 0) CustomerArrived(ev, QCu, en); else CustomerDeparture(ev, QCu, en); Ptint_QStatus(QCu); CloseForDay();/主要功能子函数Status OpenForDay(EventList &ev, QCuEvent en, QCupp &q) in

19、t temp = 0; printf(请输入随机数种子(或输入0使用随机种子):); scanf(%d,&temp); if (temp=0) srand(unsigned)time(NULL); else srand(temp); printf(请输入营业时间(单位:分钟):); scanf(%d,&temp); CloseTime = temp; TotalTime = 0; CustomerNum = 0; en.OccurTime = 0; en.NType = 0; en.next = NULL; ev = (EventList) malloc(sizeof(QCuEvent); e

20、v-next = NULL; OrderInser(ev, en); printf(请输入办理业务的窗口数(至少1个):); scanf(%d,&windowsnum); q = (QCustomerp *) malloc(windowsnum+1)*sizeof(QCustomerp); for (int i=1;i=windowsnum;i+) InitCuQueue(qi); return OK;Status CustomerArrived(EventList &ev, QCupp &q, QCuEvent en) test(顾客到达处理); CustomerNum +; / 产生随机数

21、 /srand(54); int durtime = rand()%30+1; int intertime = rand()%5+1; / 插入到达事件表 QCuEvent enTemp; int t = en.OccurTime + intertime; enTemp.OccurTime = t; enTemp.NType = 0; enTemp.next = NULL; if (t ArrivalTime = en.OccurTime; Q-Duration = durtime; Q-next = NULL; int i = MinCuQueue(q); EnCuQueue(qi,Q);

22、/ 插入离开事件 enTemp.OccurTime = en.OccurTime + durtime; enTemp.NType = i; enTemp.next = NULL; if(QLength(qi) = 1) OrderInser(ev, enTemp); return OK;Status CustomerDeparture(EventList &ev, QCupp &q, QCuEvent en) test(顾客离开处理); int i = en.NType; printf(离开时间%dn,en.OccurTime); if(en.OccurTimeCloseTime) Desto

23、ryQueue(qi); else QCuElem customer; DeCuQueue(qi,customer); / 客户逗留时间 TotalTime += en.OccurTime - customer.ArrivalTime; printf(总时间为%dn,TotalTime); if (qi.front-next) GetQHead(qi,customer); QCuEvent enTemp; enTemp.OccurTime = en.OccurTime + customer.Duration; enTemp.NType = i; OrderInser(ev, enTemp);

24、return OK;void CloseForDay() printf(*n); printf(*n); printf(* 所有顾客业务办理总时间:%d分钟n, TotalTime); printf(* 业务办理顾客数:%dn, CustomerNum); printf(* 平均每人办理时间:%fn,(float)TotalTime/(float)CustomerNum); printf(*n); printf(*n); /功能实现子函数Status OrderInser(EventList &ev, QCuEvent en) EventList entemp,qtemp; entemp =

25、(EventList) malloc(sizeof(QCuEvent); entemp-OccurTime = en.OccurTime; entemp-NType = en.NType; entemp-next = NULL; if (!ev-next) ev-next = entemp; return OK; qtemp = ev; while(qtemp-next&qtemp-next-OccurTime next; entemp-next = qtemp-next; qtemp-next = entemp; return OK;int QLength(QCustomerp qn) QE

26、ptr qtemp; int i=0; qtemp = qn.front-next; while(qtemp) qtemp = qtemp-next; i+; return i;int MinCuQueue(QCupp q) int i,min; for (i=1,min=1;i=windowsnum;i+) min = QLength(qmin)next; ev-next = p-next; free(p); return OK;Status InitCuQueue(QCustomerp &qn) qn.front = (QEptr) malloc(sizeof(QCuElem); qn.front-next = NULL; qn.rear = qn.front; return OK;Status EnCuQueue(QCustomerp &qn,QEptr Q) qn.rear-next = Q; qn.rear = Q; retu

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1