《2022年银行业务模拟系统的实现 .pdf》由会员分享,可在线阅读,更多相关《2022年银行业务模拟系统的实现 .pdf(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、程序设计与算法综合训练设计报告3 学号:E11514064 姓名:汪泓章年级:大一专 业:计科项目名称:银行业务模拟系统的设计与实现完成日期:2016 年 7月 1 日1需求分析(1)问题描述:假设某银行有四个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正空闲,则可上前办理业务,反之,若四个窗口均有客户所占,他便会排在人数最少的队伍后面。现在需要编制程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。(2)基本要求1)初始化(OpenForDay
2、),模拟银行开门时各数据结构的状态。2)事件驱动(EventDrived),对客户到达和离开事件做相应处理。3)下班处理(CloseForDay),模拟银行关门时的动作,统计客户平均逗留时间。4)按照题意要求独立进行设计,设计结束后按要求写出设计报告。输入的形式和输入值的范围:规定银行一天的营业时间为480 分钟。输出的形式:所有顾客业务办理的总时间;办理业务的总顾客数;平均每人办理时间程序所能达到的功能:通过队列的知识完成离散时间模拟,即已知窗口数和一天的营业时间可以求得平均每人办理的时间。2概要设计总体设计思想:为了计算这个平均的逗留时间,自然需要知道每个客户到达银行和离开银行这两个时刻,
3、后者减去前者即为每个客户在银行的逗留时间。所有客户逗留时间的总和被一天内进入银行的客户数除便是所求的平均时间。称客户到达银行和离开银行这两个时间发生的事情为“事件”,则整个模拟程序将按事件的先后顺序进行处理。这样一种程序称做事件驱动模拟。下面是上述银行客户的离散事件驱动的模拟算法(1)数据结构和程序模块:下面是模拟程序中需要的数据结构及其操作。a模拟算法的主要处理对象是“事件”,事件的主要信息是事件的类型和事件的发生时刻。算法中处理的事件有两类:一类是客户到达事件;另一类是客户离开事件。前一类事件发生的时刻随客户的到来自然形成;后一类事件发生的时刻由客户办理业务所需时间和等待名师资料总结-精品
4、资料欢迎下载-名师精心整理-第 1 页,共 15 页 -时间而定。由于程序驱动是按事件发生时刻的先后顺序进行的,所以事件表应是有序表,其主要操作是插入和删除事件,用一个单链表表示。b 模拟程序中需要的另一数据结构是表示客户排队的队列,由于假设银行有4 个窗口,因此程序中需要4 个队列,队列中有关客户的信息是客户到达的时刻和客户办理业务所需要的时间。每个队列中的队头客户即为正在窗口办理事务的客户,他办完业务离开队列的时刻就是即将发生的客户离开事件的时刻,这就是说,对每个队头客户都存在一个将要驱动的客户离开事件。因此在任何时刻即将发生的事伯只有5 种可能:1)新的客户到达;2)1 号窗口的客户离开
5、;3)2 号窗口的客户离开;4)3 号窗口的客户离开;5)4 号窗口的客户离开;从以上分析可知,在模拟程序中只需要两种数据结构:有序链表和队列。程序中用到的头文件、类型定义及主要的函数原型如下:#includestdio.h#includemalloc.h#includetime.h#includestdlib.h int OccurTime;/事件发生时刻int NType;/事 件 类 型,Qu表 示 到 达 事 件,0至Qu-1表 示Qu 个 窗 口 的 离 开 事件 Event,ElemType;/事件类型,有序链表LinkList的数据元素类型 typedef struct LNod
6、e /定义事件表的结点类型 ElemType data struct LNode*next;LNode,*LinkList;typedef LinkList EventList;/事件链表类型,定义为有序链表 typedef struct /定义客户队列的元素类型 int ArrivalTime;/到达时刻int Duration;/办理事务所需时间 QElemType;/定 义QElemType(队 列 的 数 据 元 素 类 型)为 结 构 体 类型;typedef struct QNode /定义客户队列的结点类型 QElemType data struct QNode*next;QNo
7、de,*Queue;typedef struct Queue head;Queue tail;LinkQueue;LinkQueue qQu+1;/Qu个客户队列名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 15 页 -void OpenForDay();/模拟银行开门的动作,即初始化操作 void CustomerArrived()/处理客户到达事件 void CustomerDeparture()/处理客户离开事件(2)各模块之间的调用与设计a 主程序模块:void main()输出主界面:选择操作:进入银行模拟系统/退出程序;While(进入银行业务模拟窗口)OpenFo
8、rDay();进入初始化操作;输出格式控制;银行业务模拟:While(有要处理的时间时)DeQueuel();If(客户到达)CustomerArrived();Else CustomerDeparture();计算出客户的平均逗留时间并输出 b 函数调用关系图名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 15 页 -3.详细设计void OpenForDay()/模拟银行开门的动作,即初始化操作 int i;InitList(ev);/初始化事件链表为空 en.OccurTime=0;/设定第一个客户到达事件 en.NType=0;/客户到达事件 Insert_EventLi
9、st(ev,en);/插入事件 q=(LinkQueue*)malloc(Qu+1)*sizeof(LinkQueue);/为队列申请Qu+1 个队头指针,第 0个不用 for(i=1;iQu+1;+i)/置空队列 InitQueue(qi);void CustomerArrived()/处理客户到达事件 QElemType f;int durtime,intertime,i;+CustomerNum;Random(durtime,intertime);/生成随机数 /printf(%d%dn,durtime,intertime);et.OccurTime=en.OccurTime+inter
10、time;/下一客户到达时刻 et.NType=0;/队列中只有一个客户到达事件 /printf(%d%dn,et.NType,et.OccurTime);if(et.OccurTimeCloseTime)/银行尚未关门,插入事件表 Insert_EventList(ev,et);i=Minimum(q);/求长度最短队列的序号,等长为最小的序号 f.ArrivalTime=en.OccurTime;f.Duration=durtime;EnQueue(qi,f);if(QueueLength(qi)=1)et.OccurTime=en.OccurTime+durtime;et.NType=i
11、;Insert_EventList(ev,et);/设定第 i 队列的一个离开事件并插入事件表 void CustomerDeparture()/处理客户离开事件,名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 15 页 -en.NTyPe!=0 int i;i=en.NType;DelQueue(qi,customer);/删除第 i 队列的排头客户 TotalTime+=en.OccurTime-customer.ArrivalTime;/累计客户逗留时间if(!QueueEmpty(qi)/设定第 i 队列的一个离开事件并插入事件表 GetHead_q(qi,custome
12、r);et.OccurTime=en.OccurTime+customer.Duration;et.NType=i;Insert_EventList(ev,et);void Bank_Simulation()int i;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,en.OccurTime);if(en.NType=0)CustomerArrived();
13、/处理客户到达事件 else CustomerDeparture();/处理客户离开事件 /计算并输出平均逗留时间 printf(顾 客 总 数:%d,所 有 顾 客 共 耗 时:%d分 钟,平 均 每 人 耗 时:%d分 钟n,CustomerNum,TotalTime,TotalTime/CustomerNum);4.测试与分析利用随机产生的种子进行事件的模拟,即到达时间和办理业务的时间都是随机产生。如果事件尚未到达下班时间,则将其插入到空队列或者是人数(元素)最少的队列,通过检验,算出在不同的服务窗口数下的等待时间以及服务时间,基本上实现了银行事件的模拟。名师资料总结-精品资料欢迎下载-
14、名师精心整理-第 5 页,共 15 页 -5.总结该实验涉及到线性表的建立、插入、删除等操作,涉及到了队列的建立、插入、删除,涉及到了离散事件的应用思想,还涉及到了排序的概念。完成这个实验对线性表、队列及C语言编程等多方面的知识将是一个很好的利用,对离散事件也将有一个初步的认识。通过本次实验,提高了自已调试程序的能力。充分体会到了在程序执行时的提示性输出的重要性。6.附录名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 15 页 -源程序清单:#define OK 1#define TRUE 1#define FALSE 0#define ERROR 0#define INFEAS
15、IBLE-1#define OVERFLOW-2 typedefint Status;/-银行排队模拟/事件和事件表typedefstructQCuEvent intOccurTime;intNType;structQCuEvent*next;QCuEvent,*EventList;/窗口前队列元素typedefstructQCuElem intArrivalTime;int Duration;structQCuElem*next;QCuElem,*QEptr;/窗口指针typedefstruct QEptr front;QEptr rear;QCustomerp,*QCupp;/主要操作函数
16、Status OpenForDay(EventList&ev,QCuEvent en,QCupp&q);/开门Status CustomerArrived(EventList&ev,QCupp&q,QCuEvent en);/顾客到达Status CustomerDeparture(EventList&ev,QCupp&q,QCuEvent en);/顾客离开voidCloseForDay();名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 15 页 -/基本操作函数Status OrderInser(EventList&ev,QCuEvent en);/按时间顺序插入事件到事件
17、表intQLength(QCustomerpqn);/求窗口队列长度intMinCuQueue(QCupp q);/求队最短的窗口Status DelFirstEvent(EventList&ev);/删除事件表中的第一个事件Status InitCuQueue(QCustomerp&qn);/初始化窗口队列Status EnCuQueue(QCustomerp&qn,QEptr Q);/进入队列Status DeCuQueue(QCustomerp&qn,QCuElem&Q);/删除队列中的元素Status GetQHead(QCustomerpqn,QCuElem&Q);/获得队列中的第一
18、个元素Status DestoryQueue(QCustomerpqn);/销毁队列void Ptint_QStatus(QCustomerpQCu);/打印队列长度voidBank_SimulationFunc();void test(char str);#include#include#include inti=0,e=0,counter=0;intTotalTime=0,CustomerNum=0;/累计客户逗留时间,客户数intCloseTime;/关门时间intwindowsnum=0;/主函数void main()EventListev;/事件表QCuEvent en;QCuppQ
19、Cu=NULL;OpenForDay(ev,en,QCu);while(ev-next)en.NType=ev-next-NType;en.OccurTime=ev-next-OccurTime;名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 15 页 -DelFirstEvent(ev);if(en.NType=0)CustomerArrived(ev,QCu,en);else CustomerDeparture(ev,QCu,en);Ptint_QStatus(QCu);CloseForDay();/主要功能子函数Status OpenForDay(EventList&ev,
20、QCuEvent en,QCupp&q)int temp=0;printf(请输入随机数种子(或输入 0 使用随机种子):);scanf(%d,&temp);if(temp=0)srand(unsigned)time(NULL);elsesrand(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);ev-next=NUL
21、L;OrderInser(ev,en);printf(请输入办理业务的窗口数(至少 1 个):);scanf(%d,&windowsnum);名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 15 页 -q=(QCustomerp*)malloc(windowsnum+1)*sizeof(QCustomerp);for(inti=1;i=windowsnum;i+)InitCuQueue(qi);return OK;Status CustomerArrived(EventList&ev,QCupp&q,QCuEvent en)test(顾客到达处理);CustomerNum+;/产
22、生随机数/srand(54);intdurtime=rand()%30+1;intintertime=rand()%5+1;/插入到达事件表QCuEventenTemp;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;inti=MinCuQueue(q);EnCuQueue(qi,Q);/插入离开事件enTemp.OccurTime=en.OccurTime+du
23、rtime;名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 15 页 -enTemp.NType=i;enTemp.next=NULL;if(QLength(qi)=1)OrderInser(ev,enTemp);return OK;Status CustomerDeparture(EventList&ev,QCupp&q,QCuEvent en)test(顾客离开处理);inti=en.NType;printf(离开时间%dn,en.OccurTime);if(en.OccurTimeCloseTime)DestoryQueue(qi);else QCuElem custom
24、er;DeCuQueue(qi,customer);/客户逗留时间TotalTime+=en.OccurTime-customer.ArrivalTime;printf(总时间为%dn,TotalTime);if(qi.front-next)GetQHead(qi,customer);QCuEventenTemp;enTemp.OccurTime=en.OccurTime+customer.Duration;enTemp.NType=i;OrderInser(ev,enTemp);return OK;voidCloseForDay()名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,
25、共 15 页 -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)EventListentemp,qtemp;entemp=(EventList)malloc(sizeof(QCuEvent);ent
26、emp-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-OccurTimenext;entemp-next=qtemp-next;qtemp-next=entemp;return OK;intQLength(QCustomerpqn)名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 15 页 -QEptrqtemp;inti=0;qtemp=qn.front-
27、next;while(qtemp)qtemp=qtemp-next;i+;returni;intMinCuQueue(QCupp q)inti,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);名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 15 页 -qn.front-next=NULL;qn.rear=qn
28、.front;return OK;Status EnCuQueue(QCustomerp&qn,QEptr Q)qn.rear-next=Q;qn.rear=Q;return OK;Status DeCuQueue(QCustomerp&qn,QCuElem&Q)QEptrqtemp;qtemp=qn.front-next;Q.ArrivalTime=qtemp-ArrivalTime;Q.Duration=qtemp-Duration;qn.front-next=qtemp-next;if(qn.rear=qtemp)qn.rear=qn.front;free(qtemp);return O
29、K;Status GetQHead(QCustomerpqn,QCuElem&Q)Q.ArrivalTime=qn.front-next-ArrivalTime;Q.Duration=qn.front-next-Duration;return OK;Status DestoryQueue(QCustomerpqn)QEptr p;名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 15 页 -while(qn.front-next)p=qn.front-next;qn.front-next=p-next;free(p);qn.front-next=NULL;qn.rear=qn.front;return OK;voidPtint_QStatus(QCustomerpQCu)int l;for(inti=1;i=windowsnum;i+)l=QLength(QCui);printf(队列%d:长%d:,i,l);for(int n=1;n=l;n+)printf();printf(n);void test(char str)printf(-%s-n,str);名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 15 页 -