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

📄 monitor.cpp

📁 电梯仿真系统的实现
💻 CPP
字号:
//## begin module%1.3%.codegen_version preserve=yes
//   Read the documentation to learn more about C++ code generator
//   versioning.
//## end module%1.3%.codegen_version

//## begin module%3C12C4F200BE.cm preserve=no
//	  %X% %Q% %Z% %W%
//## end module%3C12C4F200BE.cm

//## begin module%3C12C4F200BE.cp preserve=no
//## end module%3C12C4F200BE.cp

//## Module: Monitor%3C12C4F200BE; Package body
//## Subsystem: <Top Level>
//## Source file: D:\Program\OOP\Elevators\SourceCode\Monitor.cpp

//## begin module%3C12C4F200BE.additionalIncludes preserve=no
//## end module%3C12C4F200BE.additionalIncludes

//## begin module%3C12C4F200BE.includes preserve=yes
#include "stdafx.h"
//## end module%3C12C4F200BE.includes

// Monitor
#include "Monitor.h"
//## begin module%3C12C4F200BE.declarations preserve=no
//## end module%3C12C4F200BE.declarations

//## begin module%3C12C4F200BE.additionalDeclarations preserve=yes
//## end module%3C12C4F200BE.additionalDeclarations


// Class CMonitor 



CMonitor::CMonitor()
  //## begin CMonitor::CMonitor%3C12154C029E_const.hasinit preserve=no
  //## end CMonitor::CMonitor%3C12154C029E_const.hasinit
  //## begin CMonitor::CMonitor%3C12154C029E_const.initialization preserve=yes
  //## end CMonitor::CMonitor%3C12154C029E_const.initialization
{
  //## begin CMonitor::CMonitor%3C12154C029E_const.body preserve=yes
  //## end CMonitor::CMonitor%3C12154C029E_const.body
}

CMonitor::CMonitor(const CMonitor &right)
  //## begin CMonitor::CMonitor%3C12154C029E_copy.hasinit preserve=no
  //## end CMonitor::CMonitor%3C12154C029E_copy.hasinit
  //## begin CMonitor::CMonitor%3C12154C029E_copy.initialization preserve=yes
  //## end CMonitor::CMonitor%3C12154C029E_copy.initialization
{
  //## begin CMonitor::CMonitor%3C12154C029E_copy.body preserve=yes
	//return *this;
  //## end CMonitor::CMonitor%3C12154C029E_copy.body
}


CMonitor::~CMonitor()
{
  //## begin CMonitor::~CMonitor%3C12154C029E_dest.body preserve=yes
	for(int i =0;i<10;i++)
	{
		//GetElevator(i)->get_m_ltMessages().clear();
		GetElevator(i)->GetLtPassenger()->clear();
	}
	for(i = 0;i<40;i++)
	{
		GetFloor(i+1)->GetPassengerList()->clear();
	}
	m_pltPassengers->clear();
  //## end CMonitor::~CMonitor%3C12154C029E_dest.body
}


CMonitor & CMonitor::operator=(const CMonitor &right)
{
  //## begin CMonitor::operator=%3C12154C029E_assign.body preserve=yes
	return *this;
  //## end CMonitor::operator=%3C12154C029E_assign.body
}


int CMonitor::operator==(const CMonitor &right) const
{
  //## begin CMonitor::operator==%3C12154C029E_eq.body preserve=yes
	return 0;
  //## end CMonitor::operator==%3C12154C029E_eq.body
}

int CMonitor::operator!=(const CMonitor &right) const
{
  //## begin CMonitor::operator!=%3C12154C029E_neq.body preserve=yes
	return 0;
  //## end CMonitor::operator!=%3C12154C029E_neq.body
}



//## Other Operations (implementation)
int CMonitor::SelectElevator (CMessage* msg)
{
  //## begin CMonitor::SelectElevator%3C131ECA023A.body preserve=yes
//选梯算法,在方法中监视类根据消息数据,为该请求选择一个合适的电梯

	int distance[10]={-1}; // 这里的距离指的是花费时间的多少.
	int shortest = 9000;   // 最少时间
	int ret= -1;
	for(int i =0;i<10;i++)
	{
		//首先检查该电梯能否提供服务
		if(m_pElevators[i]->IsQualifiedForRespondingCall(msg))
		{
			//计算时间距离,从电梯当前位置到乘客当前位置要花费多少时间
			//包括两个部分:
			//1. 楼层之间距离乘以电梯的速度
			//2. 中间需要停留的时间(包括上下电梯的时间)
			distance[i] = abs(m_pElevators[i]->GetLocation() - msg->OriFloor)*m_S
				+ m_pElevators[i]->GetStopNums(msg) * m_T;
			if(distance[i]<shortest)
			{
				shortest = distance[i];
				ret = i;
			}
		}
	}
	if(ret>=0) return ret;
//如果所有电梯都不能满足条件,原因可能是能否提供服务的条件较苛刻
// 强制执行E1电梯.
	else return 1;
  //## end CMonitor::SelectElevator%3C131ECA023A.body
}



bool CMonitor::DispatchMsg (CMessage* msg)
{
  //## begin CMonitor::DispatchMsg%3C13214B00AA.body preserve=yes
	//监视类对消息的派发.
	int eid = SelectElevator(msg); // 选梯
	CElevator* tmp;
	tmp =GetElevator(eid);
	tmp->AddMsg(msg); // 把消息送入电梯消息队列.
	return true;
  //## end CMonitor::DispatchMsg%3C13214B00AA.body
}

// Additional Declarations
  //## begin CMonitor%3C12154C029E.declarations preserve=yes
CMonitor::CMonitor(int k,int n,int m,int l,int s,int t)
{
	m_K = k;
	m_N = n;
	m_M = m;
	m_L = l;
	m_S = s;
	m_T = t;
	m_pltPassengers = new CPassengerList();
	//注意要把电梯和楼层和监视类关联起来
	m_pElevators[0] = new CElevator(ALL,0,m_S,m_K,m_T);
	m_pElevators[1] = new CElevator(ALL,1,m_S,m_K,m_T);
	m_pElevators[2] = new CElevator(UPPART,2,m_S,m_K,m_T);
	m_pElevators[3] = new CElevator(UPPART,3,m_S,m_K,m_T);
	m_pElevators[4] = new CElevator(DOWNPART,4,m_S,m_K,m_T);
	m_pElevators[5] = new CElevator(DOWNPART,5,m_S,m_K,m_T);
	m_pElevators[6] = new CElevator(EVENS,6,m_S,m_K,m_T);
	m_pElevators[7] = new CElevator(EVENS,7,m_S,m_K,m_T);
	m_pElevators[8] = new CElevator(ODDS,8,m_S,m_K,m_T);
	m_pElevators[9] = new CElevator(ODDS,9,m_S,m_K,m_T);
	for(int i=0;i<10;i++)
	{
		m_pElevators[i]->set_m_pMonitor(this);
	}
	for(i =0;i<40;i++)
	{
		m_pFloors[i] = new CFloor(i+1);
	}
	m_iCount=0;
	m_bFinished = false;
}

CElevator* CMonitor::GetElevator(int index)
{
	return m_pElevators[index];
}

CFloor* CMonitor::GetFloor(int index)
{
	return m_pFloors[index-1];
}

CPassengerList* CMonitor::GetPsgList()
{
	return m_pltPassengers;
}
CMessage* CMonitor::InquirePassenger(CPassenger *ppas)
{
	// 询问乘客有无请求.
	if(!ppas->IsEnd()) m_bFinished = false;
	if(ppas->HasRequest())
	{
		CMessage* msg;
		msg = new CMessage();
		if(!ppas->IsServed())
		{
			//乘客的上一个请求没有被满足.
			//重发该请求
			msg->PID = ppas->GetPID();
			msg->OriFloor = ppas->GetOriFloor();
			msg->ObjFloor = ppas->GetObjFloor();//重发请求
			if(msg->ObjFloor<msg->OriFloor) msg->Direction = RDOWN;
			else msg->Direction = RUP;
			return msg;
		}
		if(ppas->IsCompleted())
		{
			//乘客已经乘坐完L次,该发出最后一次返回请求
			msg->PID = ppas->GetPID();
			msg->OriFloor = ppas->GetOriFloor();
			msg->ObjFloor = 1;//要回到一层结束乘坐
			ppas->SetObjFloor(1);

			if(msg->ObjFloor==ppas->GetOriFloor())
			{
				//如果乘客已经到达一层,则不发出请求.
				ppas->SetStatus(END);
				return NULL;
			}
			else
			{
				if(msg->ObjFloor < msg->OriFloor) msg->Direction = RDOWN;
				else msg->Direction = RUP;
				return msg;
			}
		}
		// 以上情况都不满足,按正常请求发送.
		msg->PID = ppas->GetPID();
		msg->OriFloor = ppas->GetOriFloor();
		ppas->GenRandFloor();
		msg->ObjFloor = ppas->GetObjFloor();
		if(msg->ObjFloor<msg->OriFloor) msg->Direction = RDOWN;
		else msg->Direction = RUP;
		return msg;
	}
	else return NULL;

} //## end CMonitor%3C12154C029E.declarations
//## begin module%3C12C4F200BE.epilog preserve=yes
//## end module%3C12C4F200BE.epilog


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -