elevator.cpp

来自「数据结构是编程的基础」· C++ 代码 · 共 673 行 · 第 1/2 页

CPP
673
字号

}
//////////////////////时间流逝////////////////////

//////////////////////开门////////////////////
void opendoor(int uord)
{
	struct stack *outelevator=elevator;
	struct queue *inelevator=que[floor];
	dwait=1;
	timeadd(20,2);
	fprintf(outfile,"电梯门在%d楼打开!\n",floor);
	while(outelevator!=NULL)                                     //出门 begin
	{
		if(outelevator->people->outfloor==floor)
		{
			delelevator(outelevator);
			timeadd(25,2);
			fprintf(outfile,"第%d个人走出电梯,到达目标%d楼!\n",outelevator->people->number,floor);
			delperson(outelevator->people);
			outelevator=outelevator->next;
		}
		else
		{
			outelevator=outelevator->next;
		}
	}                                                            //出门 end	
	callcar[floor]=0;
	if(uord)
	{
		while(inelevator!=NULL)
		{
			while(inelevator!=NULL)
			{
				if(inelevator->people->outfloor>floor)
				{
					insertelevator(inelevator->people);
					delqueue(inelevator,floor);				
					timeadd(25,2);	
				}
				inelevator=inelevator->next;
			}
			dopen=1;
			if(timeadd(40,1))
			{
				inelevator=que[floor];
			}
		}
		closedoor(1);
		return;
	}
	else
	{
		while(inelevator!=NULL)
		{
			while(inelevator!=NULL)
			{
				if(inelevator->people->outfloor<floor)
				{
					insertelevator(inelevator->people);
					delqueue(inelevator,floor);				
					timeadd(25,2);	
				}
				inelevator=inelevator->next;
			}
			dopen=1;
			if(timeadd(40,0))
			{
				inelevator=que[floor];
			}
		}
		closedoor(0);
		return;
	}
	if(state==goingup)	closedoor(1);	
	else closedoor(0);
}
//////////////////////开门////////////////////

//////////////////////关门////////////////////
void closedoor(int downorup)
{
	int i;
	struct queue *inelevator=que[floor];
	while(timeadd(20,downorup))
	{
		while(inelevator!=NULL)
		{
			if((downorup&&inelevator->people->outfloor>floor)||(!downorup&&inelevator->people->outfloor<floor))
			{
				delqueue(inelevator,floor);
				insertelevator(inelevator->people);				
				timeadd(25,2);			
			}
			inelevator=inelevator->next;
		}
		dopen=1;
		if(timeadd(40,downorup))
		{
			inelevator=que[floor];				
		}
	}
	callcar[floor]=0;
	dopen=0;
	dwait=0;
	fprintf(outfile,"电梯门在%d楼关闭!\n",floor);
	if(state==idle)
	{
		callup[floor]=calldown[floor]=0;
		selectnext();
		return;
	}
	else
	{
		if(state==goingup)
		{
			for(i=floor+1;i<5;i++)
			{
				if(callup[i]||callcar[i]||calldown[i])
				{
					callup[floor]=0;
					upele();
					return;
				}
			}
			for(i=floor-1;i>=0;i--)
			{
				if(callup[i]||calldown[i]||callcar[i])
				{
					callup[floor]=calldown[floor]=0;
					state=goingdown;
					downele();
					return;
				}
			}
		}
		else
		{
			for(i=floor-1;i>=0;i--)
			{
				if(callup[i]||calldown[i]||callcar[i])
				{
					calldown[floor]=0;
					downele();
					return;
				}
			}
			for(i=floor+1;i<5;i++)
			{
				if(callup[i]||calldown[i]||callcar[i])
				{
					callup[floor]=calldown[floor]=0;
					state=goingup;
					upele();
					return;
				}
			}
		}
		state=idle;
		selectnext();
		return;
	}
}
//////////////////////关门////////////////////

//////////////////////选择方向////////////////////
void selectnext()
{
	int i,j;
	if(callup[floor])
	{
		opendoor(1);
		return;
	}
	if(calldown[floor])
	{
		opendoor(0);
		return;
	}
	if(elevator!=NULL)
	{
		if(elevator->people->outfloor>floor)
		{
			state=goingup;
			upele();
		}
		else
		{
			state=goingdown;
			downele();
		}
	}
	for(j=0;;j++)
	{
		for(i=0;i<5;i++)
		{
			if((callup[i]||calldown[i]||callcar[i])&&i!=floor)
			{			
				if(i<floor)
				{
					state=goingdown;
					downele();
					return ;
				}
				else
				{
					state=goingup;
					upele();
					return ;
				}	
			}
		}
		timeadd(1,2);
		if(j==300&&floor!=1)
		{
			callcar[1]=1;
		}
	}
	return ;
}

//////////////////////选择方向////////////////////

//////////////////////上一层////////////////////
void upele()
{
	int i;
	floor++;
	timeadd(51,2);
	fprintf(outfile,"电梯上一层,从%d楼到%d楼\n",floor-1,floor);
	if(callcar[floor]||callup[floor])
	{
		timeadd(14,2);
		opendoor(1);
		return;
	}
	else
	{
		for(i=floor+1;i<5;i++)
		{
			if(callcar[i]||callup[i]||calldown[i])
			{
				upele();
				return;
			}
		}
		if(calldown[floor])
		{
			timeadd(14,2);
		    opendoor(0);
		    return;
		}
		for(i=floor-1;i>=0;i--)
		{
			if(callcar[i]||callup[i]||calldown[i])
			{
				timeadd(14,2);
				state=idle;
				selectnext();
				return;
			}
		}
	}
}

//////////////////////上一层////////////////////

//////////////////////下一层////////////////////
void downele()
{
	int i;
	floor--;
	timeadd(61,2);
	fprintf(outfile,"电梯下一层,从%d楼到%d楼\n",floor+1,floor);
	if(callcar[floor]||calldown[floor])
	{
		timeadd(23,2);
		opendoor(0);
		return;
	}
	else
	{
		for(i=floor-1;i>=0;i--)
		{
			if(callcar[i]||calldown[i]||callup[i])
			{
				
				downele();
				return;
			}
		}
		if(callup[floor])
		{
			timeadd(23,2);
		    opendoor(1);
		    return;
		}
		for(i=floor+1;i<5;i++)
		{
			if(callcar[i]||calldown[i]||callup[i])
			{
				timeadd(23,2);
				state=idle;
				selectnext();
				return;
			}
		}
	}
}

//////////////////////下一层////////////////////

int main(int argc, char* argv[])
{	
	int i;
	elevator=NULL;                        //系统初始电梯中没有人
	for(i=0;i<5;i++)                      //系统初始各层都没有人等待  begin
	{
		que[i]=NULL;
		callcar[i]=0;
		callup[i]=0;
		calldown[i]=0;
	}                                     //系统初始各层都没有人等待   end
	getpeople();                          //从文件中读取搭乘电梯的人们
	floor=1;
	dwait=dopen=0;
	state=idle;
	if(people==NULL) return 0;
	time=people->reachtime;                //第一个人进入系统
	insertqueue(people);
	lastman=people;
	selectnext();
	return 0;
}

⌨️ 快捷键说明

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