职场文秘网

首页 > 心得体会 > 剖析整改 / 正文

银行业务模拟与离散事件模拟课程设计

2020-08-02 00:10:56

工学系课程设计报告 设 计 题 目:银行业务模拟与离散事件模拟 系 别:工学系 专 业 (方 向):
年 级、 班:
学 生 姓 名:
学 生 学 号:
指 导 教 师:
年 月 日 目录 一、系统开发的背景。

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); en.OccurTime=0; en.NType=Qu; /*到达*/ OrderInsert(ev,en,cmp); for(i=0;i<Qu;++i) InitQueue(q[i]); } void Random(int &d,int &i) { /* 生成两个随机数*/ d=rand()%chuli+1; /*到处理的随机数*/ i=rand()%(jiange+1); /*到间隔之间的随机数*/ } int Minimum(LinkQueue Q[]) { /*返回最短序列的序号*/ int l[Qu]; int i,k=0; for(i=0;i<Qu;i++) l[i]=QueueLength(Q[i]); for(i=1;i<Qu;i++) if(l[i]<l[0]) { l[0]=l[i]; k=i; } return k; } 主要功能子函数 输入随机数种子 输入营业时间 输入办理业务的窗口数 该模块的具体代码如下所示。

(二) 顾客到达函数CustomerArrived() 客户到达处理 产生随机数 插入到达事件表 插入最短队 插入离事件 该模块的具体代码如下所示:
void CustomerArrived() { /*处理客户到达事件*/ QElemType f; int durtime,intertime,i; ++CustomerNum; /*客户数增加1*/ Random(durtime,intertime); et.OccurTime=en.OccurTime+intertime;/*下一客户到达时刻=当前客户的到达时间+时间间隔*/ et.NType=Qu; /*下一客户到达事件*/ i=Minnimum(q); if(et.OccurTime<CloseTime) /*下一客户到达银行还未关门*/ OrderInsert(ev,et,cmp); 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); } } (三) 顾客离开函数CustomerDeparture() 顾客离开处理 离开时间 客户逗留时间 总时间 该模块的具体代码如下所示:
void CustomerDeparture() { /*处理客户离开事件*/ int i; i=en.NType; DeQueue(q[i],customer); /*删除队列排头客户*/ TotalTime+=en.OccurTime-customer.ArrivalTime; if(!QueueEmpty(q[i])) { GetHead(q[i],customer); et.OccurTime=en.OccurTime+customer.Duration; et.NType=i; OrderInsert(ev,et,cmp); } } 四、系统测试 (一) 测试函数 测试该函数使用的测试方法,测试的具体步骤,测试用例的选取,测试的结果。

(二) (三) (四) 五、总结 通过此次实验,熟悉了链表在实际应用中的简单操作,通过实际数产生函数,完成了一系列银行活动的模拟,可以给银行业务的办理提供更大的便利。

实验中,存在问题,在进行了一系列的修改和请教下,解决了问题。

利用随机产生种子进行事件的模拟,即到达和办理业务的时间都是随机产生。如果事件尚未到达下班时间,则将插入到空列队或者是人数(元素)最少的列队,通过检验,算出在不同服务窗口数下的等待时间以及服务时间,基本实现了银行业务的模拟。

六、附件(代码、部分图表) LinkList.h #define Qu 2 #define jiange 5 #define chuli 10 #include <string.h> #include <malloc.h> #include <stdlib.h> #include <math.h> #include <process.h> #include <iostream> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 typedef int Status; typedef int Boolean; typedef struct { int OccurTime; int NType; }Event,ElemType; typedef struct LNode /*结点类型*/ { ElemType data; LNode *next; }*Link,*Position; struct LinkList /*链表类型*/ { Link head,tail; int len; }; typedef LinkList EventList; EventList ev; Event en,et; void InitList(LinkList &L) { /*构造一个空的线性表*/ Link p; p=(Link)malloc(sizeof(LNode)); if(p) { p->next=NULL; Lhead=Ltail=p; Llen=0; } else exit(ERROR); } Status DelFirst(LinkList &L,Link h,Link &q) { q=h->next; if(q) /*链表非空*/ { h->next=q->next; if(!h->next) /*删除尾结点*/ Ltail=h; /* 修改尾指针*/ Llen--; return OK; } else return FALSE; } ElemType GetCurElem(Link p) { /*已知P指向线性链表中的一个结点,返回P所指结点中数据元素的值*/ return p->data; } Status ListEmpty(LinkList L) { if(L.len) return FALSE; else return TRUE; } Position GetHead(LinkList L) { /*返回线性链表L中头结点的位置*/ return L.head; } void OrderInsert(LinkList &L,ElemType e,int(*comp)(ElemType,ElemType)) { Link o,p,q; q=Lhead; p=q->next; while(p!=NULL&&comp(p->data,e)<0) /*P不是表尾且元素值小于E*/ { q=p; p=p->next; } o=(Link)malloc(sizeof(LNode)); o->data=e; /*赋值*/ q->next=o; /*插入*/ o->next=p; L.len++; /*表长加一*/ if(!p) /*插在表尾*/ L.tail=o; /*修改尾结点*/ } Queue.h typedef struct { int ArrivalTime; int Duration; /*办理事务所需时间*/ }QElemType; /*定义队列的数据元素类型为结构体类型*/ typedef struct QNode { QElemType data; QNode *next; }*QueuePtr; struct LinkQueue { QueuePtr front,rear; /*队头队尾指针*/ }; void InitQueue(LinkQueue &Q) { /*构造一个空队列Q*/ if(!(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)))) exit(OVERFLOW); Q.front->next=NULL; } void DestroyQueue(LinkQueue &Q) { while(Q.front) { Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear; } } Status QueueEmpty(LinkQueue Q) { if(Q.front->next==NULL) return TRUE; else return FALSE; } int QueueLength(LinkQueue Q) { /*求队列的长度*/ int i=o; QueuePtr p; p=Q.front; while(Q.rear!=p) { i++; p=p->next; } return i; } Status GetHead(LinkQueue Q.QElemType &e) { QueuePtr p; if(Q.front==Q.rear) return ERROR; p=Q.front->next; e=p->data; return OK; } void EnQueue(LinkQueue &Q.QElemType e) { QueuePtr p; if(!(p=(QueuePtr)malloc(sizeof(QNode)))) /*存贮分配失败*/ exit(OVERFLOW); p->data=e; p->next=NULL; Q.rear->next=p; Q.rear=p; } Status DeQueue(LinkQueue &Q.QElemType &e) { QueuePtr p; if(Q.front==Q.rear) return ERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; free(p); return OK; } #include“LinkList.h“ #include“Queue.h“ long int TotalTime=0; /*累计客户逗留时间,初值为0*/ int CloseTime,CustomerNum=0; Main.h LinkQueue q[Qu]; /*客户队列*/ QElemType customer; /*客户记录,临时变量*/ int cmp(Event a,Event b) { if(a.QccurTime==b.QccurTime) return 0; else return(a.OccurTime-b.OccurTime)/abs(a.OccurTime-b.OccurTime); } void OpenForDay() { /*初始化事件链表*/ int i; InitList(ev); en.OccurTime=0; en.NType=Qu; /*到达*/ OrderInsert(ev,en,cmp); for(i=0;i<Qu;++i) InitQueue(q[i]); } void Random(int &d,int &i) { /* 生成两个随机数*/ d=rand()%chuli+1; /*到处理的随机数*/ i=rand()%(jiange+1); /*到间隔之间的随机数*/ } int Minimum(LinkQueue Q[]) { /*返回最短序列的序号*/ int l[Qu]; int i,k=0; for(i=0;i<Qu;i++) l[i]=QueueLength(Q[i]); for(i=1;i<Qu;i++) if(l[i]<l[0]) { l[0]=l[i]; k=i; } return k; } void CustomerArrived() { /*处理客户到达事件*/ QElemType f; int durtime,intertime,i; ++CustomerNum; /*客户数增加1*/ Random(durtime,intertime); et.OccurTime=en.OccurTime+intertime;/*下一客户到达时刻=当前客户的到达时间+时间间隔*/ et.NType=Qu; /*下一客户到达事件*/ i=Minnimum(q); if(et.OccurTime<CloseTime) /*下一客户到达银行还未关门*/ OrderInsert(ev,et,cmp); 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); } } void CustomerDeparture() { /*处理客户离开事件*/ int i; i=en.NType; DeQueue(q[i],customer); /*删除队列排头客户*/ TotalTime+=en.OccurTime-customer.ArrivalTime; if(!QueueEmpty(q[i])) { GetHead(q[i],customer); et.OccurTime=en.OccurTime+customer.Duration; et.NType=i; OrderInsert(ev,et,cmp); } } void Bank_Simulation() { /*银行业务模拟*/ Link p; OpenForDay(); while(!ListEmpty(ev)) { DelFirst(ev,ev,head,p); en.OccurTime=GetCurElem(p).OccurTime; en.NType=GetElem(p).NType; if(en.NType==Qu) /*到达事件*/ CustomerArrived(); else CustomerDeparture(); } printf(“窗口数:%d 两相邻到达的客户时间间隔0~%d分钟 每个客户办理的时间:1~%d分钟\n“,Qu,jiange,chuli); printf(“客户总数:%d\n“,CustomerNum); printf(“所有客户共耗时:%ld分钟\n“,TotalTime); printf(“平均每人耗时:%d分钟\n“,TotalTime/CustomerNum); printf(“最后一个客户离开的时间:%d\n“,en,OccurTime); } void main() { printf(“请输入银行营业时间长度(分):“); scanf(“%d“,&CloseTime); Bank_Simulation(); getchar(); getcher();

Tags: 模拟   离散   银行业务  

搜索
网站分类
标签列表