2010下半年试题参考答案:2010上半年试题试题五阅读下列说明和C++弋码,将应填入(n)处的字句写在对应栏内。[说明]某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征。需要模拟的飞机种类及其特征如表5-1所示。表5-1飞机种类起飞特征飞行特征直升机(Helicopter)垂直起飞(VerticalTakeOff)亚音速飞行(SubSonicFly)客机(AirPlane)长距离起飞(LongDistanceTakeOff)亚音速飞行(SubSonicFly)歼击机(Fighter)长距离起飞(LongDistanceTakeOff)超音速飞行(SuperSonicFly)鹞式战斗机(Harrier)垂直起飞(VerticalTakeOff)超音速飞行(SuperSonicFly)为支持将来模拟更多种类的飞机,采用策略设计模式(strategy)设计的类图如图5-1所示。图5-1中,AirCraft为抽象类,描述了抽象的飞机,而类Helicopter、AirPlane、Fighter和Harrier分别描述具体的飞机种类,方法fly()和takeOff()分别表示不同飞机都具有飞行特征和起飞特征;类FlyBehavior与TakeOffBehavior为抽象类,分别用于表示抽象的飞行行为与起飞行为;类SubSonicFly与SuperSonicFly分别描述亚音速飞行和超音速飞行的行为;类VerticalTakeOff与LongDistanceTakeOff分别描述垂直起飞与长距离起飞的行为。[C++代码]#include<iostream>usingnamespacestd;classFlyBehaVior{public:virtualvoidfly()=0;};classSubSonicFly:publicFlyBehaVior{public:voidfly(){cout<<亚音速飞行!<<endl;)};classSupersonicFly:publicFlyBehaVior{public:voidfly(){cout<<超音速飞行!<<endl;)};classTakeOffBehavior{publie:virtualvoidtakeOff()=0;};classVerticalTakeOff:publicTakeOffBehavior{public:voidtakeOff(){cout<<垂直起飞!<<endl'}};classLongDistanceTakeOff:publicTakeOffBehavior{public:voidtakeOff(){cout<<长距离起飞!<<endl;}};classAirCraft{protected:(1);(2);public:voidfly(){(3);}voidtakeoff(){(4);};};classHelicopter:publicAirCraft{public:Helicopter(){flyBehavior=new(5);takeoffBehavior=new(6);}(7){if(!flyBehaVior)deleteflyBehaVior;if(!takeoffBehavior)deletetakeoffBehaVior;}};//其他代码省略参考答案:1.FlyBehavior*flyBehavior2.TakeOffBehavjor*=takeOffBehavior3.flyBehavior->fly()4.takeOffBehavior->takeOff()5.SubSonicFly()6.VerticalTakeOff()7.~Helicopter()2009上半年试题阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。[说明]现欲构造一文件/目录树,采用组合(Composite)设计模式来设计,得到的类图如下图所示:[C++代码]#include<list>#include<iostream>#include<string>usingnamespacestd;classAbstractFile{protected:stringname;//文件或目录名称public:voidprintName(){cout<<name;>//打印文件或目录名称virtualvoidaddChild(AbstractFile*file)=0;//给一个目录增加子目录或文件virtualvoidremoveChild(AbstractFile*file)=0;//删除一个目录的子目录或文件virtuallist<AbstractFile*>*getChildren()=0;//获得一个目录的子目录或文件};classFile:publiCAbstractFile{public:File(stringname){(1)=name;}voidaddChild(AbstractFile*file){return;}voidremoveChild(AbstractFile*file){return;}(2)getChildren(){return(3);}};classFolder:publicAbstractFile{private:list<AbstractFile*>childList;//存储子目录或文件public:Folder(stringname){(4)=name;}voidaddChild(AbstractFile*file){childList.push_back(file);}voidremoveChild(AbstractFile*file){childList.remove(file);}list<AbstractFile*>*getChildren(){return(5);}};voidmain(){//构造一个树形的文件/目录结构AbstractFile*rootFolder=newFolder(c:\\);AbstractFile*compositeFolder=newFolder(compositel);AbstractFile*windowsFolder=newFolder(windows);AbstractFile*file=newFile(TestComposite.java);rootFolder->addChild(compositeFolder);rootFolder->addChild(windowsFolder);compositeFolder->addChild(file);}参考答案:1.this->name2.list<AbstractFile*>*3.NULL4.this->name5.&childList2009下半年试题试题六阅读下列说明和C++代码,将应填入(n)处的字句写在的对应栏内。1.[说明]现欲实现一个图像浏览系统,要求该系统能够显示BMP、3PEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接(Bridge)设计模式进行设计,所得类图如下图所示。采用该设计模式的原因在于:系统解析BMP、GIF与JPEG文件的代码仅与文件格式相关,而在屏幕上显示像素矩阵的代码则仅与操作系统相关。[C++代码]classMatrix{//各种格式的文件最终都被转化为像素矩阵//此处代码省略};classImagelmp{public:virtualvoiddoPaint(Matrixm)=0;//显示像素矩阵m};classWinImp:publicImageImp{public:voiddoPaint(Matrixm){/*调用Windows系统的绘制函数绘制像素矩阵*/)};classLinuxImp:publicImageImp{public:voiddoPaint(Matrixm){/*调用Linux系统的绘制函数绘制像素矩阵*/}};classImage{public:voidsetImp(ImageImp*imp){(1)=imp;}virtualvoidparseFile(stringfileName)=0;protected:(2)*imp;};classBMP:publicImage{public:voidparseFile(stringfileName){//此处解析BMP文件并获得一个像素矩阵对象m(3);//显示像素矩阵m}};classGIF:publicImage{//此处代码省略};classJPEG:publicImage{//此处代码省略};voidmain(){//在Windows操作系统上查看demo.bmp图像文件Image*imagel=(4);ImageImp*imageImpl=(5);(6);imagel->parseFile(demo.bmp);}现假设该系统需要支持10种格式的图像文件和5种操作系统,不考虑类Matrix,若采用桥接设计模式则至少需要设计(7)个类。参考答案:(1)this->imp(2)ImageImp(3)imp->doPaint(m)(4)newBMP()(5)newWinImp()(6)imagel->setImp(imageImpl)(7)172008下半年试题试题六阅读下列说明和C++代码,将应填入(n)处的字句写在对应栏内。1.【说明】已知某类库开发商提供了一套类库,类库中定义了Application类和Document类,它们之间的关系如下图所示。其中,Application类表示应用程序自身,而Document类则表示应用程序打开的文档。Application类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中读出信息后,它就由一个Document对象表示。当开发一个具体的应用程序时,开发者需要分别创建自己的Application和Document子类,例如上图中的类MyApplication和类MyDocument,并分别实现Application和Document类中的某些方法。已知Application类中的openDocument方法采用了模板方法(TemplateMethod)设计模式,该方法定义了打开文档的每一个主要步骤,如下所示:1.首先检查文档是否能够被打开,若不能打开,则给出出错信息并返回;2.创建文档对象;3.通过文档对象打开文档;4.通过文档对象读取文档信息;5.将文档对象加入到Application的文档对象集合中。【C++代码】#include<iostream>#include<vector>usingnamespacestd;classDocument{public:voidsave(){/*存储文档数据,此处代码省略*/)voidopen(stringdocName){/*打开文档,此处代码省略*/)voidclose(){/*关闭文档,此处代码省略*/)virtualvoidread(stringdocName)=0;};classAppplication{private:vector<(1)>docs;/*文档对象集合*/public:boolcanOpenDocument(stringdocName){/*判断是否可以打开指定文档,返回真值时表示可以打开,返回假值表示不可打开,此处代码省略*/}voidaddDocument(Document*aDocument){/*将文档对象添加到文档对象集合中*/docs.push_back((2));}virtualDocument*doCreateDocument()=0;/*创建一个文档对象*/voidopenDocument(strin