[计算机类试卷]软件水平考试中级软件设计师下午应用技术(面向对象程序设计)模拟试卷1及答案与解析.doc

上传人:wealthynice100 文档编号:506738 上传时间:2018-11-29 格式:DOC 页数:10 大小:61KB
下载 相关 举报
[计算机类试卷]软件水平考试中级软件设计师下午应用技术(面向对象程序设计)模拟试卷1及答案与解析.doc_第1页
第1页 / 共10页
[计算机类试卷]软件水平考试中级软件设计师下午应用技术(面向对象程序设计)模拟试卷1及答案与解析.doc_第2页
第2页 / 共10页
[计算机类试卷]软件水平考试中级软件设计师下午应用技术(面向对象程序设计)模拟试卷1及答案与解析.doc_第3页
第3页 / 共10页
[计算机类试卷]软件水平考试中级软件设计师下午应用技术(面向对象程序设计)模拟试卷1及答案与解析.doc_第4页
第4页 / 共10页
[计算机类试卷]软件水平考试中级软件设计师下午应用技术(面向对象程序设计)模拟试卷1及答案与解析.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、软件水平考试中级软件设计师下午应用技术(面向对象程序设计)模拟试卷 1及答案与解析 一、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 1 现欲实现一个图像浏览系统,要求该系统能够显示 BMP、 JPEG和 GIF三种格式的文件,并且能够在 Windows和 Linux两种操作系统上运行。系统首先将BMP、 JPEG和 GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上 述需求并减少所需生成的子类数目,采用桥接 (Bridge)设计模

2、式进行设计所得类图如图16 1所示。 采用该设计模式的原因在于:系统解析 BMP、 GIF与 IPEG文件的代码仅与文件格式相关,而在屏幕上显示像素矩阵的代码则仅与操作系统相关。【 C+代码】 class Matrix 各种格式的文件最终都被转化为像素矩阵 ;此处代码省略 ; class ImageImp public: virtUal void doPaint(Matrix m): 0; 显示像素矩阵 m ; class WinImp: public ImageImp public: void doPaint(Matrix m) *调用 Windows系统的绘制函数绘制像素矩阵 * ; cl

3、ass LinuxImp:public ImageImp public: void doPaint(Matrix m) *调用 Linux系统的绘制函数绘制像素矩阵 * ; class Image public: void setImp(ImageImp*imp) (1) =imp; ) virtual void parseFi le(string fileName)=0; protected: (2) *imp; ; class BMP:public Image public: void parseFile(string fileName) 此处解析 BMP文件并获得一个像素矩阵对象 m (

4、3);显示像素矩阵 m ; class GIF : public Image 此处代码省略 ; class JPEG : public Image 此处代码省略 ; void main( ) 在 windows操作系统上 查看 demo bmp图像文件 Image*imagel= (4); ImageImp*imageImpl= (5); (6); imagel一 parseFile(“demo bmp” ); 现假设该系统需要支持 10种格式的图像文件和 5种操作系统,不考虑类 Matrix,若采用桥接设计模式则至少需要设计 (7)个类。 2 某大型商场内安装了多个简易的纸巾售卖机,自动出售

5、 2元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态图如图 16-2所示。 采用状态 (State)模式来实现该纸巾售卖机,得到如图 16-3所示的类图。其中类 State为抽象类,定义了投币、退币、出纸巾等方法接口。类 SoldState、 SoldOutState、 NoQuarterState和HasQuarterState分别对应图 16-2中纸巾售卖机的 4种状态:售出纸巾、纸巾售完、没有投币、有 2元钱。 【 C+代码】 #includeusing namespace std;以下为类的定义部分 class TissueMachine; 类的提前引用 Class State

6、fpublic: virtual void insertQuarter()=0;投币 virtual void ejectQuarter()=0;退币 virtual void turnCrank()=0; 按 “出纸巾 ”按钮 virtual void dispense()=0; 出纸巾 ; *类 SoidOutState、 NoQuarterState、 HasQuarterState、 SoldState的定义省略,每个类中均定义了私有数据成员 TissueMachine*tissueMachine; * clasS TiSsueMachine private: (1) *soldOut

7、State, *noQuarterState, *hasQuarterState,*soldState, *state; int count; 纸巾数 public: TiSSueMachine(int numbers); void SetState(State*state); State* qetHasQuarterState(); State* qetNoQuarterState(); State*getSoldState(); State*getSoldOutState(); int getCount(); 其余代码省略 ; 以下为类的实现部分 void NoQuarterState :

8、 insertQuarter() tissueMachine一 setState( (2) ); void HasQuarterState: ej ectQuarter() tissueMachine一 setState( (3) ); void SoldState:dispense() if(tissueMachine一 getCount() 0) tissueMachine一 setState( (4) ); else tissueMachine一 setState( (5) ); 其余代码省略 3 某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费

9、用。咖啡店所供应的咖啡及配料的种类和价格如表 16-1所示。 现采用装饰器 (Decorator)模式来实现计算费用的功能,得到如图 16-4所示的类图。 【 C+代码】 #include#includeUS ing namespace std; const int ESPRESSO PRICE=2 5; const int DRAKROAST PRICE=20; const int MOCHA PRICE=10; const int WHIP PRICE=8; class Beverage 饮料 (1) : string description; public;(2) ()f return

10、description; ) (3); ; class condimentDecorator :public Beverage 配料 protected: (4); ; class Espresso: public Beverage 蒸馏咖啡 public: Espresso ( ) description=“Espresso”; int cost()return ESPRESSOPRICE; ; class DarkRoast: public Beverage 深度烘焙咖啡public: DarkRoast( ) description=“DardRoast”; ) int cost()re

11、turn DRAKROASTPRICE; ; class Mocha : public condimentDecorator 摩卡 public:Mocha(Beverage*beverage) this一 beverage=beVerage; string getDescription()return beverage一 getDescription()+”, Mocha”; int cost( ) return MOCHA PR工 CE+beVerage一 COSt(); ; class Whip : public condimentDecorator 奶泡 public: Whip(Be

12、verage*beVerage)this一 beVerage=beVerage; string getDescription() return beverage一 getDescription( )+“, Whip”; int cost() return WHI P PRICE+beVerage一 cost( ); ) ; int meln() Beverage*beverage=new DarkRoast(); beverage=new Mocha( (5) ); beverage=new Whip(6); coutgetDescription ()cost() endl; return 0

13、; 编译运行上述程序,其输出结果为: DarkRoast, Mocha, Whip Y38 4 己知某类库开发商提供了一套类库,类库中定义了 Application类和 Document类,它们之间的关系如图 165所示。其中, Application类表示应用程序自身,而Document类则表示应用程序打开的文档。 Application类负责打开一个已有的以外部形式存储的文档, 如一个文件,一旦从该文件中读出信息后,它就由一个Document对象表示了。 当开发一个具体的应用程序时,开发者需要分别创建自己的 Application和 Document子类。例如,图 16-5中的类 MyAp

14、plication和类MyDocument,并分别实现 Application和 Document类中的某些方法。已知Application类中的 openDocument方法采用了模板方法 (Template Method)设计模式,该方法定义了打开文档的每一个主要步骤如下: (1)首先检查文档是否能够被打开,若 不能打开,则给出出错信息并返回。 (2)创建文档对象。 (3)通过文档对象打开文档。 (4)通过文档对象读取文档信息。 (5)将文档对象加入到 Application的文档对象集合中。 Java代码 abstract class Documentpublic void save()

15、 *存储文档数据,此处代码省略 * public void open(String docName) *打开文档,此处代码省略 * public void close() *关闭文档,此处代码省略 * public abstract void read(String docName); ; abstract class Appplicationprivate Vectordocs; *文档对象集合 * publ ic boolean canOpenDocument( String docName ) *判断是否可以打开指定文档,返回真值时表示可以打开,返回假值表示不可打开,此处代码省略 * p

16、ublic void addDocument(Document aDocument) *将文档对象添加到文档对象集合中 * docs add(2); public abstract Document doCreateDocument(); *创建一个文档对象 * public void openDocument(String docName) *打开文档 * if(3)System out println(“文档无法打开 !”); return; (4)adoc= (5); (6); (7);( 8); ; 5 某大型商场内安装了多个简易的纸巾售卖机,自动出售 2元钱一包的纸巾,且每次仅售出一

17、包纸巾。纸巾售卖机的状态图如 图 16-6所示。 采用状态 (State)模式来实现该纸巾售卖机,得到如图 16-7所示的类图。其中,类 State为抽象类,定义了投币、退币、出纸巾等方法接口。类 SoldState、 SoldOutState、 NoQuarterState和HasQuarterState分别对应图 16-6中纸巾售卖机的 4种状态:售出纸巾、纸巾售完、没有投币、有 2元钱。 【 Java代码】 import j ava util *; interface State public void insertQuarter(); 投币 public void ejectQuart

18、er(); 退币 public void turnCrank(); 按下 “出纸巾 ”按钮 public void dispense(); 出纸巾 class TissueMachine (1) soldoutState, noQuarterstate, hasQuarterState, soldState,state; state=soldoutState; int count=0; 纸巾数 public TissueMachine(int numbers) *实现代码省略 * public State getHasQuarterState() return hasQuarterState;

19、 public State getNoQuarterState() return noQuarterState; public State getSoldState() return soldState; publ ic State getSoldOutState() return soldOutState; public int getCount() return count; 其余代码省略 class NoQuarterState implements State TiSsueMachine tiSsueMachine; public void insertQuarter() tissue

20、Machine setState(2); 构造方法以及其余代码省略 clasS HasQuarterState implements State TiSsueMachine tiSsueMachine; public void ej ectQuarter(); tissueMachine setState( (3) ); 构造方法以及其余代码省略 class SoldState implements State TissueMachine tiSsueMachine; public void dispense() if(tissueMachine getCount() 0) tissueMac

21、hine setState(4); else tissueMachine setState(5); 6 某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表 16-2所示。 现采用装饰器 (Decorator)模式来实现计算费用的功能,得到如图 16-8所示的类图。 Java代码 import java util *: (1) class Beverage 饮料 String description=“Unknown Beverage”; public (2) () return description; )pu

22、blic (3) ; abstract clas s CondimentDecorator extends Beverage 配料 (4); ; class Espresso extends Beverage 蒸馏咖啡 private final int ESPRESSO PRICE=2 5;publ ic Espres s 0() description=”Espres so”; public int cost()return ESPRESSO PRICE; clas s DarkRoast extends Beverage 深度烘焙咖啡 private finalint DARKROAST

23、PRICE=2 0 ; public DarkRoast0 description= “DarkRoast”; public int cost()f rcturn DARKROAST PRICE; )clas s Mocha extends CondimentDecorator 摩卡 private final int MOCHAPRICE=10; publ ic Mocha(Beverage beverage) this beverage=beverage; public String getDescription() return beverage getDescriptiOn0 + “,

24、 Mocha”; public int cost()return MOCHA PRICE+beverage cost(); class Whip extends condimentDecorator 奶泡 private finalint WHIPPRICE=8; public Whip(Beverage beverage)this beverage=beverage; public String getDescripti。 n() return beverage getDescription()+“, Whip”; public int cost()return WHIPPRICE+beve

25、rage cost(); public class Coffeepublic static void main(String args)Beverage beverage=new DarkRoast(); beverage=new Mocha (5);beverage=new Whip(6);System out println(beverage getDescription0+“¥ ”+beverage cost(); 编译运行上述程序,其输出结果为: DarkRoast, Mocha, Whip¥ 38 软件水平考试中级软件设计师下午应用技术(面向对象程序设计)模拟试卷 1答案与解析 一、

26、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 1 【正确答案】 (1)this-imp (2)Imagelmp (3)imp-doPaint(m) (4)new BMP() (5)ngw WinImp() (6)imagel一 setImp(Imagelmpl) (7)17 【试题解析】 本题考查基本面向对象设计模式的运用能力。 由文字描述和 UML结构图可知 BMP、 GIF与 JPEG是 Image的子类,分别负责读取不同格式的文件。 Imagelmp的主要任务是将像素矩阵显示在屏幕上,它的两个子类

27、Winlmp、 Linuxlmp分别实现 Windows系统和 Linux系统上的图像显示代码。空 (1)处 主要设置在哪个平台上进行实现,由于该类的成员变量也是 imp,与参数相同,因此应填 this-imp。同理,该成员变量的类型和参数的类型应保持相同,故空 (2)处应填 ImageImp。空 (3)处需要根据 imp成员变量存储的实现对象来显示图像,应填 imp-doPaint(m)。在空 (4)处需要生成一个 BMP对象,故应填。 new BMP(),在空 (5)处需要生成一个 WinImp对象,故应填 new Winlmp(),空 (6)处应填 imagel一 setlmp(Imag

28、elmp 1),采用 Bridge(桥接模式 )能够 将文件分析代码和图像显示代码分解在不同的类层结构中,如果不考虑 Matrix等类,那么最后需要设计的类包括 2个父类,分别为文件格式子类和操作系统平台类,故系统需要支持 10种格式的图像文件和 5种操作系统至少需要 17个类。 2 【正确答案】 (1)State (2)tissueMachine-getHasQuarterState() (3)tissueMachine-getNoQuarterState0 (4)tissueMachine-getNoQuarterState0 (5)tissueMachine-getSoldOutStat

29、e0 【试题解析】 本题考查基本面向对象设计模式的运用能力。 状态设计模式主要是能够使一个对象的内在状态改变时允许改变其行为,使这个对象看起来像是改变了其类。由类图可知类 State是类 SoldState、 SoldOutState、NoQuarterState和 HasQmrterState分的父类,它抽象了这 4个类的共有属性和行为。在使用中,无论是这 4个类中哪个类的对象,都可被当作 State对象来使用。 根据题目的描述,可以知道一个纸巾售卖机它由 4种状态,分别是售出 纸巾、纸巾售完、没有投币、有 2元钱。 在本题中,根据程序不难知道第 (1)空是要定义 5个对象指针,而这些对象指

30、针都应该属于 State类型,因此第一空答案为 State。 第 (2)在类 NoQuarterState(没有投币 )的 insertQuarter函数中,而这个函数是投币函数,在该函数中,使用了 tissueMachine类的 setState方法,该方法是设置纸巾售卖机的当前状态,根据题目给出的纸巾售卖机状态图,可以知道,从没有投币状态,经过投币后,应该转换到有 2元钱状态。 setState方法的 参数是一个State的对象,因此第 (2)空应该是一个有 2元钱对象,这里可以新创建一个该对象,也可以通过 tissueMachine类的 getHasQuarterState方法来获得这样

31、一个对象,所以第 (2)空答案应该是 tissueMachine getHasQuarterState0或 new HasQuarterState。 第 (3)在类 HasQuarterState(有 2元钱 )的 ejectQuarter函数中,而这个函数是退币函数,在该函数中,也使用了 tissueMachine类的 setState方法,该方法是设置纸巾售卖机的当前状态,根据题目给出的纸巾售卖机状态图,可以知道,从有 2元钱状态,经过退币后,应该转换到没有投币状态。而 setState方法的参数是一个State的对象,因此第 (3)空应该是一个没有投币对象,而这里我们可以新创建一个该对象

32、,也可以通过 tissueMachine类的 getNoQuarterState方法来获得这样一个对象,所以第 (3)空答案应该是 “tissueMachine getNoQuarterState0”或 “new NoQuarterState”。 同样的道理 ,可以知道第 (4)空的答案是 tissueMachine getNoQuarterState0或 newNoQuarterState。第 (5)空的答案是 tissueMachine getSoldOutState0或new SoldOutState。 3 【正确答案】 (1)protected (2)virtual string ge

33、tDescription (3)virtual int cost0=0 (4)Beverage*beverage (5)beverage (6)beverage 【试题 解析】 本题考查了 C+语言的应用能力和装饰设计模式的应用。 第 (1)空很明显,是要说明属性 description在类 Beverage中的类型,应该是私有的、受保护的或公有的,从后面的程序可以看出,子类中继承使用了该属性,因此这里只能定义为受保护的,因此第 (1)空的答案为 protected。 第 (2)空处也很明显,是要给出一个函数的定义,并且该函数的函数体是“returndescription; 99 9从子类奶泡

34、和摩卡中不难发现这个函数应该是getDescription,因此本空的答案为 virtual string getDescription。 第 (3)空需要结合后面各子类才能发现,在 Beverage中还应该定义一个函数cost,而这个函数在 Beverage中并没有实现,因此要定义为纯虚函数,所以第 (3)空的答案为 virtual int cost()=0。 第 (4)空在类 CondimentDecorator中,且是该类唯一的一条语句,而它的子类分别是奶泡和摩卡,在奶泡和摩卡这两个类中,都用到了 Beverage*beverage,而在使用之前并没有说明,因此这就可以说明, Bever

35、age*beverage是在父类CondimentDecorator中定义的,子类直接继承使用,因此第 (4)空的答案为Beverage*beverage。 第 (5)和第 (6)空在主函数当中,其中第 (5)空是要创建一个 Mocha对象,应该调用的是类 Mocha的构造函数。从类 Mocha中,可以看出,其构造函数 Mocha的参数是一个 Beverage类型的对象指针,而在主函数中,开始就定义了一个 Beverage类型的对象指针 beverage,因此这里只需填写 beverage即可。同理第 (6)空的答案也是 beverage。 4 【正确答案】 (1)Document (2)aD

36、ocument (3)!canOpenDocument(doeName) (4)Document (5)doCreateDocument() (6)adoCopen(docName) (7)adoCread(docName) 【试题解析】 本题考查了 Java语言的应用能力和模板方法设计模式。空 (1)考查了 Java库中 Vector模板类的使用,由于 Vector模板类可以存储任意类型,在定义时需要指定其存储类型,根据后面的代码,能够加入到该文档集合对象的 类型为文档类型,因此空 (1)处的类型应该为 Document。空 (2)处将文档对象加入文档集合对象中。从空 (3)开始的代码属于图

37、中 Application类的 OpenDocument方法,该方法是模板方法,因此,需根据题目给出的步骤一一对应填空。空 (3)处判断能否打开文档,需要调用父类自己的方法 canOpenDocument。空 (4)与空 (5)所在的语句需要创建文档对象,调用 doCreateDocument方法,接着通过文档对象打开和读取文档,最后通过 addDocument方法将该文档对象加入到文档对象集合中 。所有这些方法都是在父类或文档对象中进行定义,不涉及到具体的子类。而子类负责要实现这些模板方法中需要调用的方法以便运行时被调用。 5 【正确答案】 (1)State (2)tissueMachine

38、 getttasQuarterState() (3)tissueMachine getNoQuarterState() (4)tissueMachine getNoQuarterState() (5)tissueMachine getSoldOutState() 【试题解析】 本题考查基本面向对象设计模 式的运用能力。 状态设计模式主要是能够使一个对象的内在状态改变时允许改变其行为,使这个对象看起来像是改变了其类。由类图可知类 State是类 SoldState、 SoldOutState、NoQuarterStalte和 HasQuarterState分的父类,它抽象了这 4个类的共有属性和

39、行为。在使用中,无论是这 4个类中哪个类的对象,都可被当作 State对象来使用。 根据题目的描述,可以知道一个纸巾售卖机它由 4种状态,分别是售出纸巾、纸巾售完、没有投币、有 2元钱。 在本题中,根据程序不难知道第 (1)空是要定义 5个对象的引用,而这些变量都应该属于 State类型,因此第一空答案为 State。 第 (2)在类 NoQuarterState(没有投币 )的 insertQuarterl()函数中,而这个函数是投币函数,在该函数中,使用了 tissueMachine类的 setState方法,该方法是设置纸巾售卖机的当前状态,根据题目给出的纸巾售卖机状态图,可以知道,从没

40、有投币状态,经过投币后,应该转换到有 2元钱状态。 setState方法的参数是一个State的对象,因此第 (2)空应该是一个有 2元钱对象,这里可以 新创建一个该对象,也可以通过 tissueMachine类的 getttasQuarterState方法来获得这样一个对象,所以第 (2)空答案应该是 tissueMachine getHasQuarterState()或 new HasQuarterState。 第 (3)在类 HasQuarterState(有 2元钱 )的 ejectQuarter。函数中,而这个函数是退币函数,在该函数中,也使用了 tissueMachine类的 se

41、tState方法,该方法是设置纸巾售卖机的当前状态,根据题目给出的纸巾售卖机状态图 。可以知道,从有 2元钱状态,经过退币后,应该转换到没有投币状态。 setState方法的参数是一个State的对象,因此第 (3)空应该是一个没有投币对象,这里可以新创建一个该对象,也可以通过 tissueMachine类的 getNoQuarterState方法来获得这样一个对象,所以第 (3)空答案应该是 tissueMachine getNoQuarterState()或 new NoQuarterState。 同样的道理,可以知道第 (4)空的答案是 tissueMachine getNoQuarte

42、rState()或newNoQuarterState。第 (5)空的答案是 tissueMachine getSoldOutState()或。 new SoldOutState。 6 【正确答案】 (1)abstract (2)String getDescription (3)abstract int cost() (4)Beverage beverage (5)beverage (6)beverage 【试题解析】 本题考查了 Java语言的应用能力和装饰设计模式的应用。 第 (1)空很明显,是要给类 Beverage前添加定义的关键字,从整个程序来看,应该要将类 Beverage定义为抽象

43、类,需要在前面添加关键字 abstract,因此第 (1)空的答案为 abstract。 第 (2)空处也很明显,是要给出一个函数的定义,并且该函数的函数体是“returndescription; ”,从子类奶泡和摩卡中我们不难发现这个函数应该是getDescription,而该函数的返回类型 String,因此本空的答案为 String getDescription。 第 (3)空需要结合后面各子类才能发现,在 Beverage中还 应该定义一个函数cost,而这个函数在 Beverage中并没有实现,因此要定义为抽象函数,所以第 (3)空的答案为 abstract int cost()=0

44、。 第 (4)空在类 CondimentDecorator中,且是该类唯一的一条语句,而他的子类分别是奶泡和摩卡,在奶泡和摩卡这两个类中,都用到了 Beverage beverage,而在使用之前并没有说明,因此这就可以判定, Beverage beverage是在父类CondimentDecorator中定义的,子类直接继承使用,因此第 (4)空的答案为Beverage beverage。 第 (5)和第 (6)空在主函数当中,其中第 (5)空是要创建一个 Mocha对象,应该调用的是类 Mocha的构造函数。从类 Mocha中,可以看出,其构造函数 Mocha的参数是一个 Beverage类型的对象引用,而在主函数中,开始就定义了一个Beverage类型的对象引用 beverage,因此这里只需填写 beverage即可。同理第 (6)空的答案也是 beverage。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试资料 > 职业资格

copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1