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

📄 elevator.h

📁 关于一个五层楼的电梯模型,关于栈与队列的应用,内有实验报告.
💻 H
字号:
//电梯类型
#include "ClientStack.h"
typedef struct {
	int floor;	//电梯所在层
	int ClientNumber;//电梯内人数
	EleStatus status;	//电梯当前状态
	EleStage Stage;	//电梯运行时期
	int Count;//用于电梯计时
	int CallUp[Maxfloor+1];//每层的Up按钮
	int CallDown[Maxfloor+1];//每层的Down按钮
	int CallCar[Maxfloor+1];//电梯内的目标层按钮
	ClientStack	S[Maxfloor+1];//乘客栈,要去不同楼层的人放在不同的栈中
}Elevator;
//电梯类型基本操作
void InitEle(Elevator &E) {
	//初始化电梯类型
	int i;
	E.floor=1;//电梯初始停在第一层
	E.status=Waiting;E.Count=OverTime;
	E.Stage=Down;
	E.ClientNumber=0;
	for(i=0;i<=Maxfloor;i++) {
		E.CallUp[i]=0;E.CallDown[i]=0;E.CallCar[i]=0;
	}
	for(i=0;i<=Maxfloor;i++) InitStack(E.S[i]);
}
Status CountOver(Elevator &E) {
	//判断电梯计时是否完成
	if(E.Count) {
		E.Count--;return FALSE;
	}
	return TRUE;
}
void DestoryEle(Elevator &E) {
	//销毁电梯类型
	int i;
	for(i=0;i<=Maxfloor;i++) DestroyStack(E.S[i]);
}
int EleFloor(Elevator const &E) {
	//返回电梯所在的层
	return E.floor;
}
EleStatus EleStatus(Elevator const &E) {
	//返回电梯状态
	return E.status;
}
Status RequireAbove(Elevator const &E) {
	//判断是否有高层请求
	for(int i=E.floor+1;i<=Maxfloor;i++)
		if(E.CallCar[i]||E.CallDown[i]||E.CallUp[i]) return TRUE;
	return FALSE;
}
Status RequireBelow(Elevator const &E) {
	//判断是否有低层请求
	for(int i=E.floor-1;i>=Minfloor;i--)
		if(E.CallCar[i]||E.CallDown[i]||E.CallUp[i]) return TRUE;
	return FALSE;
}
Status EleAchieved(Elevator &E) {
	//判断电梯是否要停于当前层
	if(E.CallCar[E.floor]) return TRUE;
	if(E.Stage==Up&&E.CallUp[E.floor]||E.Stage==Down&&E.CallDown[E.floor])
		return TRUE;
	if(E.Stage==Up&&E.CallDown[E.floor]&&!RequireAbove(E)) {
		E.Stage=Down;return TRUE;
	}
	if(E.Stage==Down&&E.CallUp[E.floor]&&!RequireBelow(E)) {
		E.Stage=Up;return TRUE;
	}
	return FALSE;
}
Status EleOpenDoor(Elevator &E) {
	//判断电梯是否要开门
	if(E.CallCar[E.floor]||E.CallDown[E.floor]&&E.Stage==Down||E.CallUp[E.floor]&&E.Stage==Up)
		return TRUE;
	if(E.status==Waiting) {
		if(E.CallDown[E.floor]) {E.Stage=Down;return TRUE;}
		if(E.CallUp[E.floor]) {E.Stage=Up;return TRUE;}
	}
	return FALSE;
}
//*******************************************************************
EleStage EleDecide(Elevator &E) {
	//判断电梯动作
	int Above,Below;
	Above=RequireAbove(E);
	Below=RequireBelow(E);
	//无请求则停止
	if(Above==0&&Below==0) return Stop;
	//有请求则按请求移动
	else {
		if(E.Stage==Up) {
			if(Above!=0) return Up;
			else {
				E.Stage=Down;return Down;
			}
		}//if
		else {
			if(Below!=0) return Down;
			else {
				E.Stage=Up;return Up;
			}
		}//if
	}
}
Action ElevatorRun(Elevator &E){
	//电梯状态转换
	switch(E.status) {
		case Opening:
			//完成开门则转入Opened状态
			E.status=Opened;E.Count=CloseTest;
			return DoorOpened;
		case Opened:
			//进行关门测试
			if(E.Stage==Down&&!E.CallCar[E.floor]&&!E.CallDown[E.floor]||
				E.Stage==Up&&!E.CallCar[E.floor]&&!E.CallUp[E.floor]) {//无人进出,关门
				E.status=Closing;E.Count=DoorTime;
			}//if
			break;
		case Closing:
			//完成关门则转入Closed状态
			E.status=Closed;
			return DoorClosed;
		case Waiting:
			//不在第一层且超出所规定的停候时间,电梯向第一层移动
			if(E.Count==0) {
				if(E.floor!=1) E.CallCar[1]=1;
			}
			else E.Count--;
			//如果有人可以进入,则开门
			if(EleOpenDoor(E)) {
				E.status=Opening;E.Count=DoorTime;break;
			}
		case Closed:
			//根据EleDecide的返回值设定电梯状态
			switch(EleDecide(E)) {
				case Up: E.status=Moving;E.Count=UpTime+Accelerate;return GoingUp;
				case Down: E.status=Moving;E.Count=DownTime+Accelerate;return GoingDown;
				case Stop:if(E.status!=Waiting) {E.status=Waiting;E.Count=OverTime;}
			};//switch
			break;
		case Moving:
			//完成移动
			if(E.Stage==Up) E.floor++;
			else			E.floor--;
			if(EleAchieved(E)) {//到达目标层,转入减速状态
				E.status=Decelerate;
				E.Count=DownDecelerate;
			}
			else E.Count+=DownTime;//未到达目标层,继续下降
			return Achieved;
		case Decelerate:
			//完成减速
			//确定正确的电梯时期
			if(E.Stage==Up&&!E.CallUp[E.floor]&&!RequireAbove(E)) E.Stage=Down;
			else if(E.Stage==Down&&!E.CallDown[E.floor]&&!RequireBelow(E)) E.Stage=Up;
			//转到开门状态
			E.status=Opening;E.Count=DoorTime;
			break;
	};//switch
	return None;
}//ElevatorRun

⌨️ 快捷键说明

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