美文网首页C++
银行排队叫号系统的模拟

银行排队叫号系统的模拟

作者: _RO_CKY_ | 来源:发表于2017-10-09 21:33 被阅读124次

    模拟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();

    }

    相关文章

      网友评论

        本文标题: 银行排队叫号系统的模拟

        本文链接:https://www.haomeiwen.com/subject/adqmyxtx.html