2021年上半年软件设计师下午题题型分析及解题全攻略(附真题及答案解析)

2021年上半年软件设计师下午题题型分析及解题全攻略


试题一(数据流图与结构化分析)

题型:数据流图实体识别、数据存储补充、数据流补充、结构化语言描述。
考点

  1. 实体识别:根据上下文数据流图匹配实际业务角色(如车主、管理员)。
  2. 数据存储设计:识别系统中存储的数据对象(如停车记录表)。
  3. 数据流平衡:确保数据流的起点和终点符合加工逻辑。
  4. 结构化语言:将自然语言转化为if-else逻辑,描述加工流程。

解题思路

  1. 实体命名:对照题干说明,筛选出所有外部交互角色(如“车主”对应注册功能)。
  2. 数据存储定位:从功能描述中提取关键数据(如“会员信息表”存储充值信息)。
  3. 缺失数据流:检查加工之间的输入输出是否完整(如“计费规则”需从存储到计费加工)。
  4. 结构化语言:按层次描述分支判断,明确入口、出口逻辑。

知识点总结

  • 数据流图(DFD):分上下文图和分层图,关注外部实体、数据流、加工、数据存储。
  • 结构化分析:自顶向下分解功能,保证数据流一致性。
  • 加工逻辑描述:使用判定树、判定表或结构化语言(if-else分支)。

试题二(数据库设计)

题型:ER图补充、逻辑结构设计、新增实体设计。
考点

  1. ER模型构建:识别实体、联系和多重性(如客户和团购点的“订单”联系)。
  2. 关系模式转换:处理多对多联系,引入关联表(如“供货”关系表)。
  3. 完整性约束:主键、外键的正确设置(如订单表中客户电话的依赖关系)。

解题思路

  1. 补充ER图:根据需求描述确定实体间联系(如“订单”连接客户与团购点)。
  2. 逻辑结构分析
    • (a)填入“团购点编号,供货量”(多对多联系需分开存储)。
    • (b)添加“客户电话”作为外键。
  3. 新增快递实体:与客户建立“收取”联系,快递表增加客户电话外键。

知识点总结

  • ER模型设计:实体(矩形)、联系(菱形)、属性(椭圆)的表示方式。
  • 关系模式转换规则
    • 实体→表(属性对应列);
    • 多对多联系→独立关系表+主键组合。
  • 外键约束:确保数据完整性(如订单表中的客户电话需存在于客户表)。

试题三(面向对象分析与UML设计)

题型:用例图参与者识别、类图类名匹配、用例关系解释。
考点

  1. 用例图分析:识别系统参与者(如患者、药师)和用例(如“处理处方”)。
  2. 类图映射:根据功能描述对应类名(如处方类关联支付方式)。
  3. 用例关系:区分包含(include)、扩展(extend)、泛化(generalize)关系。

解题思路

  1. 参与者与用例填充
    • A1为“患者”(注册、登录)、A2为“快递人员”(送药)、A3为“药师”(处理处方)。
  2. 类名匹配:C1为“处方”,C5为“配送信息”(类属性与功能对应)。
  3. 用例关系解释
    • Include:必选子用例(如登录必须包含身份验证)。
    • Extend:可选扩展(如支付失败后的重试流程)。
    • Generalize:父子用例继承(如多种支付方式的泛化)。

知识点总结

  • 用例图:描述系统功能边界,注重参与者与用例的交互。
  • 类图设计:类名、属性、操作、关联关系的映射(如“处方”类有计算费用方法)。
  • 用例关系类型
    • Include(必需功能组成),Extend(条件触发扩展),Generalize(父子继承)。

试题四(动态规划算法)

题型:代码填空、算法策略与复杂度分析。
考点

  1. 动态规划实现:三角剖分问题的最优解递推式(m[i][j]为子问题权重)。
  2. 代码逻辑:填充循环范围(r规模)、状态转移条件。
  3. 复杂度分析:时间O(n³)(三重循环),空间O(n²)(二维数组存储)。

解题思路

  1. 代码填空
    • (1)子问题规模范围:r <= N
    • (2)计算终点j:j = i + r - 1
    • (3)比较当前解与最小值:temp < m[i][j]
  2. 算法策略:动态规划通过分解子问题并存储结果避免重复计算。

知识点总结

  • 动态规划(DP):适用最优子结构问题,核心是状态转移方程(m[i][j] = min{…})。
  • 时间复杂度:由嵌套循环决定,常见为多项式级(如立方阶)。
  • 空间复杂度:由DP表维度决定(二维表为O(n²))。

试题六(组合设计模式实现)


题型与考点

题型:设计模式代码填空(组合模式)、面向对象类图映射。
考点

  1. 组合模式结构:抽象类定义、叶子节点和容器节点的实现差异。
  2. Java语法:抽象方法声明、属性可见性、泛型容器的使用。
  3. 递归操作:组合模式中树形结构的遍历逻辑(如打印菜单)。

问题回顾:根据类图补全组合模式的Java代码,重点实现菜单项(叶节点)和菜单(容器节点)的层次化结构。


解题思路与答案解析

代码填空要点

  1. (1) protected

    • 解析MenuComponent类的name属性需要被子类(MenuItemMenu)继承,protected保证子类可见,但外部不可直接访问。
  2. (2) abstract boolean addMenuElement(MenuComponent element)

    • 解析:组合模式中容器节点(Menu)和叶子节点(MenuItem)需统一接口。addMenuElement为抽象方法,叶子节点默认不支持添加子元素(返回false)。
  3. (3) abstract List getElement()

    • 解析:获取子元素列表的抽象方法。Menu(容器)返回子元素列表,MenuItem(叶子)无子元素,返回null
  4. (4) List elementList

    • 解析Menu作为容器,需维护子元素列表(菜单项或子菜单),使用泛型List存储。
  5. (5) mainMenu.addMenuElement(subMenu)

    • 解析:构建菜单层级,将子菜单subMenu添加到主菜单mainMenu的子元素列表中。

知识点总结
  1. 组合模式(Composite Pattern)

    • 核心思想:将对象组织成树形结构,使客户端可以统一处理单个对象(叶节点)和组合对象(容器节点)。
    • 适用场景:递归层次结构(如文件系统、菜单树)需要统一操作接口的场景。
    • 关键角色
      • Component(抽象类):定义统一接口,如MenuComponent
      • Leaf(叶节点):实现具体操作,不支持子节点(如MenuItem)。
      • Composite(容器节点):包含子节点,管理添加、删除操作(如Menu)。
  2. 代码实现要点

    • 抽象类的设计
      abstract class MenuComponent {
          protected String name;  // 子类可见的属性
          public abstract boolean addMenuElement(MenuComponent element);
          public abstract List<MenuComponent> getElement();
      }
      
    • 叶子节点(无子元素):重写方法返回默认值(如addMenuElement返回falsegetElement返回null)。
    • 容器节点(支持子元素)
      class Menu extends MenuComponent {
          private List<MenuComponent> elementList;  // 子元素列表
          public boolean addMenuElement(MenuComponent element) {
              return elementList.add(element);  // 添加子元素
          }
      }
      
    • 递归遍历:通过getElement获取子元素,递归调用打印方法。
  3. 代码运行逻辑举例

    // 构建菜单层级
    MenuComponent mainMenu = new Menu("Insert");
    Menu subMenu = new Menu("Chart");
    MenuItem element = new MenuItem("On This Sheet");
    
    mainMenu.addMenuElement(subMenu);  // 子菜单加入主菜单
    subMenu.addMenuElement(element);   // 菜单项加入子菜单
    
    // 打印菜单结构(递归输出)
    printMenus(mainMenu);  // 输出:"Insert" -> "Chart" -> "On This Sheet"
    

常见错误与避坑指南
  1. 抽象方法遗漏:未在抽象类MenuComponent中声明抽象方法(如漏掉getElement),导致编译错误。
  2. 叶节点操作限制:对MenuItem调用addMenuElement时应返回false,确保叶子节点不可扩展。
  3. 泛型容器使用:错误的数据类型(如List)会导致类型转换异常,需使用List

总结与复习建议

  1. 数据流图与结构化设计:重点掌握数据流平衡与加工逻辑描述。
  2. 数据库设计:熟练ER图到关系模式的转换及完整性约束。
  3. 面向对象与UML:强化用例图、类图的设计及用例关系区分。
  4. 算法设计:理解动态规划原理,掌握代码实现模板。
  5. 真题训练:通过历年试题练习,熟悉高频考点与时间分配策略。

你可能感兴趣的:(软件设计师,java,算法,uml,数据库,流程图)