摘要:2018上半年软件设计师考试已结束,小编为大家整理了2018上半年软件设计师下午真题,以下为第二部分。
● 阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
某ETC( Electronic Toll Collection,不停车收费)系统在高速公路沿线的特定位置上设置一个横跨道路上空的龙门架( Toll gantry),龙门架下包括6条车道( Traffic lanes),每条车道上安装有雷达传感器( Radar sensor)、无线传输器( Radio transceiver)和数码相机( Digital Camera)等用于不停车收费的设备,以完成正常行驶速度下的收费工作。该系统的基本工作过程如下:
(1)每辆汽车上安装有车载器,驾驶员( Driver)将一张具有识别码的磁卡插入车载器中。磁卡中还包含有驾驶员账户的当前信用记录。
(2)当汽车通过某条车道时,不停车收费设备识别车载器内的特有编码,判断车型,将收集到的相关信息发送到该路段所属的区域系统( Regional center)中,计算通行费用创建收费交易( Transaction),从驾驶员的专用账户中扣除通行费用。如果驾驶员账户透支,则记录透支账户交易信息。区域系统再将交易后的账户信息发送到维护驾驶员账户信息的中心系统( Central system)
(3)车载器中的磁卡可以使用邮局的付款机进行充值。充值信息会传送至中心系统,以更新驾驶员账户的余额。
(4)当没有安装车载器或者车载器发生故障的车辆通过车道时,车道上的数码相机将对车辆进行拍照,并将车辆照片及拍摄时间发送到区域系统,记录失败的交易信息;并将该交易信息发送到中心系统。
(5)区域系统会获取不停车收费设备所记录的交通事件( Traffic events);交通广播电台( Traffic advice center)根据这些交通事件进行路况分析并播报路况。
现采用面向对象方法对上述系统进行分析与设计,得到如表3-1所示的用例列表以及如图3-1所示的用例图和图3-2所示的分析类图。
【问题1】(4分)
根据说明中的描述,给出图3-1中A1~A4所对应的参与者名称。
【问题2)(5分)
根据说明中的描述及表3-1,给出图3-1中U1-U5所对应的用例名称。
【问题3】(6分)
根据说明中的描述,给出图3-2中C1~C6所对应的类名。
● 阅读下列说明和C代码,回答问题1和问题2,将解答填入答题纸的对应栏内。
【说明】
某公司购买长钢条,将其切割后进行出售。切割钢条的成本可以忽略不计,钢条的长度为整英寸。已知价格表P,其中中Pi(i=1,2,...,m)表示长度为i英寸的钢条的价格。现要求解使销售收益最大的切割方案。
求解此切割方案的算法基本思想如下:
假设长钢条的长度为n英寸,最佳切割方案的最左边切割段长度为i英寸,则继续求解剩余长度为n-i 英寸钢条的最佳切割方案。考虑所有可能的i,得到的最大收益rn对应的切割方案即为最佳切割方案。rn的递归定义如下:
rn =max1≤ i ≤n(pi +rn-i)
对此递归式,给出自顶向下和自底向上两种实现方式
【C代码】
/*常量和变量说明
n:长钢条的长度
P[]:价格数组
*/
#define LEN 100
int Top_Down_ Cut_Rod(int P[],int n){/*自顶向下*/
int r=0;
int i;
if(n==0){
retum 0;
}
for(i=1;(1);i++){
int tmp=p[i]+Top_Down_ Cut_Rod(p,n-i);
r=(r>=tmp)?r:tmp;
}
return r;
}
int Bottom_Up_Cut_Rod(int p[],int n){ /*自底向上*/
int r[LEN]={0};
int temp=0;
int i,j;
for(j=1;j<=n;j++){
temp=0;
for(i=1;(2);i++){
temp=(3);
}
(4)
}
return r[n];
}
【问题1】(8分)
根据说明,填充C代码中的空(1)~(4)。
【问题2】(7分)
根据说明和C代码,算法采用的设计策略为(5)。
求解rn时,自顶向下方法的时间复杂度为(6);自底向上方法的时间复杂度为(7)(用O表示)。
● 阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
生成器( Builder)模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。图5-1所示为其类图。
【C++代码】
#include <iostream>
#include <string>
using namespace std;
class Product {
private:
string partA, partB;
public:
Product__(5)__{ }
void setPartA(const string&s){ PartA=s;}
void setPartB(const string&s){ PartB=s;}
∥其余代码省略
};
class Builder{
public:
(1);
virtual void buildPartB__(6)__=0;
(2);
};
class ConcreteBuilder1: public Builder{
private:
Product* product;
public:
ConcreteBuilder1__(7)__{product=new Product__(8)__; }
void buildPartA__(9)__{ (3)("Component A");}
void buildPartB__(10)__{ (4)("Component B");}
Product*getResult__(11)__{ return product;}
∥其余代码省略
};
class ConcreteBuilder2: public Builder{
/*代码省略*/
};
class Director {
private:
Builder* builder;
public:
Director(Builder*pBuilder){builder*pBuilder;}
void construct__(12)__{
(5)
∥其余代码省略
}
∥其余代码省略
};
int main__(13)__{
Director* director1=new Director(new ConcreteBuilder1__(14)__);
director1->construct__(15)__;
delete director 1;
return 0;
}
软考备考资料免费领取
去领取