📄 elevator.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%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 + -