使用C++实现银行排队叫号系统
1|0模拟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
1|1源代码
#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();
}
__EOF__

本文作者:Rocky
本文链接:https://www.cnblogs.com/nrocky/p/15229971.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/nrocky/p/15229971.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了