数据结构银行业务活动的模拟.docx
- 文档编号:6936770
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:12
- 大小:25.57KB
数据结构银行业务活动的模拟.docx
《数据结构银行业务活动的模拟.docx》由会员分享,可在线阅读,更多相关《数据结构银行业务活动的模拟.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构银行业务活动的模拟
数据结构课程设计报告
题目:
银行业务活动的模拟
一、实验目的
银行业务活动的模拟
任务:
假设某银行有4个窗口对外接待客户,从早晨银行开门起不断有客户进入银行,由于每个窗口在某个时刻只能接待一个客户。
因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进入银行的客户。
如果某个窗口的业务员正空闲,则可上前输业务。
反之,若个窗口均有客户所占,他便会排在为数最少的队伍后面。
编制一个程序模拟银行的这种业务活动并计算一天中客户在银行的平均逗留时间。
功能要求:
1).实现数据的输入;
2).各个窗口数据的访问和输出;
3)当前窗口的人员分布情况动态显示。
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:
学生自己根据系统功能要求自己设计。
请在最后的上交资料中指明你用到的存储结构;
测试数据:
要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。
进行程序测试,以保证程序的稳定。
测试数据及测试结果请在上交的资料中写明;
二、总体设计
1.设计原理:
为了计算平均时间,就要掌握每个客户到达银行和离开银行这两个时刻,后者减去前者即为每个客户在银行逗留的时间。
所有客户逗留时间的总和被一天内进入银行的客户数除便是所求的平均时间。
事件的主要信息是事件类型和事件发生的时刻,算法中要处理的事件有两类:
一类是客户到达的时间,另一类是客户离开的时间。
前一类事件发生的时刻随客户到来自然形成,后一类事件发生时刻则由客户事务所需时间和等待所耗时间而定。
由于驱动程序是按时间发生时刻的先后顺序进行,则事件表应该是有序表,其主要操作是插入和删除事件。
2.设计方案及流程
由于在实际的银行中,客户到达的时刻及其办理事务所需时间都是随机的,在模拟程序中可用随机数代替,不失一般性。
假设第一个客户进门的时刻为0,即是模拟程序处理的第一个事件,之后每个客户到达的时刻在前一个客户到达时设定。
因此在客户到达事件发生时需先产生两个随机数:
其一为此时刻到达的客户办理事务所需时间durtime;其二为下一个客户将到达的时间间隔intertime,假设当前事件发生的时刻为occurtime,则下一个客户到达事件发生的时刻为occurtime+intertime。
由此应产生一个新的客户到达时间插入表;刚到达的客户则应插入到当前所含元素最少的队列中;若该队列在插入前为空,则还应产生一个客户离开事件插入事件表。
客户离开时间的处理比较简单。
首先计算该客户在银行逗留的时间,然后从队列中删除该客户后查看队列是否为空,若不空则设定一个新的队头客户离开事件。
三、实验步骤
第1次:
完成程序的主框架设计,进行调试,验证其正确性;
第2次:
详细设计,进行调试,验证其正确性;
第3次:
进行整体调试,运行程序,对运行结果进行分析,完成实验报告。
程序代码如下:
#include
#include
#include
#include
#include
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
typedefintStatus;//Status是函数的类型,其值是函数结果状态代码,如OK等
#defineQu4//客户队列数
typedefstruct
{
intOccurTime;//事件发生时刻
intNType;
}Event,ElemType;
typedefstructLNode
{
ElemTypedata;
LNode*next;
}*Link,*Position;
structLinkList//链表类型
{
Linkhead,tail;
intlen;
};
typedefstruct
{
intArrivalTime;//到达时刻
intDuration;//办理事务所需时间
}QElemType;//定义QElemType(队列的数据元素类型)为结构体类型;
typedefstructQNode
{
QElemTypedata;
QNode*next;
}*QueuePtr;
structLinkQueue
{
QueuePtrfront,rear;//队头、队尾指针
};
typedefLinkListEventList;//事件链表类型,定义为有序链表
EventListev;//事件表
Eventen;//事件
Eventet;//临时变量
LinkQueueq[Qu];//Qu个客户队列
QElemTypecustomer;//客户记录
intTotalTime=0,CustomerNum=0;//累计客户逗留时间,客户数(初值为0)
intCloseTime;//银行营业时间(单位是分)
//对链表的操作:
StatusInitList(LinkList&L)
{//构造一个空的线性链表
Linkp;
p=(Link)malloc(sizeof(LNode));//生成头结点
if(p)
{
p->next=NULL;
L.head=L.tail=p;
L.len=0;
returnOK;
}
else
returnERROR;
}
StatusDelFirst(LinkList&L,Linkh,Link&q)
{
q=h->next;
if(q)//链表非空
{
h->next=q->next;
if(!
h->next)//删除尾结点
L.tail=h;//修改尾指针
L.len--;
returnOK;
}
else
returnFALSE;//链表空
}
ElemTypeGetCurElem(Linkp)
{//已知p指向线性链表中的一个结点,返回p所指结点中数据元素的值
returnp->data;
}
StatusListEmpty(LinkListL)
{
if(L.len)
returnFALSE;
else
returnTRUE;
}
intListLength(LinkListL)
{
returnL.len;
}
PositionGetHead(LinkListL)
{//返回线性链表L中头结点的位置
returnL.head;
}
StatusOrderInsert(LinkList&L,ElemTypee,int(*comp)(ElemType,ElemType))
{//已知L为有序线性链表,将元素e按非降序插入在L中。
Linko,p,q;
q=L.head;
p=q->next;
while(p!
=NULL&&comp(p->data,e)<0)
{
q=p;
p=p->next;
}
o=(Link)malloc(sizeof(LNode));//生成结点
o->data=e;//赋值
q->next=o;//插入
o->next=p;
L.len++;//表长加1
if(!
p)//插在表尾
L.tail=o;//修改尾结点
returnOK;
}
//对队列的操作:
StatusInitQueue(LinkQueue&Q)
{//构造一个空队列Q
if(!
(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode))))
exit(OVERFLOW);
Q.front->next=NULL;
returnOK;
}
StatusQueueEmpty(LinkQueueQ)
{//若Q为空队列,则返回TRUE,否则返回FALSE
if(Q.front==Q.rear)
returnTRUE;
else
returnFALSE;
}
intQueueLength(LinkQueueQ)
{//求队列的长度
inti=0;
QueuePtrp;
p=Q.front;
while(Q.rear!
=p)
{
i++;
p=p->next;
}
returni;
}
StatusGetHead(LinkQueueQ,QElemType&e)
{//若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR
QueuePtrp;
if(Q.front==Q.rear)
returnERROR;
p=Q.front->next;
e=p->data;
returnOK;
}
StatusEnQueue(LinkQueue&Q,QElemTypee)
{//插入元素e为Q的新的队尾元素
QueuePtrp;
if(!
(p=(QueuePtr)malloc(sizeof(QNode))))//存储分配失败
exit(OVERFLOW);
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
returnOK;
}
StatusDeQueue(LinkQueue&Q,QElemType&e)
{//若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR
QueuePtrp;
if(Q.front==Q.rear)
returnERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
returnOK;
}
intcmp(Eventa,Eventb)
{//依事件a的发生时刻<、=或>事件b的发生时刻分别返回-1、0或1
if(a.OccurTime==b.OccurTime)
return0;
else
return(a.OccurTime-b.OccurTime)/abs(a.OccurTime-b.OccurTime);
}
voidOpenForDay()
{//初始化操作
inti;
InitList(ev);//初始化事件链表为空
en.OccurTime=0;//设定第一个客户到达事件
en.NType=Qu;//到达
OrderInsert(ev,en,cmp);//插入事件表
for(i=0;i InitQueue(q[i]); } voidRandom(int&d,int&i) { d=rand()%30+1;//1到30之间的随机数每个客户办理业务的时间最大值30 i=rand()%5+1;//1到5之间的随机数两相邻到达的客户的时间间隔最大值5 } intMinimum(LinkQueueQ[])//返回最短队列的序号 { intt[Qu]; inti,k; for(i=0;i t[i]=QueueLength(Q[i]); k=0; for(i=1;i if(t[i] { t[0]=t[i]; k=i; } returnk; } voidCustomerArrived() {//处理客户到达事件,en.NType=Qu QElemTypef; intdurtime,intertime,i; ++CustomerNum; Random(durtime,intertime);//生成随机数 et.OccurTime=en.OccurTime+intertime;//下一客户到达时刻 et.NType=Qu;//队列中只有一个客户到达事件 if(et.OccurTime OrderInsert(ev,et,cmp); i=Minimum(q);//求长度最短队列 f.ArrivalTime=en.OccurTime; f.Duration=durtime; EnQueue(q[i],f); if(QueueLength(q[i])==1) { et.OccurTime=en.OccurTime+durtime; et.NType=i; OrderInsert(ev,et,cmp);//设定第i队列的一个离开事件并插入事件表 } } voidCustomerDeparture() { inti; i=en.NType; DeQueue(q[i],customer);//删除第i队列的排头客户 TotalTime+=en.OccurTime-customer.ArrivalTime;//累计客户逗留时间 if(! QueueEmpty(q[i])) {//设定第i队列的一个离开事件并插入事件表 GetHead(q[i],customer); et.OccurTime=en.OccurTime+customer.Duration; et.NType=i; OrderInsert(ev,et,cmp); } } voidBank_Simulation(){ Linkp; OpenForDay();//初始化 while(! ListEmpty(ev)) { DelFirst(ev,GetHead(ev),p); en.OccurTime=GetCurElem(p).OccurTime; en.NType=GetCurElem(p).NType; if(en.NType==Qu) CustomerArrived();//处理客户到达事件 else CustomerDeparture();//处理客户离开事件 }//计算并输出平均逗留时间 printf("顾客总数: %d,所有顾客共耗时: %d分钟,平均每人耗时: %d分钟\n",CustomerNum,TotalTime,TotalTime/CustomerNum); } voidmain() { printf("请输入银行营业时间长度(单位: 分)\n"); scanf("%d",&CloseTime); Bank_Simulation(); } 四、实验结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 银行业务 活动 模拟