image

编辑人: 长安花落尽

calendar2025-06-15

message4

visits930

2022年11月软件设计师 下午题答案及解析

一、[材料型]问答题

试题一(共15分)
阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。

【说明】

随着新能源车数量的迅猛增长,全团各地电动汽车配套充电桩急速增长,同时也带来了充电桩计量准确性的问题。充电桩都需要配备相应的电能计量和电费计费功能,需要对充电柱计量准确性强制进行检定。现需开发计量检定云端软件,其主要功能是:

(1)数据接收。接收计量裝置上报的充电数据,即充电过程中电压、电流、电能等充电监测数据和计量数据(充电监测数据为充电桩监测的数据,计量数据为计量装置计量的数据,以秒为间隔单位),接收计量装置心跳数据,并分别进行存储。

(2)基础数据维护。管理员对充电桩、计量检定装置等基础数据进行维护。

(3)数据分析。实现电压、电流、电能数据的对比,进行误差分析,记录充电桩的充电误差,供计量装置检定。系统根据计量检测人员给出的查询和统计条件展示查询统计结果。

(4)充电柱检定。分析充电误差:计量检测人员根据误差分析结果和检定信息记录,对充电桩进行检定,提交检定结果;系统更新充电桩中的检定信息(检定结果和检定时间并存储于检定记录。

(5)异常告警。检测计量裝置心跳,当心跳停止时,向管理员发出告警。

(6)检定信息获取。供其它与充电桩相关的第三方服务查询充电桩中的检定信息。现采用结构化方法对计量检定云端软件进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的口层数据流图。


图1-1

1、【问题1】(4分)

使用说明中的词语,给出图1-1中的实体E1~E4的名称。

参考答案:

E1计量装置   

E2管理员   

E3计量检测人员    

E4第三方服务


解析:

根据说明和提供的图1-1,实体E1应该是负责接收数据的模块,即计量装置数据接收模块。实体E2应该是对充电桩基础数据进行维护的模块,即充电桩基础数据维护模块。实体E3涉及到数据分析和充电柱检定的功能,因此应命名为数据分析与充电柱检定模块。实体E4根据说明中的描述,涉及到异常告警和检定信息的获取,对应到图中的模块应为异常告警及检定信息获取模块。

2、【问题2】(5分)

使用说明中的词语,给出图1-2中的数据存储D1~DS的名称。

参考答案:

D1充电检测及计量数据文件  

D2基础信息文件   

D3计量装置心跳数据  

D4充电误差信息

D5检定记录


解析:

根据说明中的描述和图1-2中的数据流向,可以对应出各个数据存储的名称。D1应存储充电过程中电压、电流、电能等充电监测数据和计量数据。D2应存储关于充电桩、计量检定装置等基础数据的信息。D3存储的是计量装置的心跳数据,用于检测计量装置的状态。D4存储的是充电误差分析数据,包括充电桩的充电误差记录等。D5则存储检定结果和检定记录,供其他与充电桩相关的第三方服务查询。因此,各数据存储的名称应分别为:D1充电监测数据及计量数据、D2基础数据、D3计量装置心跳数据、D4充电误差分析数据、D5检定结果及记录数据。

3、【问题3】(4分)

根据说明和图中术语,补充图1-2中缺失的数据流及其起点和终点。

参考答案:

E3----P3 查询和统计条件

P4----P5 更新检定信息(检定记录)

D5----P6 检定信息(检定记录)

D4----P3 充电误差信息

解析:

根据说明和图中的术语,我们可以确定数据流及其起点和终点。对于缺失的数据流,我们可以通过分析软件的功能和模块之间的关系来推断。

  1. 对于E3—-P3的数据流,由于软件需要实现数据分析功能,其中查询和统计条件是进行数据分析的一部分,因此数据流应为“查询和统计条件”,起点是数据分析模块,终点是数据展示模块,以展示查询统计结果。
  2. 对于P4—-P5的数据流,充电柱检定的结果需要更新并存储到数据库中的检定信息里,因此数据流应为“更新检定信息”,起点是充电柱检定模块,终点是数据库存储模块(或“检定记录存储模块”)。
  3. 对于D5—-P6的数据流,其他与充电桩相关的第三方服务需要查询充电桩中的检定信息,这些信息应存储在数据库中,因此数据流应为“检定信息(检定记录)”,起点是数据库存储模块(或“检定记录存储模块”),终点是检定信息获取模块。
  4. 对于D4—-P3的数据流,由于软件需要进行数据分析,包括电压、电流、电能数据的对比和误差分析,因此会产生充电误差信息,这些信息可能被其他模块使用,如与充电桩相关的第三方服务。因此,数据流应为“充电误差信息”,起点是数据分析模块,终点是与充电桩相关的第三方服务或其他需要知道充电误差信息的模块。

4、【问题4】(2分)

根据说明,给出“充电监附与计量数据”数据流的组成。

参考答案:

充电过程中电压、电流、电能等充电监测数据和计量数据(充电监测数据为充电桩监测的数据,计量数据为计量装置计量的数据,以秒为间隔单位)


解析:

根据说明中的描述,充电监附与计量数据是充电桩配套计量系统中的重要组成部分。充电监测数据主要反映充电桩的工作状态和充电过程的各种参数,如电压、电流、电能等。而计量数据则是计量装置对充电过程中电能的计量结果,两者都是实时数据采集并上报,以秒为单位进行间隔。因此,充电监附与计量数据的数据流主要由这两部分组成。

试题二(共15分)
阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】

某营销公司为了便于对各地的分公司及专卖店进行管理,拟开发一套业务管理系统,请根据下述需求描述完成该系统的数据库设计。

【需求描述】

(1)分公司信息包括:分公司编号、分公司名、地址和电话。其中,分公司编号唯一确定分公司关系的每一个元组。每个分公司拥有多家专卖店,每家专卖店只属于一个分公司。

(2)专实店信息包括:专卖店号、专卖店名、店长、分公司编号、地址、电话,其中店号唯一确定专卖店关系中的每一个元组。每家专卖店只有一名店长,负责专卖店的各项业务;每名店长只负责一家专卖店:每家专卖店有多名职员,每名职员只属于一家专卖店。

(3)职员信息包括:职员号、职员名、专卖店号、岗位、电话、薪资。其中,职员号唯一标识职员关系中的每一个元组。岗位有店长、营业员等。

【概念模型设计】

根据需求阶段收集的信息,设计的实体联系图(不完整)如图2-1所示。

【逻辑结构设计】根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整)

分公司(分公司编号,分公司名,地址,电话)

专卖店(专卖店号,专卖店名,_(a),地址,电话)

职员(职员号,职员名,_(b),岗位,电话,薪资)

5、【问题1】(6分)

根据需求描述,图2-1实体联系图中缺少三个联系。请在答题纸对应的实体联系图中补充三个联系及联系类型。

注:联系名可用联系1、联系2、联系3;也可根据你对题意的理解取联系名。

参考答案:

联系1   分公司和专卖店:1:*(一对多)

联系2   专卖店和店长:1:1

联系3   专卖店和职员:1:*(一对多)


解析:

根据需求描述,我们知道分公司与专卖店的关系是1个分公司对应多个专卖店,所以联系1应该是分公司和专卖店,且联系类型为1:。同理,专卖店与店长的关系是1个专卖店只有1个店长,所以联系2是专卖店和店长,联系类型为1:1。最后,专卖店与职员的关系是1个专卖店对应多个职员,所以联系3是专卖店和职员,联系类型为1:。因此,在实体联系图中应补充这三个联系及相应的联系类型。

6、【问题2】(6分)

(1)  将关系模式中的空(a)、(b)的属性补充完整,并填入答题纸对应的位置上。

(2)  专卖店关系的主键:_(c)和外键:(d)

f职员关系的主键:(e)和外键:(f)


参考答案:

(1)(a)店长、分公司编号 (b)专卖店号

(2)(c)专卖店号 (d)店长、 分公司编号

(3)(e)职员号(f)专卖店号


解析:

(1)根据需求描述,专卖店信息包括专卖店号、专卖店名、店长等属性,因此在专卖店关系模式中,空(a)应填写“店长”。同时,每家专卖店只属于一个分公司,所以专卖店与分公司之间存在关联,空(b)应填写“分公司编号”。

(2)专卖店关系的主键是唯一的标识每家专卖店的属性,根据需求描述,专卖店号唯一确定专卖店关系中的每一个元组,所以(c)处应填写“专卖店号”。而专卖店与分公司及店长之间存在关联,因此外键包括“分公司编号”和“店长”。

(3)职员关系的主键是唯一的标识每位职员的属性,根据需求描述,职员号唯一标识职员关系中的每一个元组,所以(e)处应填写“职员号”。而每位职员只属于一家专卖店,因此外键是“专卖店号”。

7、【问题3】(3分)

(1)为了在紧急情况发生时,能及时联系到职员的家人,专卖店要求每位职员至少要填写一位紧急联系人的姓名、与本人关系和联系电话。根据这种情况,在图2-1中还需添加的实体是 (g) ,职员关系与该实体的联系类型为 (h) 。

(2)给出该实体的关系模式。


参考答案:

(1)(g)紧急联系人(h)1:*(一对多)

(2)紧急联系人(紧急联系人号,职员号,紧急联系人姓名,与本人关系,联系电话)


解析:

(1)根据题目描述,专卖店要求每位职员至少要填写一位紧急联系人的姓名、与本人关系和联系电话。这意味着在现有的数据库结构中,需要增加一个表示紧急联系人的实体。这个实体应该包含紧急联系人的相关信息,如姓名、与职员的关系(例如家人、朋友等)和联系电话。因此,(g)处应填写“紧急联系人”。

关于(h)处的联系类型,因为每位职员至少要有一位紧急联系人,但可能有多个职员共享同一个紧急联系人,所以紧急联系人与职员的关系是一对多的关系,即(h)处应填写“一对多”。

(2)对于紧急联系人这一实体的关系模式,应包括其独特的标识(如紧急联系人号)、所关联的职员的标识(职员号)、紧急联系人的姓名、与本人的关系以及联系电话等信息。因此,紧急联系人关系模式为:紧急联系人(紧急联系人号,职员号,紧急联系人姓名,与本人关系,联系电话)。

试题三(15分)

阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】

图3-1所示为某软件系统中一个温度控制模块的界面。界面上提供了两种温度计量单位,即华氏度(Fahrenheit)和摄氏度(Celsius)。软件支持两种计量单位之间的自动换算,即若输入一个华氏度的温度,其对应的摄氏度温度值会自动出现在摄氏度的显示框内,反之亦然。

用户可以通过该界面上的按钮Raise(升高温度)和Lower(降低温度)来改变温度的值。界面右侧是一个温度计,将数字形式的温度转换成温度计上的刻度比例进行显示。当温度值改变时,温度计的显示也随之同步变化。


现在采用面向对象方法实现该温度控制模块,得到如图3-2所示的用例图和3-3所示的类图。



8、【问题1】(4分)

根据说明中的描述,给出图3-2中U1~U4所对应的用例名。

参考答案:

U1   显示温度

U2   显示华氏度

U3   温度计显示

U4   自动换算


解析:

根据说明中的描述,我们可以对图3-2中的用例进行识别并命名。

U1“显示温度”表示软件界面上的温度计可以显示当前的温度值。

U2“华氏度输入与显示”描述了用户可以通过界面输入华氏度温度,并且软件能够显示输入的华氏度值。这个用例与说明中关于华氏度和摄氏度之间自动换算的功能相关联。

U3“温度计与刻度显示”表示软件界面上的温度计能够将数字形式的温度转换成刻度比例进行显示,并且随着温度值的变化,温度计的显示也会同步变化。

U4“单位自动换算”描述了软件支持两种计量单位(华氏度和摄氏度)之间的自动换算功能,即输入一个单位的温度值后,软件能够自动计算并显示另一个单位的温度值。

这些用例名准确地反映了说明中描述的温度控制模块的功能和需求。

9、【问题2】(8分)

根据说明中的描述,给出图3-3中C1~C8所对应的类名(类名使用图3-1中标注的词汇

参考答案:

解析:

根据题目描述和图3-1中的标注,我们可以推断出每个类所代表的功能模块。C1代表温度控制模块的界面,因此命名为“温度控制模块界面类”;C2代表温度计量单位,包括华氏度和摄氏度,可以命名为“温度计量单位类”。对于C3和C4,由于分别代表华氏度和摄氏度,可以直接以“华氏度类”和“摄氏度类”命名。C5负责温度控制,包括升高和降低温度的操作,所以命名为“温度控制类”。C6负责在界面上显示温度计,可以命名为“温度计显示类”。C7代表按钮操作,如升高和降低温度的按钮,可以命名为“按钮操作类”。C8代表温度值,这个类是核心类之一,用于存储和计算温度,可以命名为“温度值类”。

10、【问题3】(3分)

现需将图3-1所示的界面改造为一个更为通用的GUL应用,能够实现任意计量单位之间的换算,例如干克和磅之间的换算,厘米和英寸之间的换算等等。为了实现这个新的需求,可以在图3-3所示的类图上增加哪种设计模式?请解释选择该设计模式的原因(不超过50字)

参考答案:

策略模式,此模式可以定义一系列的算法策略,把它们一个个封装起来,并且使它们可以相互替换。在需要指定的计量单位换算时,调用相应的算法策略即可。


解析:

策略模式适用于这种情况,因为该模式可以定义一系列的算法策略,对应不同的计量单位换算。在需要指定计量单位换算时,可以调用相应的算法策略。这样,系统可以根据需要选择使用不同的策略,从而实现任意计量单位之间的换算,符合将界面改造为更通用的GUL应用的需求。

试题四(15分)

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

【说明】

排序是将一组无序的数据元素调整为非递减顺序的数据序列的过程,堆排序是一种常用的排序算法。用顺序存储结构存储堆中元素,非递减堆排序的步骤是:

(1)将含n个元素的待排序数列构造成一个初始大项堆,存储在数组R(R[1],R[2],… R[n])中。此时堆的规模为n,堆项元素R[1]就是序列中最大的元素,R[n]是堆中最后一个元素。

(2)将堆顶元素和堆中最后一个元素交换,最后一个元素脱离堆结构,堆的规模减1,将堆中剩余的元素调整成大顶堆;

(3)重复步骤(2),直到只剩下最后一个元素在堆结构中,此时数组R是一个非递减的数据序列。

【C代码】

下面是该算法的C语言实现。

(1)主要变量说明

n:待排序的数组长度

R[]:待排序数组,n个数放在R[1],R[2],…,R[n]中

(1)代码

#include <stdio.h>

#define MAXITEM 100

 

/*

调整堆

R:待排序数组;

v:节点编号,以v为根的二叉树,R[v]≥R[2v],R[v]≥R[2v+1],且其左子树和右子树都是大顶堆;

n:堆结构的规模,即堆中的元素数

*/

void Heapify(int R[MAXITEM], int v, int n){

    inti,j;

i=v;

j=2*i;


R[0]=R[i];

while(j<=n){

    if(j<n&&R[j]<R[j+1]){

    j++;

}

if(    (1)    ){

    R[i]=R[j];

i=j;

j=2*i;

}

else{

    j=n+1;

}

}

R[i]=R[0];

}

 

/* 堆排序,R为待排序数组;n为数组大小  */

void HeapSort(int R[MAXITEM], int n){

    int i;


for(i=n/2; i>=1; i--){

    (2)    ;

    }

for(i=n;    (3)    ;i--){

R[0]=R[i];

R[i]=R[1];

    (4)    ;

Heapify(R,1,i-1);

}

}

 

 

 


11、【问题1】(8分)

根据以上说明和C代码,填充C代码中的空(1)~(4)。

参考答案:

(1)R[j]>R[i]

(2)Heapify(R,i,n)

(3)i>=1

(4)R[1]=R[0]


解析:

(1)在堆调整过程中,需要保证堆顶元素是堆中最大的元素,因此当子节点(j)大于根节点(i)时,需要调整堆结构。所以此处应填写 R[j] >= R[i](或 R[j]>R[i])。
(2)构建初始大顶堆时,需要从数组的中间位置开始调整堆结构,因此这里应该是对数组的前半部分进行堆调整,即 Heapify(R, i, n)(或 Heapify(R, n/2, n))。
(3)在堆排序过程中,每次交换堆顶元素和最后一个元素后,都需要重新调整堆结构。因此此处应填写循环条件 i >= 1(或 i > 0),表示从最后一个元素开始向前遍历数组。
(4)在交换堆顶元素和最后一个元素后,需要将新的堆顶元素放入正确的位置,即 R[i]=R[0](或 R[j]=R[0],因为此时R[j]已经被提取到首位)。

12、【问题2】(2分)

根据以上说明和C代码,算法的时间复杂度为上 (5) (用O符号表示)。

参考答案:

O(nlogN)


解析:

堆排序算法的时间复杂度主要由构建初始堆和不断调整堆的过程决定。构建初始堆的时间复杂度为O(n),而不断调整堆的过程需要进行n-1次,每次调整的时间复杂度为O(logn)。因此,总的时间复杂度为O(n) + (n-1) * O(logn),简化后即为O(nlogN)。

13、【问题3】(5分))

考虑数据序列R=(7,10,13,15,4,20,19,8),n=8,则构建的初始大顶堆为 (6) ,第一个元素脱离堆结构,对剩余元素再调整成大顶堆后的数组R为 (7)

参考答案:

(6)20,15,19,10,4,13,7,8

(7)19,15,13,10,4,8,7


解析:

问题3涉及到堆排序的过程和结果。

  1. 对于给定的数据序列R=(7,10,13,15,4,20,19,8),我们首先构建初始的大顶堆。大顶堆的性质是:父节点的值大于其子节点的值。所以,我们需要将序列中的较大值逐渐调整到序列的前端,形成大顶堆。初始大顶堆的构建顺序应该是根据序列中的元素大小进行排序的,例如第一个元素应为最大或次大的值。因此,(6)中的初始大顶堆应为:20,19,15,(将大于或等于当前节点的元素移到合适的位置构成大顶堆)。括号内表示需要根据具体的算法逻辑来确定具体的元素。

  2. 对于(7),第一个元素脱离堆结构意味着我们将堆顶元素(当前最大的元素)与最后一个元素交换位置,然后移除最后一个元素(此时已不在堆中)。接着对剩余的堆元素重新进行堆调整,确保剩余的堆仍然满足大顶堆的性质。因此,(7)中的调整后的数组R为:调整后的数组R为:19,(将剩余的元素按照大顶堆的性质重新排列),具体数值需要按照堆排序算法逻辑进行填充。由于我们无法直接知道具体的调整过程,所以需要按照堆排序算法的逻辑来填充这些位置。

二、问答题

14、试题五

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

【说明】

Facade(外观)模式是一种通过为多个复杂子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。以医院为例,就医时患者需要与医院不同的职能部门交互。完成挂号、门诊、取药等操作,为简化就医流程,设置了一个接待员的职位,代患者完成上述就医步骤,患者则只需与接待员交互即可。如图5-1给出了以外观模式实现该场景的类图。


【Java 代码】


参考答案:

(1)String  getName()

(2)void dispose(Patient  patient)

(3)new ConcretePatient("name")

(4)Facade  

(5)new Facade(patient)

(6)f.dispose()


解析:

根据提供的说明和Java代码,我们可以分析出以下几点:

  1. 在外观模式的实现中,Facade类为子系统的功能提供了一个一致的接口。其中,getName()方法应该是用于获取Facade对象名称的字符串方法。
  2. dispose()方法应该是用于处理或释放与患者相关的资源。由于它需要一个Patient对象作为参数,所以方法签名应该是void dispose(Patient patient)。
  3. 在代码中,需要创建一个ConcretePatient的实例,用来代表一个具体的患者。因此,在适当的地方应该使用new ConcretePatient(“name”)来创建一个具有指定名称的患者实例。
  4. 在创建Facade对象时,应该使用其类名Facade。
  5. 要使用Facade模式处理患者,需要创建一个Facade对象,并将患者对象传递给它。因此,应该使用new Facade(patient)来创建Facade对象。
  6. 最后,为了处理患者,应该调用Facade对象的dispose()方法。

15、试题六

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

【说明】

Facade(外观)模式是一种通过为多个复杂子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。以医院为例,就医时患者需要与医院不同的职能部门交互完成挂号、门诊、取药等操作。为简化就医流程,设置了一个接待员的职位,代患者完成上述就医步骤,患者则只需与接待员交互即可。如图6-1给出了以外观模式实现该场景的类图。


【C++代码】


参考答案:

(1)virtual string getName()=0

(2)virtual void dispose(Patient *patient)=0

(3)new ConcretePatient("name")

(4)Facade *

(5)new Facade(patient)

(6)f->dispose()


解析:

根据题目描述和给出的类图,我们可以推断出以下结论:

  1. Patient是一个抽象类,其中有一个抽象方法getName(),用于获取患者的名字。因此,在Patient的声明中,getName()函数的声明应为virtual string getName() = 0;
  2. Facade类是一个外观模式类,它提供了一个统一的接口来访问复杂的子系统。在Facade类中,需要访问Patient对象以获取患者信息。因此,在Facade类的构造函数中,需要接收一个指向Patient对象的指针。同时,由于需要在构造函数中获取患者的名字,所以构造函数的参数应包括Patient的指针。
  3. 在具体实现中,我们需要创建ConcretePatient的实例,并传入患者的名字作为构造函数的参数。例如:new ConcretePatient(“name”)。
  4. 最后,当我们使用Facade对象时,需要通过指针调用其dispose()函数来完成某些操作。因此,应写为f->dispose(),其中f是Facade类型的指针。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2022年11月软件设计师 下午题答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share