2017上半年软件设计师考试案例分析真题(二)

希赛 整理了2017上半年软件设计师考试下午真题,以下是第二部分。

试题四

阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。

【说明】

假币问题:有n枚硬币,其中有一枚是假币,己知假币的重量较轻。现只有一个天平,要求用尽量少的比较次数找出这枚假币。

【分析问题】

将n枚硬币分成相等的两部分:

(1)当n为偶数时,将前后两部分,即1…n/2和n/2+1…0,放在天平的两端,较轻的一端里有假币,继续在较轻的这部分硬币中用同样的方法找出假币:

(2)当n为奇数时,将前后两部分,即1..(n-1)/2和(n+1)/2+1…0,放在天平的两端,较轻的一端里有假币,继续在较轻的这部分硬币中用同样的方法找出假币:若两端重量相等,则中间的硬币,即第(n+1)/2枚硬币是假币。

【C代码】

下面是算法的C语言实现,其中:

coins[]:硬币数组

first,last:当前考虑的硬币数组中的第一个和最后一个下标

#include <stdio.h>

int getCounterfeitCoin(int coins[], int first,iot last)

{

int firstSum = 0,lastSum = 0;

int ì;

If(first==last-1){ /*只剩两枚硬币*/

if(coins[first] < coins[last])

return first;

return last;

}

if((last – first + 1) % 2 =0){ /*偶数枚硬币*/

for(i = first;i <( 1 );i++){

firstSum+= coins[i];

}

for(i=first + (last-first) / 2 + 1;i < last +1;i++){

lastSum += coins[i];

}

if( 2 ){

Return getCounterfeitCoin(coins,first,first+(last-first)/2;)

}else{

Return getCounterfeitCoin(coins,first+(last-first)/2+1,last;)

}

}

else{ /*奇数枚硬币*/

For(i=first;i<first+(last-first)/2;i++){

firstSum+=coins[i];

}

For(i=first+(last-first)/2+1;i<last+1;i++){

lastSum+=coins[i];

}

If(firstSum<lastSum){

return getCounterfeitCoin(coins,first,first+(last-first)/2-1);

}else if(firstSum>lastSum){

return getCounterfeitCoin(coins,first+(last-first)/2-1,last);

}else{

Return( 3 )

}

}

}

【问题一】

根据题干说明,填充C代码中的空(1)-(3)

【问题二】

根据题干说明和C代码,算法采用了()设计策略。函数getCounterfeitCoin的时间复杂度为()(用O表示)。

【问题三】

若输入的硬币数为30,则最少的比较次数为(),最多的比较次数为()。

试题五(共15分〉

阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。

【说明】

某快餐厅主要制作井出售儿童套餐,一般包括主餐(各类比萨)、饮料和玩具,其餐品种类可能不同,但其制作过程相同。前台服务员(Waiter)调度厨师制作套餐。现采用生成器(Builder)模式实现制作过程,得到如图5-1所示的类图。

【C++代码】

#include<iostream>

#include <string>

using namespace std;

class Pizza {

private: string parts;

public:

void setParts(string parts) { this->parts=parts; }

string getParts() { return parts; }

};

class PizzaBuilder {

protected:Pizza* pizza;

public:

Pizza* getPizza() { retum pizza; }

void createNewPizza() {pizza = new Pizza();}

( 1 );

}

class HawaiianPizzaBuilder :public PizzaBuilder {

public:

void buildParts() { pizza->setParts(“cross +mild + ham&pineapple”); }

class SpicyPizzaBuider: public PizzaBuilder {

public:

void buildParts() { pizza->setParts(“pan baked +hot + ham&pineapple”); }

}

Class Waiter{

Private:

PizzaBuilder* pizzaBuilder;

public:

void setPizzaBuilder(PizzaBuilder* pizzaBuilder) { /*设置构建器*/

( 2 )

}

Pizza* getPizza() { return pizzaBuilder->getPizza(); }

void construct() { /*构建*/

pizzaBuilder->createNewPizza();

( 3 )

}

};

int main(){

Waiter*waiter=new Waiter();

PizzaBuilder*hawaiian pizzabuilder=new HawaiianPizzaBuilder()

( 4 );

( 5 );

cout<< “pizza: “<< waiter->getPizza()->getParts()<< endl;

}

程序的输出结果为:

pizza:cross+mild+ham&pineapple

试题六(共15分)

阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。

【说明】

某快餐厅主要制作并出售儿童套餐,一般包括主餐(各类比萨)、饮料和玩具,其餐品种类可能不同,但其制作过程相同。前台服务员(Waiter)调度厨师制作套餐。现采用生成器(Builder)模式实现制作过程,得到如图6-1所示的类图。

【Java代码】

class Pizza {

private String parts;

public void setParts(String parts) {this.parts = parts;}

public String toString() {return this.parts;}

}

abstract class PizzaBuilder {

protected Pizza pizza;

public Pizza getPizza() {return pizza;}

public void createNewPizza() { pizza = new Pizza();}

public (1) ;

}

class HawaiianPizzaBuilder extends PizzaBuilder {

public void buildParts() {pizza.setParts(“cross + mild + ham&pineapp1e”};

}

class SpicyPizzaBuilder extends PizzaBuilder {

public void buildParts() { pizza.setParts(“pan baked + hot + pepperoni&salami”);}

}

class Waiter {

private PizzaBuilder pizzaBuilder;

public void setPizzaBuilder(PizzaBuilder pizzaBuilder) { /*设置构建器*/

(2) ;

}

public Pizza getPizza(){ return pizzaBuilder.getPizza(); }

public void construct() {/*构建*/

pizzaBuilder.createNewPizza();

(3) ;

}

}

Class FastFoodOrdering {

public static viod mainSting[]args) {

Waiter waiter = new Waiter();

PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();

(4);

(5);

System.out.println(“pizza: ” + waiter.getPizza());

}

}

程序的输出结果为:

Pizza:cross+mild+ham&pineapple

原文标题:2017上半年软件设计师考试下午真题汇总

原文链接:http://www.educity.cn/rk/1787691.html

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年5月8日
下一篇 2017年5月8日

相关推荐