欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    银行业务模拟系统的实现(共16页).docx

    • 资源ID:5784818       资源大小:157.11KB        全文页数:16页
    • 资源格式: DOCX        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    银行业务模拟系统的实现(共16页).docx

    精选优质文档-倾情为你奉上程序设计与算法综合训练设计报告3学号:E 姓名:汪泓章 年级: 大一 专 业:计科项目名称:银行业务模拟系统的设计与实现 完成日期:2016年7月1日1需求分析 (1) 问题描述:假设某银行有四个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正空闲,则可上前办理业务,反之,若四个窗口均有客户所占,他便会排在人数最少的队伍后面。现在需要编制程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。  (2)基本要求1)初始化(OpenForDay),模拟银行开门时各数据结构的状态。2)事件驱动(EventDrived), 对客户到达和离开事件做相应处理。3)下班处理(CloseForDay),模拟银行关门时的动作,统计客户平均逗留时间。4)按照题意要求独立进行设计,设计结束后按要求写出设计报告。输入的形式和输入值的范围:规定银行一天的营业时间为480分钟。输出的形式:所有顾客业务办理的总时间;办理业务的总顾客数;平均每人办理时间程序所能达到的功能:通过队列的知识完成离散时间模拟,即已知窗口数和一天的营业时间可以求得平均每人办理的时间。2概要设计 总体设计思想:为了计算这个平均的逗留时间,自然需要知道每个客户到达银行和离开银行这两个时刻,后者减去前者即为每个客户在银行的逗留时间。所有客户逗留时间的总和被一天内进入银行的客户数除便是所求的平均时间。称客户到达银行和离开银行这两个时间发生的事情为“事件”,则整个模拟程序将按事件的先后顺序进行处理。这样一种程序称做事件驱动模拟。下面是上述银行客户的离散事件驱动的模拟算法(1) 数据结构和程序模块:                                                    下面是模拟程序中需要的数据结构及其操作。 a模拟算法的主要处理对象是“事件”,事件的主要信息是事件的类型和事件的发生时刻。算法中处理的事件有两类:一类是客户到达事件;另一类是客户离开事件。前一类事件发生的时刻随客户的到来自然形成;后一类事件发生的时刻由客户办理业务所需时间和等待时间而定。由于程序驱动是按事件发生时刻的先后顺序进行的,所以事件表应是有序表,其主要操作是插入和删除事件,用一个单链表表示。 b模拟程序中需要的另一数据结构是表示客户排队的队列,由于假设银行有4个窗口,因此程序中需要4个队列,队列中有关客户的信息是客户到达的时刻和客户办理业务所需要的时间。每个队列中的队头客户即为正在窗口办理事务的客户,他办完业务离开队列的时刻就是即将发生的客户离开事件的时刻,这就是说,对每个队头客户都存在一个将要驱动的客户离开事件。因此在任何时刻即将发生的事伯只有5种可能:1)新的客户到达;2)1号窗口的客户离开;3)2号窗口的客户离开;4)3号窗口的客户离开;5)4号窗口的客户离开; 从以上分析可知,在模拟程序中只需要两种数据结构:有序链表和队列。 程序中用到的头文件、类型定义及主要的函数原型如下: #include"stdio.h" #include"malloc.h" #include"time.h" #include"stdlib.h"    int OccurTime; / 事件发生时刻 int NType; / 事件类型,Qu表示到达事件,0至Qu-1表示Qu个窗口的离开事件  Event,ElemType; / 事件类型,有序链表LinkList的数据元素类型 typedef struct LNode  /定义事件表的结点类型    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;   QNode, *Queue;  typedef  struct  Queue head; Queue tail; LinkQueue; LinkQueue  qQu+1; / Qu个客户队列 void OpenForDay(); /模拟银行开门的动作,即初始化操作  void CustomerArrived() / 处理客户到达事件 void CustomerDeparture() / 处理客户离开事件          (2)各模块之间的调用与设计a 主程序模块:void main()输出主界面:选择操作:进入银行模拟系统/退出程序;While(进入银行业务模拟窗口)OpenForDay();进入初始化操作;输出格式控制;银行业务模拟:While(有要处理的时间时)DeQueuel();If(客户到达)CustomerArrived();ElseCustomerDeparture();计算出客户的平均逗留时间并输出   b 函数调用关系图                                         3. 详细设计void OpenForDay() /模拟银行开门的动作,即初始化操作       int 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(qi);   void CustomerArrived()   / 处理客户到达事件    QElemType f;    int durtime,intertime,i;    +CustomerNum;   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.OccurTime<CloseTime) / 银行尚未关门,插入事件表     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;      Insert_EventList(ev,et); / 设定第i队列的一个离开事件并插入事件表       void CustomerDeparture()   / 处理客户离开事件,en.NTyPe!=0    int i;    i=en.NType;                                                   DelQueue(qi,customer); / 删除第i队列的排头客户   TotalTime+=en.OccurTime-customer.ArrivalTime; / 累计客户逗留时间    if(!QueueEmpty(qi)     / 设定第i队列的一个离开事件并插入事件表      GetHead_q(qi,customer);      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;i<QU+1;i+) output_q(qi);   /getchar();/为观察执行结果用  Gethead(ev,en); /printf("事件%d %dn ",en.NType,en.OccurTime);       if(en.NType=0)        CustomerArrived(); / 处理客户到达事件      else CustomerDeparture(); / 处理客户离开事件     / 计算并输出平均逗留时间    printf("顾客总数:%d, 所有顾客共耗时:%d分钟, 平均每人耗时: %d分钟n",CustomerNum,TotalTime,TotalTime/CustomerNum);  4. 测试与分析利用随机产生的种子进行事件的模拟,即到达时间和办理业务的时间都是随机产生。如果事件尚未到达下班时间,则将其插入到空队列或者是人数(元素)最少的队列,通过检验,算出在不同的服务窗口数下的等待时间以及服务时间,基本上实现了银行事件的模拟。5. 总结该实验涉及到线性表的建立、插入、删除等操作,涉及到了队列的建立、插入、删除,涉及到了离散事件的应用思想,还涉及到了排序的概念。完成这个实验对线性表、队列及C语言编程等多方面的知识将是一个很好的利用,对离散事件也将有一个初步的认识。通过本次实验,提高了自已调试程序的能力。充分体会到了在程序执行时的提示性输出的重要性。6. 附录源程序清单: #define OK 1#define TRUE 1#define FALSE 0#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;/-银行排队模拟/事件和事件表typedef struct QCuEventint OccurTime;int NType;struct QCuEvent *next;QCuEvent, *EventList;/窗口前队列元素typedef struct QCuElemint ArrivalTime;int Duration;struct QCuElem *next;QCuElem,*QEptr;/窗口指针typedef struct QEptr front;QEptr rear;QCustomerp,*QCupp;/主要操作函数Status OpenForDay(EventList &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 MinCuQueue(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);/销毁队列void Ptint_QStatus(QCustomerp QCu);/打印队列长度void Bank_SimulationFunc();void test(char str);#include <stdio.h>#include <stdlib.h>#include <time.h>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;OpenForDay(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);elseCustomerDeparture(ev, QCu, en);Ptint_QStatus(QCu);CloseForDay();/主要功能子函数Status OpenForDay(EventList &ev, QCuEvent en, QCupp &q)int 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);ev->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 +;/ 产生随机数/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 < CloseTime)OrderInser(ev, enTemp);printf("时间%dn",t);/ 插入最短队QEptr Q;Q = (QEptr) malloc(sizeof(QCuElem);Q->ArrivalTime = en.OccurTime;Q->Duration = durtime;Q->next = NULL;int i = MinCuQueue(q);EnCuQueue(qi,Q); / 插入离开事件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.OccurTime>CloseTime)DestoryQueue(qi);elseQCuElem 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);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 = (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 < en.OccurTime)qtemp = qtemp->next;entemp->next = qtemp->next;qtemp->next = entemp;return OK;int QLength(QCustomerp qn) QEptr 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)<=QLength(qi) ? min:i;return min;Status DelFirstEvent(EventList &ev)EventList p;p = ev->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;return OK;Status DeCuQueue(QCustomerp &qn,QCuElem &Q)QEptr qtemp;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 OK;Status GetQHead(QCustomerp qn,QCuElem &Q)Q.ArrivalTime = qn.front->next->ArrivalTime;Q.Duration = qn.front->next->Duration;return OK;Status DestoryQueue(QCustomerp qn)QEptr p;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;void Ptint_QStatus(QCustomerp QCu)int l;for(int i=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);专心-专注-专业

    注意事项

    本文(银行业务模拟系统的实现(共16页).docx)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开