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

📄 elevator.cpp

📁 电梯仿真系统的实现
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//## 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%3C12090901FE.cm preserve=no
//	  %X% %Q% %Z% %W%
//## end module%3C12090901FE.cm

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

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

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

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

// Elevator
#include "Elevator.h"

//## begin module%3C12090901FE.declarations preserve=no
//## end module%3C12090901FE.declarations

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


// Class CElevator 


















CElevator::CElevator()
  //## begin CElevator::CElevator%3C1206FF0294_const.hasinit preserve=no
      : m_enType(ALL),
        m_iPassengers(0),
        m_enStatus(WAIT),
        m_enDirection(DOWN),
        m_enDoorState(CLOSED),
        m_lTimer(0),
        m_lTotalRun(0),
        m_lTotalIdle(0)
  //## end CElevator::CElevator%3C1206FF0294_const.hasinit
  //## begin CElevator::CElevator%3C1206FF0294_const.initialization preserve=yes
  //## end CElevator::CElevator%3C1206FF0294_const.initialization
{
  //## begin CElevator::CElevator%3C1206FF0294_const.body preserve=yes
  //## end CElevator::CElevator%3C1206FF0294_const.body
}

CElevator::CElevator(const CElevator &right)
  //## begin CElevator::CElevator%3C1206FF0294_copy.hasinit preserve=no
      : m_enType(ALL),
        m_iPassengers(0),
        m_enStatus(WAIT),
        m_enDirection(DOWN),
        m_enDoorState(CLOSED),
        m_lTimer(0),
        m_lTotalRun(0),
        m_lTotalIdle(0)
  //## end CElevator::CElevator%3C1206FF0294_copy.hasinit
  //## begin CElevator::CElevator%3C1206FF0294_copy.initialization preserve=yes
  //## end CElevator::CElevator%3C1206FF0294_copy.initialization
{
  //## begin CElevator::CElevator%3C1206FF0294_copy.body preserve=yes
  //## end CElevator::CElevator%3C1206FF0294_copy.body
}


CElevator::~CElevator()
{
  //## begin CElevator::~CElevator%3C1206FF0294_dest.body preserve=yes
	delete m_pltPassenger;
  //## end CElevator::~CElevator%3C1206FF0294_dest.body
}


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


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

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



//## Other Operations (implementation)
bool CElevator::Reachable (int iFloor)
{
  //## begin CElevator::Reachable%3C120D2002D0.body preserve=yes
// 根据电梯的运行规则判断能否到达某一层
	if(iFloor>40||iFloor<1) return false;
	if(iFloor==1) return true;
	switch(m_enType)
	{
	//第一种类型,每层都可达.
	case ALL:		return true;break;
	//第二种类型,除一层外,只能到25~40.
	case UPPART:	if(iFloor<=40 && iFloor>=25) return true;
					else return false;
					break;
	//第三种类型,只能到1~25;
	case DOWNPART:	if(iFloor>0 && iFloor<=25) return true;
					else return false;
					break;
	//第四种类型,1,2~40中的偶数层.
	case EVENS:		if(iFloor%2==0) return true;
					else return false;
					break;
	//第五种类型,1~40中的奇数层.
	case ODDS:		if(iFloor%2==1) return true;
					else return false;
	default:		TRACE("Wrong requried floor!\n");
					return false;
					break;

	}
	return false;
  //## end CElevator::Reachable%3C120D2002D0.body
}

bool CElevator::IsOverloading ()
{
  //## begin CElevator::IsOverloading%3C120D83035C.body preserve=yes
// 电梯是否超载
	if(m_pltPassenger->size()>=m_iCapacity)
		return true;
	else 
		return false;
  //## end CElevator::IsOverloading%3C120D83035C.body
}

void CElevator::Manager ()
{
  //## begin CElevator::Manager%3C1212D301AE.body preserve=yes
//电梯自己的管理器,对自己状态的转换控制.
	int ret;
	switch(m_enStatus){
	case IDLE: //电梯的空闲状态
		m_lTotalIdle++;
		m_bFinished = false;
		if(m_ltMessages.empty()) 
		{
			SetStatus(IDLE);
			SetDirection(NONE);
		}
		else 
		{
			//消息队列不为空,检查是否要停.
			if(StopOrNot()) Stop();
			//否则运行.
			else Start();
		}
		break;
	case RUN:
		m_bFinished = false;
		m_lTotalRun++;
		m_iSpeed--;
		//速度控制电梯的位置.
		if(!m_iSpeed)
		{
			if(m_enDirection==UP) m_iLocation++;
			else m_iLocation--;
			m_iSpeed = m_pMonitor->m_S;
			if(StopOrNot()) Stop();
		}
		break;
	case WAIT:
		m_lTotalWait++;
		m_lTotalRun++;
		//当电梯处于等待状态的时候,我们认为他仍在工作
		//先下后上
		if(!--m_iPassUpDown)
		{
			if(!PassengerOut())
			{
				ret = PassengerIn();
				if(ret!=1) m_bFinished = true;
			}
			m_iPassUpDown = m_pMonitor->m_T;
		}
		if(m_bFinished)
		{
			//在这里加入由于满载而没有满足的乘客的处理
			if(ret==2)
			{
				if(!m_ltWaitMsg.empty()) Overloaded();
			}
			if(m_ltMessages.empty()) 
			{
				SetStatus(IDLE);
				SetDirection(NONE);
			}
			else Start();
		}
		break;
	default: 
		break;
	}
  //## end CElevator::Manager%3C1212D301AE.body
}

void CElevator::Start ()
{
  //## begin CElevator::Start%3C1213200366.body preserve=yes
	//电梯的启动
	SetStatus(RUN);
	//判断运行方向.
	JudgeDirection();
  //## end CElevator::Start%3C1213200366.body
}

void CElevator::Stop ()
{
  //## begin CElevator::Stop%3C12133B02DA.body preserve=yes
	//m_enDirection = STOP;
// 电梯的停止
	SetStatus(WAIT);
//计算一次在电梯外楼层内等待的乘客消息队列
	CMessage* temp;
	CMsgList::iterator it;
	if(!m_ltWaitMsg.empty()) m_ltWaitMsg.clear();
	//寻找在该楼层中有上梯请求的消息.
	for(it = m_ltMessages.begin();it!=m_ltMessages.end();it++)
	{
		temp = *it;
		if(temp->OriFloor ==m_iLocation)
			m_ltWaitMsg.push_back(temp);
	}
  //## end CElevator::Stop%3C12133B02DA.body
}

bool CElevator::StopOrNot ()
{
  //## begin CElevator::StopOrNot%3C130785023A.body preserve=yes
//判断电梯是否要在某一层电梯停止
	if(m_iLocation<=1||m_iLocation>=40)
		ChangeDirection();
	if(!Reachable(m_iLocation)) return false;
	CMessage* tmp;
	CMsgList::iterator it;
	CPassengerList::iterator pit;
	CPassenger* ptmp;
//检查乘客链表中有无要下的乘客
	for(pit = m_pltPassenger->begin(); pit!= m_pltPassenger->end(); pit++)
	{
		ptmp = *pit;
		if(ptmp->GetObjFloor()==m_iLocation)
		{
			return true;
		}
	}
//检查消息队列中有无要上的乘客
	for(it = m_ltMessages.begin(); it!= m_ltMessages.end(); it++)
	{
		tmp = *it;
		if(tmp->OriFloor==m_iLocation)
		{
			ptmp = m_pltPassenger->GetPassengerByPID(tmp->PID);
			if(ptmp==NULL)	return true;
		}
	}
	return false;
  //## end CElevator::StopOrNot%3C130785023A.body
}



void CElevator::AddMsg (CMessage* msg)
{
  //## begin CElevator::AddMsg%3C13218501B8.body preserve=yes
	//系统组织好消息后就要添加到选定电梯的消息队列中去.
	if(m_ltMessages.size()>m_ltMessages.max_size()) 
	{
		TRACE("Over max_size : %d\n",m_ltMessages.max_size());
	}
	m_ltMessages.insert(m_ltMessages.end(),msg);
  //## end CElevator::AddMsg%3C13218501B8.body
}


// Additional Declarations
  //## begin CElevator%3C1206FF0294.declarations preserve=yes
CElevator::CElevator(ETYPE type,int id,int speed,int capacity,int passupdown)
{
	m_enType = type;
	m_iEID = id;
	m_iSpeed = speed;

	while(true) 
	{
		int floor = Random(40,1);
		if(Reachable(floor))
		{
			m_iLocation = floor;
			break;
		}
	}
	m_iCapacity = capacity;
	m_iPassUpDown = passupdown;
	m_iPassengers= 0;
    m_enStatus=IDLE;
    m_enDirection = DOWN;
    m_enDoorState=CLOSED;
    m_lTimer=0;
    m_lTotalRun= 0;
    m_lTotalIdle=0;
	m_lTotalWait=0;
	m_pltPassenger = new CPassengerList();
	m_bFinished = false;
}

void CElevator::OpenDoor()
{
	m_enDoorState = OPEN;
}
void CElevator::CloseDoor()
{
	m_enDoorState = CLOSED;
}
CMonitor* CElevator::GetMonitor()
{
	return m_pMonitor;
}

CFloor* CElevator::GetFloor(int floor)
{
	ASSERT(m_pMonitor!=NULL);
	return m_pMonitor->GetFloor(floor);
}
CPassengerList* CElevator::GetLtPassenger()
{

⌨️ 快捷键说明

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