当前位置:首页 >> 工学 >>

数据结构课程设计之银行离散事件模拟


《数据结构》课程设计报告

数据结构课程设计报告

银行业务模拟与离散事件模拟

一、 实验目的
1. 通过此次课程设计中银行业务模拟的题目,掌握队列(或者链表) 等数据 结构的基本操作方面的知识,并能灵活的解决一些基本的问题,加深对其性质及 各项操作的理解; 2. 将所学数据结构方面的知识与一门具体的语言相结合(C/C++)来进行实 现,感受数据结构的强大作用,加深理解。

二、 问题描述
1. 问题描述 假设某银行有 4 个窗口对外接待客户,从早晨银行开门(开门 9:00am,关 门 5:00pm)起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客 户, 因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进入银行的客户 (建议:客户进入时间使用随机函数产生),若某个窗口的业务员正空闲,则上 前办理业务; 反之, 4 个窗口均有窗户所占, 若 他便会排在人数最少的队伍后面。 2. 任务要求 编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的 平均时间。建议有如下设置: (1) 客户到达时间随机产生,一天客户的人数设定为 100 人。 (2) 银行业务员处理时间随机产生,平均处理时间 10 分钟。 (3) 将一天的数据(包括业务员和客户)以文件方式输出。

三、算法的思想与算法实现步骤
1. 基本思想 通过队列数据类型进行基本操作,主要有三个模块:分别是主函数模块、 主要操作函数及基本操作函数。 其中,主函数负责其他子函数的调用实现以及基 本界面的操作,主要函数包括开门函数的实现:OpenForDay,顾客到达函数: CustomerArrived,顾客离开的函数:CustomerDepartion 等;而基本操作函数

1

数据结构课程设计报告 就是对其中牵扯到的操作进行具体的实现,如按时间先后插入队列 OrderInsert、寻求最短的队列 MinCuQueue、删除队列元素以及销毁等。 2. 实现步骤 首先, 分析题目要求划分实现模块、 画出大致的流程图, 定义基本数据类型, 诸如结构体、队列等; 其次,考虑基本大致的操作,比如要拟定开门的时间、顾客到来为其提供服 务以及离开时的操作等; 再次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需 要进行的基本操作,即具体编写每个小函数实现功能; 最后,编写主函数对每个实现进行按需调用,实现操作。 3. 流程图
开始

客户到达

选择服务窗口

是 窗口忙 排队 服务并展开


队列空 队头取客户 窗口闲置 处理并离开



时间到

结束

图-1 事件流程图

2

数据结构课程设计报告

开始

main()

Customerarrive()

进入 or 离开

CutomDepation() ()

队列是否为空

输出结果

结束

图-2

主函数流程图

四、 程序核心代码
#define #define #define #define #define #define OK 1 TRUE 1 FALSE 0 ERROR 0 INFEASIBLE -1 OVERFLOW -2

typedef int Status; //-----------------银行排队模拟 //事件和事件表 typedef struct QCuEvent { int OccurTime; int NType; struct QCuEvent *next; }QCuEvent, *EventList;

3

数据结构课程设计报告
//窗口前队列元素 typedef struct QCuElem { int ArrivalTime; int Duration; struct QCuElem *next; }QCuElem,*QEptr; //窗口指针 typedef struct { QEptr front; QEptr rear; }QCustomerp,*QCupp; //主要操作函数 Status OpenForDay(EventList &ev, QCuEvent en, QCupp &q);//开门 Status CustomerArrived(EventList &ev, QCupp &q, QCuEvent en);//顾客到达 Status CustomerDeparture(EventList &ev, QCupp &q, QCuEvent en);//顾客离开 void CloseForDay(); //基本操作函数 Status OrderInser(EventList &ev, QCuEvent en);//按时间顺序插入事件到事件表 int QLength(QCustomerp qn);//求窗口队列长度 int MinCuQueue(QCupp q);//求队最短的窗口 Status DelFirstEvent(EventList &ev);//删除事件表中的第一个事件 Status InitCuQueue(QCustomerp &qn);//初始化窗口队列 Status EnCuQueue(QCustomerp &qn,QEptr Q);//进入队列 Status DeCuQueue(QCustomerp &qn,QCuElem &Q);//删除队列中的元素 Status GetQHead(QCustomerp qn,QCuElem &Q);//获得队列中的第一个元素 Status DestoryQueue(QCustomerp qn);//销毁队列 void Ptint_QStatus(QCustomerp QCu[]);//打印队列长度 void Bank_SimulationFunc(); void test(char str[]);

#include "stdio.h" #include "stdlib.h" #include "time.h" int int int int i=0,e=0,counter=0; TotalTime=0,CustomerNum=0; //累计客户逗留时间,客户数 CloseTime; //关门时间 windowsnum = 0;4

//主函数 void main() { EventList ev;

// 事件表

4

数据结构课程设计报告
QCuEvent en; QCupp QCu = 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(); } //主要功能子函数 Status OpenForDay(EventList &ev, QCuEvent en, QCupp &q) { int temp = 0; printf("请输入随机数种子(或输入 0 使用随机种子):"); scanf("%d",&temp); if (temp==0) srand((unsigned)time(NULL)); else srand(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 (int i=1;i<=windowsnum;i++) {

5

数据结构课程设计报告
InitCuQueue(q[i]); } return OK; } Status CustomerArrived(EventList &ev, QCupp &q, QCuEvent en) { test("顾客到达处理<<<<<<<<"); CustomerNum ++; // 产生随机数 //srand(54); int durtime = rand()%30+1; int intertime = rand()%5+1; // 插入到达事件表 QCuEvent enTemp; int t = en.OccurTime + intertime; enTemp.OccurTime = t; enTemp.NType = 0; enTemp.next = NULL; if (t < CloseTime) OrderInser(ev, enTemp); printf("时间%d\n",t); // 插入最短队 QEptr Q; Q = (QEptr) malloc(sizeof(QCuElem)); Q->ArrivalTime = en.OccurTime; Q->Duration = durtime; Q->next = NULL; int i = 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); return OK; } Status CustomerDeparture(EventList &ev, QCupp &q, QCuEvent en) { test(">>>>>>>>顾客离开处理"); int i = en.NType; printf("离开时间%d\n",en.OccurTime); if(en.OccurTime>CloseTime) {

6

数据结构课程设计报告
DestoryQueue(q[i]); } else{ QCuElem customer; DeCuQueue(q[i],customer); // 客户逗留时间 TotalTime += en.OccurTime - customer.ArrivalTime; printf("总时间为%d\n",TotalTime); if (q[i].front->next) { GetQHead(q[i],customer); QCuEvent enTemp; enTemp.OccurTime = en.OccurTime + customer.Duration; enTemp.NType = i; OrderInser(ev, enTemp); } } return OK; } void CloseForDay() { printf("***************************************\n"); printf("*\n"); printf("* 所有顾客业务办理总时间:%d 分钟\n", TotalTime); printf("* 业务办理顾客数:%d\n", CustomerNum); printf("* 平均每人办理时间:%f\n",(float)TotalTime/(float)CustomerNum); printf("*\n"); printf("***************************************\n"); } //功能实现子函数 Status OrderInser(EventList &ev, QCuEvent en) { EventList entemp,qtemp; entemp = (EventList) malloc(sizeof(QCuEvent)); entemp->OccurTime = en.OccurTime; entemp->NType = en.NType; entemp->next = NULL; if (!ev->next) { ev->next = entemp; return OK; }

7

数据结构课程设计报告
qtemp = ev; while(qtemp->next&&qtemp->next->OccurTime < en.OccurTime) { qtemp = qtemp->next; } entemp->next = qtemp->next; qtemp->next = entemp; return OK; } int QLength(QCustomerp qn) { QEptr qtemp; int i=0; qtemp = qn.front->next; while(qtemp) { qtemp = qtemp->next; i++; } return i; } int MinCuQueue(QCupp q) { int i,min; for (i=1,min=1;i<=windowsnum;i++) { min = QLength(q[min])<=QLength(q[i]) ? min:i; } return min; } Status DelFirstEvent(EventList &ev) { EventList p; p = ev->next; ev->next = p->next; free(p); return OK; } Status InitCuQueue(QCustomerp &qn) {

8

数据结构课程设计报告
qn.front = (QEptr) malloc(sizeof(QCuElem)); qn.front->next = NULL; qn.rear = qn.front; return OK; } Status EnCuQueue(QCustomerp &qn,QEptr Q) { qn.rear->next = Q; qn.rear = Q; return OK; } Status DeCuQueue(QCustomerp &qn,QCuElem &Q) { QEptr qtemp; 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); return OK; } Status GetQHead(QCustomerp qn,QCuElem &Q) { Q.ArrivalTime = qn.front->next->ArrivalTime; Q.Duration = qn.front->next->Duration; return OK; } Status DestoryQueue(QCustomerp qn) { QEptr p; while(qn.front->next) { p = qn.front->next; qn.front->next = p->next; free(p); } qn.front->next =NULL; qn.rear = qn.front; return OK;

9

数据结构课程设计报告
} void Ptint_QStatus(QCustomerp QCu[]) { int l; for(int i=1;i<=windowsnum;i++) { l = QLength(QCu[i]); printf("队列%d:长%d:",i,l); for (int n=1;n<=l;n++) { printf("@"); } printf("\n"); } } void test(char str[]) { printf("--%s--\n",str); }

五、 程序运行结果

10

数据结构课程设计报告 中间显示部分省略……

六、 实验总结
1. 实验结果分析 利用随机产生的种子进行事件的模拟,即到达时间和办理业务的时间都 是随机产生。 如果事件尚未到达下班时间, 则将其插入到空队列或者是人数 (元 素)最少的队列,通过检验,算出在不同的服务窗口数下的等待时间以及服务 时间,基本上实现了银行事件的模拟。 2. 实验心得体会 数据结构是一门理论性较强且抽象的课程,经过一周的数据结构课程设计, 至今我仍感受颇深,从选题到定稿,从理论到实践,在短短的一周时间里,虽然 时间比较紧, 但我学到了很多以前不知道的东西,同时不仅复习和巩固了以前所 学过的知识, 而且看到了和学到了很多在书本上所没有学到过的知识,使我懂得 了理论必须和实践永远的结合起来,才能有质的飞跃,从而提高自己的实际动手 能力和独立思考的能力。在设计的过程中遇到过很多问题,但我一直坚持着,这 毕竟第一次做的, 难免会遇到过各种各样的问题,同时在设计的过程中发现了自 己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,现在觉 得一定要把以前所学过的知识重新温故。 虽然我的算法不够完好, 还有许多问题,

11

数据结构课程设计报告 但我一定会调试成功的。 最后,感谢李老师本学期来的悉心教导,祝老师身体健康,工作愉快!

参考文献
[1] 张小艳,龚尚福编著. 数据结构与算法. 徐州:中国矿业大学出版社,2007 [2] 严蔚敏,吴伟民编著. 数据结构(C 语言版). 北京: 清华大学出版社,1997 [3] 谭浩强编著. C 程序设计(第三版). 北京: 清华大学出版社,2005

12


相关文章:
报告-银行业务模拟与离散事件模拟
银行业务模拟与离散事件模拟 二、课程设计内容 【问题描述】 假设某银行有 4 ...对于主要数据结构的举例如下: //四个队列(银行窗口) queue<int>q1,q2,q3,q...
银行业务模拟与离散事件
成绩14信计2015-2016(一) 数据结构课程设计 设计题目 设计时间 学生姓名 学生学号 所在班级 指导教师 银行业务模拟离散事件 2016 1.11~2016 1.15 张超 ...
银行业务模拟与离散事件模拟
7 银行业务模拟与离散事件模拟一、系统开发的背景。为了在现实生活中,方便银行...通过此次课程设计银行业务模拟的题目,掌握队列,或链表等数据 结构的基本操作...
数据结构课程设计 银行系统
数据结构课程设计银行模拟... 22页 免费 银行业务模拟 离散事件模拟... 3页 免费 银行排队 11页 免费 C# 银行叫号系统课程设计 23页 免费 银行业务模拟课程设计...
数据结构课程设计银行模拟系统[1]1
银行业务模拟 离散事件模... 8页 免费数​据​结​构​课​程​设...数据结构课程设计报告 班姓 级:软件 092 班 名:余祖彬 学 号: 34 号 指导...
数据结构课程设计实习报告-银行业务模拟
数据结构课程设计实习报告题目: 题目:银行业务模拟班级: 班级:计算机科学技术 2004...工具设计实现一个用事件驱动的银行业务离散模型, 模拟每一个客 户到达银行、...
数据结构与算法--离散事件模拟
数据结构课程设计之银行离... 13页 2财富值 银行业务模拟 离散事件模拟... ...实验报告课程名称:数据结构与算法 实验名称: 离散事件模拟 一、 实验目的 1 掌握...
银行业务模拟课程设计报告
银行客户的离散事件进行预测,通过银行业务模拟系统计算出客户在银行逗留的总时间...安徽新华学院数据结构课程设计报告 题目:银行业务模拟系统 学院:信息工程学院 专业...
对《数据结构》3.5节离散事件模拟例题的解释
对《数据结构》3.5节离散事件模拟例题的解释_理学_高等教育_教育专区。严蔚敏版...这节课主要由一个对有序线性链表和队列应用的实例展开, 题目是关于银行 业务的...
数据结构课设题目
数据结构课程设计-指导书 2016-2017-1 学期 选题三:银行业务模拟与离散事件模拟【问题描述】 假设某银行有 4 个窗口对外接待客户, 从早晨银行开门 (开门 9...
更多相关标签: