工学系课程设计报告
设 计 题 目:银行业务模拟离散事件模拟
系 :工学系
专 业 (方 ):
年 级 班:
学 生 姓 名:
学 生 学 号:
指 导 教 师:
年 月 日
目录
系统开发背景 1
() 系统功求 1
(二) 系统模块结构设计 1
三系统设计实现 2
() 开门函数: 3
(二) 顾客达函数: 5
(三) 顾客离开函数: 6
四系统测试 7
五总结 8
六附件(代码部分图表) 8
银行业务模拟离散事件模拟
系统开发背景
现实生活中方便银行业务员更操作理银行出现种事件方便算出种时间设计银行业务模拟离散事件模拟系统
通次课程设计中银行业务模拟题目掌握队列链表等数结构基操作方面知识灵活解决基问题加深性质操作理解
学数结构方面知识门具体语言相结合进行实现感受数结构强作加深理解
() 系统功求
编制程序模拟银行种业务活动计算天中客户银行逗留均时间
1 客户达时间机产生天客户数设定100
2 银行业务员处理时间机产生均处理时间10分钟
3 天数结构(包括业务员客户)文件方式输出
(二) 系统模块结构设计
通系统功分析银行业务模拟离散事件模拟系统功图示
银行业务模拟离散事件模拟
开门函数
(OpenForday())
顾客达函数
(CustomerArrived())
顾客离开函数
(CustomerDeparture())
银行业务模拟离散事件模拟系统
通图功分析整系统划分3模块:
1 开门函数该模块实现:银行开始正常营业时间助函数OpenForDay()实现
2 顾客达函数该模块实现:客户银行里 排队办理完银行业务功助函数CustomerArrive()实现
3 顾客离开函数该模块实现:银行班时间顾客全部离开功助函数CustomerDepart()实现
三系统设计实现
流程图
客户达
开始
选择服务窗口
窗口忙
服务展开
链表空
窗口闲置
结束
排队
头取客户
处理离开
否
时间
() 开门函数:OpenForDay()
分析:首先输入机数种子然输入银行办理时基信息图示
void OpenForDay()
{ *初始化事件链表*
int i
InitList(ev)
enOccurTime0
enNTypeQu *达*
OrderInsert(evencmp)
for(i0i
}
void Random(int &dint &i)
{ * 生成两机数*
drand()chuli+1 *处理机数*
irand()(jiange+1) *间隔间机数*
}
int Minimum(LinkQueue Q[])
{ *返回短序列序号*
int l[Qu]
int ik0
for(i0i
for(i1i
l[0]l[i]
ki
}
return k
}
功子函数
输入机数种子
输入营业时间
输入办理业务窗口数
该模块具体代码示
(二) 顾客达函数CustomerArrived()
客户达处理
产生机数
插入达事件表
插入短队
插入离事件
该模块具体代码示:
void CustomerArrived()
{ *处理客户达事件*
QElemType f
int durtimeintertimei
++CustomerNum *客户数增加1*
Random(durtimeintertime)
etOccurTimeenOccurTime+intertime*客户达时刻前客户达时间+时间间隔*
etNTypeQu *客户达事件*
iMinnimum(q)
if(etOccurTime
fArrivalTimeenOccurTime
fDurationdurtime
EnQueue(q[i]f)
if(QueueLength(q[i])1)
{
etOccurTimeenOccurTime+durtime*设定离开事件*
etNTypei
OrderInsert(evetcmp)
}
}
(三) 顾客离开函数CustomerDeparture()
顾客离开处理
离开时间
客户逗留时间
总时间
该模块具体代码示:
void CustomerDeparture()
{ *处理客户离开事件*
int i
ienNType
DeQueue(q[i]customer) *删队列排头客户*
TotalTime+enOccurTimecustomerArrivalTime
if(QueueEmpty(q[i]))
{
GetHead(q[i]customer)
etOccurTimeenOccurTime+customerDuration
etNTypei
OrderInsert(evetcmp)
}
}
四系统测试
() 测试函数
测试该函数测试方法测试具体步骤测试例选取测试结果
(二)
(三)
(四)
五总结
通次实验熟悉链表实际应中简单操作通实际数产生函数完成系列银行活动模拟银行业务办理提供更便利
实验中存问题进行系列修改请教解决问题
利机产生种子进行事件模拟达办理业务时间机产生果事件尚未达班时间插入空列队者数(元素)少列队通检验算出服务窗口数等时间服务时间基实现银行业务模拟
六附件(代码部分图表)
LinkListh
#define Qu 2
#define jiange 5
#define chuli 10
#include
#include
#include
#include
#include
#include
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status
typedef int Boolean
typedef struct
{
int OccurTime
int NType
}EventElemType
typedef struct LNode *结点类型*
{
ElemType data
LNode *next
}*Link*Position
struct LinkList *链表类型*
{
Link headtail
int len
}
typedef LinkList EventList
EventList ev
Event enet
void InitList(LinkList &L)
{ *构造空线性表*
Link p
p(Link)malloc(sizeof(LNode))
if(p)
{
p>nextNULL
LheadLtailp
Llen0
}
else
exit(ERROR)
}
Status DelFirst(LinkList &LLink hLink &q)
{
qh>next
if(q) *链表非空*
{
h>nextq>next
if(h>next) *删尾结点*
Ltailh * 修改尾指针*
Llen
return OK
}
else
return FALSE
}
ElemType GetCurElem(Link p)
{ *已知P指线性链表中结点返回P指结点中数元素值*
return p>data
}
Status ListEmpty(LinkList L)
{
if(Llen)
return FALSE
else
return TRUE
}
Position GetHead(LinkList L)
{ *返回线性链表L中头结点位置*
return Lhead
}
void OrderInsert(LinkList &LElemType eint(*comp)(ElemTypeElemType))
{
Link opq
qLhead
pq>next
while(pNULL&&comp(p>datae)<0) *P表尾元素值E*
{
qp
pp>next
}
o(Link)malloc(sizeof(LNode))
o>datae *赋值*
q>nexto *插入*
o>nextp
Llen++ *表长加*
if(p) *插表尾*
Ltailo *修改尾结点*
}
Queueh
typedef struct
{
int ArrivalTime
int Duration *办理事务需时间*
}QElemType *定义队列数元素类型结构体类型*
typedef struct QNode
{
QElemType data
QNode *next
}*QueuePtr
struct LinkQueue
{
QueuePtr frontrear *队头队尾指针*
}
void InitQueue(LinkQueue &Q)
{ *构造空队列Q*
if((QfrontQrear(QueuePtr)malloc(sizeof(QNode))))
exit(OVERFLOW)
Qfront>nextNULL
}
void DestroyQueue(LinkQueue &Q)
{
while(Qfront)
{
QrearQfront>next
free(Qfront)
QfrontQrear
}
}
Status QueueEmpty(LinkQueue Q)
{
if(Qfront>nextNULL)
return TRUE
else
return FALSE
}
int QueueLength(LinkQueue Q)
{ *求队列长度*
int io
QueuePtr p
pQfront
while(Qrearp)
{
i++
pp>next
}
return i
}
Status GetHead(LinkQueue QQElemType &e)
{
QueuePtr p
if(QfrontQrear)
return ERROR
pQfront>next
ep>data
return OK
}
void EnQueue(LinkQueue &QQElemType e)
{
QueuePtr p
if((p(QueuePtr)malloc(sizeof(QNode)))) *存贮分配失败*
exit(OVERFLOW)
p>datae
p>nextNULL
Qrear>nextp
Qrearp
}
Status DeQueue(LinkQueue &QQElemType &e)
{
QueuePtr p
if(QfrontQrear)
return ERROR
pQfront>next
ep>data
Qfront>nextp>next
if(Qrearp)
QrearQfront
free(p)
return OK
}
#includeLinkListh
#includeQueueh
long int TotalTime0 *累计客户逗留时间初值0*
int CloseTimeCustomerNum0
Mainh
LinkQueue q[Qu] *客户队列*
QElemType customer *客户记录时变量*
int cmp(Event aEvent b)
{
if(aQccurTimebQccurTime)
return 0
else
return(aOccurTimebOccurTime)abs(aOccurTimebOccurTime)
}
void OpenForDay()
{ *初始化事件链表*
int i
InitList(ev)
enOccurTime0
enNTypeQu *达*
OrderInsert(evencmp)
for(i0i
}
void Random(int &dint &i)
{ * 生成两机数*
drand()chuli+1 *处理机数*
irand()(jiange+1) *间隔间机数*
}
int Minimum(LinkQueue Q[])
{ *返回短序列序号*
int l[Qu]
int ik0
for(i0i
for(i1i
l[0]l[i]
ki
}
return k
}
void CustomerArrived()
{ *处理客户达事件*
QElemType f
int durtimeintertimei
++CustomerNum *客户数增加1*
Random(durtimeintertime)
etOccurTimeenOccurTime+intertime*客户达时刻前客户达时间+时间间隔*
etNTypeQu *客户达事件*
iMinnimum(q)
if(etOccurTime
fArrivalTimeenOccurTime
fDurationdurtime
EnQueue(q[i]f)
if(QueueLength(q[i])1)
{
etOccurTimeenOccurTime+durtime*设定离开事件*
etNTypei
OrderInsert(evetcmp)
}
}
void CustomerDeparture()
{ *处理客户离开事件*
int i
ienNType
DeQueue(q[i]customer) *删队列排头客户*
TotalTime+enOccurTimecustomerArrivalTime
if(QueueEmpty(q[i]))
{
GetHead(q[i]customer)
etOccurTimeenOccurTime+customerDuration
etNTypei
OrderInsert(evetcmp)
}
}
void Bank_Simulation()
{ *银行业务模拟*
Link p
OpenForDay()
while(ListEmpty(ev))
{
DelFirst(evevheadp)
enOccurTimeGetCurElem(p)OccurTime
enNTypeGetElem(p)NType
if(enNTypeQu) *达事件*
CustomerArrived()
else
CustomerDeparture()
}
printf(窗口数:d 两相邻达客户时间间隔0~d分钟 客户办理时间:1~d分钟\nQujiangechuli)
printf(客户总数:d\nCustomerNum)
printf(客户耗时ld分钟\nTotalTime)
printf(均耗时d分钟\nTotalTimeCustomerNum)
printf(客户离开时间d\nenOccurTime)
}
void main()
{
printf(请输入银行营业时间长度(分))
scanf(d&CloseTime)
Bank_Simulation()
getchar()
getcher()
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档