一、问题描述
问题描述:假设某银行有四个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正空闲,则可上前办理业务,反之,若四个窗口均有客户所占,他便会排在人数最少的队伍后面。现在需要编制程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。
基本要求
(1)初始化(OpenForDay),模拟银行开门时各数据结构的状态。
(2)事件驱动(EventDrived), 对客户到达和离开事件做相应处理。
(3)下班处理(CloseForDay),模拟银行关门时的动作,统计客户平均逗留时间。
二、具体做法与中心思想
1.建立四个队列,每个队列表示一个窗口,一共四个窗口,还使用了一些数组用来储存顾客在银行待的时间,同理全部都是一式四份。
2.使用一个永循环,用次数来终止它,即可以手动输入银行今天的营业时间(如果时间到了银行仍然有顾客,则等这些人办理完业务以后银行再关门),然后用时间做随机数种子,每分钟有百分之30的概率进来顾客,再继续使用时间作为随机数种子,随机生成每位顾客在办理业务时将要花费的时间。(注意当没有窗口空闲时,新进来的顾客将会排到人数最少的队伍后面去)
3.最后通过四个数组来分别记录每个窗口的每一个人进银行的时间以及出银行的时间,相减即为在银行待的时间,最后在银行关门以后计算出平均时间。
三、具体步骤
先建立三个文件,gy.h , gy.cpp , main.cpp,在gy.h文件中定义队列的结构体,声明一些队列的操作函数,比如入队,出队,队伍是否满等等。然后在gy.cpp文件中进行函数具体的定义,最后在main.cpp文件中,构造核心函数:(1)初始化(OpenForDay),模拟银行开门时各数据结构的状态。(2)事件驱动(EventDrived), 对客户到达和离开事件做相应处理。(3)下班处理(CloseForDay),模拟银行关门时的动作,统计客户平均逗留时间。
四、实验代码
gy.h:
#ifndef GY_H_INCLUDED
#define GY_H_INCLUDED
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#include<windows.h>
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;
#define OK 1
#define ERROR 0
//本次实验的核心算法,将通过队列来实现
typedef struct {
ElemType data[MAXSIZE];
int front, rear;
}SqQueue;
void InitQueue(SqQueue &Q);//初始化队列
Status FullQueue(SqQueue Q);//判断队列是否满
Status EmptyQueue(SqQueue Q);//判断队列是否空
Status Push(SqQueue &Q, ElemType x);//元素进队列
Status Pop(SqQueue &Q, ElemType & x);//元素出队列
Status QueueLength(SqQueue Q);//计算队列的长度
#endif // GY_H_INCLUDED
gy.cpp:
#include <iostream>
#include "gy.h"
//构造一个空队列
void InitQueue(SqQueue &Q)
{
Q.front = 0;
Q.rear = 0;
}
//判断队列是否满
Status FullQueue(SqQueue Q)
{
return ((Q.rear)==50);
}
//判断队列是否为空
Status EmptyQueue(SqQueue Q)
{
return (Q.rear==Q.front);
}
//入队列
Status Push(SqQueue &Q, ElemType x)
{
if(Q.rear == MAXSIZE)
return ERROR;
Q.data[Q.rear++] = x;//赋值,然后rear后移
return OK;
}//每一次push完,rear都在最后一个存储数据位置的更高一位
//出队列
Status Pop(SqQueue &Q, ElemType & x)
{
if(Q.front