银行排队叫号系统的模拟

模拟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<iostream>
#include<stdlib.h>
#include<time.h>
#include<queue>
#include<Windows.h>
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<User> 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 << "普通客户 进入排队, 编号:" <<user.userID<< endl;
NormalUserQueue.push(user);
}
else if(user.type==1)
{
cout << "VIP客户  进入排队,  编号:"<<user.userID<<endl;
VIPUserQueue.push(user);
}
else if (user.type == 2)
{
cout << "对公客户 进入排队,  编号:" <<user.userID<< endl;
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();
}

1.问题的定义即分析 银行叫号系统中大概能分成两个对象:一个为来的顾客,一个为银行本身 顾客(Customer)里面需要包含有数据: 【1】每个顾客都应该有一个标签以用来区分,因此需要一个ID(cID) 【2】问题中有求等待的时间,而有关等待时间的两个变量即为进入银行的时间以及接受服务的时间(enterTime和startTime) 【3】由于题目中说明顾客的服务时间不是固定的,因此每个顾客的服务时间又有区别,所以需要有一个变量来进行表示(serTime) 【4】顾客接受服务完后离开的时间(endTime) 综上:Customer中所需要的私有成员有(cID,enterTime,startTime,serTime,endTime) 而Customer的成员函数其实只是对以上数据进行输入输出,所以有成员函数有: 一系列的Set函数,一系列的Get函数,以及构造函数,复制函数,=的重载函数以及Reset函数 银行(bank)里面需要包含的数据: 银行中的人有两种状态,一是等待,二是接受服务,而这等待状态遵循先到先得的原则,因此,采用队列这种结构来表示这些状态比较合适,已经接受过服务的要反复输入输出,用容易遍历的数据类型vector 【1】处于等待状态的人(waiting) 【2】处于服务状态或已经接受过服务的人(serving) 由于经常要对waiting以及serving进行操作,所以不考虑将其作为私有成员(省去了Set以及Get函数) 考虑一下所含有的成员函数:Reset函数(保证银行是空的),Display函数(对已经接受过服务的以及正在服务的顾客进行展示),Assign()(断某个窗口是否是空的利用每次都改变的endTime - startTime == 随机生成的serTime判断 添加功能函数:查看最大等待时间以及其对应的人数的函数Maxwaiting 2.类与算法设计 类设计: class Customer { private: int enterTime; //进入银行的时间 int startTime; //开始服务的时间 int cID; //顾客的编号 int endTime; //顾客停止服务的时间 int serTime; //顾客服务从开始到结束服务所需要的时间(随机的) public: Customer(); //默认构造函数 Customer(const Customer &new;_customer); //复制函数 Customer &operator;=(const Customer&old;_customer); //=重载函数 void Reset(); //重置,将所有数据归零 int GetServDurance(); //返回等待时间 int GetEndTime(); //返回离开银行的时间 int GetSerTime(); //返回接受服务的时间 int GetStartTime();//返回开始接受服务的时间 int GetID(); //返回ID void SetEnterTime(int new_enter); void SetStartTime(int new_start); void SetEndTime(int new_end); void SetID(int new_ID); void SetSerTime(int new_sertime); }; class Bank { public: vector<Customer> serving; //在服务窗口接受过服务的人 queue<Customer> waiting; //在银行内等待的人 bool Assign(Customer customer); //判断第i个窗口的顾客是否服务完成 void Display(); //将在等待的人或者是已经接受了服务的人展示到屏幕上 void MaxWaiting(); void Reset(); }; 算法设计 随机数的产生: 【1】由于需要对过程进行模拟,所以需要一整套的模拟系统,包括产生随机人数,随机服务时间等等 【2】事实上,银行对服务窗口的更新是按照一定的时间(即每隔几秒刷新一次),同样的人也是类似,因此需要几个单位时间已确定进行这些随机事件发生的间隔 几个变量如下: const int UnitTime = 10;//单位时间为10 const int ServTime = 5;//服务时间为5-10 const int UnitTimePeo = 5;//单位时间进来的人数为5-10; const int StopEnterTime = TimeSlot - 2 * UnitTime;//为了保证所有顾客能完成服务,顾客进入的时间为0-80 const int PerTime = 5;//每隔5秒显示一次窗口信息 int TimeOfServing = 0;//随机生成的服务时间(5-10) int Number = 0; //随机生成的人数(5-10) 通过这些变量以及srand((unsigned)time(0)),rand()即可产生一系列的随机数以便进行模拟 过程的模拟 每当产生一系列随机的人,就将他们放进waiting的队列中去,接着遍历各个窗口,若窗口为空,则先来的人可以去那个窗口(即push到serving,pop掉waiting),若不为空,则改变结束时间,之后Present + 1 显示内容:剩余的时间,各窗口的情况,以及已经接受了服务的人的等待时间 注意:该程序为每五刷新一次,每十随机进入一些人
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Rocky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值