1、软件水平考试(中级)软件设计师下午(应用技术)历年真题试卷汇编 5 及答案解析(总分:14.00,做题时间:90 分钟)一、必答题(总题数:7,分数:14.00)1.必答题(共 4 道大题,每道大题)(分数:2.00)_2.阅读下列说明和 c+代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 现要求实现一个能够自动生成求职简历的程序,简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同,并尽量减少程序中的重复代码。现采用原型模式(Prototype)来实现上述要求,得到如图 161 所示的类图。 (分数:2.00)_3.阅读以下说明和 C+代码,将
2、应填入(n)处的字句写在对应栏内。【说明】欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如表 162 所示。该绘图软件的扩展性要求,将不断扩充新的图形和新的绘图程序。为了避免出现类爆炸的情况,现采用桥接(Bridge)模式来实现上述要求,得到如图 162 所示的类图。 (分数:2.00)_4.阅读下列说明和 C+代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以 SQL Server 和Access 两种数据库以及系统中的数据库表 Departm
3、ent 为例,其类图如图 163 所示。 (分数:2.00)_5.阅读下列说明 C+代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表 163 所示。 现采用装饰器(Decorator)模式来实现计算费用的功能,得到如图 165 所示的类图。 (分数:2.00)_6.阅读下列说明 SDC+代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 某大型商场内安装了多个简易的纸巾售卖机,自动售出 2 元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机
4、的状态如图 166 所示。 采用状态(State)模式来实现该纸巾售卖机,得到如图 167 所示的类图。其中类State 为抽象类,定义了投币、退币、出纸巾等方法接口。类SoldState、SoldOutState、NoQuarterState 和 HasQuarterState 分别对应图 164 中纸巾售卖机的 4 中状态:售出纸巾、纸巾售完、没有投币、有 2 元钱。 (分数:2.00)_7.阅读下列说明和 C+代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 某公司的组织结构图如图 1610 所示,现采用组合(Composition)设计模式来构造该公司的组织结构, 得到如图
5、 16 一11 所示的类图。 (分数:2.00)_软件水平考试(中级)软件设计师下午(应用技术)历年真题试卷汇编 5 答案解析(总分:14.00,做题时间:90 分钟)一、必答题(总题数:7,分数:14.00)1.必答题(共 4 道大题,每道大题)(分数:2.00)_解析:2.阅读下列说明和 c+代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 现要求实现一个能够自动生成求职简历的程序,简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同,并尽量减少程序中的重复代码。现采用原型模式(Prototype)来实现上述要求,得到如图 161 所示的类图。
6、 (分数:2.00)_正确答案:(正确答案:(I)virtual Cloneable*Clone()=0 (2)WorkExperience*obj (3)Work (4)Resume*obj (5)a 一Clone()解析:解析:本题考查原型模式的概念及应用,原型模型是一种对象创建模型,用原型实体指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模型允许一个对象再创建另一个可订制的对象,无需知道任何创建的细节。Prototype 模式其实就是常说的”虚拟构造函数”一个实现,C+的实现机制中并没有支持这个特性,但是通过不同派生类实现的 Clone 接口函数可以完成与”虚拟构造函数”同样
7、的效果。题中声明一个虚拟基类,所有的原型都从这个基类继承, (1)所代表的就是这个基类中的纯虚函数,需要供继承者自行实现,即为 virtual Cloneable*Clone()=0,首先声明一个抽象基类,并定义 clone()函数为纯虚函数。然后根据基类实例化各个子类,并且实现复制构造函数,并实现 clone()函数,由此可知(2)处为 WorkExperience*obj,(3)处 Work,(4)处为 Resume*obj。在 main 函数中实现 Resume*b 对*am 复制,故根据 C+语法(5)中为 a 一Clone()。3.阅读以下说明和 C+代码,将应填入(n)处的字句写在
8、对应栏内。【说明】欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如表 162 所示。该绘图软件的扩展性要求,将不断扩充新的图形和新的绘图程序。为了避免出现类爆炸的情况,现采用桥接(Bridge)模式来实现上述要求,得到如图 162 所示的类图。 (分数:2.00)_正确答案:(正确答案:(1)virtual void drawLine(double xl,double y1,double x2,double y2); (2)virtual void drawCircle(double X,double Y,double r); (3)DPIdra
9、w-a-ircle(x,y,r);(4)DP2drawCircle(x,y,r); (5)virtual void draw();(6)Shape(dp)。)解析:解析:本题考查 Bridge 桥接模式的概念及应用,将抽象与其实现解耦,使它们都可以独立地变化。大致意思是说:将一组实现与另一组使用他们的对象分离。这里的实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类)Drawing 是一个虚拟基类,里面包含了希望不同策略实现的算法,派生类 V1Drawing,V2Drawing 都派生自 Drawing,对基类中的希望实现的算法都作了具体实现,且它们都含
10、有 drawLine 和 drawCircle 函数,所以 Draw 类中缺失的应该是这两个算法,于是 (1)virtual void drawLine(double x1,double y1,double x2,double y2); (2)virtual void drawCircle(double x,double y,double r);DPI 和 DP2 中包含了绘制 Line 和 Circle 的具体实现的Static 方法,因此在 V1Drawing,V2Drawing 类中可以直接进行调用它们。 (3)DPL drawacircle(x,y,r) (4)DP2drawCircl
11、e(x,y,r);Shape 类派生出 Rectangle 和 Circle 类,里面都含有draw 方法,但是具体 draw 方法的实现却不相同,所以(5)virtual void draw(),最后 Circle 的构造函数初始化了后 4 个变量,还有继承自 shape 的变量一 dp 未做初始化,因此调用 shape构造函数做初始化(6)shape(dp)。4.阅读下列说明和 C+代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以 SQL Server 和Access 两种数据库以及系统
12、中的数据库表 Department 为例,其类图如图 163 所示。 (分数:2.00)_正确答案:(正确答案:(1)virtual void Insert(Department 木 department) (2)virtual Department GetDepartment(int id) (3)public IDepartment (4)public IDepartment (5)class Ifactory (6)virtual IDepartment*Create Department()解析:解析:本题考查抽象工厂设计模式的概念及其应用。抽象工厂设计模式的意图是:提供一个创建一系列
13、相关或相互依赖的对象,而无须指出它们具体的类。在如下情况下应当考虑使用抽象工厂模式:当一个系统要独立于它的产品的创建、组合和表示时;当一个系统要由多个产品系列中的一个来配置时;当需强调一系列相关的产品对象的设计以便进行联合使用时;想提供一组对象而不显示它们的实现过程,只显示它们的接口时。抽象工厂设计模式的类图如图 164 所示,其中:5.阅读下列说明 C+代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表 163 所示。 现采用装饰器(Decorat
14、or)模式来实现计算费用的功能,得到如图 165 所示的类图。 (分数:2.00)_正确答案:(正确答案:(1)abstract(2)StringgetDescription(3)abstractintcost() (4)Beveragebeverage(5)beverage(6)beverage)解析:解析:由类图可知,Beverage 是基类,Espresso、DarkRoast、CondimentDecorator 是 Beverage的派生类,Mocha、Whip 又是 CondimentDecorator 的派生类。 (1)处应填kdescfiption访问控制类型,可能为 priv
15、ate 或 protected。在 Beverage派生类 Espressol)-始化函数中直接使用“description,由此可知,在基类中,description访问控制类型为 protected。如果为 priVate,则在派生中不能使用。 在基类中先后动态建立了一个 DarkRoast 对象、Mocha 对象和 Whip 对象,调用初始化函数,并输出。在 Mocha 类和 Whip 类中分别调用了基类的 getDescription()cost()。6.阅读下列说明 SDC+代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 某大型商场内安装了多个简易的纸巾售卖机,自动售出
16、 2 元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态如图 166 所示。 采用状态(State)模式来实现该纸巾售卖机,得到如图 167 所示的类图。其中类State 为抽象类,定义了投币、退币、出纸巾等方法接口。类SoldState、SoldOutState、NoQuarterState 和 HasQuarterState 分别对应图 164 中纸巾售卖机的 4 中状态:售出纸巾、纸巾售完、没有投币、有 2 元钱。 (分数:2.00)_正确答案:(正确答案:(1)State (2)tissueMachine-getHasQuarterState0 或 new HasQuarterSt
17、ate (3)tissueMachine-getNoQuarterState0 或 new NoQuarterState (4)tissueMachine-getNoQuarterState0或 new NoQuarterState (5)tissueMachine-getS0ldoutState()或 new So|dOutState)解析:解析: (1)根据题意,本题使用的是状态模式,判断纸巾售卖机的状态,根据不同的状态执行不同的动作。State 定义了纸巾售卖机所对应的一些状态,售出纸巾、纸巾售完等状态。类SoldOutState、NoQuarterState、HasQuarterSta
18、te、SoldState 均有类 State 派生而来。 (2)void insertQuarter()定义了一个“投币”的方法:在没有“2 元钱”时,客户投币的方法。tissureMachinesetState 是改变纸巾售卖机的状态,此时,客户已投入 2 元钱,故将此时的状态改为“有 2 元钱”的状态,纸巾售卖机调用“有 2 元钱”状态的方法即可。 (3)void ejectQuarter0 定义了一个“退币”的方法:在有 2 元钱的状态下,用户按下退币按钮,纸巾售卖机将此时的状态改为“没有投币”状态,故直接调用 getNoQulnerState()即可。 (4)根据纸巾售卖机状态图可知,
19、当售出纸巾,并且纸巾数量仍大于 0 时,将返回“没有投币”状态,同第(3)小题的分析,此处应调用getNoQuarterState0。 (5)根据纸巾售卖机状态图可知,当售出纸巾,并且纸巾数量等于 0 时,将返回“纸巾售完”状态,此处用了 ifelse判断语句,当纸巾数量仍大于 0 时,返回“没有投币”状态,否则,纸巾数量一定等于 0,本段程序第(5)空是 else 下的一条语句,故此处是判断 count 为 0 时,纸巾售卖机的状态,显然,应调用 getSoldOutState0。7.阅读下列说明和 C+代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 某公司的组织结构图如图 1
20、610 所示,现采用组合(Composition)设计模式来构造该公司的组织结构, 得到如图 16 一11 所示的类图。 (分数:2.00)_正确答案:(正确答案:(1)this 一name (2)virtual void Add(Company*c)=0 (3)virtual void Delete(Company*C)=0 (4)Company* (5)Children (6)Children (7)root 一Add(comp) (8)comp 一Add(compl)解析:解析:初始化函数中,将形参的值付给成员 name,形参的变量名和成员变量的名称相同,需要使this 指针指示被赋值的
21、 name 是类的成员。增加(删除)子公司、办事处或部门用到的函数是 Add 和Delete。由于 C0mpany 是抽象类,并作为 ConcreteCompany、HRDepartment、FinanceDepartment 的基类,ConcreteCompany、HRD 印 anment 继承了其父类的 Add 和 Delete 操作,因此在基类中要将 Add 和 DeIete设置为纯虚函数。类 ConcreteCompany 表示具体的分公司或者办事处,其中的成员 children 用来存储子公司、办事处或部门,其数据类型应为 Company*,当进行增加操作时,要把增加的对象存储在 children的最后;当进行删除操作,则需要从 children 中将对应的对象移除。 (7)处的操作是把上海分公司这个对象加入到北京公司总部中。 (8)处的操作是将南京办事处这个对象加入到上海分公司中。