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; 
}