⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keshe.cpp

📁 本设计使用C++来实现一个简单的数据结构问题
💻 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 + -