1、银行业务模拟与离散事件模拟课程设计 工学系课程设计报告 设 计 题 目:银行业务模拟与离散事件模拟 系 别:工学系 专 业 (方 向): 年 级、 班: 学 生 姓 名: 学 生 学 号: 指 导 教 师: 年 月 日 目录 一、系统开发的背景。 1 (一) 系统功能要求 1 (二) 系统模块结构设计 1 三、系统的设计与实现 2 (一) 开门函数: 3 (二) 顾客到达函数: 5 (三) 顾客离开函数: 6 四、系统测试 7 五、总结 8 六、附件(代码、局部图表) 8 银行业务模拟与离散事件模拟 一、系统开发的背景。 为了在现实生活中,方便银行业务员更好的操作和管理银行出现的各种事件,以及
2、方便算出各种时间,我们设计了银行业务模拟与离散事件模拟系统。 通过此次课程设计中银行业务模拟的题目,掌握队列,或链表等数据结构的根本操作方面的知识并能灵活的解决一些根本的问题,加深对其性质及操作的理解。 将所学数据结构方面的知识与一门具体的语言相结合来进行实现,感受数据结构的强大作用,加深理解。 (一) 系统功能要求 编制一个程序,可以以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间 1、 客户到达时间随机产生,一天客户的人数设定为100人; 2、 银行业务员处理时间随机产生,平均处理时间为10分钟; 3、 将一天的数据结构(包括业务员和客户)以文件方式输出。 . (二) 系统模块
3、结构设计 通过对系统功能的分析,银行业务模拟与离散事件模拟系统功能如以下图所示。 银行业务模拟与离散事件模拟 开门函数 (OpenForday() 顾客到达函数 (CustomerArrived()) 顾客离开函数 (CustomerDeparture() 银行业务模拟与离散事件模拟系统 通过上图的功能分析,把整个系统划分为3个模块: 1、 开门函数,该模块主要实现:银行开始正常营业时间,借助函数OpenForDay()来实现; 2、 顾客到达函数,该模块主要实现:客户在银行里 从排队到办理完银行业务的功能,借助函数CustomerArrive()来实现; 3、 顾客离开函数,该模块主要实现:
4、银行下班时间及顾客全部离开的功能,借助函数CustomerDepart()来实现。 三、系统的设计与实现 【流程图】 客户到达 开始 选择效劳窗口 窗口忙 效劳并展开 链表空 窗口闲置 结束 排队 对头取客户 处理并离开 否 时间到 (一) 开门函数:OpenForDay() 分析:首先输入随机数种子,然后输入银行办理时的根本信息。如以下图所示。 void OpenForDay() /x初始化事件链表x/ int i; InitList(ev); en.OccurTime=0; en.NType=Qu; /x到达x/ OrderInsert(ev,en,cmp); for(i=0;i(二) 顾
5、客到达函数CustomerArrived() 客户到达处理 产生随机数 插入到达事件表 插入最短队 插入离事件 该模块的具体代码如下所示: void CustomerArrived() /x处理客户到达事件x/ QElemType f; int durtime,intertime,i; +CustomerNum; /x客户数增加1x/ Random(durtime,intertime); et.OccurTime=en.OccurTime+intertime;/x下一客户到达时刻=当前客户的到达时间+时间间隔x/ et.NType=Qu; /x下一客户到达事件x/ i=Minnimum(q);
6、 if(et.OccurTimevoid CustomerDeparture() /x处理客户离开事件x/ int i; i=en.NType; DeQueue(qi,customer); /x删除队列排头客户x/ TotalTime+=en.OccurTime-customer.ArrivalTime; if(!QueueEmpty(qi) GetHead(qi,customer); et.OccurTime=en.OccurTime+customer.Duration; et.NType=i; OrderInsert(ev,et,cmp); 四、系统测试 (一) 测试函数 测试该函数使用的
7、测试方法,测试的具体步骤,测试用例的选取,测试的结果。 (二) (三) (四) 五、总结 通过此次实验,熟悉了链表在实际应用中的简单操作,通过实际数产生函数,完成了一系列银行活动的模拟,可以给银行业务的办理提供更大的便利。 实验中,存在问题,在进行了一系列的修改和请教下,解决了问题。 利用随机产生种子进行事件的模拟,即到达和办理业务的时间都是随机产生。如果事件尚未到达下班时间,那么将插入到空列队或者是人数(元素)最少的列队,通过检验,算出在不同效劳窗口数下的等待时间以及效劳时间,根本实现了银行业务的模拟。 六、附件(代码、局部图表) LinkList.h #define Qu 2 #defin
8、e 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; Event,ElemType; typedef struct LNode /x结点类型x/ ElemType data; LNode xnext; xL
9、ink,xPosition; struct LinkList /x链表类型x/ Link head,tail; int len; ; typedef LinkList EventList; EventList ev; Event en,et; void InitList(LinkList &L) /x构造一个空的线性表x/ 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
10、 &q) q=h-next; if(q) /x链表非空x/ h-next=q-next; if(!h-next) /x删除尾结点x/ Ltail=h; /x 修改尾指针x/ Llen-; return OK; else return FALSE; ElemType GetCurElem(Link p) /xP指向线性链表中的一个结点,返回P所指结点中数据元素的值x/ return p-data; Status ListEmpty(LinkList L) if(L.len) return FALSE; else return TRUE; Position GetHead(LinkList L)
11、/x返回线性链表L中头结点的位置x/ return L.head; void OrderInsert(LinkList &L,ElemType e,int(xcomp)(ElemType,ElemType) Link o,p,q; q=Lhead; p=q-next; while(p!=NULL&comp(p-data,e)next; o=(Link)malloc(sizeof(LNode); o-data=e; /x赋值x/ q-next=o; /x插入x/ o-next=p; L.len+; /x表长加一x/ if(!p) /x插在表尾x/ L.tail=o; /x修改尾结点x/ Queu
12、e.h typedef struct int ArrivalTime; int Duration; /x办理事务所需时间x/ QElemType; /x定义队列的数据元素类型为结构体类型x/ typedef struct QNode QElemType data; QNode xnext; xQueuePtr; struct LinkQueue QueuePtr front,rear; /x队头队尾指针x/ ; void InitQueue(LinkQueue &Q) /x构造一个空队列Qx/ if(!(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)
13、 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) /x求队列的长度x/ 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.fr