问题及代码:
/* 版权所有 (C)DWW 文件名称:银行业务的模拟系统.cpp 内容摘要:银行排队办理业务 作者:杜文文 完成日期:2015 年12月 25日 */
<pre name="code" class="cpp">#include <iostream> #include <queue>//队列的头文件 #include <stdlib.h>//C语言标准的包含库头文件 #include <stdio.h> #include <time.h> #include <ctime> #include "windows.h"//WINDOWS.H是一个最重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件。 using namespace std; int AverageTime;//平均时间 /* *************************************************************** 功能描述:输出主要界面 输入参数:无 输出参数:标题 时间 单位时间 当前时间 其他说明:服务时间为0-100 *************************************************************** */ void DisplayWindows(int presenttime,int servingtime, int waittime)//现在的时间;服务的时间;等待的时间 { cout<<"************银行业务的模拟系统*************"<<endl; cout<<" "<<endl; cout<<"***********银行服务时间0--"<<servingtime<<"************"<<endl; cout<<" "<<endl; cout<<"**该系统每隔"<<waittime<<"单位个时间显示窗口信息****"<<endl; cout<<" "<<endl; cout<<"当前时间为"<<presenttime<<""<<endl; } /* *************************************************************** 功能描述:顾客信息 输入参数:无 输出参数:顾客服务的时间 顾客等待的时间 顾客进去的时间 其他说明:id从0开始 *************************************************************** */ class Customer//顾客信息 { public: Customer() { ServTime=0; enterTime=0; startTime=0; cID=0; endTime=0; } void Reset() { ServTime=0; enterTime=0; startTime=0; cID=0; endTime=0; } Customer(const Customer& anthercustomer)//复制构造函数 { enterTime=anthercustomer.enterTime; startTime=anthercustomer.startTime; servDurance=anthercustomer.servDurance; ServTime=anthercustomer.ServTime; cID=anthercustomer.cID; endTime=anthercustomer.endTime; } void SetServTime(int serT) { ServTime=serT; } int GetID() { return cID; } int GetEndTime() { return endTime; } int GetStartTime() { return startTime; } int GetSerDurance()//顾客等待时间 { return (startTime-enterTime); } int GetServTime() { return ServTime; } void SetEnterTime(int enterT) { enterTime=enterT; } void SetEndTime(int endT) { endTime=endT; } void SetID(int ID) { cID=ID; } void SetSartTime(int startT) { startTime=startT; } private: int enterTime,startTime,ServTime,servDurance,cID,endTime; }; /* *************************************************************** 功能描述:银行信息 输入参数:无 输出参数:顾客及等待时间 其他说明:id依次增加 *************************************************************** */ class Bank { public: void ResetBank() { while(!servingcustomer.empty()) servingcustomer.pop(); while(!waitingcustomer.empty()) waitingcustomer.pop(); } bool Assign(Customer customer)//判断服务窗口有没有完成服务 { if(customer.GetEndTime()-customer.GetStartTime()==customer.GetServTime()) return true; else return false; } void DisplayWaitingTime(queue<Customer> quecus) { AverageTime=0; cout<<"顾客及等待时间:"<<endl; while(!quecus.empty()) { cout<<"顾客"<<quecus.front().GetID()<<": "<<quecus.front().GetSerDurance()<<" "; AverageTime+=quecus.front().GetSerDurance(); quecus.pop(); } cout<<endl; } queue<Customer> GetCustomerQueue(queue<Customer> queuec) { queue<Customer> temp; while(!queuec.empty()) { temp.push(queuec.front()); queuec.pop(); } return temp; } queue<Customer> servingcustomer; queue<Customer> waitingcustomer; }; /* *************************************************************** 功能描述:主函数 输入参数:无 输出参数:判断窗口1-5的完成情况 其他说明:单位时间是5 *************************************************************** */ int main() { Bank Bank1; Bank1.ResetBank(); queue<Customer> CustomerTrack; queue<Customer> CustomerTrack2; Customer serv1,serv2,serv3,serv4,serv5; int num[5]={0}; srand((unsigned) time(0));//播种子 const int TimeSlot=100;//假设服务时间段为0-100 const int WaitTime=10;//单位时间为10 const int ServTime=7;//服务时间为1-7 const int UnitTimePeo=10;//单位时间进来的人数为0-9 const int StopEnterTime=80;//为了保证所有顾客能完成服务,顾客进入的时间为0-80 int PresentTime=0;//初始化当前时间为0 int PerTime=10;//每隔5秒显示一次窗口信息 int NumberOfCustomer=0; int TimeOfServing=0; int IDtrack=0; while(PresentTime<TimeSlot) { Customer tempCustomer; NumberOfCustomer=rand()%UnitTimePeo; for(int j=0; j<NumberOfCustomer;j++) { tempCustomer.SetID(++IDtrack); TimeOfServing=1+rand()%ServTime; tempCustomer.SetServTime(TimeOfServing); tempCustomer.SetEnterTime(PresentTime); Bank1.waitingcustomer.push(tempCustomer); } int nnn=0; for(int t=0;t<WaitTime+nnn;t++) { if(Bank1.Assign(serv1))//窗口1完成 { if(serv1.GetID()!=0) CustomerTrack.push(serv1); serv1.Reset(); if(!Bank1.waitingcustomer.empty()) { serv1=Bank1.waitingcustomer.front(); serv1.SetSartTime(PresentTime); serv1.SetEndTime(PresentTime); Bank1.waitingcustomer.pop(); Bank1.servingcustomer.push(serv1); num[0]++; } } else { serv1.SetEndTime(PresentTime); } if(Bank1.Assign(serv2))//窗口2完成 { if(serv2.GetID()!=0) CustomerTrack.push(serv2); serv2.Reset(); if(!Bank1.waitingcustomer.empty()) { serv2=Bank1.waitingcustomer.front(); serv2.SetSartTime(PresentTime); serv2.SetEndTime(PresentTime); Bank1.waitingcustomer.pop(); Bank1.servingcustomer.push(serv2); num[1]++; } } else { serv2.SetEndTime(PresentTime); } if(Bank1.Assign(serv3))//窗口3完成 { if(serv3.GetID()!=0) CustomerTrack.push(serv3); serv3.Reset(); if(!Bank1.waitingcustomer.empty()) { serv3=Bank1.waitingcustomer.front(); serv3.SetSartTime(PresentTime); serv3.SetEndTime(PresentTime); Bank1.waitingcustomer.pop(); Bank1.servingcustomer.push(serv3); num[2]++; } } else { serv3.SetEndTime(PresentTime); } if(Bank1.Assign(serv4))//窗口4完成 { if(serv4.GetID()!=0) CustomerTrack.push(serv4); serv4.Reset(); if(!Bank1.waitingcustomer.empty()) { serv4=Bank1.waitingcustomer.front(); serv4.SetSartTime(PresentTime); serv4.SetEndTime(PresentTime); Bank1.waitingcustomer.pop(); Bank1.servingcustomer.push(serv4); num[3]++; } } else { serv4.SetEndTime(PresentTime); } if(Bank1.Assign(serv5))//窗口5完成 { if(serv5.GetID()!=0) CustomerTrack.push(serv5); serv5.Reset(); if(!Bank1.waitingcustomer.empty()) { serv5=Bank1.waitingcustomer.front(); serv5.SetSartTime(PresentTime); serv5.SetEndTime(PresentTime); Bank1.waitingcustomer.pop(); Bank1.servingcustomer.push(serv5); num[4]++; } } else { serv5.SetEndTime(PresentTime); } if(PresentTime%PerTime==0) { CustomerTrack2=Bank1.GetCustomerQueue(Bank1.servingcustomer); system("cls"); DisplayWindows(PresentTime,TimeSlot,PerTime); /*显示窗口1-5的服务ID*/ cout<<endl; cout<<"**当前时间窗口服务的顾客的ID,0为没有顾客**"<<endl; cout<<"窗口1的ID:"<<serv1.GetID()<<" "; cout<<"窗口2的ID:"<<serv2.GetID()<<" "; cout<<"窗口3的ID:"<<serv3.GetID()<<" "; cout<<"窗口4的ID:"<<serv4.GetID()<<" "; cout<<"窗口5的ID:"<<serv5.GetID()<<endl; /*显示正在等待的顾客的数量*/ cout<<"正在等待的顾客的数量:"<<Bank1.waitingcustomer.size()<<endl; cout<<endl; Bank1.DisplayWaitingTime(CustomerTrack2); Sleep(2000); } PresentTime++; if(PresentTime==80) nnn=20; } } int TotalNum=0; for(int rr=0;rr<5;rr++) { cout<<"窗口"<<rr+1<<"服务顾客数量:"<<num[rr]<<endl; TotalNum+=num[rr]; } cout<<"顾客平均等待时间为:"<<static_cast<double>(AverageTime)/static_cast<double>(TotalNum)<<endl; system("pause"); return 0; }