<div>//该头文件中存放了所有的变量
#ifndef VARIABLE_H
#define VARIABLE_H
//定义窗口数量
const int Nor_Max = 3;
const int VIP_Max = 1;
const int Offic_Max = 1;
const int ServedTime = 4;
const int SpaceTime = 2;
const int MaxTime = 12;
//用来记录时间,看顾客是否可以入队
int time = 0;
//用来自增来表示当前客户取到的编号
int NumberCount = 0;
//记录当前叫号的窗口信息
int NorWindow = 0;
int VipWindow = 0;
int OfficWindow = 0;
//窗口数量
int WindowNumber = 0;
//改变量用于记录用户的进入信息
int col = 0;
//定义顾客类型
typedef enum Client_Type{
CommonClient, VIPClient, OfficialClient
};
//定义窗口类型
typedef enum Window_Type{
Common_Bank, VIP_Bank, Official_Bank
};
//定义在银行中顾客到场时的场景,即每个2s后,顾客入队的情况,该矩阵在顾客入队时使用
int Staution[7][3] = { { 3, 1, 1 }, { 5, 0, 0 }, { 0, 0, 0 }, { 5, 1, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };
#endif
//头文件
#ifndef USER_H
#define USER_H
#include
#include"Variable.h"
using namespace std;
//定义每个客户需要被服务的时间
const int ClientNeedTime = 4;
class User{
public:
int Id;//顾客叫到的号码
int isWait;
int ArrayTime;//到达的时间
//应为该程序已经固定每个客户被服务的时间为4s,所以在这里不需要为每个客户固定他们被服务的时间
public:
int ServeTime;//顾客已被服务的时间
Client_Type type;//顾客类型
public:
//该函数的作用是如果客户不满足推队条件,则窗口将继续为客户服务
void getServed(){
}
};
#endif
#ifndef VIPUSER_H
#define VIPUSER_H
#include"User.h"
class VIPUser:public User{
public:
void getServed();
};
void VIPUser::getServed()
{
cout << "VIP" << Id << "用户正在接受服务" << endl;
}
#endif
#ifndef OFFICIALUSER_H
#define OFFICIALUSER_H
#include"User.h"
class OfficialUser :public User{
public:
void getServed();
};
void OfficialUser::getServed()
{
cout << "政府" << Id << "用户正在接受服务" << endl;
}
#endif
#ifndef NORMALUSER_H
#define NORMALUSER_H
#include"User.h"
class NormalUser :public User{
public:
void getServed();
};
void NormalUser::getServed()
{
cout <<"普通"<< Id << "用户正在接受服务" << endl;
}
#endif
#ifndef BANKWINDOW_H
#define BANKWINDOW_H
#include"User.h"
#include"Variable.h"
#include
using namespace std;
class BankWindow{
public:
bool isBusy;//是否处于服务状态
int Id;//窗口号
User client;//当前服务顾客
Window_Type type;//窗口类型
public:
//该函数的作用是为主要负责将用户弹出链表队列
void HandleUser();
};
void BankWindow::HandleUser()
{
}
#endif
#ifndef NORMALBANKWINDOW_H
#define NORMALBANKWINDOW_H
#include"BankWindow.h"
#include"Simulater.h"
class NormalBankWindow:public BankWindow{
public:
void HandleUser();
};
void NormalBankWindow::HandleUser()
{
cout << "普通窗口" << Id << "正在对用户" << client.Id << "进行服务" << endl;
}
#endif
#ifndef OFFICIALBANKWINDOW_H
#define OFFICIALBANKWINDOW_H
#include"BankWindow.h"
class OfficialBankWindow :public BankWindow{
public:
void HandleUser();
};
void OfficialBankWindow::HandleUser()
{
cout << "政府窗口" << Id << "正在对用户" << client.Id << "进行服务" << endl;
}
#endif
#ifndef VIPBANKWINDOW_H
#define VIPBANKWINDOW_H
#include"BankWindow.h"
class VIPBankWindow :public BankWindow{
public:
void HandleUser();
};
void VIPBankWindow::HandleUser()
{
cout << "VIP窗口" << Id << "正在对用户" << client.Id << "进行服务" << endl;
}
#endif
#ifndef SIMULATER_H
#define SIMULATER_H
#include
#include
#include
#include"NormalBankWindow.h"
#include"OfficialBankWindow.h"
#include"VIPBankWindow.h"
#include"VIPUser.h"
#include"NormalUser.h"
#include"OfficialUser.h"
#include"LinkList.h"
#include"Variable.h"
using namespace std;
class Simulater{
private:
//普通窗口3个,VIP窗口一个,对公窗口1个
NormalBankWindow NorBankWin[Nor_Max];
VIPBankWindow VIPBankWin[VIP_Max];
OfficialBankWindow OfficBankWin[Offic_Max];
public:
//利用顺序栈来存放不同用户类型的顾客
queue
Normal; queue
VIP; queue
Official; //用链表形式的队列来存放窗口出的人 LinkList
NorBank; LinkList
VIPBank; LinkList
OffBank; public: //我希望在构造函数中实现,生成窗口队列的功能 Simulater(); //该函模拟了全过程 void Simulate(); //顾客入队,该函数处理一开始定义的矩阵 void customerEnter(); //顾客入银行处理队列 void simulaterCustomerEnter(); //呼叫用户 void simulaterCallCustomer(); }; Simulater::Simulater() { //窗口如窗口的队伍 //将窗口入队,并将窗口的初始状态设置为不忙碌,并设置窗口的类型,设置窗口类型的主要作用是分班当VIP用户出现是的操作 for (int i = 0; i < Nor_Max; i++) { WindowNumber++; NorBank.Push(NorBankWin[i]); NorBankWin[i].Id = WindowNumber; NorBankWin[i].isBusy = false; NorBankWin[i].type = Common_Bank; } for (int i = 0; i < VIP_Max; i++) { WindowNumber++; VIPBank.Push(VIPBankWin[i]); VIPBankWin[i].Id = WindowNumber; VIPBankWin[i].isBusy = false; VIPBankWin[i].type = VIP_Bank; } for (int i = 0; i < Offic_Max; i++) { WindowNumber++; OffBank.Push(OfficBankWin[i]); OfficBankWin[i].Id = WindowNumber; OfficBankWin[i].isBusy = false; OfficBankWin[i].type = Official_Bank; } } //该函数的作用是将客户从顾客队里剔除,即队列长度减一 void Simulater::simulaterCustomerEnter() { //首先判断是那种顾客,在将相应的顾客队列的头元素弹出 //该函数一次只能处理一名顾客 for (int i = 0; i < Nor_Max; i++) { if (NorBankWin[i].isBusy == false&&!Normal.empty()) { NorBankWin[i].client = Normal.front(); /*Normal.front().getServed();*/ NorBankWin[i].isBusy = true; Normal.pop(); } } for (int i = 0; i < VIP_Max; i++) { if (VIPBankWin[i].isBusy == false && (!VIP.empty() || !Normal.empty())) { if (!VIP.empty()) { VIPBankWin[i].client = VIP.front(); /*VIP.front().getServed();*/ VIPBankWin[i].isBusy = true; VIP.pop(); } else { VIPBankWin[i].client = Normal.front(); /*Normal.front().getServed();*/ VIPBankWin[i].isBusy = true; Normal.pop(); } } } for (int i = 0; i < Offic_Max; i++) { if (OfficBankWin[i].isBusy == false && (!Official.empty() || !Normal.empty())) { if (!Official.empty()) { OfficBankWin[i].client = Official.front(); /*Official.front().getServed();*/ OfficBankWin[i].isBusy = true; Official.pop(); } else { OfficBankWin[i].client = Normal.front(); /*Normal.front().getServed();*/ OfficBankWin[i].isBusy = true; Normal.pop(); } } } } //模拟主结构,该函数的功能已经完成 void Simulater::Simulate() { //下面是正式的开始模拟银行的工作行为 while (time
</div>