问答题

【说明】
传输门是传输系统中的重要装置。传输门具有Open(打开)、Closed(关闭)、Opening (正在打开)、StayOpen(保持打开)和Closing(正在关闭)五种状态。触发传输门状态转换的事件有click、complete和timeout三种。事件与其相应的状态转换如下图所示。


下面的C++代码1与C++代码2分别用两种不同的设计思路对传输门进行状态模拟,请填补代码中的空缺。
【C++代码1】
const int CLOSED=1; const int OPENING=2;
const int OPEN=3; const int CLOSING=4;
const int STAYOPEN=5; //定义状态变量,用不同整数表示不同状态
class Door {
Private:
int state; //传输门当前状态
void setState(int state){ this->state=state;} //设置当前状态
public:
Door():state(CLOSED){};
void getState(){ //根据当前状态输出相应的字符串
switch(state){
case OPENING: cout<<"OPENING"<<endl; break;
case CLOSED: cout<<"CLOSED"<<endl; break;
case OPEN: cout<<"OPEN"<<endl; break;
case CLOSING: cout<<"CLOSING"<<endl; break;
case STAYOPEN:cout<<"STAYOPEN"<<endl; break;
}
};
void click() { //发生click事件时进行状态转换
if ( (1) ) setState(OPENING);
else if ( (2) ) setState(CLOSING);
else if ( (3) ) setState(STAYOPEN);
}
void timeout(){ //发生timeout事件时进行状态转换
if (state == OPEN) setState(CLOSING);
}
void complete(){ //发生complete事件时进行状态转换
if (state == OPENING) setState(OPEN);
else if (state == CLOSING) setState(CLOSED);
}
};
int main(){
Door aDoor;
aDoor.getState();aDoor.click(); aDoor.getState();
aDoor.complete();aDoor.getState(); aDoor.click();
aDoor.getState();aDoor.click(); aDoor.getState(); return 0;
}
【C++代码2】
class Door {
public:
DoorState *CLOSED,*OPENING,*OPEN,*CLOSING,*STAYOPEN,*state;
Door();
virtual~Door(){……//释放申请的内存,此处代码省略);
void setState(DoorState *state) { this->state = state;}
void getState(){
//此处代码省略,本方法输出状态字符串,
//例如,当前状态为CLOSED时,输出字符串为“CLOSED”
};
void click();
void timeout();
void complete();
};
Door::Door(){
CLOSED = new DoorClosed(this); OPENING = new DoorOpening(this);
OPEN = new DoorOpen(this); CLOSING = new DoorClosing(this);
STAYOPEN = new DoorStayOpen(this);state = CLOSED;
}
void Door :: click() { (4) ;)
void Door :: timeout() { (5) ;)
void Door :: complete() { (6) ;}
class DoorState//定义一个抽象的状态,它是所有状态类的基类
{
protected:Door *door;
public:
DoorState(Door *door) {this->door = door;}
virtual~DoorState(void);
virtual void click() {}
virtual void complete() {}
virtual void timeout() {}
};
class DoorClosed :public DoorState{//定义一个基本的Closed状态
public:
DoorClosed(Door *door) :DoorState(door) {}
virtual ~ DoorClosed(){}
void click();
};
void DoorClosed :: click() { (7) ;}
//其他状态类的定义与实现代码省略
int main() {
Door aDoor;
aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete();
aDoor.getState();aDoor.timeout();aDoor.getState();return 0;
}

【参考答案】

(1)state == CLOSED || state == CLOSING
(2)state == OPEN......

(↓↓↓ 点击下方‘点击查看答案’看完整答案、解析 ↓↓↓)
热门 试题

问答题
【说明】 传输门是传输系统中的重要装置。传输门具有Open(打开)、Closed(关闭)、Opening (正在打开)、StayOpen(保持打开)和Closing(正在关闭)五种状态。触发状态的转换事件有click、complete和timeout三种。事件与其相应的状态转换如下图所示。 下面的Java代码1与Java代码2分别用两种不同的设计思路对传输门进行状态模拟,请填补代码中的空缺。 【Java代码1】 public class Door { public static final int CLOSED = 1; public static final int OPENING = 2; public static final int OPEN = 3; public static final int CLOSING = 4; public static final int STAYOPEN = 5; private int state = CLOSED; 定义状态变量,用不同的整数表示不同状态 private void setState(int state){ this.state = state;} 设置传输门当前状态 public void getState() { 此处代码省略,本方法输出状态字符串, 例如,当前状态为CLOSED时,输出字符串为 CLOSED } public void click() { 发生click事件时进行状态转换 if ( (1) ;) setState(OPENING); else if ( (2) ;) setState{CLOSING); else if ( (3) ;) setState(STAYOPEN); } 发生timeout事件时进行状态转换 public void timeout() { if (state == OPEN) setState(CLOSING);} public void complete() { 发生complete事件时进行状态转换 if (state == OPENING) setState(OPEN); else if (state == CLOSING) setState(CLOSED); } public static void main(String [] args){ Door aDoor = new Door(); aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete(); aDoor.getState();aDoor.click();aDoor.getState();aDoor.click(); aDoor.getState();return; } } 【Java代码2】 public class Door { public final DoorState CLOSED = new DoorClosed(this); public final DoorState OPENING = new DoorOpening(this); public final DoorState OPEN = new DoorOpen(this); public final DoorState CLOSING = new DoorClosing(this); public final DoorState STAYOPEN = new DoorStayOpen(this); private DoorState state = CLOSED; 设置传输门当前状态 public void setState(DoorState state) { this.state=state;} public void getState(){ 根据当前状态输出对应的状态字符串 System.out.println(state.getClass().getName()); } public void click(){ (4) ;} 发生click事件时进行状态转换 public void timeout(){ (5) ;} 发生timeout事件时进行状态转换 public void complete(){ (6) ;) 发生complete事件时进行状态转换 public static void main(String[]args){ Door aDoor = new Door(); aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete(); aDoor.getState();aDoor.timeout();aDoor.getState();return; } } public abstract class DoorState { 定义所有状态类的基类 protected Door door ; public DoorState(Door doer) { this.door = door;} public void click() {} public void complete() {} public void timeout() {} } class DoorClosed extends DoorState { 定义一个基本的Closed状态 public DoorClosed(Door door) { super(door);} public void click() { (7) ;) 该类定义的其余代码省略 } 其余代码省略
问答题
【说明】 某汽车制造工厂有两条装配线。汽车装配过程如图10-6所示,即汽车底盘进入装配线,零件在多个工位装配,结束时汽车自动完成下线工作。 (1)e0和e1表示底盘分别进入装配线0和装配线1所需要的时间。 (2)每条装配线有n个工位,第一条装配线的工位为S0,0,S0,1,…,S0,n-0,第二条装配线的工位为S1,0,S1,1,…,S1,n-1。其中S0,k和S1,k(0≤k≤n-1)完成相同的任务,但所需时间可能不同。 (3)aij表示在工位Sij处的装配时间,其中i表示装配线(i=0或i=1),j表示工位号(0≤j≤n-1)。 (4)tij表示从Sij处装配完成后转移到另一条装配线下一个工位的时间。 (5)X0和X1表示装配结束后,汽车分别从装配线0和装配线1下线所需要的时间。 (6)在同一条装配线上,底盘从一个工位转移到其下一个工位的时间可以忽略不计。 图10-7所示的流程图描述了求最短装配时间的算法,该算法的输入为; n: 表示装配线上的工位数; e[i]: 表示e1和e2,i取值为0或1: a[i][j]: 表示ai,j,i的取值为0或1,j的取值范围为0~n-1; t[i][j]: 表示ti,j,i的取值为0或1,j的取值范围为0~n-1; x[i]: 表示X0和X1,i取值为0或1。 算法的输出为: fi:最短的装配时间; li:获得最短装配时间的下线装配线号(0或者1)。 算法中使用的f[i][j]表示从开始点到Si,j处的最短装配时间。