软件设计师历年试题
试题五(共 15 分)
从下列的 3 道试题(试题五至试题七)中任选 1 道解答。 如果解答的试题数超过 1 道,则题号小的 1 道解答有效 阅读以下说明和 C 语言函数,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明]
在一个分布网络中,资源(石油、天然气、电力等)可从生产地送往其他地方。在传输过程中,资源会有损耗。例如,天然气的气压会减少,电压会降低。我们将需要输送的资源信息称为信号。在信号从信源地送往消耗地的过程中,仅能容忍一定范围的信号衰减,称为容忍值。分布网络可表示为一个树型结构,如图 5-1 所示。信号源是树根,树中的每节点(除了根)表示一个可以放置放大器的子节点,其中某些节点同时也是信号消耗点,信号从一个节点流向其子节点。
每个节点有一个 d 值,表示从其父节点到该节点的信号衰减量。例如,在图 5-1 中,节点 w、p、q 的 d 值分别为 2、1、3,树根节点表示信号源,其 d 值为 0。
每个节点有一个 M
值,表示从该节点出发到其所有叶子的信号衰减量的最大值。显然,叶子节点
的 M 值为 0。对于非叶子节点 j,M(j)=max{M(k) + d(k) | k 是 j 的孩子节点}。在此公式中,要计算节点的 M 值,必须先算出其所有子节点的 M 值。
在计算 M 值的过程中,对于某个节点 i,其有一个子节点 k 满足 d(k)+M(k)大于容忍值,则应在 k 处放置放大器,否则,从节点 i 到某叶子节点的信号衰减量会超过容忍值,使得到达该叶子节点时信号不可用,而在节点 i 处放置放大器并不能解决到达叶子节点的信号衰减问题。
例如,在图 5-1 中,从节点 p 到其所有叶子节点的最大衰减值为 4。若容忍值为 3,则必须在 s 处放置信号放大器,这样可使得节点 p 的 M 值为 2。同样,需要在节点 q、v 处放置信号放大器,如图 5-2 阴影节点所示。若在某节点放置了信号放大器,则从该节点输出的信号与信号源输出的信号等价。
15
软件设计师考试历年真题 第29页 共 16 页 软件设计师历年试题 函数 placeBoosters(TreeNode *root)的功能是:对于给定树型分布网络中各个节点,计算其信号衰减量的最大值,并确定应在树中的哪些节点放置信号放大器。
全局变量 Tolerance 保存信号衰减容忍值。 树的节点类型定义如下: typedef struct TreeNode {
int id; /*当前节点的识别号*/ int ChildNum; /*当前节点的子节点数目*/ int d; /*父节点到当前节点的信号衰减值*/
struct TreeNode **childptr; /*向量,存放当前节点到其所有子节点的指针*/ int M; /*当前节点到其所有子节点的信号衰减值中的最大值*/ bool boost; /*是否在当前节点放置信号放大器的标志*/ }TreeNode; [C语言函数]
void placeBoosters(TreeNode *root )
{ /* 计算 root 所指节点处的衰减量,如果衰减量超出了容忍值,则放置放大器 */ TreeNode *p; int i,degradation; if ( (1) ) {
degradation = 0; root->M = 0; i = 0;
if (i >= root->ChildNum)
return;
p = (2) ;
for(;i < root->ChildNum && p; i++,p = (3) ){ p->M = 0; (4) ;
if (p->d + p->M > Tolerance) { /*在 p 所指节点中放置信号放大器*/ p->boost = true; p->M = 0; }
if (p->d + p->M > degradation) degradation = p->d + p->M; }
root -> M = (5) ; } }
试题六(共 15 分)
阅读下列说明和 C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明]
某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如表 6-1 所示:
16
软件设计师考试历年真题 第31页 共 17 页 软件设计师历年试题
为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图 6-1 所示:
其中,Duck 为抽象类,描述了抽象的鸭子,而类 RubberDuck、MallardDuck、CottonDuck和 RedHeadDuck 分别描述具体的鸭子种类,方法 fly()、quack()和 display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;类 FlyBehavior 与 QuackBehavior 为抽象类,分别用于表示抽象的飞行行为与发声行为;类 FlyNoWay 与 FlyWithWings 分别描述不能飞行的行为和用翅膀飞行的行为;类 Quack、Squeak 与 QuackNoWay 分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。 [C++代码] #include
public : (2) fly() = 0; };
class QuackBehavior {
public:(3) quack() = 0; };
class FlyWithWings:public FlyBehavior{
public: void fly(){ cout << \使用翅膀飞行 !\ };
class FlyNoWay:public FlyBehavior{
17
软件设计师考试历年真题 第33页 共 18 页 软件设计师历年试题 不能飞行 !\
};
class Quack:public QuackBehavior{
public: void quack(){ cout << \发出\\'嘎嘎\\'声 !\ } };
class Squeak:public QuackBehavior{
public: void quack(){ cout << \发出空气与橡皮摩擦声 !\ };
class QuackNoWay:public QuackBehavior{
public: void quack (){ cout << \不能发声 !\ };
class Duck { protected:
FlyBehavior * (4) ; QuackBehavior * (5) ; public:
void fly(){ (6) ; } void quack() { (7) ; }; virtual void display()=0; };
class RubberDuck: public Duck { public:
RubberDuck(){
flyBehavior = new (8) ; quackBehavior = new (9) ; }
~RubberDuck(){
if(!flyBehavior) delete flyBehavior; if(!quackBehavior) delete quackBehavior; }
void display(){ /*此处省略显示橡皮鸭的代码 */ } };
//其它代码省略 试题七(共 15 分)
阅读下列说明和 Java 代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明]
某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如表 7-1 所示:
}
18
软件设计师考试历年真题 第35页 共 19 页 软件设计师历年试题
为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图 7-1 所示:
其中,Duck 为抽象类,描述了抽象的鸭子,而类 RubberDuck、MallardDuck、CottonDuck和 RedHeadDuck 分别描述具体的鸭子种类,方法 fly()、quack()和 display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;接口 FlyBehavior 与 QuackBehavior 分别用于表示抽象的飞行行为与发声行为;类 FlyNoWay 与 FlyWithWings 分别描述不能飞行的行为和用翅膀飞行的行为;类 Quack、Squeak 与 QuackNoWay 分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。 [Java 代码] (1) FlyBehavior {
public void fly(); };
(2) QuackBehavior {
public void quack(); };
class FlyWithWings implements FlyBehavior{
public void fly(){ System.out.println(\使用翅膀飞行 !\ };
class FlyNoWay implements FlyBehavior{
public void fly(){ System.out.println(\不能飞行 !\ };
class Quack implements QuackBehavior{
public void quack(){ System.out.println(\发出\\'嘎嘎\\'声 !\ }
19
软件设计师考试历年真题 第37页 共 20 页