1、银行业务模拟与离散事件模拟数据结构课程设计报告银行业务模拟与离散事件模拟一、 实验目的1. 通过此次课程设计中银行业务模拟的题目,掌握队列(或者链表) 等数据结构的基本操作方面的知识,并能灵活的解决一些基本的问题,加深对其性质及各项操作的理解;2. 将所学数据结构方面的知识与一门具体的语言相结合(C/C+)来进行实现,感受数据结构的强大作用,加深理解。二、 问题描述 1. 问题描述假设某银行有4个窗口对外接待客户,从早晨银行开门(开门9:00am,关门5:00pm)起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进入银行的客户(
2、建议:客户进入时间使用随机函数产生),若某个窗口的业务员正空闲,则上前办理业务;反之,若4个窗口均有窗户所占,他便会排在人数最少的队伍后面。2. 任务要求编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。建议有如下设置:(1) 客户到达时间随机产生,一天客户的人数设定为100人。(2) 银行业务员处理时间随机产生,平均处理时间10分钟。(3) 将一天的数据(包括业务员和客户)以文件方式输出。三、算法的思想与算法实现步骤1. 基本思想 通过队列数据类型进行基本操作,主要有三个模块:分别是主函数模块、主要操作函数及基本操作函数。其中,主函数负责其他子函数的调用实现以及基本界
3、面的操作,主要函数包括开门函数的实现:OpenForDay,顾客到达函数:CustomerArrived,顾客离开的函数:CustomerDepartion等;而基本操作函数就是对其中牵扯到的操作进行具体的实现,如按时间先后插入队列OrderInsert、寻求最短的队列MinCuQueue、删除队列元素以及销毁等。 2. 实现步骤首先,分析题目要求划分实现模块、画出大致的流程图,定义基本数据类型,诸如结构体、队列等;其次,考虑基本大致的操作,比如要拟定开门的时间、顾客到来为其提供服务以及离开时的操作等;再次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编
4、写每个小函数实现功能;最后,编写主函数对每个实现进行按需调用,实现操作。3. 流程图 是 否 否 图-1 事件流程图图-2 主函数流程图四、 程序核心代码#define OK 1#define TRUE 1#define FALSE 0#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;/-银行排队模拟/事件和事件表typedef struct QCuEvent int OccurTime; int NType; struct QCuEvent *next;QCuEvent, *EventList;
5、/窗口前队列元素typedef struct QCuElem int 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 C
6、ustomerDeparture(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);/初始
7、化窗口队列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 stdi
8、o.h#include stdlib.h#include time.hint i=0,e=0,counter=0;int TotalTime=0,CustomerNum=0; /累计客户逗留时间,客户数int CloseTime; /关门时间int windowsnum = 0;5/主函数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-Oc
9、curTime; 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) int temp = 0; printf(请输入随机数种子(或输入0使用随机种子):); scanf(%d,&temp); if (temp=0) srand(unsigned)
10、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
11、 = (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
12、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); / 插入离开事件 enTemp.OccurTime = en.OccurTime + durtime; enTemp.NType = i; enTemp.next = NUL
13、L; 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) DestoryQueue(qi); else QCuElem customer; DeCuQueue(qi,customer); / 客户逗留时间 TotalTime += en.Oc
14、curTime - 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, TotalT
15、ime); 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
16、.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) QEptr qtemp; int i=0; qtemp = qn.front-next; while(qtemp) qtemp = qtemp-next; i+; return
17、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
18、) 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(QCusto
19、merp 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(QCu
20、stomerp 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);五、程序运行结果中间显示部分省略六、 实验总结1.实验结果分析利用随机产生的种子进行事件的模拟,即到达时间和办理业务的时间都是随机产生。如果事件尚未到达下班时间,则将其插入到空队列或者是人数(元素)最少的队列,通过检验,算出在不同的服务窗口数下的等待时间以及
21、服务时间,基本上实现了银行事件的模拟。2.实验心得体会数据结构是一门理论性较强且抽象的课程,经过一周的数据结构课程设计,至今我仍感受颇深,从选题到定稿,从理论到实践,在短短的一周时间里,虽然时间比较紧,但我学到了很多以前不知道的东西,同时不仅复习和巩固了以前所学过的知识,而且看到了和学到了很多在书本上所没有学到过的知识,使我懂得了理论必须和实践永远的结合起来,才能有质的飞跃,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到过很多问题,但我一直坚持着,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,现在觉得一定要把以前所学过的知识重新温故。虽然我的算法不够完好,还有许多问题,但我一定会调试成功的。最后,感谢李老师本学期来的悉心教导,祝老师身体健康,工作愉快! 参考文献1 张小艳,龚尚福编著. 数据结构与算法. 徐州:中国矿业大学出版社,20072 严蔚敏,吴伟民编著. 数据结构(C语言版). 北京: 清华大学出版社,19973 谭浩强编著. C程序设计(第三版). 北京: 清华大学出版社,2005
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1