C++銀行排隊叫號系統 -隊列-大連理工大學-數據結構-上機作業


#include <stdlib.h>
#include <iostream>
#include <queue>
#include <list>

using namespace std;


class User
{
public:
    User();
    User(int id,bool isWait,int ArriveTime,wchar_t type,int ServerTime)
        :id(id),isWait(isWait),ArriveTime(ArriveTime),type(type),ServerTime(ServerTime){};
    ~User(){};

    virtual void getServed();
public:
    int id;
    int isWait;
    int ArriveTime;
    wchar_t type;
private:
    int ServerTime;

};

class NormalUser: public User{
public:
    NormalUser(int id,bool isWait,int ArriveTime,wchar_t type,int ServerTime)
        :User(id,isWait,ArriveTime,type,ServerTime){};
    void getServed();
};

class VIPUser: public User{
public:
    VIPUser(int id,bool isWait,int ArriveTime,wchar_t type,int ServerTime)
        :User(id,isWait,ArriveTime,type,ServerTime){};
    void getServed();
};

class OfficialUser: public User{
public:
    OfficialUser(int id,bool isWait,int ArriveTime,wchar_t type,int ServerTime)
        :User(id,isWait,ArriveTime,type,ServerTime){};
    void getServed();
};

void User::getServed(){
    if(type=='n'){
        cout<<endl<<endl<<"---普通用戶"<<id<<" 服務完畢!---"<<endl;
    }
    if(type=='v'){
        cout<<endl<<endl<<"--- VIP用戶"<<id<<" 服務完畢!---"<<endl;
    }
    if(type=='o'){
        cout<<endl<<endl<<"---對公用戶"<<id<<" 服務完畢!---"<<endl;
    }
}

void NormalUser::getServed(){
    cout<<endl<<endl<<"---普通用戶"<<id<<" 服務完畢!---"<<endl;
}

void VIPUser::getServed(){
    cout<<endl<<endl<<"--- VIP用戶"<<id<<" 服務完畢!---"<<endl;
}

void OfficialUser::getServed(){
    cout<<endl<<endl<<"---對公用戶"<<id<<" 服務完畢!---"<<endl;
}


class BankWindow
{
public:
    BankWindow(){};
    BankWindow(bool isBusy,int id,wchar_t type)
        :isBusy(isBusy),id(id),type(type){};
    ~BankWindow(){};

    bool isBusy;
    int id;
    User *client;
    wchar_t type;
    int serviceStartTime;

    virtual void HandleUser();
};

class NormalBankWindow: public BankWindow{
public:
    NormalBankWindow(bool isBusy,int id,wchar_t type)
        :BankWindow(isBusy,id,type){};
    void HandleUser();
};

class VIPBankWindow: public BankWindow{
public:
    VIPBankWindow(bool isBusy,int id,wchar_t type)
        :BankWindow(isBusy,id,type){};
    void HandleUser();
};

class OfficialBankWindow: public BankWindow{
public:
    OfficialBankWindow(bool isBusy,int id,wchar_t type)
        :BankWindow(isBusy,id,type){};
    void HandleUser();
};

void BankWindow::HandleUser(){
    cout<<endl<<"BankWindow handle user."<<endl;
}

void NormalBankWindow::HandleUser(){
    cout<<endl<<"---"<<this->id<<"號窗口 接收 用戶"<<client->id<<"---"<<endl<<endl;
}

void VIPBankWindow::HandleUser(){
    cout<<endl<<"---"<<this->id<<"號窗口 接收 用戶"<<client->id<<"---"<<endl<<endl;
}

void OfficialBankWindow::HandleUser(){
    cout<<endl<<"---"<<this->id<<"號窗口 接收 用戶"<<client->id<<"---"<<endl<<endl;
}

class Simulater
{
public:
    Simulater(){};
    ~Simulater(){};

    queue<NormalUser> NormalUserQueue;
    queue<VIPUser> VIPUserQueue;
    queue<OfficialUser> OfficialUserQueue;

    list<NormalBankWindow> nbw;
    list<VIPBankWindow> vbw;
    list<OfficialBankWindow> obw;

    void customerEnter();
    void simulateCustomerEnter();
    void simulateCallCustomer();
    void Simulate();

    void display();
};

int t=0;
bool Flag=false;
int customerEnterMatrix[9][3]={
    {3,1,1},
    {5,0,0},
    {0,0,0},
    {5,1,0},
    {0,0,0},
    {0,0,0},
    {0,0,0},
    {0,0,0},
    {0,0,0}
};

void Simulater::customerEnter(){//模擬用戶入隊
    static int h=1001;
    int i=0,j=0,k=0;
    i=customerEnterMatrix[t/2][0];
    j=customerEnterMatrix[t/2][1];
    k=customerEnterMatrix[t/2][2];
    for(int n=0;n<i;n++){
        NormalUserQueue.push(NormalUser(h++,true,t,'n',0));
        cout << "普通客戶 進入排隊,  編號:" <<NormalUserQueue.back().id<< endl;
    }
    for(int n=0;n<j;n++){
        VIPUserQueue.push(VIPUser(h++,true,t,'v',0));
        cout << "VIP客戶  進入排隊,  編號:"<<VIPUserQueue.back().id<<endl;
    }
    for(int n=0;n<k;n++){
        OfficialUserQueue.push(OfficialUser(h++,true,t,'o',0));
        cout << "對公客戶 進入排隊,  編號:" <<OfficialUserQueue.back().id<< endl;
    }
}

void Simulater::simulateCustomerEnter(){//銀行處理用戶序列
    //普通用戶窗口
    list<NormalBankWindow>::iterator itor;
    itor=nbw.begin();
    while(itor!=nbw.end()){
        cout <<"窗口號:"<<itor->id;
        if (itor->isBusy == true){
            cout<< "  -正在服務-  "<< " 窗口類型: " << "普通 "<< "客戶編號: " << itor->client->id;
            if (t - itor->serviceStartTime >= 4){
                itor->client->getServed();
                Flag=true;
                itor->isBusy = false;//將當前位置的User清空
            }
        }
        else{
            cout << "  -等待服務-  ";
        }
        cout<<endl;
        itor++;
    }
    //VIP用戶窗口
    cout <<"窗口號:"<<vbw.begin()->id;
    if (vbw.begin()->isBusy == true){
        cout<< "  -正在服務-  "<< " 窗口類型: " << " VIP "<< "客戶編號: " << vbw.begin()->client->id;
        if (t - vbw.begin()->serviceStartTime >= 4){
            vbw.begin()->client->getServed();
            Flag=true;
            vbw.begin()->isBusy = false;//將當前位置的User清空
        }
    }
    else{
        cout << "  -等待服務-  ";
    }
    cout<<endl;
    //對公用戶窗口
    cout <<"窗口號:"<<obw.begin()->id;
    if (obw.begin()->isBusy == true){
        cout<< "  -正在服務-  "<< " 窗口類型: " << "對公 "<< "客戶編號: " << obw.begin()->client->id;
        if (t - obw.begin()->serviceStartTime >= 4){
            obw.begin()->client->getServed();
            Flag=true;
            obw.begin()->isBusy = false;//將當前位置的User清空
        }
    }
    else{
        cout << "  -等待服務-  ";
    }
    cout<<endl;

}
//銀行處理的時間是4秒,占兩個周期
void Simulater::simulateCallCustomer(){//呼叫用戶,從隊列里面呼叫
    //普通用戶窗口
    list<NormalBankWindow>::iterator itor;
    itor=nbw.begin();
    while(itor!=nbw.end()){
        if (itor->isBusy == false && !NormalUserQueue.empty()){
            itor->client = &NormalUserQueue.front();
            cout<<itor->client->id<<", 請進入"<<itor->id<<"號普通窗口服務" ;
            itor->HandleUser();
            itor->isBusy = true;
            itor->serviceStartTime = t;
            NormalUserQueue.pop();
        }
        itor++;
    }
    //VIP用戶窗口
    if (vbw.begin()->isBusy == false){
        if (!VIPUserQueue.empty()){
            vbw.begin()->client = &VIPUserQueue.front();
            vbw.begin()->isBusy = true;
            vbw.begin()->serviceStartTime = t;
            VIPUserQueue.pop();
            cout <<vbw.begin()->client->id<< ", 請進入3號VIP窗口服務" ;
            vbw.begin()->HandleUser();
        }
        else if (!NormalUserQueue.empty()){
            vbw.begin()->client = &NormalUserQueue.front();
            vbw.begin()->isBusy = true;
            vbw.begin()->serviceStartTime = t;
            NormalUserQueue.pop();
            cout <<vbw.begin()->client->id<< ", 請進入3號VIP窗口服務" ;
            vbw.begin()->HandleUser();
        }
        else{}
    }
    //對公用戶窗口
    if (obw.begin()->isBusy == false){
        if (!OfficialUserQueue.empty()){
            obw.begin()->client = &OfficialUserQueue.front();
            obw.begin()->isBusy = true;
            obw.begin()->serviceStartTime = t;
            OfficialUserQueue.pop();
            cout <<obw.begin()->client->id<< ", 請進入4號對公窗口服務" ;
            obw.begin()->HandleUser();
        }
        else if (!NormalUserQueue.empty()){
            obw.begin()->client = &NormalUserQueue.front();
            obw.begin()->isBusy = true;
            obw.begin()->serviceStartTime = t;
            NormalUserQueue.pop();
            cout <<obw.begin()->client->id<< ", 請進入4號對公窗口服務" ;
            obw.begin()->HandleUser();
        }
        else {}
    }
}

void Simulater::Simulate(){
    nbw.push_back(NormalBankWindow(false,0,' '));
    nbw.push_back(NormalBankWindow(false,1,' '));
    nbw.push_back(NormalBankWindow(false,2,' '));
    vbw.push_back(VIPBankWindow(false,3,' '));
    obw.push_back(OfficialBankWindow(false,4,' '));
    cout << "------------------------模  擬  開  始---------------------" << endl;

    while(t<=16){//模擬時間是否結束
        cout<<""<<t<<"s時 :"<<endl;
        customerEnter();
        simulateCallCustomer();
        simulateCustomerEnter();
        if(Flag){
            Flag=false;
            //customerEnter();
            simulateCallCustomer();
            simulateCustomerEnter();
        }
        cout<<endl<<"**********************************************************"<<endl;

        //時間增加
        t+=2;
    }

}

int main(){
    Simulater SSS;
    SSS.Simulate();
    return 0;
}

 整個程序的框架是根據書上的程序框圖來的,測試用例也是。

歡迎debug~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM