您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 金融资料 > 数据结构课程设计之银行离散事件模拟
《数据结构》课程设计报告数据结构课程设计报告1银行业务模拟与离散事件模拟一、实验目的1.通过此次课程设计中银行业务模拟的题目,掌握队列(或者链表)等数据结构的基本操作方面的知识,并能灵活的解决一些基本的问题,加深对其性质及各项操作的理解;2.将所学数据结构方面的知识与一门具体的语言相结合(C/C++)来进行实现,感受数据结构的强大作用,加深理解。二、问题描述1.问题描述假设某银行有4个窗口对外接待客户,从早晨银行开门(开门9:00am,关门5:00pm)起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进入银行的客户(建议:客户进入时间使用随机函数产生),若某个窗口的业务员正空闲,则上前办理业务;反之,若4个窗口均有窗户所占,他便会排在人数最少的队伍后面。2.任务要求编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。建议有如下设置:(1)客户到达时间随机产生,一天客户的人数设定为100人。(2)银行业务员处理时间随机产生,平均处理时间10分钟。(3)将一天的数据(包括业务员和客户)以文件方式输出。三、算法的思想与算法实现步骤1.基本思想通过队列数据类型进行基本操作,主要有三个模块:分别是主函数模块、主要操作函数及基本操作函数。其中,主函数负责其他子函数的调用实现以及基本界面的操作,主要函数包括开门函数的实现:OpenForDay,顾客到达函数:CustomerArrived,顾客离开的函数:CustomerDepartion等;而基本操作函数数据结构课程设计报告2就是对其中牵扯到的操作进行具体的实现,如按时间先后插入队列OrderInsert、寻求最短的队列MinCuQueue、删除队列元素以及销毁等。2.实现步骤首先,分析题目要求划分实现模块、画出大致的流程图,定义基本数据类型,诸如结构体、队列等;其次,考虑基本大致的操作,比如要拟定开门的时间、顾客到来为其提供服务以及离开时的操作等;再次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能;最后,编写主函数对每个实现进行按需调用,实现操作。3.流程图是否否图-1事件流程图排队开始客户到达窗口忙选择服务窗口服务并展开窗口闲置时间到结束队列空处理并离开队头取客户数据结构课程设计报告3图-2主函数流程图四、程序核心代码#defineOK1#defineTRUE1#defineFALSE0#defineERROR0#defineINFEASIBLE-1#defineOVERFLOW-2typedefintStatus;//-----------------银行排队模拟//事件和事件表typedefstructQCuEvent{intOccurTime;intNType;structQCuEvent*next;}QCuEvent,*EventList;开始结束Customerarrive()进入or离开CutomDepation()()main()队列是否为空输出结果数据结构课程设计报告4//窗口前队列元素typedefstructQCuElem{intArrivalTime;intDuration;structQCuElem*next;}QCuElem,*QEptr;//窗口指针typedefstruct{QEptrfront;QEptrrear;}QCustomerp,*QCupp;//主要操作函数StatusOpenForDay(EventList&ev,QCuEventen,QCupp&q);//开门StatusCustomerArrived(EventList&ev,QCupp&q,QCuEventen);//顾客到达StatusCustomerDeparture(EventList&ev,QCupp&q,QCuEventen);//顾客离开voidCloseForDay();//基本操作函数StatusOrderInser(EventList&ev,QCuEventen);//按时间顺序插入事件到事件表intQLength(QCustomerpqn);//求窗口队列长度intMinCuQueue(QCuppq);//求队最短的窗口StatusDelFirstEvent(EventList&ev);//删除事件表中的第一个事件StatusInitCuQueue(QCustomerp&qn);//初始化窗口队列StatusEnCuQueue(QCustomerp&qn,QEptrQ);//进入队列StatusDeCuQueue(QCustomerp&qn,QCuElem&Q);//删除队列中的元素StatusGetQHead(QCustomerpqn,QCuElem&Q);//获得队列中的第一个元素StatusDestoryQueue(QCustomerpqn);//销毁队列voidPtint_QStatus(QCustomerpQCu[]);//打印队列长度voidBank_SimulationFunc();voidtest(charstr[]);#includestdio.h#includestdlib.h#includetime.hinti=0,e=0,counter=0;intTotalTime=0,CustomerNum=0;//累计客户逗留时间,客户数intCloseTime;//关门时间intwindowsnum=0;4//主函数voidmain(){EventListev;//事件表数据结构课程设计报告5QCuEventen;QCuppQCu=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();}//主要功能子函数StatusOpenForDay(EventList&ev,QCuEventen,QCupp&q){inttemp=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=NULL;OrderInser(ev,en);printf(请输入办理业务的窗口数(至少1个):);scanf(%d,&windowsnum);q=(QCustomerp*)malloc((windowsnum+1)*sizeof(QCustomerp));for(inti=1;i=windowsnum;i++){数据结构课程设计报告6InitCuQueue(q[i]);}returnOK;}StatusCustomerArrived(EventList&ev,QCupp&q,QCuEventen){test(顾客到达处理);CustomerNum++;//产生随机数//srand(54);intdurtime=rand()%30+1;intintertime=rand()%5+1;//插入到达事件表QCuEventenTemp;intt=en.OccurTime+intertime;enTemp.OccurTime=t;enTemp.NType=0;enTemp.next=NULL;if(tCloseTime)OrderInser(ev,enTemp);printf(时间%d\n,t);//插入最短队QEptrQ;Q=(QEptr)malloc(sizeof(QCuElem));Q-ArrivalTime=en.OccurTime;Q-Duration=durtime;Q-next=NULL;inti=MinCuQueue(q);EnCuQueue(q[i],Q);//插入离开事件enTemp.OccurTime=en.OccurTime+durtime;enTemp.NType=i;enTemp.next=NULL;if(QLength(q[i])==1)OrderInser(ev,enTemp);returnOK;}StatusCustomerDeparture(EventList&ev,QCupp&q,QCuEventen){test(顾客离开处理);inti=en.NType;printf(离开时间%d\n,en.OccurTime);if(en.OccurTimeCloseTime){数据结构课程设计报告7DestoryQueue(q[i]);}else{QCuElemcustomer;DeCuQueue(q[i],customer);//客户逗留时间TotalTime+=en.OccurTime-customer.ArrivalTime;printf(总时间为%d\n,TotalTime);if(q[i].front-next){GetQHead(q[i],customer);QCuEventenTemp;enTemp.OccurTime=en.OccurTime+customer.Duration;enTemp.NType=i;OrderInser(ev,enTemp);}}returnOK;}voidCloseForDay(){printf(***************************************\n);printf(*\n);printf(*所有顾客业务办理总时间:%d分钟\n,TotalTime);printf(*业务办理顾客数:%d\n,CustomerNum);printf(*平均每人办理时间:%f\n,(float)TotalTime/(float)CustomerNum);printf(*\n);printf(***************************************\n);}//功能实现子函数StatusOrderInser(EventList&ev,QCuEventen){EventListentemp,qtemp;entemp=(EventList)malloc(sizeof(QCuEvent));entemp-OccurTime=en.OccurTime;entemp-NType=en.NType;entemp-next=NULL;if(!ev-next){ev-next=entemp;returnOK;}数据结构课程设计报告8qtemp=ev;while(qtemp-next&&qtemp-next-OccurTimeen.OccurTime){qtemp=qtemp-next;}entemp-next=qtemp-next;qtemp-next=entemp;returnOK;}intQLength(QCustomerpqn){QEptrqtemp;inti=0;qtemp=qn.front-next;while(qtemp){qtemp=qtemp-next;i++;}returni;}intMinCuQueue(QCuppq){inti,min;for(i=1,min=1;i=windo
本文标题:数据结构课程设计之银行离散事件模拟
链接地址:https://www.777doc.com/doc-4544699 .html