【第 1 题】(题型:简答题 - 数据流图分析)
题目:
阅读下列说明,回答问题 1 至问题 4, 将解答填入答题纸的对应栏内。
【说明】某医疗护理机构为老年人或有护理需求者提供专业护理,现欲开发一基于 Web 的医疗管理系统,以改善医疗护理效率。该系统的主要功能如下:
(1) 通用信息查询。客户提交通用信息查询请求,查询通用信息表,返回查询结果。
(2) 医生聘用。医生提出应聘 / 辞职申请,交由主管进行聘用 / 解聘审批,更新医生表,并给医生反馈聘用 / 解聘结果;删除解聘医生的出诊安排。
(3) 预约处理。医生安排出诊时间,存入医生出诊时间表;根据客户提交的预约查询请求,查询在职医生及其出诊时间等预约所需数据并返回;创建预约,提交预约请求,在预约表中新增预约记录,更新所约医生出诊时间并给医生发送预约通知;给客户反馈预约结果。
(4) 药品管理。医生提交处方,根据药品名称从药品数据中查询相关药品库存信息,开出药品,更新对应药品的库存以及预约表中的治疗信息;给医生发送 “药品已开出” 反馈。
(5) 报表创建。根据主管提交的报表查询请求 (报表类型和时间段), 从预约数据、通用信息、药品库存数据、医生以及医生出诊时间中进行查询,生成报表返回给主管。
现采用结构化方法对医疗管理系统进行分析与设计,获得如图 1-1 所示的上下文数据流图和图 1-2 所示的 0 层数据流图。


【问题 1】(3 分)
使用说明中的词语,给出图 1-1 中的实体 E1~E3 的名称。
【问题 2】(5 分)
使用说明中的词语,给出图 1-2 中的数据存储 D1~D5 的名称。
【问题 3】(4 分)
使用说明和图中术语,补充图 1-2 中缺失的数据流及其起点和终点。
【问题 4】(3 分)
使用说明中的词语,说明 “预约处理” 可以分解为哪些子加工,并说明建模图 1-1 和图 1-2 时如何保持数据流图平衡。
【答案 】【问题 1】
E1:客户 E2:医生 E3:主管
根据系统功能描述,与系统交互的外部实体有三类:提交查询和预约请求的 "客户"、提出应聘 / 辞职和处方的 "医生"、进行聘用审批和报表查询的 "主管",对应 E1-E3。
【问题 2】
D1:通用信息表 D2:医生表 D3:医生出诊时间表
D4:预约表 D5:药品数据表(或药品库存表)
根据功能描述中的数据存储提及:
通用信息查询对应 D1:通用信息表
医生聘用功能对应 D2:医生表
预约处理中的出诊时间存储对应 D3:医生出诊时间表
预约记录存储对应 D4:预约表
药品管理中的药品库存查询对应 D5:药品数据表
【问题 3】
【解析】
安排出诊时间、预约查询处理、创建预约记录、反馈预约结果
数据流图平衡规则:
父图(图 1-1 上下文 DFD)和子图(图 1-2 0 层 DFD)的输入输出数据流必须一致;子图中加工的输入输出数据流必须与其分解后的子加工的输入输出数据流在数量和内容上保持平衡,即父图中某加工的输入 / 输出数据流必须等于其子图中所有子加工的输入 / 输出数据流的总和。
【第 2 题】(题型:简答题 - 数据库设计)
题目:
阅读下列说明,回答问题 1 至问题 3, 将解答填入答题纸的对应栏内。
【说明】
某海外代购公司为扩展公司业务,需要开发一个信息化管理系统。请根据公司现有业务及需求完成该系统的数据库设计。
【需求描述】
(1) 记录公司员工信息。员工信息包括工号、身份证号、姓名、性别和一个手机号,工号唯一标识每位员工,员工分为代购员和配送员。
(2) 记录采购的商品信息。商品信息包括商品名称、所在超市名称、采购价格、销售价格和商品介绍,系统内部用商品条码唯一标识每种商品。一种商品只在一家超市代购。
(3) 记录顾客信息。顾客信息包括顾客真实姓名、身份证号 (清关缴税用)、一个手机号和一个收货地址,系统自动生成唯一的顾客编号。
(4) 记录托运公司信息。托运公司信息包括托运公司名称、电话和地址,系统自动生成唯一的托运公司编号。
(5) 顾客登录系统之后,可以下订单购买商品。订单支付成功后,系统记录唯一的支付凭证编号,顾客需要在订单里指定运送方式:空运或海运。
(6) 代购员根据顾客的订单在超市采购对应商品,一份订单所含的多个商品可能由多名代购员从不同超市采购。
(7) 采购完的商品交由配送员根据顾客订单组合装箱,然后交给托运公司运送。托运公司按顾客订单核对商品名称和数量,然后按顾客的地址进行运送。
【概念模型设计】
根据需求阶段收集的信息,设计的实体联系图 (不完整) 如图 2-1 所示。

【逻辑结构设计】
根据概念模型设计阶段完成的实体联系图,得出如下关系模式 (不完整):
员工 (工号,身份证号,姓名,性别,手机号)
商品 (条码,商品名称,所在超市名称,采购价格,销售价格,商品介绍)
顾客 (编号,姓名,身份证号,手机号,收货地址)
托运公司 (托运公司编号,托运公司名称,电话,地址)
订单 (订单 ID,(a), 商品数量,运送方式,支付凭证编号)
代购 (代购 ID, 代购员工号,(b))
运送 (运送 ID, 配送员工号,托运公司编号,订单 ID, 发运时间)
【问题 1】(3 分)
根据问题描述,补充图 2-1 的实体联系图。
【问题 2】(6 分)
补充逻辑结构设计结果中的 (a)、(b) 两处空缺。
【问题 3】(6 分)
为方便顾客,允许顾客在系统中保存多组收货地址。请根据此需求,增加 “顾客地址” 弱实体,对图 2-1 进行补充,并修改 “运送” 关系模式。
【答案】
【问题 1】

【解析】
根据需求描述,顾客和订单是 1 对多关系,订单和商品是多对多关系,订单与代购员、配送员都是多对多关系,配送员与托运公司是多对多关系,这些是原 E-R 图缺失的联系。
【问题 2】
(a):顾客编号,商品条码
(b):订单 ID,商品条码
【解析】
(a) 订单关系需要关联顾客和商品,因此需要添加顾客编号(关联顾客表)和商品条码(关联商品表)作为外键;
(b) 代购关系是订单和代购员的关联表,需要添加订单 ID 和商品条码来关联具体的订单商品。
【问题 3】

【解析】
增加 "顾客地址" 弱实体后,运送关系需要关联具体的收货地址,因此添加地址 ID 作为外键,关联顾客地址表。
【第 3 题】(题型:简答题 - UML 用例图与类图分析)
题目:
阅读下列说明,回答问题 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 所对应的类名。
【答案】
【问题 1】
A1:Driver
A2:Central system
A3:Traffic advice center
A4:Regional center
【问题 2】
U1:Underpaid transaction
U2:Record Illegal use
U3:Create transaction
U4:Record traffic event
U5:Charge card
【问题 3】
C1:Central System
C2:Toll gantry
C3:Traffic lane
C4:Radar sensors
C5:Digital Cameras
C6:Radio transceiver
【第 4 题】(题型:填空题 - 算法设计)
题目:
阅读下列说明和 C 代码,回答问题 1 和问题 2, 将解答填入答题纸的对应栏内。
【说明】
某公司购买长钢条,将其切割后进行出售。切割钢条的成本可以忽略不计,钢条的长度为整英寸。已知价格表 p, 其中 p (i=1,2,⋯,m) 表示长度为 i 英寸的钢条的价格。现要求解使销售收益最大的切割方案。
求解此切割方案的算法基本思想如下:
假设长钢条的长度为 n 英寸,最佳切割方案的最左边切割段长度为 i 英寸,则继续求解剩余长度为 n-i 英寸钢条的最佳切割方案。考虑所有可能的 i, 得到的最大收益 rn 对应的切割方案即为最佳切割方案。rn 的递归定义如下:
Rn=max₁≤i≤n (pᵢ+rₙ₋ᵢ)
对此递归式,给出自顶向下和自底向上两种实现方式。
【C 代码】
/* 常量和变量说明n:长钢条的长度p[]:价格数组*/#define LEN 100intTop_Down_Cut_Rod(int p[],int n){/*自顶向下*/int r = 0;int i;if(n == 0){return 0;}for(i= 1;(1); i++){int tmp =p[i] + Top_Down_Cut_Rod(p,n - i);r =(r >= tmp)? r: tmp;}return r;}intBottom_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];}
【问题 2】(7 分)
根据说明和 C 代码,算法采用的设计策略为 (5) 。
求解 Rn 时,自顶向下方法的时间复杂度为 (6) ; 自底向上方法的时间复杂度为 (7) 方法 (用 O 表示)。
【答案】
【问题 1】
(1) i <= n
(2) i <= j
(3) temp = max (temp, p [i] + r [j-i])
(4) r [j] = temp
【解析】
(1) 自顶向下的循环需要遍历所有可能的切割长度 i,从 1 到 n,因此条件为 i <= n。
(2) 自底向上的循环中,j 表示当前计算的钢条长度,i 表示切割段长度,因此 i 的范围是 1 到 j,条件为 i <= j。
(3) 计算当前切割长度 i 对应的收益,取最大值更新 temp,因此是 temp = max (temp, p [i] + r [j-i])。
(4) 将计算得到的最大收益存入 r [j],即 r [j] = temp。
【问题 2】
(5) 动态规划(Dynamic Programming)
(6) O (2ⁿ)
(7) O (n²)
【解析】
(5) 算法采用动态规划策略,通过保存子问题的解避免重复计算。
(6) 自顶向下方法存在大量重复计算,时间复杂度为指数级 O (2ⁿ)。
(7) 自底向上方法通过迭代计算子问题,时间复杂度为多项式级 O (n²)。
【第 5 题】(题型:填空题 - C++ 设计模式实现)
题目:
阅读下列说明和 C++ 代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
生成器 (Builder) 模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。图 5-1 所示为其类图。

【C++ 代码】
#include <iostream>#include <string>using namespace std;class Product {private :string partA, partB;public :Product() { }void setPartA(conststring& s) { partA = s; }void setPartB(conststring& s) { partB = s; }//其余代码省略};class Builder {public :(1);virtual void buildPartB() = 0;(2);};class ConcreteBuilder1 : public Builder {private :Product* product;public :ConcreteBuilder1() { product = new Product(); }void buildPartA() {(3)("Component A"); }void buildPartB() {(4) ("Component B"); }Product* getResult() { return product; }//其余代码省略};class ConcreteBuilder2 : public Builder {/*代码省略*/}class Director {private:Builder* builder;public :Director(Builder* pBuilder) { builder = pBuilder; }void construct() {(5);//其余代码省略//其余代码省略}int main(){Director* director1 = new Director(new ConcreteBuilder1());director1->construct();delete director1;return 0;}
【答案】
(1) virtual void buildPartA () = 0;
(2) virtual Product* getResult () = 0;
(3) product->setPartA
(4) product->setPartB
(5) builder->buildPartA (); 或者 builder->buildPartB ();
【解析】
(1) Builder 是抽象基类,需要声明纯虚函数 buildPartA (),与 buildPartB () 对应。
(2) 抽象基类需要声明纯虚函数 getResult (),用于返回构建好的产品。
(3) ConcreteBuilder1 中的 buildPartA () 调用 product 的 setPartA 方法设置部件 A。
(4) ConcreteBuilder1 中的 buildPartB () 调用 product 的 setPartB 方法设置部件 B。
(5) Director 的 construct () 方法调用 builder 的 buildPartA () 和 buildPartB () 方法构建产品。
【第 6 题】(题型:填空题 - Java 设计模式实现)
题目:阅读下列说明和 Java 代码,将应填入 (n) 处的字句写在答题纸的对应栏内。【说明】生成器 (Builder) 模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。图 6-1 所示为其类图。

【Java 代码】
import java.util.*;class Product {private String partA;private String partB;public Product(){}public void setPartA(String s) { partA = s; }public void setPartB(String s) { partB = s; }}interface Builder {public (1) ;public void buildPartB();public (2);}class ConcreteBuilderl implements Builder {private Product product;public ConcreteBuilderl(){ product = new Product();}public void buildPartA(){(3)("Component A"); }public void buildPartB(){(4)("Component B"); }public Product getResult(){ return product;}}class ConcreteBuilder2 implements Builder {// 代码省略}class Director {private Builder builder;public Director(Builder builder) { this.builder = builder; }public void construct(){(5);//代码省略}}class Test {public static void main(String[] args) {Director directorl = new Director(new ConcreteBuilderl());directorl.construct();}}
【答案】
(1) void buildPartA ();
(2) Product getResult ();
(3) product.setPartA
(4) product.setPartB
(5) builder.buildPartA (); 或者 builder.buildPartB ();
【解析】
本题考查设计模式中生成器(Builder)模式的基本概念和实现。
生成器模式是一种典型的创建型模式。创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。
Builder 为创建一个 Product 对象的各个部件指定抽象接口。
ConcreteBuilder 实现 Builder的接口以构造和装配该产品的各个部件,定义并明确
它所创建的表示,提供一个检索产品的接口。
Director 构造一个使用Builder 接口的对象。
Product 表示被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程。包含定义组成组件的类,包括将这些组件装配成最终产品的接口。
生成器模式适用于:当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时;当构造过程必须允许被构造的对象有不同的表示时。
图5-1中的类 Product 包含两个了两个组成部分:partA 和 partB,因此在类 Builder中需要为这两个组成部分创建抽象接口。这里使用了 Java 中的 Interface 来实现。构造partB的接口在代码中已经给出,因此第(1)空应填写“void buildPartA()”。
第(2)空的内容可以从类 ConcreteBuilderl来进行推断。在 ConcreteBuilderl 中出现了方法 getResult,该类实现了 Builder中定义的接口。。根据上下文,可以判定该方法也应该是 Builder中定义的接口。因此第(2)空应填写“Product getResult()”。
第(3)、(4)空用于创建产品的内部表示。Product包含两部分 partA 和 partB,分别调用类Product中提供的方法 setPartA和 setPartB 来实现。因此(3)、(4)空分别填入 “product.setPartA”和“product.setPartB”
第(5)空是对 Bulider 中接口的使用,这里应填入“builder.buildPartA()”或 “Builder.buildPartB()”。
知识点盘点:
【试题一知识点】
・数据流图(DFD)的基本组成元素:外部实体、加工、数据存储、数据流
・数据流图的平衡规则:父图与子图的输入输出数据流一致性
・结构化分析方法的核心思想:自顶向下、逐步分解
・数据字典与数据流图的配合使用
【试题二知识点】
・实体联系图(ER 图)的设计:实体、属性、联系的识别
・弱实体的概念与设计:依赖于强实体的实体,其主键包含强实体的主键
・关系模式的转换:ER 图到关系模式的映射规则
・外键的设计:用于关联不同关系表的字段
・数据库设计的三个阶段:概念设计、逻辑设计、物理设计
【试题三知识点】
・UML 用例图的组成:参与者、用例、关联关系
・UML 类图的组成:类、属性、方法、关联关系
・面向对象分析的核心:识别参与者、用例和核心实体类
・系统边界的划分:区分系统内部元素和外部参与者
・用例的命名规则:动宾结构,描述系统提供的功能
【试题四知识点】
・动态规划算法的核心思想:将大问题分解为子问题,保存子问题的解避免重复计算
・自顶向下与自底向上的区别:自顶向下是递归 + 记忆化,自底向上是迭代计算
・时间复杂度分析:指数级复杂度与多项式级复杂度的差异
・最优子结构性质:问题的最优解包含子问题的最优解
・重叠子问题性质:不同的问题求解过程中需要重复计算相同的子问题
【试题五知识点】
・生成器 (Builder) 模式的意图:将复杂对象的构建与表示分离
・生成器模式的角色:产品 (Product)、抽象生成器 (Builder)、具体生成器 (ConcreteBuilder)、指挥者 (Director)
・C++ 纯虚函数的定义:用于定义抽象基类的接口
・面向对象的多态性:通过抽象基类指针调用具体子类的方法
・设计模式的分类:生成器模式属于创建型模式
【试题六知识点】
・Java 接口的定义:用于定义规范,由实现类实现接口中的方法
・生成器模式的 Java 实现:通过接口定义生成器规范,具体生成器实现接口
・面向对象的封装性:Product 类的属性通过 setter 方法设置
・设计模式的应用场景:当需要构建复杂对象且构建过程与表示分离时使用生成器模式
・Java 多态性:通过接口类型引用具体实现类的对象
THE END -
点击下方卡片关注我 点个小赞你必上岸↓↓↓

