#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~