📄 keshe.cpp
字号:
#include <iostream.h>
#include <stdlib.h>
#include "QueueADT.h"
#include <iomanip.h>
struct data
{
int number;
int arrivalTime;
};//data
struct callerStatus
{
int callerNum;
int arriveTime;
int startTime;
int svcTime;
};//custStatus
struct simStats
{
int numcaller;
int totSvcTime;
int totWaitTime;
int maxQueueSize;
int totIdleTime;
};//simStats
struct information//记录给个服务窗口的信息
{
int clock;
int callerNum;
int arriveTime;
int startTime;
int svcTime;
int queueCount;
int waitTime;
};
int endTime;
int maxServiceTime;
int svcWindowsNum;
int numServer=0;
Queue<information> informat[6];//定义全局变量
//函数声明
void newcaller (Queue<data> &queue,int clock,int &callerNum);
void callerFree (Queue<data> &queue,int clock,callerStatus *Status,bool& morecallers);
void eachcallerComplete (Queue<data> &queue,int clock,callerStatus *Status, simStats *stats,
bool& morecallers);
void printStats(simStats *stats);
/*主函数*/
void main()
{
Queue<data> queue;
int clock=1;
bool morecallers=1;
int callerNum=0;
callerStatus callerStatus[6];
for(int i=0;i<6;i++)
{
callerStatus[i].callerNum=0;
callerStatus[i].arriveTime=0;
callerStatus[i].startTime=0;
callerStatus[i].svcTime=0;
}
simStats simStats[6];
for(int j=0;j<6;j++)
{
simStats[j].numcaller=0;
simStats[j].totSvcTime=0;
simStats[j].totWaitTime=0;
simStats[j].maxQueueSize=0;
simStats[j].totIdleTime=0;
}
//define and initilize
cout<<"please input the length of time in hours that the service will be provided:\n";
cin>>endTime;
cout<<"please input the maximum time it takes for the operator to take an order:\n ";
cin>>maxServiceTime;
cout<<"please input the number of server windows:\n";
cin>>svcWindowsNum;
cout<<"svcWindows callerNum arrTime staTime svcTime waitTim queueSize clock\n\n\n";
while (clock<endTime||morecallers)
{
newcaller (queue,clock,callerNum);
callerFree (queue,clock,callerStatus,morecallers);
eachcallerComplete (queue,clock,callerStatus,simStats,morecallers);
if (!queue.emptyQueue())
morecallers=1;
clock++;
}
while(numServer<svcWindowsNum)
{
simStats[svcWindowsNum].totIdleTime=clock-simStats[numServer].totSvcTime-1;
numServer=numServer+1;
}
numServer=0;
printStats(simStats);
}
//主函数结束
void newcaller (Queue<data> &queue,int clock,int &callerNum)
{
if (clock<endTime)
{ int arrival;
arrival=rand()%10+1;
if((arrival>0)&&(arrival<4))
{ data callerData;
while(arrival>0)
{
callerNum=callerNum+1;
callerData.number=callerNum;
callerData.arrivalTime=clock;
queue.enqueue(callerData);
arrival=arrival-1;
}
}
}
}//newCust
void callerFree (Queue<data> &queue,int clock,
callerStatus Status[],bool& morecallers)
{
data callerData;
while(numServer<svcWindowsNum)
{
if (clock > Status[numServer].startTime+Status[numServer].svcTime-1)
{
if (!queue.emptyQueue())
{
queue.dequeue(callerData);
Status[numServer].callerNum=callerData.number;
Status[numServer].arriveTime=callerData.arrivalTime;
Status[numServer].startTime=clock;
Status[numServer].svcTime=rand()%maxServiceTime+1;
if(!queue.emptyQueue())
morecallers=1;
}
}
numServer=numServer+1;
}
numServer=0;
}
void eachcallerComplete (Queue<data> &queue,
int clock,callerStatus Status[],
simStats stats[],bool& morecallers)
{
int waitTime(0),queueSize(0);
while(numServer<svcWindowsNum)
{
if (clock==Status[numServer].startTime+Status[numServer].svcTime-1)
{
waitTime=Status[numServer].startTime-Status[numServer].arriveTime;
stats[svcWindowsNum].numcaller++;
stats[svcWindowsNum].totSvcTime+=Status[numServer].svcTime;
stats[svcWindowsNum].totWaitTime+=waitTime;
queueSize=queue.queueCount();
int numServer1(0);
while(numServer1<svcWindowsNum)
{if (stats[numServer1].maxQueueSize < queueSize)
stats[numServer1].maxQueueSize=queueSize;
numServer1=numServer1+1;
}
information temp;
temp.clock=clock;
temp.callerNum=stats[svcWindowsNum].numcaller;
temp.arriveTime=Status[numServer].arriveTime;
temp.startTime=Status[numServer].startTime;
temp.svcTime=Status[numServer].svcTime;
temp.waitTime=waitTime;
temp.queueCount=queueSize;
informat[numServer].enqueue(temp);
while(informat[numServer].queueCount())
{
informat[numServer].dequeue(temp);
cout<<setw(3)<<(numServer+1)<<setw(9)<<temp.callerNum<<setw(10)<<temp.arriveTime
<<setw(9)<< temp.startTime<<setw(9)<<temp.svcTime
<<setw(7)<< waitTime<<setw(7)<< queueSize
<<"\t\t"<<clock<<endl;
}
}
morecallers=0;
numServer=numServer+1;
}
numServer=0;
}
void printStats(simStats stats[])
{
int avgSvcTime,avgWaitTime;
avgSvcTime=avgWaitTime=0;
while(numServer<svcWindowsNum)
{
stats[svcWindowsNum].numcaller+=stats[numServer].numcaller;
stats[svcWindowsNum].totIdleTime+=stats[numServer].totIdleTime;
stats[svcWindowsNum].totWaitTime+=stats[numServer].totWaitTime;
stats[svcWindowsNum].totSvcTime+=stats[numServer].totSvcTime;
stats[svcWindowsNum].maxQueueSize=stats[numServer].maxQueueSize;
numServer++;
}
avgSvcTime=stats[svcWindowsNum].totSvcTime/stats[svcWindowsNum].numcaller;
avgWaitTime=stats[svcWindowsNum].totWaitTime/stats[svcWindowsNum].numcaller;
cout<<"\n\t模拟统计:"<<endl;
cout<<"\n\t总电话数:"<<stats[svcWindowsNum].numcaller<<endl;
cout<<"\t总服务时间"<<stats[svcWindowsNum].totSvcTime<<endl;
cout<<"\t平均服务时间:"<<avgSvcTime<<endl;
cout<<"\t总等待时间:"<<stats[svcWindowsNum].totWaitTime<<endl;
cout<<"\t平均等待时间:"<<avgWaitTime<<endl;
cout<<"\t总空闲时间:"<<stats[svcWindowsNum].totIdleTime<<endl;
cout<<"\t最大队伍长度:"<<stats[svcWindowsNum].maxQueueSize<<endl;
}//print
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -