数据结构课程设计之银行离散事件模拟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》课程设计报告
银行业务模拟与离散事件模拟
一、实验目的
1. 通过此次课程设计中银行业务模拟的题目,掌握队列(或者链表) 等数据结构的基本操作方面的知识,并能灵活的解决一些基本的问题,加深对其性质及各项操作的理解;
2. 将所学数据结构方面的知识与一门具体的语言相结合(C/C++)来进行实现,感受数据结构的强大作用,加深理解。
二、问题描述
1.问题描述
假设某银行有4个窗口对外接待客户,从早晨银行开门(开门9:00am,关门5:00pm)起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进入银行的客户(建议:客户进入时间使用随机函数产生),若某个窗口的业务员正空闲,则上前办理业务;反之,若4个窗口均有窗户所占,他便会排在人数最少的队伍后面。
2. 任务要求
编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。建议有如下设置:
(1)客户到达时间随机产生,一天客户的人数设定为100人。
(2)银行业务员处理时间随机产生,平均处理时间10分钟。
(3)将一天的数据(包括业务员和客户)以文件方式输出。
三、算法的思想与算法实现步骤
1. 基本思想
通过队列数据类型进行基本操作,主要有三个模块:分别是主函数模块、
主要操作函数及基本操作函数。其中,主函数负责其他子函数的调用实现以及基本界面的操作,主要函数包括开门函数的实现:OpenForDay,顾客到达函数:CustomerArrived,顾客离开的函数:CustomerDepartion等;而基本操作函数
就是对其中牵扯到的操作进行具体的实现,如按时间先后插入队列OrderInsert、寻求最短的队列MinCuQueue、删除队列元素以及销毁等。
2. 实现步骤
首先,分析题目要求划分实现模块、画出大致的流程图,定义基本数据类型,诸如结构体、队列等;
其次,考虑基本大致的操作,比如要拟定开门的时间、顾客到来为其提供服务以及离开时的操作等;
再次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能;
最后,编写主函数对每个实现进行按需调用,实现操作。
3. 流程图
图-1 事件流程图
图-2 主函数流程图
四、程序核心代码
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
//-----------------银行排队模拟
//事件和事件表
typedef struct QCuEvent
{
int OccurTime;
int NType;
struct QCuEvent *next;
}QCuEvent, *EventList;
//窗口前队列元素
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 i=0,e=0,counter=0;
int TotalTime=0,CustomerNum=0; //累计客户逗留时间,客户数
int CloseTime; //关门时间
int windowsnum = 0;4
//主函数
void main() {
EventList ev; // 事件表