模擬20秒的輸出結果:
--------模擬開始--------
初始化用戶:
普通客戶 進入排隊, 編號:1000
VIP客戶 ?進入排隊, ?編號:1001
普通客戶 進入排隊, 編號:1002
普通客戶 進入排隊, 編號:1003
VIP客戶 ?進入排隊, ?編號:1004
VIP客戶 ?進入排隊, ?編號:1005
VIP客戶 ?進入排隊, ?編號:1006
對公客戶 進入排隊, ?編號:1007
普通客戶 進入排隊, 編號:1008
VIP客戶 ?進入排隊, ?編號:1009
普通客戶 編號為: 1000 請進入0號普通窗口服務
普通客戶 編號為: 1002 請進入1號普通窗口服務
普通客戶 編號為: 1003 請進入2號普通窗口服務
VIP客戶 ?編號為: 1001 請進入3號VIP窗口服務
對公客戶 編號為: 1007 請進入4號對公窗口服務
-當前模擬時間:0s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1000
窗口號:1 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1002
窗口號:2 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1003
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1001
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1007
-當前模擬時間:1s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1000
窗口號:1 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1002
窗口號:2 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1003
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1001
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1007
-當前模擬時間:2s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1000
窗口號:1 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1002
窗口號:2 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1003
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1001
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1007
VIP客戶 ?進入排隊, ?編號:1010
-當前模擬時間:3s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1000
窗口號:1 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1002
窗口號:2 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1003
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1001
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1007
對公客戶 進入排隊, ?編號:1011
-當前模擬時間:4s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1000
窗口號:1 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1002
窗口號:2 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1003
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1001
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1007
對公客戶 進入排隊, ?編號:1012
-當前模擬時間:5s -
窗口號:0 ? -等待服務-
窗口號:1 ? -等待服務-
窗口號:2 ? -等待服務-
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1001
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1007
普通客戶 編號為: 1008 請進入0號普通窗口服務
普通客戶 進入排隊, 編號:1013
-當前模擬時間:6s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1008
窗口號:1 ? -等待服務-
窗口號:2 ? -等待服務-
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1001
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1007
普通客戶 編號為: 1013 請進入1號普通窗口服務
普通客戶 進入排隊, 編號:1014
-當前模擬時間:7s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1008
窗口號:1 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1013
窗口號:2 ? -等待服務-
窗口號:3 ? -等待服務-
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1007
普通客戶 編號為: 1014 請進入2號普通窗口服務
VIP客戶 ?編號為: 1004 請進入3號VIP窗口服務
普通客戶 進入排隊, 編號:1015
-當前模擬時間:8s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1008
窗口號:1 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1013
窗口號:2 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1014
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1004
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1007
VIP客戶 ?進入排隊, ?編號:1016
-當前模擬時間:9s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1008
窗口號:1 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1013
窗口號:2 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1014
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1004
窗口號:4 ? -等待服務-
對公客戶 編號為: 1011 請進入4號對公窗口服務
VIP客戶 ?進入排隊, ?編號:1017
-當前模擬時間:10s -
窗口號:0 ? -等待服務-
窗口號:1 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1013
窗口號:2 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1014
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1004
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1011
普通客戶 編號為: 1015 請進入0號普通窗口服務
普通客戶 進入排隊, 編號:1018
-當前模擬時間:11s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1015
窗口號:1 ? -等待服務-
窗口號:2 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1014
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1004
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1011
普通客戶 編號為: 1018 請進入1號普通窗口服務
VIP客戶 ?進入排隊, ?編號:1019
-當前模擬時間:12s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1015
窗口號:1 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1018
窗口號:2 ? -等待服務-
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1004
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1011
普通客戶 進入排隊, 編號:1020
-當前模擬時間:13s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1015
窗口號:1 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1018
窗口號:2 ? -等待服務-
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1004
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1011
普通客戶 編號為: 1020 請進入2號普通窗口服務
普通客戶 進入排隊, 編號:1021
-當前模擬時間:14s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1015
窗口號:1 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1018
窗口號:2 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1020
窗口號:3 ? -等待服務-
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1011
VIP客戶 ?編號為: 1005 請進入3號VIP窗口服務
對公客戶 進入排隊, ?編號:1022
-當前模擬時間:15s -
窗口號:0 ? -等待服務-
窗口號:1 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1018
窗口號:2 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1020
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1005
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1011
普通客戶 編號為: 1021 請進入0號普通窗口服務
對公客戶 進入排隊, ?編號:1023
-當前模擬時間:16s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1021
窗口號:1 ? -等待服務-
窗口號:2 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1020
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1005
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1011
VIP客戶 ?進入排隊, ?編號:1024
-當前模擬時間:17s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1021
窗口號:1 ? -等待服務-
窗口號:2 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1020
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1005
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1011
對公客戶 進入排隊, ?編號:1025
-當前模擬時間:18s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1021
窗口號:1 ? -等待服務-
窗口號:2 ? -等待服務-
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1005
窗口號:4 ? -等待服務-
對公客戶 編號為: 1012 請進入4號對公窗口服務
對公客戶 進入排隊, ?編號:1026
-當前模擬時間:19s -
窗口號:0 ? -正在服務- ?客戶類型: 普通 ?客戶編號: 1021
窗口號:1 ? -等待服務-
窗口號:2 ? -等待服務-
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1005
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1012
VIP客戶 ?進入排隊, ?編號:1027
-當前模擬時間:20s -
窗口號:0 ? -等待服務-
窗口號:1 ? -等待服務-
窗口號:2 ? -等待服務-
窗口號:3 ? -正在服務- ?客戶類型: VIP ? 客戶編號: 1005
窗口號:4 ? -正在服務- ?客戶類型: 對公 ?客戶編號: 1012
普通客戶 進入排隊, 編號:1028
#include
#include
#include
#include
#include
using namespace std;
class User
{
public:
int userID;
int type;//0為普通用戶,1為VIP用戶,2為對公用戶.
User() { type = 0; userID = 1000; }
User(int t, int id) { userID = id, type = t; }
};
class BankWindow
{
public:
int id;//0,1,2,為普通窗口,3為VIP窗口,4為對公窗口.
bool isBusy;
User client;
int serviceStartTime=0;
BankWindow() { isBusy = false; }
BankWindow(int i) ?{ id = i; isBusy = false; }
};
class Simulater
{
private:
int serviceTime[3] = {4,6,8};
int initID = 1000;
BankWindow bankWindow0;
BankWindow bankWindow1;
BankWindow bankWindow2;
BankWindow bankWindow3;
BankWindow bankWindow4;
queue NormalUserQueue, VIPUserQueue, OfficialUserQueue;
public:
Simulater()
{
bankWindow0.id = 0;
bankWindow1.id = 1;
bankWindow2.id = 2;
bankWindow3.id = 3;
bankWindow4.id = 4;
srand(unsigned(time(0)));
}
void enterQueue(User user)
{
if (user.type == 0)
{
cout << "普通客戶 進入排隊, 編號:" <
NormalUserQueue.push(user);
}
else if(user.type==1)
{
cout << "VIP客戶 ?進入排隊, ?編號:"<
VIPUserQueue.push(user);
}
else if (user.type == 2)
{
cout << "對公客戶 進入排隊, ?編號:" <
OfficialUserQueue.push(user);
}
else
{
cout << "用戶類型出錯!";
}
}
void output(User user)
{
if (user.type == 0)
{
cout << "普通客戶 " << "編號為: " << user.userID;
}
else if (user.type == 1)
{
cout << "VIP客戶 " << " 編號為: " << user.userID;
}
else if (user.type == 2)
{
cout << "對公客戶 " << "編號為: " << user.userID;
}
else
{
cout << "用戶類型錯誤!" << endl;
}
}
void output2(User user)
{
if (user.type == 0)
{
cout << " ?客戶類型: " << "普通 ?"<< "客戶編號: " << user.userID;
}
else if (user.type == 1)
{
cout << " ?客戶類型: " << "VIP ? " << "客戶編號: " << user.userID;
}
else if (user.type == 2)
{
cout << " ?客戶類型: " << "對公 ?" << "客戶編號: " << user.userID;
}
else
{
cout << " ?用戶類型錯誤!" << endl;
}
}
void enterWindow(int time)
{
if (bankWindow0.isBusy == false && !NormalUserQueue.empty())
{
bankWindow0.client = NormalUserQueue.front();
output(bankWindow0.client);
cout<<" 請進入0號普通窗口服務" << endl;
bankWindow0.isBusy = true;
bankWindow0.serviceStartTime = time;
NormalUserQueue.pop();
}
if (bankWindow1.isBusy == false && !NormalUserQueue.empty())
{
bankWindow1.client = NormalUserQueue.front();
output(bankWindow1.client);
cout << " 請進入1號普通窗口服務" << endl;
bankWindow1.isBusy = true;
bankWindow1.serviceStartTime = time;
NormalUserQueue.pop();
}
if (bankWindow2.isBusy == false && !NormalUserQueue.empty())
{
bankWindow2.client = NormalUserQueue.front();
output(bankWindow2.client);
cout << " 請進入2號普通窗口服務" << endl;
bankWindow2.isBusy = true;
bankWindow2.serviceStartTime = time;
NormalUserQueue.pop();
}
if (bankWindow3.isBusy == false)
{
if (!VIPUserQueue.empty())
{
bankWindow3.client = VIPUserQueue.front();
bankWindow3.isBusy = true;
bankWindow3.serviceStartTime = time;
VIPUserQueue.pop();
}
else if (!NormalUserQueue.empty())
{
bankWindow3.client = NormalUserQueue.front();
bankWindow3.isBusy = true;
bankWindow3.serviceStartTime = time;
NormalUserQueue.pop();
}
else
{
}
output(bankWindow3.client);
cout << " 請進入3號VIP窗口服務" << endl;
}
if (bankWindow4.isBusy == false)
{
if (!OfficialUserQueue.empty())
{
bankWindow4.client = OfficialUserQueue.front();
bankWindow4.isBusy = true;
bankWindow4.serviceStartTime = time;
OfficialUserQueue.pop();
}
else if (!NormalUserQueue.empty())
{
bankWindow4.client = NormalUserQueue.front();
bankWindow4.isBusy = true;
bankWindow4.serviceStartTime = time;
NormalUserQueue.pop();
}
else {}
output(bankWindow4.client);
cout << " 請進入4號對公窗口服務" << endl;
}
}
void display(int time)
{
cout << "-當前模擬時間:" << time << "s -" << endl;
windowCondition(bankWindow0);
windowCondition(bankWindow1);
windowCondition(bankWindow2);
windowCondition(bankWindow3);
windowCondition(bankWindow4);
}
void customerEnter()
{
int type = rand() % 12;//不同概率生成用戶.
if (type >= 0 && type <= 5)
{
User u(0, initID);
enterQueue(u);
}
if (type >= 6 && type <= 9)
{
User u(1, initID);
enterQueue(u);
}
if (type >= 10 && type <= 11)
{
User u(2, initID);
enterQueue(u);
}
initID++;
}
void windowCondition(BankWindow bankWindow)
{
cout << "窗口號:" << bankWindow.id<<" ? ";
if (bankWindow.isBusy == true)
{
cout << "-正在服務-";
output2(bankWindow.client);
}
else
{
cout << "-等待服務-";
}
cout << endl;
}
void isBusy(int time)//掃描一遍窗口,檢測服務是否結束
{
if (bankWindow0.isBusy == true)
{
if (time - bankWindow0.serviceStartTime >= serviceTime[bankWindow0.client.type])
{
bankWindow0.isBusy = false;
}
}
if (bankWindow1.isBusy == true)
{
if (time - bankWindow1.serviceStartTime >= serviceTime[bankWindow1.client.type])
{
bankWindow1.isBusy = false;
}
}
if (bankWindow2.isBusy == true)
{
if (time - bankWindow2.serviceStartTime >= serviceTime[bankWindow2.client.type])
{
bankWindow2.isBusy = false;
}
}
if (bankWindow3.isBusy == true)
{
if (time - bankWindow3.serviceStartTime >= serviceTime[bankWindow3.client.type])
{
bankWindow3.isBusy = false;
}
}
if (bankWindow4.isBusy == true)
{
if (time - bankWindow4.serviceStartTime >= serviceTime[bankWindow4.client.type])
{
bankWindow4.isBusy = false;
}
}
}
void simulate()
{
int time = 0;
cout << "--------模擬開始--------" << endl;
cout << "初始化用戶:" << endl;
for (int i = 0; i < 10; i++)
{
customerEnter();
}
enterWindow(time);
while (1)
{
display(time);
enterWindow(time);
isBusy(time);
if (time/2 != 0)
{
customerEnter();//沒間隔兩秒進入一位客戶.
}
Sleep(1000);
time++;
if (time == 21)
{
getchar();
}
}
}
};
int main()
{
Simulater simulater;
simulater.simulate();
}