问题及代码:
/*
版权所有 (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;
}
运行结果: