文档介绍:该【银行业务模拟系统的设计与实现实验报告 】是由【知识徜徉土豆】上传分享,文档一共【10】页,该文档可以免费在线阅读,需要了解更多关于【银行业务模拟系统的设计与实现实验报告 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。数据结构实验报告——银行业务模拟系统的设计与实现学院:软件学院专业:计算机科学与技术班级:12级java班学号:姓名:吴静指导老师:张磊数据结构实验报告学号姓名吴静年级2023班级计算机科学技术机号:、、:00--9:30(Java班)指导教师张磊、张俊娜一、实验题目:银行业务模拟系统的设计与实现(该实验为综合性实验,共用6个学时)二、实验规定::1)通过实验掌握对离散事件模拟的结识;2)进一步理解队列的实现与应用;3)对链表的操作有更深层次的理解;该实验涉及到线性表的建立、插入、删除等操作,涉及到了队列的建立、插入、删除,涉及到了离散事件的应用思想,还涉及到了排序的概念。完毕这个实验对线性表、队列及C语言编程等多方面的知识将是一个很好的运用,对离散事件也将有一个初步的结识。:假设某银行有四个窗口对外接待客户,从上午银行开门起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,假如某个窗口的业务员正空闲,则可上前办理业务,反之,若四个窗口均有客户所占,他便会排在人数最少的队伍后面。现在需要编制程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。:1)初始化(OpenForDay),模拟银行开门时各数据结构的状态。事件驱动(EventDrived),对客户到达和离开事件做相应解决。下班解决(CloseForDay),模拟银行关门时的动作,记录客户平均逗留时间。[备注]:假设银行开门的时刻(间)设为0,银行天天营业的时间在程序运营时输入(例如480分钟)。每个客户办理业务的时间不超过30分钟,两个相邻客户到达银行的时间间隔不超过5分钟规定程序执行时,只要给出银行天天的营业时间即可输出客户平均逗留的时间。三、总的设计思想、环境语言、工具等总的设计思想:为了计算这个平均的逗留时间,自然需要知道每个客户到达银行和离开银行这两个时刻,后者减去前者即为每个客户在银行的逗留时间。所有客户逗留时间的总和被一天内进入银行的客户数除便是所求的平均时间。称客户到达银行和离开银行这两个时间发生的事情为“事件”,则整个模拟程序将按事件的先后顺序进行解决。这样一种程序称做事件驱动模拟。下面是上述银行客户的离散事件驱动的模拟算法。voidBank_Simulation(intCloseTime){//OpenForDay();//初始化,模拟银行开门时各数据结构的状态。while(有要解决的事件时)//有事件可解决{EventDrived;//事件驱动,从事件表中取出事件en;//根据en的类型(客户到达事件或客户离开事件)做相应的解决if(en表达客户到达)CustomerArrived();//解决客户到达事件elseCustomerDeparture();//解决客户离开事件}//whileCloseForDay();//计算客户的平均逗留时间}//Bank_Simulation环境语言:Windows下的MicrosoftVC++四、数据结构与模块说明下面是模拟程序中需要的数据结构及其操作。“事件”,事件的重要信息是事件的类型和事件的发生时刻。算法中解决的事件有两类:一类是客户到达事件;另一类是客户离开事件。前一类事件发生的时刻随客户的到来自然形成;后一类事件发生的时刻由客户办理业务所需时间和等待时间而定。由于程序驱动是按事件发生时刻的先后顺序进行的,所以事件表应是有序表,其重要操作是插入和删除事件,用一个单链表表达!!,由于假设银行有4个窗口,因此程序中需要4个队列,队列中有关客户的信息是客户到达的时刻和客户办理业务所需要的时间。每个队列中的队头客户即为正在窗口办理事务的客户,他办完业务离开队列的时刻就是即将发生的客户离开事件的时刻,这就是说,对每个队头客户都存在一个将要驱动的客户离开事件。因此在任何时刻即将发生的事伯只有5种也许:1)新的客户到达;2)1号窗口的客户离开;3)2号窗口的客户离开;4)3号窗口的客户离开;5)4号窗口的客户离开;注:为了使编写的程序具有通用性,在编程序时将银行的营业时间、开的窗口数、客户办业业务的最长时间及两个客户到达的时间间隔都设立成程序运营时动态输入,这样可以对程序以及银开设的窗口的合理性进行分析,实现真正的模拟。从以上分析可知,在模拟程序中只需要两种数据结构:有序链表和队列。程序中用到的头文献、类型定义及重要的函数原型如下:#include""#include""#include""#include""intCks=4;//银行办理业务的窗口数,默认值为:4;最大值不超过20;intQu;//客户队列数Qu=CksintKhjg=5;//两相邻到达客户的时间间隔最大值,默认值为:5intBlsj=30;//每个客户办理业务的时间最大值,默认值为:30typedefstruct//定义事件的元素类型ElemType为结构体类型{urTime;//事件发生时刻intNType;//事件类型,Qu表达成达事件,0至Qu-1表达Qu个窗口的离开事件}Event,ElemType;//事件类型,有序链表LinkList的数据元素类型typedefstructLNode//定义事件表的结点类型{ ElemTypedata; structLNode*next;}LNode,*LinkList;typedefLinkListEventList;//事件链表类型,定义为有序链表typedefstruct//定义客户队列的元素类型{intArrivalTime;//到达时刻intDuration;//办理事务所需时间}QElemType;//定义QElemType(队列的数据元素类型)为结构体类型;typedefstructQNode//定义客户队列的结点类型{ QElemTypedata; structQNode*next;}QNode,*Queue;typedefstruct{Queuehead;Queuetail;}LinkQueue;LinkQueueq[Qu+1];//Qu个客户队列voidOpenForDay();//模拟银行开门的动作,即初始化操作voidCustomerArrived()//解决客户到达事件voidCustomerDeparture()//解决客户离开事件五、重要算法的设计与实现voidOpenForDay()//模拟银行开门的动作,即初始化操作{inti;InitList(ev);//=0;//=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]);}voidCustomerArrived(){//解决客户到达事件QElemTypef;intdurtime,intertime,i;++CustomerNum;Random(durtime,intertime);//生成随机数//printf("%d%d\n",durtime,intertime);=+intertime;//=0;//队列中只有一个客户到达事件//printf("%d%d\n",,);if(<CloseTime)//银行尚未关门,插入事件表Insert_EventList(ev,et);i=Minimum(q);//求长度最短队列的序号,=;=durtime;EnQueue(q[i],f);if(QueueLength(q[i])==1){=+durtime;=i;Insert_EventList(ev,et);//设定第i队列的一个离开事件并插入事件表}}voidCustomerDeparture(){//解决客户离开事件,!=0inti;i=;DelQueue(q[i],customer);//删除第i队列的排头客户TotalTime+=-;//累计客户逗留时间if(!QueueEmpty(q[i])){//设定第i队列的一个离开事件并插入事件表GetHead_q(q[i],customer);=+;=i;Insert_EventList(ev,et);}}voidBank_Simulation(){inti;OpenForDay();//初始化while(!ListEmpty(ev)){//output_ev(ev);//for(i=1;i<QU+1;i++)output_q(q[i]); //getchar();//为观测执行结果用 Gethead(ev,en);//printf("事件%d%d\n",,);if(==0)CustomerArrived();//解决客户到达事件elseCustomerDeparture();//解决客户离开事件}//计算并输出平均逗留时间printf("顾客总数:%d,所有顾客共耗时:%d分钟,平均每人耗时:%d分钟\n",CustomerNum,TotalTime,TotalTime/CustomerNum);}六、源程序见电子稿(文献名为:);七、运营结果八、自我评析与总结该实验做得比较成功,例如在编写调试程序时,并不是仅仅把目的局限在编译通过,执行有结果上。除了为了完毕任务的模块外,另有测试事件表的函数output_ev和各窗口队列状态的函数output_q;在适当的地方调用它们,运营时可以看到事件表和窗口队列的状态,用来判断编写程序的对的性;当运营通过并符合题中规定后将这一部分代码变成注释即可。通过本次实验,提高了自已调试程序的能力。充足体会到了在程序执行时的提醒性输出的重要性。编写大一点的程序,应用先写出算法,再写程序,调试时一段一段调试;对于没有实现在操作用空操作代替,这样容易找犯错误所在。最忌讳将所有代码写完后再调试,这样错误太难找。 九、《数据结构学习指导与训练》《数据结构》(C语言版)《数据结构习题集》(C语言版)清华大学出版社十、教师评语: