首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
阅读以下说明和C++代码。 【说明】 传输门是传输系统中的重要装置。传输门具有Open(打开)、Closed(关闭)、Opening (正在打开)、StayOpen(保持打开)和Closing(正在关闭)五种状态。触发传输门状态转换的事件有click
阅读以下说明和C++代码。 【说明】 传输门是传输系统中的重要装置。传输门具有Open(打开)、Closed(关闭)、Opening (正在打开)、StayOpen(保持打开)和Closing(正在关闭)五种状态。触发传输门状态转换的事件有click
admin
2008-04-04
62
问题
阅读以下说明和C++代码。
【说明】
传输门是传输系统中的重要装置。传输门具有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 == OPENING || state == STAYOPEN (3)state == OPEN (4)state->click() (5)state->timeout() (6)state->complete() (7)door->setState(door->OPENING)
解析
本题考查的是状态转换图的程序设计与实现。
空(1)、(2)和(3)需要根据状态转换图来填写,空(1)、(2)和(3)所在的方法为click,表示当发生click事件时应该发生什么状态转换。根据代码可知,发生click事件时,状态分别跳转到OPENING,CLOSING和STAYOPEN,则发生click前的状态由状态转换图可以得到,分别为CLOSED或CLOSING、STAYOPEN或OPENING以及OPEN。
代码2中空(4)、(5)和(6)考查当发生click、timeout以及complete事件的时候,状态应该如何迁移。类Door的state成员变量用于记录类Door所处的状态,而state变量的类型为DoorState *,DoorState中分别具有click、timeout和complete方法用来响应对应的事件,因此,空(4)、(5)和(6)分别为:state->click()、state->timeout()和 state->complete()。
空(7)主要考查门的当前状态为CLOSED时,发生click事件时状态的迁移。根据状态图可知,CLOSED状态的在click事件下将迁移到OPENING,因此,此处应该将传输门状态设置为OPENING,DoorState变量存储了当前其存储的传输门的实例,因此,可直接调用其方法setState来设置状态,由于传输门状态采用类的实例变量表示,所以此处应该填写door->setState(door->OPENING)。
代码1和代码2的区别是:代码2将状态间的转换规则封装到具体的类中,当状态转换图的转换规则发生变化时,只需更改部分对应类中的状态迁移规则,而代码1中的迁移规则散落在程序中,维护起来较为困难。
转载请注明原文地址:https://kaotiyun.com/show/5fDZ777K
本试题收录于:
软件设计师下午应用技术考试题库软考中级分类
0
软件设计师下午应用技术考试
软考中级
相关试题推荐
对于业务流清晰的系统可以利用(57)贯穿整个测试用例设计过程,在用例中综合使用各种测试方法,对于参数配置类的软件,要用(58)选择较少的组合方式达到最佳效果,如果程序的功能说明中含有输入条件的组合情况,则一开始就可以选用(59)和判定表驱动法。
在UNIX操作系统中,把输入/输出设备看作是(23)。
下列测试工具中,使用(68)执行自动化负载压力测试,使用(69)执行代码静态结构分析,使用(70)执行网络测试。
针对逻辑覆盖(53)叙述是不正确的。
(46)叙述是正确的。①测试用例应由测试设计人员来制定。②测试点应由测试人员确立。③测试工作展开于项目立项后,而不是代码开发完成之后。④测试对象是源代码。
假设在程序控制流图中有14条边、10个节点,则控制流程图的环路复杂性V(G)等于______。A.12B.8C.6D.4
若有关系R(A,B,C,D)和S(C,D,E),则与表达式π3,4,7(σ4<5(R×S))等价的SQL语句如下:SELECT(17)FROM(18)WHERE(19);(18)
模块设计中,某模块根据输入的控制信息从文件中读一个记录或者向文件中写一个记录,则其内聚类型为______。
王某是M国际运输有限公司计算机系统管理员。任职期间,王某根据公司的业务要求开发了“海运出口业务系统”,并由公司使用。随后,王某向国家版权局申请了计算机软件著作权登记,并取得了《计算机软件著作权登记证书》,证书明确软件名称是“海运出口业务系统V1.0”,著作
软件测试的基本方法包括白盒测试和黑盒测试方法,以下关于二者之间关联的叙述,错误的是(61)。
随机试题
人大代表的选举关系各地区和整个国家最高权力机构的稳健运行,而选举程序的设定关乎选举的成败。下列关于人大代表选举程序的说法中,错误的是哪一项?()
烧杯加热时应置于石棉网上,使其受热均匀。
女,32岁,G1P0,孕32周。定期产前检查:体重3次未增加,宫高28cm,双顶径77mm,羊水深50mm。血压140/90mmHg。蛋白尿(+/-)。其诊断应该是下列何项
疖病发生的主要原因是
【背景资料】某机电安装公司承包了一造纸车间的机电安装工程,包括属于本车间的槽罐制作安装任务(含有两台碳钢压力容器)。合同规定除工艺设备外的所有材料均由施工单位采购,拖延工期要重罚,对于文明施工也提出了具体要求。由于工期特别紧张,业主要求土建基础交付安装后
下列哪一项措施不属于预防性控制?
经济结构对商业银行的直接影响是()。
甲、乙公司约定,由丙公司每月代乙公司向甲公司偿还债务50万元,期限2年。丙公司履行5个月后,以自己并不对甲公司负有债务为由拒绝继续履行。甲公司遂向法院起诉,要求乙公司、丙公司承担违约责任。人民法院应()。
简述难度对测验的影响以及难度和区分度的关系。
Usingtheinformationinthetext,completeeachsentence14-18,withawordorphrasefromthelistbelow.Foreachsentenc
最新回复
(
0
)