www.pudn.com > MyElevator.rar > Elevator.cpp
#include "stdafx.h"
#include "Elevator.h"
CElevator::CElevator()
{
m_iFloor = 1;
m_iHeight = 0;
m_iLoadNum = 0;
m_StepList.clear();
m_Status = WAIT;
}
CElevator::~CElevator()
{
}
void CElevator::DropAndLoad(UINT Floor , UINT& in , UINT & out)
{
m_iLoadNum += (in - out);
////////////////////////
}
float CElevator::GetWaitTime(CStop stop1 , CStop stop2)
{
if (m_StepList.empty())
{
return abs(m_iHeight - (stop1.GetFloor() - 1)*10) * 2.0 /10.0;
}
else
{
float ftime = 0.0;
bool bContinue = true;
list::iterator pos = m_StepList.begin();
for( ; pos != m_StepList.end() ; ++pos)
{
if ((*pos).CanLoad(stop1, stop2))
{
ftime += (*pos).GetPartTime(stop1 , m_iHeight);
bContinue = false;
break;
}
}
if (bContinue)
{
list::iterator pos1 = m_StepList.end();
--pos1;
CStop stop3 ;
if (UP == (*pos1).GetStatus())
{
(*pos1).GetHStop(stop3);
}
else
{
(*pos1).GetLStop(stop3);
}
ftime += abs(stop1.GetFloor() - stop3.GetFloor()) * 2.0;
}
return ftime;
}
}
void CElevator::InsertStop(_STATUS status , CStop stop1 , CStop stop2)
{
if (m_StepList.empty())
{
float floor = GetFloor(); //
if (floor == (float)(stop1.GetFloor()))//不用空载跑 //
{
CStep step;
step.m_StopVector[stop1.GetFloor()-1] = stop1;
step.m_StopVector[stop2.GetFloor()-1] = stop2;
step.SetStatus(stop1.GetFloor() < stop2.GetFloor() ? UP : DOWN);
m_StepList.push_back(step);
SetStatus( stop1.GetFloor() < stop2.GetFloor() ? UP : DOWN);
}
else//有空载跑
{
if (stop1.GetFloor() < stop2.GetFloor())//UP
{
if (floor < stop1.GetFloor()) //
{
if(floor != (int)floor) //
{
if (UP == status)
{
floor = (int)floor + 1;
}
else
{
floor = (int)floor;
}
}
CStep step;
step.m_StopVector[(int)floor - 1] = CStop((int)floor , 0 , 0);
step.m_StopVector[(int)floor - 1].m_bAlreadyHaveTask = true;
step.m_StopVector[stop1.GetFloor() - 1] = stop1;
step.m_StopVector[stop2.GetFloor() - 1] = stop2;
step.SetStatus(UP);
m_StepList.push_back(step);
SetStatus(UP);
}
else
{
if(floor != (int)floor) //
{
if (UP == status)
{
floor = (int)floor + 1;
}
else
{
floor = (int)floor;
}
}
CStep step,step1;
step.m_StopVector[(int)floor - 1] = CStop((int)floor , 0 , 0);
step.m_StopVector[stop1.GetFloor() - 1] = stop1;
step.SetStatus(DOWN);
m_StepList.push_back(step);
SetStatus(DOWN);
step1.m_StopVector[stop1.GetFloor() - 1] = CStop(stop1.GetFloor() , 0 , 0);
step1.m_StopVector[stop1.GetFloor() - 1].m_bAlreadyHaveTask = true;
step1.m_StopVector[stop2.GetFloor() - 1] = stop2;
step1.SetStatus(UP);
m_StepList.push_back(step1);
}
}
else //DOWN
{
if (floor > stop1.GetFloor())
{
if(floor != (int)floor) //
{
if (UP == status)
{
floor = (int)floor + 1;
}
else
{
floor = (int)floor;
}
}
CStep step;
step.m_StopVector[(int)floor - 1] = CStop((int)floor , 0 , 0);
step.m_StopVector[(int)floor - 1].m_bAlreadyHaveTask = true;
step.m_StopVector[stop1.GetFloor() - 1] = stop1;
step.m_StopVector[stop2.GetFloor() - 1] = stop2;
step.SetStatus(DOWN);
m_StepList.push_back(step);
SetStatus(DOWN);
}
else
{
if(floor != (int)floor) //
{
if (UP == status)
{
floor = (int)floor + 1;
}
else
{
floor = (int)floor;
}
}
CStep step,step1;
step.m_StopVector[(int)floor - 1] = CStop((int)floor , 0 , 0);
step.m_StopVector[(int)floor - 1].m_bAlreadyHaveTask = true;
step.m_StopVector[stop1.GetFloor() - 1] = stop1;
step.SetStatus(UP);
m_StepList.push_back(step);
SetStatus(UP);
step1.m_StopVector[stop1.GetFloor() - 1] = CStop(stop1.GetFloor() , 0 , 0);
step1.m_StopVector[stop1.GetFloor() - 1].m_bAlreadyHaveTask = true;
step1.m_StopVector[stop2.GetFloor() - 1] = stop2;
step1.SetStatus(DOWN);
m_StepList.push_back(step1);
}
}
}
return ;
}
bool bContinue = true;
list::iterator pos = m_StepList.begin();
bool bFirst = true;
for( ; pos != m_StepList.end() ; ++pos)
{
status = (*pos).GetStatus();
if ((*pos).InsertStop(status , bFirst,m_iHeight,stop1,stop2))
{
bContinue = false;
break;
}
bFirst = false;
}
if(bContinue)
{
list::iterator pos1 = m_StepList.end();
--pos1;
CStop stop3;
_STATUS status = (*pos1).GetStatus();
/////////////////////////////////////
//find the last stop of the last step
if (UP == status)
{
(*pos1).GetHStop(stop3);
}
else
{
(*pos1).GetLStop(stop3);
}
/////////////////////////////////////
if (stop1.GetFloor() < stop2.GetFloor())//UP
{
if (stop3.GetFloor() == stop1.GetFloor())//最后一个step的终点站刚好是stop,所以最后一个stop和stop复合
{
(*pos1).m_StopVector[stop1.GetFloor()-1].EmbedNewStop(stop1);
CStep step;
step.m_StopVector[stop1.GetFloor()-1] = CStop(stop1.GetFloor() , 0 , 0);
step.m_StopVector[stop1.GetFloor() - 1].m_bAlreadyHaveTask = true;
step.m_StopVector[stop2.GetFloor()-1] = stop2;
step.SetStatus(UP);
m_StepList.push_back(step);
return;
}
else if (stop3.GetFloor() < stop1.GetFloor())//追加一个3-stop的step
{
CStep step;
step.m_StopVector[stop3.GetFloor()-1] = CStop(stop3.GetFloor() , 0 , 0);
step.m_StopVector[stop3.GetFloor()-1].m_bAlreadyHaveTask = true;
step.m_StopVector[stop1.GetFloor()-1] = stop1;
step.m_StopVector[stop2.GetFloor()-1] = stop2;
step.SetStatus(UP);
m_StepList.push_back(step);
return;
}
else//追加2个step
{
list::iterator pos2 = m_StepList.begin();
for( ; pos2 != m_StepList.end() ; ++pos2)
{
if((*pos2).GetStatus() == status)
{
int i = stop1.GetFloor() - 1;
int j = stop2.GetFloor() - 1;
if ((!(*pos2).m_StopVector[i].IsEmpty()) &&
(!(*pos2).m_StopVector[j].IsEmpty()))
{
(*pos2).m_StopVector[i].EmbedNewStop(stop1);
(*pos2).m_StopVector[j].EmbedNewStop(stop2);
return;
}
}
}
CStep step,step1;
step.m_StopVector[stop3.GetFloor() - 1] = CStop(stop3.GetFloor() , 0 , 0);
step.m_StopVector[stop3.GetFloor() - 1].m_bAlreadyHaveTask = true;
step.m_StopVector[stop1.GetFloor() - 1] = stop1;
step.SetStatus(DOWN);
m_StepList.push_back(step);
step1.m_StopVector[stop1.GetFloor() - 1] = CStop(stop1.GetFloor() , 0 , 0);
step1.m_StopVector[stop1.GetFloor() - 1].m_bAlreadyHaveTask = true;
step1.m_StopVector[stop2.GetFloor() - 1] = stop2;
step1.SetStatus(UP);
m_StepList.push_back(step1);
return;
}
}
if (stop1.GetFloor() > stop2.GetFloor())//DOWN
{
if (stop3.GetFloor() == stop1.GetFloor())//最后一个step的终点站刚好是stop,所以最后一个stop和stop复合
{
(*pos1).m_StopVector[stop1.GetFloor()-1].EmbedNewStop(stop1);
CStep step;
step.m_StopVector[stop1.GetFloor()-1] = CStop(stop1.GetFloor() , 0 , 0);
step.m_StopVector[stop1.GetFloor() - 1].m_bAlreadyHaveTask = true;
step.m_StopVector[stop2.GetFloor()-1] = stop2;
step.SetStatus(DOWN);
m_StepList.push_back(step);
return;
}
else if (stop3.GetFloor() > stop1.GetFloor())//追加一个3-stop 的step
{
CStep step;
step.m_StopVector[stop3.GetFloor()-1] = CStop(stop3.GetFloor() , 0 , 0);
step.m_StopVector[stop3.GetFloor() - 1].m_bAlreadyHaveTask = true;
step.m_StopVector[stop1.GetFloor()-1] = stop1;
step.m_StopVector[stop2.GetFloor()-1] = stop2;
step.SetStatus(DOWN);
m_StepList.push_back(step);
return;
}
else//追加2个step
{
list::iterator pos2 = m_StepList.begin();
for( ; pos2 != m_StepList.end() ; ++pos2)
{
if((*pos2).GetStatus() == status)
{
int i = stop1.GetFloor() - 1;
int j = stop2.GetFloor() - 1;
if ((!(*pos2).m_StopVector[i].IsEmpty()) &&
(!(*pos2).m_StopVector[j].IsEmpty()))
{
(*pos2).m_StopVector[i].EmbedNewStop(stop1);
(*pos2).m_StopVector[j].EmbedNewStop(stop2);
return;
}
}
}
CStep step,step1;
step.m_StopVector[stop3.GetFloor() - 1] = CStop(stop3.GetFloor() , 0 , 0);
step.m_StopVector[stop3.GetFloor() - 1].m_bAlreadyHaveTask = true;
step.m_StopVector[stop1.GetFloor() - 1] = stop1;
step.SetStatus(UP);
m_StepList.push_back(step);
step1.m_StopVector[stop1.GetFloor() - 1] = CStop(stop1.GetFloor() , 0 , 0);
step1.m_StopVector[stop1.GetFloor() - 1].m_bAlreadyHaveTask = true;
step1.m_StopVector[stop2.GetFloor() - 1] = stop2;
step1.SetStatus(DOWN);
m_StepList.push_back(step1);
return;
}
}
return;
}
return;
}
bool CElevator::StepIn(bool IsAttainFloor)
{
bool bAttainStop = false;
IsAttainFloor = false;
if (WAIT == m_Status)
{
IsAttainFloor = false;
return false;
}
if (UP == m_Status)
{
bool IsPassStep = false;
UINT in = 0;
UINT out = 0;
if(m_StepList.begin()->IsGoToTaskStop(m_iHeight , in , out, IsAttainFloor , IsPassStep))//在GoTo里头有DeleteTask的
{
DropAndLoad(m_iFloor , in , out);//上下乘客
if (IsPassStep/*(*(m_StepList.begin())).IsPassStep()*/)
{
m_StepList.pop_front();
if (m_StepList.empty())
{
SetStatus(WAIT);
bAttainStop = true;
return true;
}
SetStatus(m_StepList.begin()->GetStatus());//
return true;
}
bAttainStop = true;
}
m_iHeight += 1;
if (m_iHeight > 40)
{
if (!m_StepList.empty())
{
CStep step = (CStep)m_StepList.back();
if (step.GetStatus() == DOWN)
{
if (step.m_StopVector[4].IsEmpty())
{
CStop stop(5,0,0);
step.m_StopVector[4] = stop;
step.m_StopVector[4].m_bAlreadyHaveTask = true;
}
m_StepList.clear();
m_StepList.push_back(step);
}
else
{
CStep step1;
step1.m_StopVector[4] = CStop(5,0,0);
step1.m_StopVector[4].m_bAlreadyHaveTask = true;
CStop stop1;
step.GetLStop(stop1);
step1.m_StopVector[stop1.GetFloor()-1] = CStop(stop1.GetFloor(),0,0);
step1.SetStatus(DOWN);
m_StepList.clear();
m_StepList.push_back(step1);
m_StepList.push_back(step);
}
}
m_iHeight = 40;
m_iFloor = 5;
m_iLoadNum = 0;
m_Status = WAIT;
bAttainStop = true;
}
ASSERT(m_iHeight>=0 && m_iHeight<=40);
if (m_iHeight/10 > (m_iFloor - 1))
{
++m_iFloor;
}
return bAttainStop;
}
if (DOWN == m_Status)
{
bool IsPassStep = false ;
UINT in = 0;
UINT out = 0;
if(m_StepList.begin()->IsGoToTaskStop(m_iHeight ,in , out , IsAttainFloor , IsPassStep))
{
DropAndLoad(m_iFloor , in , out);
if (IsPassStep)
{
m_StepList.pop_front();
if (m_StepList.empty())
{
SetStatus(WAIT);
bAttainStop = true;
return true;
}
SetStatus(m_StepList.begin()->GetStatus());//
return true;
}
bAttainStop = true;
}
// if (0 == m_iHeight)
// {
// return true;
// }
m_iHeight -= 1;
if (m_iHeight < 0)
{
if (!m_StepList.empty())
{
CStep step = (CStep)m_StepList.back();
if (step.GetStatus() == UP)
{
if (step.m_StopVector[0].IsEmpty())
{
CStop stop(1,0,0);
step.m_StopVector[0] = stop;
step.m_StopVector[0].m_bAlreadyHaveTask = true;
m_StepList.clear();
m_StepList.push_back(step);
}
}
else
{
CStep step1;
step1.m_StopVector[0] = CStop(1,0,0);
step1.m_StopVector[0].m_bAlreadyHaveTask = true;
CStop stop1;
step.GetHStop(stop1);
step1.m_StopVector[stop1.GetFloor()-1] = CStop(stop1.GetFloor(),0,0);
step1.SetStatus(UP);
m_StepList.clear();
m_StepList.push_back(step1);
m_StepList.push_back(step);
}
}
m_iHeight = 0;
m_iFloor = 1;
m_iLoadNum = 0;
m_Status = WAIT;
bAttainStop = true;
}
ASSERT(m_iHeight>=0 && m_iHeight<=40);//
if (m_iHeight/10 < (m_iFloor - 1))
{
--m_iFloor;
}
return bAttainStop;
}
return false;
}
float CElevator::GetFloor()
{
return m_iHeight/10.0 + 1.0;
}