一、[材料型]问答题
试题一(共15分)
阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。
【说明】某现代农业种植基地为进一步提升农作物种植过程的智能化,欲开发智慧农业平台,集管理和销售于一体,该平台的主要功能有:
1. 信息维护。农业专家对农作物、环境等监测数据的监控处理规则进行维护。
2. 数据采集。获取传感器上传的农作物长势、土壤详情、气候等连续监测数据,解析后将监测信息进行数据处理、可视化和存储等操作。
3. 数据处理。对实时监测信息根据监控处理规则进行监测分析,将分析结果进行可视化并进行存储、远程控制;对历史监测信息进行综合统计和预测,将预测信息进行可视化和存储。
4. 远程控制。根据监控处理规则对分析结果进行判定,依据判定结果自动对控制器进行远程控制。平台也可以根据农业人员提供的控制信息对控制器进行远程控制。
5. 可视化。实时向农业人员展示监测信息;实时给农业专家展示统计分析结果和预测信息或根据农业专家请求进行展示。
现采用结构化方法对智慧农业平台进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。
图1-1上下文数据流图
图1-2 0层数据流图
1、【问题1】 (4分)
使用说明中的词语,给出图1-1中的实体E1~E4的名称。
参考答案:E1: 传感器; E2:农业专家;E3:农业人员;E4:控制器
解析:
根据题目描述和图1-1上下文数据流图,实体E1应该是获取农作物长势、土壤详情、气候等连续监测数据的设备,即传感器;E2是对农作物、环境等监测数据进行监控处理规则维护的人员,即农业专家;E3是展示监测信息、接收农业专家展示统计分析结果和预测信息的人员,即农业人员;E4是根据监控处理结果自动进行远程控制的设备,即控制器。因此,答案为E1: 传感器;E2:农业专家;E3:农业人员;E4:控制器。
2、【问题2】(4分)
使用说明中的词语,给出图1-2中的数据存储D1~D4的名称。
参考答案:D1:监控处理规则文件 D2:监测信息表 D3: 分析结果文件 D4:预测信息表
解析:
根据题目描述和图1-2的0层数据流图,可以得知数据存储D1存储的是监控处理规则文件,D2存储的是实时监测数据,即农作物监测数据表;D3存储的是根据实时监测信息分析处理后的结果,即处理分析结果文件;D4存储的是预测信息表。因此,参考答案中的命名与题目描述和图中的信息相符。
3、【问题3】(4分)
根据说明和图中术语,补充图1-2中缺失的数据流及其起点和终点。
参考答案:
起点 D1,终点P4 , 监测规则
起点 E2,终点P5 ,请求
起点D3, 终点P5 ,分析结果
起点D4,终点P5 ,预测信息
解析:
根据智慧农业平台的功能说明和上下文数据流图,我们可以推断出图1-2中缺失的数据流及其起点和终点。
- “监测规则”是从某个起点D1流向农业专家展示统计分析结果和预测信息的可视化展示(P4)的数据流。这是根据功能说明中的“信息维护”和“数据处理”部分推断出来的。
- “请求”是从某个控制器(E2)流向平台的控制指令(P5)的数据流。这是根据功能说明中的“远程控制”部分推断出来的。
- “分析结果”是从数据处理模块流向平台存储和展示的数据流(D3到P5)。这是根据功能说明中的数据处理部分推断出来的。
- “预测信息”也是从数据处理模块流向可视化展示的数据流(D4到P5)。这是根据功能说明中的数据处理和可视化部分推断出来的。
因此,根据上述分析,我们可以得出上述的答案。
4、【问题4】(3分)
根据说明,“数据处理”可以分解为哪些子加工?进一步进行分解时,需要注意哪三种常见的错误?
参考答案:
数据处理加工分为数据分析,可视化与存储
黑洞、奇迹、灰洞
解析:
根据说明中的描述,“数据处理”功能主要包括对实时监测信息根据监控处理规则进行监测分析,以及对历史监测信息进行综合统计和预测。因此,可以将其分解为数据解析、实时监测信息分析、历史监测信息综合统计和预测等子加工。
在进一步进行分解时,需要注意避免三种常见的错误。首先是分解过粗,即将一个复杂的处理过程简单地分为几个部分,没有深入细化。其次是循环处理,即在数据流图中出现循环路径,导致数据处理无法顺利进行。最后是非必要分解,即分解出的子加工在实际操作中并无明确的意义或作用,增加了系统的复杂性和不必要的开销。因此,在分解“数据处理”功能时,需要避免这三种错误的发生。
试题二(共15分)
回答问题1至问题4,将解答填入答题纸的对应栏内
【说明】
某汽车维修公司为了便于管理车辆的维修情况,拟开发一 套汽车维修管理系统,请根据下述需求描述完成该系统的数据库设计。
【需求描述】
(1)客户信息包括:客户号、客户名、客户性质、折扣率、联系人、联系电话。客户性质有个人或单位。客户号唯一标识客户关系中的每一个元组。
(2)车辆信息包括:车牌号、车型、颜色和车辆类别。一个客户至少有一辆车,一辆车只属于一个客户。
(3)员工信息包括:员工号、员工名、岗位、电话、家庭住址。其中,员工号唯一标识员工关系中的每一个元组。岗位有业务员、维修工、主管。业务员根据车辆的故障情况填写维修单。
(4)部门信息包括:部门号、名称、主管和电话,其中部门号唯一-确定 部门关系的每一个元组。 每个部门只有一名主管,但每个部门有多名员工,每名员工只属于一个部门。
(5)维修单信息包括:维修单号、车牌号、维修内容、工时。维修单号唯一标识维修单关系中的每一个元组。一个维修工可接多张维修单,但一张维修单只对应一个维修工。
【概念模型设计】根据需求阶段收集的信息,设计的实体联系图(不完整)如图2-1所示。

【逻辑结构设计】
根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整):
客户(客户号,客户名,(a);折扣率,联系人,联系电话)
车辆(车牌号,(b),车型,颜色,车辆类别)
员工(员工号,员工名,岗位,(c) ,电话,家庭住址)
部门(部门号,名称,主管,电话)
维修单(维修单号,(d), 维修内容, 工时)
5、【问题1】 (6分)
根据问题描述,补充3个联系,完善图2-1的实体联系图。联系名可用联系1、联系2和联系3代替,联系的类型为1:1、1:n和m:n (或1:1、1:*和*.*)。
参考答案:
联系1:客户和车辆,1:n
联系2:部门和员工,1:n
联系3:维修工和维修单,1:n
解析:
根据题目描述,我们可以确定以下几个实体之间的联系:
- 客户和车辆之间的联系是,一个客户至少拥有一辆车,而一辆车只能属于一个客户,所以联系类型为1:n。
- 部门和员工之间的联系是,一个部门有多名员工,但每个员工只属于一个部门,因此联系类型为1:n。
- 维修工和维修单之间的联系是,一个维修工可以负责多张维修单,而一张维修单通常由一个维修工负责(虽然题目没有明确说明是否一定是一对一关系,但通常一张维修单的完成由一个维修工负责),所以联系类型为m:n。这里的m:n表示多个维修工对应多张维修单的关系。
6、【问题2】(4分)
根据题意,将关系模式中的空(a) ~(d)的属性补充完整,并填入答题纸对应的位置上。
参考答案:a:客户性质 b:客户号 c:部门号 d:车牌号,员工号
解析:
根据题目描述和关系数据库的设计原则,我们可以对每个空进行填充:
a:在客户关系中,除了客户号作为主键外,还需要有描述客户性质的字段,所以a应该是“客户性质”。
b:车辆信息中的车牌号是车辆的唯一标识,而客户号是关联到客户信息的,所以b应该是“客户号”。
c:员工信息中,员工号是员工的唯一标识,而部门号是部门的唯一标识,所以员工与部门的关联需要通过“部门号”来实现,c应该是“部门号”。
d:维修单信息中,维修单号是维修单的唯一标识,而维修工是执行维修的人员,由于一张维修单只对应一个维修工,所以维修工的信息可以通过“员工号”(或“维修工号”)来标识,d应该是“维修工号”(或“员工号”)。
7、【问题3】(2分)
分别给出车辆关系和维修单关系的主键与外键。
参考答案:
车辆关系的主键:车牌号 外键:客户号
维修单关系的主键:维修单号 外键:车牌号,员工号
解析:
在数据库设计中,主键是用于唯一标识关系中的每一个元组的字段或字段组合。外键则是用于建立两个表之间的关联关系的字段。
对于车辆关系,车牌号是唯一的,可以唯一标识每一辆车,所以车牌号作为主键。而车辆属于某个客户,所以客户号作为外键。
对于维修单关系,维修单号是唯一的,可以唯一标识每一个维修单,所以维修单号作为主键。而维修单关联车辆和员工,所以车牌号和员工号作为外键。
8、【问题4】(3分)
如果一张维修单涉及多项维修内容,需要多个维修工来处理,那么哪个联系类型会发生何种变化?你认为应该如何解决这一问题?
参考答案:
维修工和维修单之间的联系类型会发生变化,从1:n变成m:n 。
修改维修单关系模式主键为维修单号,员工号。将员工号,维修内容独立出来形成一张表。
解析:
在原始设计中,一张维修单对应一个维修工,即维修工和维修单之间的联系类型是一对一(1:1)。然而,如果一张维修单涉及多项维修内容,需要多个维修工来处理,那么这种联系类型就会发生变化,变成多对多(m:n)。
为了解决这个问题,我们可以对数据库的逻辑结构进行设计调整。一种方法是,在维修单关系模式中加入员工号作为外键,这样一张维修单就可以关联多个员工号,即多个维修工。这样,即使一张维修单涉及多项维修内容,也能有效地记录并管理每个维修工的处理任务。
另外,如果希望更详细地记录每一项维修内容及其对应的维修工,可以将“维修内容”独立出来形成一张新的表。这张表可以与维修单表和员工表建立关联,以更清晰地记录每项维修的详情及负责该项维修的维修工信息。
试题三(共15分)
阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
某游戏公司欲开发一款吃金币游戏。 游戏的背景为一种回廊式迷宫 (Maze), 在迷宫的不同位置上设置有墙。迷宫中有两种类型的机器人(Robos):小精灵(PacMan)和幽灵(Ghost)。游戏的目的就是控制小精灵在迷宫内游走,吞吃迷宫路径上的金币,且不能被幽灵抓到。幽灵在迷宫中游走,并会吃掉遇到的小精灵。机器人游走时,以单位距离的倍数计算游走路径的长度。当迷宫中至少存在一个小精灵和一个幽灵时,游戏开始。
机器人上有两种传感器,使机器人具有一定的感知能力。这两种传感器分别是:
(1)前向传感器(FrontSensor), 探测在机器人当前位置的左边、右边和前方是否有墙(机器人遇到墙时,必须改变游走方向)。机器人根据前向传感器的探测结果,决定朝哪个方向运动。
(2)近距离传感器(ProxiSesor), 探测在机器人的视线范围内(正前方)是否存在隐藏的金币或幽灵。近距离传感器并不报告探测到的对象是否正在移动以及朝哪个方向移动。但是如果近距离传感器的连续两次探测结果表明被探测对象处于不同的位置,则可以推导出该对象在移动。
另外,每个机器人都设置有一个计时器(Timer), 用于支持执行预先定义好的定时事件。
机器人的动作包括:原地向左或向右旋转90°;向前或向后移动。
建立迷宫:用户可以使用编辑器(Editor) 编写迷宫文件,建立用户自定义的迷宫。将迷宫文件导入游戏系统建立用户自定义的迷宫。
现采用面对家分析与设计方法开发该游戏,得到如图3-1所示的用例图以及图3-2所示的初始类图。

图3-1用例图
图3-2初始类图
9、【问题1】(3分)
根据说明中的描述,给出图3-1中U1~U3所对应的用例名。
参考答案:U1 编写迷宫文件 U2导入迷宫文件; U3 设置计时器
解析:
根据说明中的描述,U1对应的是用户可以使用编辑器(Editor)编写迷宫文件的操作,因此用例名为“编写迷宫文件”。U2对应的是将迷宫文件导入游戏系统的操作,以便建立用户自定义的迷宫,因此用例名为“导入迷宫文件”。U3对应的是每个机器人都设置有一个计时器(Timer),用于支持执行预先定义好的定时事件,因此用例名为“设置计时器”。
10、【问题2】(4分)
图3-1中用例U1~U3分别与哪个(哪些)用例之间有关系,是何种关系?
参考答案:
U2和U1是包含关系
U1和U2与建立迷宫用例是包含关系;
U3与操作机器人是包含关系
解析:
根据题目描述和图3-1的用例图,我们可以知道:
- U1是关于创建游戏场景的用例,包括设置迷宫和角色。
- U2是关于角色设置的用例,涉及小精灵和幽灵的设置。
- U3是关于操作机器人的用例,涉及控制小精灵和幽灵的移动。
从图3-1的用例图中,我们可以看出:
- 建立迷宫(Editor)这个用例包含了创建游戏场景(U1)和角色设置(U2),所以U1和U2与建立迷宫用例是包含关系。
- 操作机器人(Controller)这个用例包含了控制小精灵和幽灵的移动(U3),所以U3与操作机器人用例是包含关系。
因此,答案是U2和U1是包含关系;U1和U2与建立迷宫用例是包含关系;U3与操作机器人是包含关系。
11、【问题3】 (8分)
根据说明中的描述,给出图3-2中C1~C8所对应的类名。
参考答案:
C1 机器人(Robos) ;C2 计时器(Timer);C3 小精灵(PacMan);C4 幽灵(Ghost)
C5 传感器 C6 前向传感器(FrontSensor) C7 近距离传感器(ProxiSesor)
C8 迷宫 (Maze)
其中 C3与C4 可换; C6与C7可换
解析:
根据题目描述,我们可以知道游戏中有多种实体和组件,包括机器人(小精灵和幽灵)、传感器(前向传感器和近距离传感器)、计时器和迷宫等。因此,在初始类图中,这些实体和组件应该被分别表示为不同的类。同时,题目中提到机器人上有两种传感器,这两种传感器具有不同的功能,因此需要分别建立前向传感器类和近距离传感器类。由于题目中没有具体说明编辑器需要实现哪些功能,因此我们可以将其抽象为一个编辑器基类或者具体的编辑器类。最后,由于迷宫是游戏的背景,因此需要建立一个迷宫类来表示迷宫的属性和方法。关于C3和C4、C6和C7的互换性是因为题目中提到机器人可以是小精灵或幽灵,它们都有传感器,只是类型不同而已。
试题四(共15分)
阅读下列说明和C代码,回答问题1至问题3,将解答写答题纸的对应栏内。
【说明】
生物学上通常采用编辑距离来定义两个物种DNA序列的相似性,从而刻画物种之间的进化关系。具体来说,编辑距离是指将一个字符串变换为另一个字符所需要的最小操作次数。操作有三种,分别为:插入一个字符、删除一个字符以及将一个字符修改为另一个字符。
用字符数组str1和str2分别表示长度分别为len1和len2的字符串,定义二维数组d记录求解编辑距离的子问题最优解,则该二维数组可以递归定义为:



12、【问题1】(8分)
根据说明和 C代码,填充C代码中的空 (1)~ (4)。
参考答案:
(1)d[0][j]=j
(2)str1[i-1]==str2[j-1]
(3)d[i-1][j-1]+1
(4) d[len1][len2]
解析:
根据题目说明和提供的C代码逻辑,我们可以对空(1)~(4)进行填充:
(1)对于空(1),当计算编辑距离时,如果str2的前j个字符需要插入到空字符串中,那么插入的次数就是j次,因此d[0][j]=j。
(2)对于空(2),我们需要比较str1的第i个字符和str2的第j个字符是否相同,所以填写为str1[i-1]==str2[j-1]。这里的i和j都是从数组索引的起始位置开始计算的,所以要减一。
(3)对于空(3),我们知道编辑距离可以通过递归的方式计算,当str1的前i个字符和str2的前j个字符相同,则编辑距离为去掉最后一个字符的编辑距离加一次操作(插入、删除或修改)。因此填写为d[i-1][j-1]+1。这里的操作次数是针对最后一个字符而言的。
(4)对于空(4),我们知道编辑距离的计算结果保存在二维数组d中,两个字符串的编辑距离就保存在数组的最右下角的元素中,即d[len1][len2]。这里的len1和len2分别是两个字符串的长度。
13、【问题2】 (4分)
根据说明和C代码,算法采用了(5)设计策略,时间复杂度为(6)(用O符号表示,两个字符串的长度分别用m和n表示)。
参考答案:动态规划法 O(m*n)
解析:
根据说明和C代码,该算法采用了动态规划法的设计策略来解决编辑距离问题。动态规划是一种在数学、计算机科学和运筹学中常用的求解最优化问题的方法。在这个问题中,通过定义二维数组d来记录子问题的最优解,并采用递归的方式逐步求解,符合动态规划的基本思想。
关于时间复杂度,由于该算法需要遍历两个字符串的每个字符,并且对于每个字符,都需要计算其与其他字符之间的编辑距离,因此时间复杂度为O(m*n),其中m和n分别为两个字符串的长度。
14、【问题3】(3分)
已知两个字符串A="CTGA"和B="ACGCTA",根据说明和C代码,可得出这两个字符串的编辑距离为(7)。
参考答案:4
解析:
编辑距离是一个计算机科学中的概念,用于衡量两个字符串之间的差异。在这个问题中,我们需要根据说明和C代码来计算两个字符串的编辑距离。然而,题目没有提供具体的C代码和计算过程,因此我们无法直接得出编辑距离的值。需要更多的信息或具体的代码实现才能回答这个问题。
二、问答题
试题五(共15分)
阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
享元(flyweight)模式主要用于减少创建对象的数量,以降低内存占用,提高性能。现要开发一个网络围棋程序,允许多个玩家联机下棋。由于只有一台服务器,为节省内存空间,采用享元模式实现该程序,得到如图5-1所示的类图。

15、试题五(共15分)
阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
享元(flyweight)模式主要用于减少创建对象的数量,以降低内存占用,提高性能。现要开发一个网络围棋程序,允许多个玩家联机下棋。由于只有一台服务器,为节省内存空间,采用享元模式实现该程序,得到如图5-1所示的类图。
参考答案:
(1) virtual void Draw(){}
(2) Piece*
(3)Piece*
(4) piece->Draw()
(5) piece->Draw()
解析:
享元模式主要用于减少创建对象的数量,降低内存占用,提高性能。在网络围棋程序中,可能有多名玩家联机下棋,由于只有一台服务器,需要采用享元模式来节省内存空间。根据享元模式的实现原理,享元对象需要实现一个虚函数(如Draw())来进行绘制操作,并且可能需要通过指针来管理和操作这些享元对象。因此,(n)处可能需要填写的字句与享元对象的绘制方法和指针有关。
16、 试题六(共15分)
阅读下列说明和Java代码,将应填入(n) 处的字句写在答题纸的对应栏内。
【说明】
享元(flyweight)模式主要用于减少创建对象的数量,以降低内存占用,提高性能。现要开发一个网络围棋程序,允许多个玩家联机下棋。由于只有一台服务器,为节省内存空间,采用享元模式实现该程序,得到如图6-1所示的类图。

参考答案:
(1)protected abstract void draw( )
或
public abstract void draw( )draw( )
(2)Piece
(3) Piece
(4)piece.draw()
(5)piece.draw( )
解析:
根据题目描述和给出的类图,我们可以分析出以下几点:
-
第一空:根据享元模式的应用场景和类的设计原则,抽象类“GamePiece”应该有一个抽象方法用于绘制棋子,因此第一空应填写一个方法的声明,如“protected abstract void draw()”或“public abstract void draw()”。
-
第二、三空:根据类图,“GamePiece”类的子类包括“Piece”,因此第二、三空应填写“Piece”。
-
第四、五空:在“GamePiece”或其子类的实例(如piece)中,要调用绘制棋子的方法,应该是通过对象来调用该方法,即“piece.draw()”或“当前对象的draw()方法”。如果需要在子类中调用父类的同名方法,则使用“super.draw()”。
综上,根据题目要求和给出的类图分析,得出以上答案。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!