数据结构课程设计之银行离散事件模拟.docx
- 文档编号:11625528
- 上传时间:2023-03-29
- 格式:DOCX
- 页数:14
- 大小:142.01KB
数据结构课程设计之银行离散事件模拟.docx
《数据结构课程设计之银行离散事件模拟.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之银行离散事件模拟.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构课程设计之银行离散事件模拟
《数据结构》课程设计报告
银行业务模拟与离散事件模拟
一、实验目的
1.通过此次课程设计中银行业务模拟的题目,掌握队列(或者链表)等数据结构的基本操作方面的知识,并能灵活的解决一些基本的问题,加深对其性质及各项操作的理解;
2.将所学数据结构方面的知识与一门具体的语言相结合(C/C++)来进行实现,感受数据结构的强大作用,加深理解。
二、问题描述
1.问题描述
假设某银行有4个窗口对外接待客户,从早晨银行开门(开门9:
00am,关门5:
00pm)起不断有客户进入银行。
由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进入银行的客户(建议:
客户进入时间使用随机函数产生),若某个窗口的业务员正空闲,则上前办理业务;反之,若4个窗口均有窗户所占,他便会排在人数最少的队伍后面。
2.任务要求
编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。
建议有如下设置:
(1)客户到达时间随机产生,一天客户的人数设定为100人。
(2)银行业务员处理时间随机产生,平均处理时间10分钟。
(3)将一天的数据(包括业务员和客户)以文件方式输出。
三、算法的思想与算法实现步骤
1.基本思想
通过队列数据类型进行基本操作,主要有三个模块:
分别是主函数模块、
主要操作函数及基本操作函数。
其中,主函数负责其他子函数的调用实现以及基本界面的操作,主要函数包括开门函数的实现:
OpenForDay,顾客到达函数:
CustomerArrived,顾客离开的函数:
CustomerDepartion等;而基本操作函数就是对其中牵扯到的操作进行具体的实现,如按时间先后插入队列OrderInsert、寻求最短的队列MinCuQueue、删除队列元素以及销毁等。
2.实现步骤
首先,分析题目要求划分实现模块、画出大致的流程图,定义基本数据类型,诸如结构体、队列等;
其次,考虑基本大致的操作,比如要拟定开门的时间、顾客到来为其提供服务以及离开时的操作等;
再次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能;
最后,编写主函数对每个实现进行按需调用,实现操作。
3.流程图
是
否
否
图-1事件流程图
图-2主函数流程图
四、程序核心代码
#defineOK1
#defineTRUE1
#defineFALSE0
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;
//-----------------银行排队模拟
//事件和事件表
typedefstructQCuEvent
{
intOccurTime;
intNType;
structQCuEvent*next;
}QCuEvent,*EventList;
//窗口前队列元素
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[]);
#include"stdio.h"
#include"stdlib.h"
#include"time.h"
inti=0,e=0,counter=0;
intTotalTime=0,CustomerNum=0;//累计客户逗留时间,客户数
intCloseTime;//关门时间
intwindowsnum=0;5
//主函数
voidmain(){
EventListev;//事件表
QCuEventen;
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);
else
CustomerDeparture(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++)
{
InitCuQueue(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(t 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.OccurTime>CloseTime) { DestoryQueue(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; } qtemp=ev; while(qtemp->next&&qtemp->next->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<=windowsnum;i++) { min=QLength(q[min])<=QLength(q[i])? min: i; } returnmin; } StatusDelFirstEvent(EventList&ev) { EventListp; p=ev->next; ev->next=p->next; free(p); returnOK; } StatusInitCuQueue(QCustomerp&qn) { qn.front=(QEptr)malloc(sizeof(QCuElem)); qn.front->next=NULL; qn.rear=qn.front; returnOK; } StatusEnCuQueue(QCustomerp&qn,QEptrQ) { qn.rear->next=Q; qn.rear=Q; returnOK; } StatusDeCuQueue(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); returnOK; } StatusGetQHead(QCustomerpqn,QCuElem&Q) { Q.ArrivalTime=qn.front->next->ArrivalTime; Q.Duration=qn.front->next->Duration; returnOK; } StatusDestoryQueue(QCustomerpqn) { QEptrp; while(qn.front->next) { p=qn.front->next; qn.front->next=p->next; free(p); } qn.front->next=NULL; qn.rear=qn.front; returnOK; } voidPtint_QStatus(QCustomerpQCu[]) { intl; for(inti=1;i<=windowsnum;i++) { l=QLength(QCu[i]); printf("队列%d: 长%d: ",i,l); for(intn=1;n<=l;n++) { printf("@"); } printf("\n"); } } voidtest(charstr[]) { printf("--%s--\n",str); } 五、程序运行结果 中间显示部分省略…… 六、实验总结 1.实验结果分析 利用随机产生的种子进行事件的模拟,即到达时间和办理业务的时间都是随机产生。 如果事件尚未到达下班时间,则将其插入到空队列或者是人数(元素)最少的队列,通过检验,算出在不同的服务窗口数下的等待时间以及服务时间,基本上实现了银行事件的模拟。 2.实验心得体会 数据结构是一门理论性较强且抽象的课程,经过一周的数据结构课程设计,至今我仍感受颇深,从选题到定稿,从理论到实践,在短短的一周时间里,虽然时间比较紧,但我学到了很多以前不知道的东西,同时不仅复习和巩固了以前所学过的知识,而且看到了和学到了很多在书本上所没有学到过的知识,使我懂得了理论必须和实践永远的结合起来,才能有质的飞跃,从而提高自己的实际动手能力和独立思考的能力。 在设计的过程中遇到过很多问题,但我一直坚持着,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,现在觉得一定要把以前所学过的知识重新温故。 虽然我的算法不够完好,还有许多问题,但我一定会调试成功的。 最后,感谢李老师本学期来的悉心教导,祝老师身体健康,工作愉快! 参考文献 [1]张小艳,龚尚福编著.数据结构与算法.徐州: 中国矿业大学出版社,2007 [2]严蔚敏,吴伟民编著.数据结构(C语言版).北京: 清华大学出版社,1997 [3]谭浩强编著.C程序设计(第三版).北京: 清华大学出版社,2005
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 银行 离散 事件 模拟