问题 问答题

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


下面的【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:
private:
int state; //传输门当前状态
void setState(int state) this->state = stale;//设置当前状态
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) ;
//其他状态类的定义与实现代码省略
iht 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==OPENING || state==STAYOPEN
(3)state==OPEN
(4)state->click()
(5)state->timeout()
(6)state->complete()
(7)door->setState(door->OPENING)

解析:[要点解析]
这是一道要求读者掌握状态转换图的程序设计与实现的综合题。本试题的解答思路如下。
根据(1)空缺处所在的程序段给出的注释信息“发生click事件时进行状态转换”可知,(1)空缺处所在的方法为click,表示当发生click事件时应该发生什么状态转换。找出传输门响应事件与其状态转换图(见图6-18)与click事件相关的内容,并特别注意箭头所指的方向。由于发生click事件前的状态Closed、Closing分别跳转到状态Opening,因此(1)空缺处所填写的内容是“state == CLOSED || state == CLOSING”。
同理,由如图6-18所示中的状态转换关系可知,发生click事件前的状态Opening、Stayopen分别跳转到状态Closing,即(2)空缺处所填写的内容是“state == OPENING || state == STAYOPEN”;发生click事件前的状态Open跳转到状态StayOpen,即(3)空缺处所填写的内容是“state == OPEN”。
仔细阅读【C++代码2】程序段,由语句“private DoorState state=CLOSED;”可知,类Door的state成员变量用于记录类Door所处的状态,而state变量的类型为Doorstate*。由语句“virtual void click(){}”、“virtual void complete(){}”和“virtual void timeout(){

论述题

某校学生会打算开展“创诚信校园,做诚实学生”活动,决定在同学们中进行诚信状况调查,现请你担任组长。

(1)就调查的程序问题,你的组员向你提出了以下建议:①与部分老师和同学座谈;②设计调查方案;③向学校提出具体建议;④整理交流分析材料。请你按正常的活动顺序将上述建议排序(只写数字序号即可)(         )。(2分)

(2)调查小组向你做如下采访,面对诚信的考验,结合所学知识谈谈你的真实做法或想法。

①你约了朋友,妈妈却说要带你去玩,你会                                     

因为                                                                 (2分)

②这次考试不及格,回家要被父母批评,你会                                    

因为                                                                 (2分) 

下表是调查小组统计的结果:(注:调查人数60人)

欺骗过家

长老师的

考试作

过弊的

抄袭过

作业的

涂改过试

卷分数的

有过不守

承诺现象的

18人次13人次20人次4人次22人次
(3)①上面调查表格统计的结果说明了什么问题?(1分)

②你们决定向学校领导提出关于加强中学生诚信教育的建议,你认为建议应包括哪些内容?(3分)

填空题