当前位置: 首页 > news >正文

软考中级-软件设计师 2022年下半年下午题真题解析:通关秘籍+避坑指南

📚 目录(快速跳转)

  • 大题(下午题)(每题15分,共75分)
    • 一、结构化分析与设计
      • 🚗 试题一:计量检定云端软件
    • 二、数据库应用分析与设计
      • 🚗 试题二:数据库应用分析
    • 三、面向对象分析与设计
      • 📚 试题三:温度控制系统UML设计解析
    • 四、算法填空/设计
      • 📚 试题四:C代码填空
      • 📚 试题五:Java填空题

大题(下午题)(每题15分,共75分)

2022年下午题试卷:百度云盘

一、结构化分析与设计

🚗 试题一:计量检定云端软件

  阅读下列说明和数据流图,回答问题 1 至问题 4,将解答填入答题纸的对应栏内。
【说明】
  随着新能源车数量的迅猛增长,全国各地电动汽车配套充电桩急速增长,同时也带来了充电桩计量准确性的问题。充电桩都需要配备相应的电能计量和电费计费功能,需要对充电计量准确性强制进行检定。现需开发计量检定云端软件,其主要功能是:
  (1)数据接收。接收计量装置上报的充电数据,即充电过程中电压、电流、电能等充电监测数据和计量数据(充电监测数据为充电桩监测的数据,计量数据为计量装置计量的数据,以秒为间隔单位),接收计量装置心跳数据,并分别进行存储。
  (2)基础数据维护。管理员对充电桩、计量检定装置等基础数据进行维护
  (3)数据分析。实现电压、电流、电能数据的对比,进行误差分析,记录充电桩的充电误差,供计量装置检定。系统根据计量检测人员给出的查询和统计条件展示查询统计结果。
  (4)充电桩检定。分析充电误差:计量检测人员根据误差分析结果和检定信息记录,对充电桩进行检定,提交检定结果:系统更新充电桩中的检定信息(检定结果和检定时间),并存储于检定记录。
  (5)异常告警。检测计量装置心跳,当心跳停止时,向管理员发出告警
  (6)检定信息获取。供其它与充电桩相关的第三方服务查询充电桩中的检定信息
  现采用结构化方法对计量检定云端软件进行分析与设计,获得如图 1-1 所示的上下文数据流图和图 1-2 所示的 0 层数据流图。
在这里插入图片描述
在这里插入图片描述
【问题 1】(4 分)
使用说明中的词语,给出图 1-1 中的实体 E1〜E4 的名称。
【问题 2】(5 分)
使用说明中的词语,给出图 1-2 中的数据存储 D1〜D5 的名称。
【问题 3】(4 分)
根据说明和图中术语,补充图 1-2 中缺失的数据流及其起点和终点。
【问题 4】(2 分)
根据说明,给出“充电监测与计量数据”数据流的组成。

问题1:实体识别

图1-1中的实体E1~E4名称:

  • E1:计量装置
    (依据:数据流图中E1提供"充电监测及计量数据"和"计量装置心跳数据",对应说明中计量装置上报数据的功能)

  • E2:管理员
    (依据:E2接收"告警信息",对应说明中"向管理员发出告警"的功能)

  • E3:计量检测人员
    (依据:E3提供"查询和统计条件"并接收"查询统计结果",对应说明中计量检测人员操作的功能)

  • E4:第三方服务
    (依据:E4接收"检定信息",对应说明中"供第三方服务查询检定信息"的功能)

问题2:数据存储识别

数据存储D1~D5的名称:

  • D1:充电监测及计量数据存储
    (依据:P1"数据接收"存储充电数据,对应说明中"接收充电监测数据和计量数据并存储")

  • D2:基础数据存储
    (依据:P2"基础数据管理"维护充电桩等基础数据,对应说明中"基础数据维护"功能)

  • D3:心跳数据存储
    (依据:P1"数据接收"存储心跳数据,对应说明中"接收计量装置心跳数据并存储")

  • D4:充电误差存储
    (依据:P4"充电桩检定"关联检定记录,对应说明中"记录充电误差")

  • D5:检定记录存储
    (依据:P5"检定信息获取"提供检定记录,对应说明中"存储检定记录")

问题3:缺失数据流补充

图1-2中缺失的数据流:

数据流名称起点终点
查询和统计条件E3P3
检定结果P4D5
更新检定信息P4D1
检定信息D1P6

问题4:数据流组成

“充电监测与计量数据”数据流的组成:

  • 电压数据

  • 电流数据

  • 电能数据

  • 计量数据(以秒为间隔单位)
    (依据:说明中明确提到"充电监测数据(电压、电流、电能)和计量数据,以秒为间隔单位")

二、数据库应用分析与设计

🚗 试题二:数据库应用分析

  阅读下列说明,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。
【说明】
  某营销公司为了便于对各地的分公司及专卖店进行管理,拟开发一套业务管理系统,请根据下述需求描述完成该系统的数据库设计。
【需求分析结果】
  (1)分公司信息包括:分公司编号、分公司名、地址和电话。其中,分公司编号唯一确定分公司关系的每一个元组。每个分公司拥有多家专卖店,每家专卖店只属于一个分公司。
  (2)专卖店信息包括:专卖店号、专卖店名、店长、分公司编号、地址、电话,其中店号唯一确定专卖店关系中的每一个元组。每家专卖店只有一名店长,负责专卖店的各项业务;每名店长只负责一家专卖店:每家专卖店有多名职员,每名职员只属于一家专卖店。
  (3)职员信息包括:职员号、职员名、专卖店号、岗位、电话、薪资。其中,职员号唯一标识职员关系中的每一个元组。岗位有店长、营业员等。
【概念模型设计】
  根据需求阶段收集的信息,设计的实体联系图(不完整)如图 2-1 所示。
在这里插入图片描述
【逻辑结构设计】
根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整):
分公司(分公司编号,分公司名,地址,电话)
专卖店(专卖店号,专卖店名, (a) ,地址,电话)
职员(职员号,职员名, (b) ,岗位,电话,薪资)
【问题 1】(6 分)
  根据需求描述,图 2-1 实体联系图中缺少三个联系。请在答题纸对应的实体联系图中补充三个联系及联系类型。
  注:联系名可用联系 1、联系 2、联系 3;也可根据你对题意的理解取联系名。
【问题 2】(6 分)
  (1)将关系模式中的空 (a) 、 (b) 的属性补充完整,并填入答题纸对应的位置上。
  (2)专卖店关系的主键: (c) 和外键: (d) 。
  职员关系的主键: (e) 和外键: (f) 。
【问题 3】(3 分)
  (1)为了在紧急情况发生时,能及时联系到职员的家人,专卖店要求每位职员至少要填写一位紧急联系人的姓名、与本人关系和联系电话。根据这种情况,在图 2-1 中还需添加的实体是 (g) ,职员关系与该实体的联系类型为 (h) 。
  (2)给出该实体的关系模式。

问题1:补充实体联系图(ER图)

在这里插入图片描述
关键点说明:

  • 分公司对专卖店:1对多
  • 专卖店对店长:1对1
  • 专卖店对职员:1对多

问题2:补充采购关系模式

  • (a):店长、分公司编号
  • (b):专卖店号
  • (c):专卖店号
  • (d):店长、分公司编号
  • (e):职员号
  • (f):专卖店号

问题3:新增销售需求设计

  • (1)

    • (g):紧急联系人
    • (h):1:* (一对多,一个职员有多个紧急联系人)
  • (2):

    • 紧急联系人(职工号,姓名,与职工关系,联系电话)

三、面向对象分析与设计

📚 试题三:温度控制系统UML设计解析

  阅读下列说明和 UML 图,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。
【说明】
  图 3-1 所示为某软件系统中一个温度控制模块的界面。界面上提供了两种温度计量单位,即华氏度(Farechet)和摄氏度(Celsius)。软件支持两种计量单位之间的自动换算,即若输入一个华氏度的温度,其对应的摄氏度温度值会自动出现在摄氏度的显示框内,反之亦然。
  用户可以通过该界面上的按钮 Raise(升高温度)和 Lower(降低温度)来改变温度的值。界面右侧是个温度计,将数字形式的温度转换成温度计上的制度比例进行显示。当温度值改变时,温度计的显示也随之同步变化。
在这里插入图片描述
  现采用面向对象方法现实该温度控制模板,得到如图 3-2 所示的用例图和图 3-3 所示的类图。
在这里插入图片描述
在这里插入图片描述
【问题 1】(6 分)
  根据说明中的描述,给出图 3-2 中 U1〜U4 所对应的用例名。
【问题 2】(5 分)
  根据说明中的描述,给出图 3-3 中 C1〜C8 所对应的类名(类名使用图 3-1 中标注的词汇)。
【问题 3】(4 分)
  现需将图 3-1 所示的界面改造为一个更为通用的 GUI 应用,能够实现任意计量单位之
间的换算,例如千克和克之间的换、厘米和英寸之间的换算等等。为了实现这个新的需求,可以在图 3-3 所示的类图上增加哪种设计模式?请解释选择该设计模式的原因(不超过 50字)。

问题1:用例图识别(U1-U4类名)

根据系统描述,完整用例图如下:

  • U1:显示温度
  • U2:显示华氏度
  • U3:显示温度计
  • U4:单位自动换算

问题2:类图识别(C1-C8类名)

根据系统描述,完整类图应包含以下类:

  • C1:TemperatureCovertorDialog(温度控制面板)

  • C2:FahrenheitEditBox(华氏度输入框)

  • C3:CelsiusEditBox(摄氏度输入框)

  • C4:TemperatureBar(温度计条)

  • C5:FahrenheitRaise(华氏度升温按钮)

  • C6:FahrenheitLower(华氏度降温按钮)

  • C7:CelsiusRaise(摄氏度升温按钮)

  • C8:CelsiusLower(摄氏度降温按钮)

注意:C1~C4顺序可以互换 C5~C8顺序可以互换

问题3:设计模式应用

策略模式(Strategy Pattern)

新增设计模式及原因:

  • 模式:策略模式(Strategy Pattern)

  • 原因:策略模式将一系列的算法封装起来,并使得他们可以相互替换,适用于需要使用一个算法的不同变体的场景,符合开闭原则。

四、算法填空/设计

📚 试题四:C代码填空

  阅读下列说明和 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]中
(2)C 程序

#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) {
    int i, 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);
    } 
} 

【问题 1】(8 分)
根据以上说明和 C 代码,填充 C 代码中的空(1)~(4)。
【问题 2】(2 分)
根据以上说明和 C 代码,算法的时间复杂度为 (5) (用 O 符号表示)。
【问题 3】(5 分)
考虑数据序列 R=(7,10,13,15,4,20,19,8),n=8,则构建的初始大顶堆为 (6) ,
第一个元素脱离堆结构,对剩余元素再调整成大顶堆后的数组 R 为 (7) 。

问题1:填空

先来分析代码,代码中Heapify方法用来调用堆的数据,HeapSort用来交换大顶堆的堆顶元素和堆尾元素并递归;

  • (1)需要判断根节点元素是否比子节点小,如果小则需要交换,所以

  • (1)R[j] > R[0]

  • (2)从非子节点开始遍历,进入迭代,调用Heapify方法

  • (2)Heapify[R,i,n]

  • (3)负责交换堆顶和堆尾元素

  • (3)i > 1 或者 i >= 2

  • (4)需要将堆尾R[n]的临时数据R[0]给到堆顶R[1]

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

💡 注意:

Java中数组索引是0~n-1,c中索引是1~n,所以在交换数据时, R[0] = R[i];是将第i个数据给到了临时数组中,相当于Java中的tempR[i] = R[1];将数组堆顶元素给到i,R[1] = R[0]将临时数据给到堆顶,从而实现数据交换。

问题2:时间复杂度分析

  • (5)O(nlogn)

    • 解析

      • 建堆过程:O(n)

      • n-1次调整堆:每次O(logn),总计O(nlogn)

问题3:大顶堆迭代分析

堆排序详解见文章《【数据结构】堆排序详细图解》

  • 待排序数组:R=(7,10,13,15,4,20,19,8)

  • 映射成完全二叉树

  • 在这里插入图片描述

  • 初始大顶堆

  • 在这里插入图片描述

所以:
(6)R=(20,15,19,10,4,13,7,8)

  • 第一个元素脱离堆结构,即将堆顶20脱离,对剩余元素再调整成大顶堆后的数组
  • 在这里插入图片描述
    所以:
    (7)R=(19,15,13,10,4,8,7,20

📚 试题五:Java填空题

  阅读下列说明和 Java 代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
  Facade(外观)模式是一种通过为多个复杂子系统提供一个一致的接口,而使这些子
系统更加容易被访问的模式,以医院为例,就医时患者需要与医院不同的职能部门交互,完
成挂号、门诊、取药等操作。为简化就医流程,设置了一个接待员的职位,代患者完成上述
就医步骤,患者则只需与接待员交互即可。如图 5-1 给出了以外观模式实现该场景的类图。
在这里插入图片描述【Java 代码】

import java.util.*; 

interface Patient {1; 
} 

interface Disposer {2; 
} 

class Registry implements Disposer { // 挂号 
    public void dispose(Patient patient) { 
        System.out.println("I am registering..." + patient.getName()); 
    } 
} 
        
class Doctor implements Disposer { // 医生门诊 
    public void dispose(Patient patient) {
        System.out.println("I am diagnosing..." + patient.getName());
    }
 }

class Pharmacy implements Disposer { // 取药 
    public void dispose(Patient patient) { 
        System.out.println("I am giving medicine... " + patient.getName()); 
    } 
} 
       
class Facade { 
    private Patient patient; 

    public Facade(Patient patient) { 
        this.patient = patient; 
    } 
    
    void dispose() { 
        Registry registry = new Registry(); 
        Doctor doctor = new Doctor(); 
		Pharmacy pharmacy = new Pharmacy();

        registry.dispose(patient); 
        doctor.dispose(patient);
		pharmacy.dispose(patient); 
	} 
} 

class ConcretePatient implements Patient { 
	private String name; 

	public ConcretePatient(String name) {
		this.name = name; 
	} 

	public String getName() { 
		return name; 
	} 
} 

public class FacadeTest { 
	public static void main(String[] args) { 
		Patient patient =3;4) f =5;6; 
	}
} 

试题五解答

(1)~(6)填空答案及解析:

  • (1)public String getName();

    • 依据Patient接口需提供获取患者姓名的方法,后续Registry等子系统中直接调用patient.getName()
  • (2)public void dispose(Patient patient);

    • 依据:所有子系统(挂号、门诊、取药)需实现统一的处理接口,参数为患者对象。
  • (3)new ConcretePatient(“张三”)

    • 依据:需创建具体的患者实例,测试代码中通常使用示例姓名(如"张三"),字符串中可以为任意值。
  • (4)Facade

    • 依据:外观模式中,Facade类封装子系统的复杂调用,是主程序直接交互的入口。
  • (5)new Facade(patient)

    • 依据Facade构造函数接收Patient对象,用于后续统一调用子系统方法。
  • (6)f.dispose()

    • 依据:通过外观对象f触发完整的就医流程(挂号→门诊→取药)。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述

相关文章:

  • 嵌入式汇编语言从小白到入门:从零开始的底层编程之旅
  • QT Sqlite数据库-教程001 创建数据库和表-下
  • Qt之OpenGL使用Qt封装好的着色器和编译器
  • 【图像分类】【深度学习】图像分类评价指标
  • (区间 dp)洛谷 P1220 关路灯/P2466 Sue 的小球 题解
  • QCustomPlot安装及demo
  • 洛谷 三连击 暴力枚举
  • 如何在 CentOS 7 系统上以容器方式部署 GitLab,使用 ZeroNews 通过互联网访问 GitLab 私有仓库,进行代码版本发布与更新
  • 订单防重复提交与超时取消:AOP + 延迟队列实战
  • Tabnet介绍(Decision Manifolds)和PyTorch TabNet之TabNetRegressor
  • 鼎讯信通 通信安全的终极解决方案:机架式通信干扰机
  • 小白学习java第12天:IO流之缓冲流
  • 数据库守护神-WAL机制
  • 业务幂等性技术架构体系-接口幂等
  • 时序数据异常检测-综述
  • 【蓝桥杯】赛前练习
  • STM32 模块化开发指南 · 第 3 篇 环形缓冲区 RingBuffer 模块设计与单元测试
  • WHAT - React 安全地订阅外部状态源 - useSyncExternalStore
  • 我的Hexo自动Webhook部署方案
  • tree-sitter 的 grammar.js 编写方法
  • 青海高端网站建设/小红书seo排名帝搜软件
  • wordpress标题优化/深圳网站营销seo费用
  • 南京网站制作哪家好/百度客服人工电话95188
  • 网站建设视频教程/nba最新交易新闻
  • 传智播客网站开发全套视频教程/免费seo网站推荐一下
  • 网校系统搭建/seo详细教程