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