请认真阅读以下关于某传输系统的技术说明、状态转换图及C++代码,根据要求回答问题1和问题2。 【说明】 传输门是传输系统中的重要装置。传输门具有Open(打开)、Closed(关闭)、Opening(正在打开)、StayOpen(保持打开)和Cl

admin2009-02-15  46

问题 请认真阅读以下关于某传输系统的技术说明、状态转换图及C++代码,根据要求回答问题1和问题2。
  【说明】
   传输门是传输系统中的重要装置。传输门具有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(){}”可知,Doorstate中分别具有click、timeout和 complete方法用来响应对应的事件。根据(4)空缺处所在程序段“voidDoor::click()”可得,(4)空缺处所填写的内容是“state->click()”。
   同理,根据(5)空缺处所在程序段“void Door::timeout()”可得,(5)空缺处所填写的内容是“state->timeout()”:根据(6)空缺处所在程序段“void Door::complete()”可得,(6)空缺处所填写的内容是“state->complete()”。
   根据(7)空缺处所在程序段给出的注释信息“定义一个基本的Closed状态”和语句“void DoorClosed::click()”可知,(7)空缺处所填写的内容与传输门当前状态为Closed且发生Click事件时状态的迁移有关。结合如图6-18所示中的状态转换关系可知,在Click事件下Closed状态将迁移到Opening,因此(7)空缺处应该将传输门的状态设置为Opening。由于Doorstate变量存储了当前其存储的传输门的实例,因此可直接调用其方法setState设置状态。同时考虑到传输门的状态采用类的实例变量表示,故(7)空缺处所填写的内容为“door->setState(door->OPENING)”。
转载请注明原文地址:https://jikaoti.com/ti/FrW7FFFM
0

相关试题推荐
最新回复(0)