一、问答题
1、试题一(共 15 分)
阅读下列说明和图,回答问题 1 至问题 4 ,将解答填入答题纸的对应栏内。
【说明】
某公司拟开发一个共享单车系统,采用北斗定位系统进行单车定位,提供针对用户的 APP
以及微信小程序、基于 Web 的管理与监控系统。该共享单车系统的主要功能如下。
1)用户注册登录。用户在 APP 端输入手机号并获取验证码后进行注册,将用户信息进行存储。用户登录后显示用户所在位置周围的单车。
2) 使用单车。
①扫码/手动开锁。通过扫描二维码或手动输入编码获取开锁密码,系统发送开锁指令进行
开锁,系统修改单车状态,新建单车行程。
②骑行单车。单车定时上传位置,更新行程。
③锁车结账。用户停止使用或手动锁车并结束行程后,系统根据己设置好的计费规则及使用
时间自动结算,更新本次骑行的费用并显示给用户,用户确认支付后,记录行程的支付状态。
系统还将重置单车的开锁密码和单车状态。
3)辅助管理。
①查询。用户可以查看行程列表和行程详细信息。
②报修。用户上报所在位置或单车位置以及单车故障信息并进行记录。
4)管理与监控。
①单车管理及计费规则设置。商家对单车基础信息、状态等进行管理,对计费规则 进行设
置并存储。
②单车监控。对单车、故障、行程等进行查询统计。
③用户管理。管理用户信用与状态信息,对用户进行查询统计。 现采用结构化方法对共享
单车系统进行分析与设计,获得如图 1-1 所示的上下文数据流图和图 1-2 所示的 0 层
数据流图。
【问题 1】(3 分)
使用说明中的词语,给出图 1-1 中的实体 El~E3 的名称。
【问题 2】(5 分)
使用说明中的词语,给出图 1-2 中的数据存储 Dl~D5 的名称。
【问题 3】(5 分)
根据说明和图中术语及符号,补充图 1-2 中缺失的数据流及其起点和终点。
【问题 4】(2 分)
根据说明中术语,说明"使用单车"可以分解为哪些子加工?
参考答案:见解析
解析:
: {问题一答案解析:根据说明中的词语,图1-1中的实体应包括用户、商家和单车。问题二答案解析:根据说明中的词语,图1-2中的数据存储应包括存储用户信息、记录单车位置及状态信息、记录单车行程信息、存储计费规则、记录单车故障信息。问题三答案解析:根据说明和图中术语及符号,补充图1-2中缺失的数据流及其起点和终点。开锁密码数据流从p3到E1;锁车结账数据流从p3到E1;单车状态数据流从p3到D2;计费规则数据流从D4到p3。问题四答案解析:"使用单车"这个加工可以进一步细化为扫码/手动开锁、骑行单车和锁车结账三个子加工。}
2、【试题二】(共 15 分)
阅读下列说明,回答问题 1 至问题,将解答填入答题纸的对应栏内。
【说明】
M 公司为了便于开展和管理各项业务活动,提高公司的知名度和影响力,拟构建一个基于网络的会议策划系统。
【需求分析结果】
该系统的部分功能及初步需求分析的结果如下 :
(1)M 公司旗下有业务部、策划部和其他部门。部门信息包括部门号、部门名、主管、联
系电话和邮箱号;每个部门只有一名主管,只负责管理本部门的工作,且主管参照员工关系
的员工号;一个部门有多名员工,每名员工属于且仅属于一个部门。
(2)员工信息包括员工号、姓名、职位、联系方式和薪资。职位包括主管、业务员、 策划
员等。业务员负责受理用户申请,设置受理标志。一名业务员可以受理多个用户申请,但一
个用户申请只能由一名业务员受理。
(3 用户信息包括用户号、用户名、银行账号、电话、联系地址。用户号唯一标识用户信息
中的每一个元组。
(4) 用户申请信息包括申请号、用户号、会议日期、天数、参会人数、地点、预算和受理
标志。申请号唯一标识用户申请信息中的每一个元组,且一个用户可以提交多个申请,但一
个用户申请只对应一个用户号。
(5)策划部主管为己受理的用户申请制定会议策划任务。策划任务包括申请号、任务明细
和要求完成时间。申请号唯一标识策划任务的每一个元组。一个策划任务只对应一个己受理
的用户申请,但一个策划任务可由多名策划员参与执行,且一名策划员可以参与执行,且在
项策划任务。
【概念模型设计】
根据需求阶段收集的信息,设计的实体联系图(不完整)如图 2-1 所示。
【关系模型设计】
部门(部门号,部门名,部门主管,联系电话,邮箱号)
员工(员工号,姓名,( ),联系方式,薪资)
用户(用户名,( ),电话,联系地址)
用户申请(申请号,用户号,会议日期,天数,参会人数,地点,受理标志,( ))
执行(申请号,任务明细,( ))
【问题 1】(5 分)
根据问题描述,补充五个联系,完善图 2-1 的实体联系图。联系名可用联系 1、联系 2、联系 3、联系 4 和联系 5,联系的类型为 1:1、1:n 和 m:n(或 1:1、1:*和*:*)。
【问题 2】(4 分)
根据题意,将关系模型中的空(a)~(d)补充完整,并填入答题纸对应的位置上。
【问题 3】(4 分)
给出“用户申请”和“策划任务”关系模式的主键和外键。
【问题 4】(2 分)
请问“执行”关系模式的主键为全码的说法正确吗?为什么?
参考答案:见解析
解析:
:{“解析”: “问题1中需要补充的五个联系是基于实体关系图中缺失的部分。根据需求阶段收集的信息,可以推断出这些联系以及它们的类型。\n\n问题2中需要填写的关系模型中的空字段是基于实体和它们之间的关系。例如,在员工关系中,职位是一个空字段,它应该与部门关联,因为员工属于某个部门并担任特定职位。类似地,为其他关系填写适当的字段。\n\n问题3中要求确定“用户申请”和“策划任务”关系模式的主键和外键。主键是唯一标识关系元组的字段,而外键是标识与其他关系关联的字段。\n\n问题4中询问的是“执行”关系模式的主键是否为全码的说法是否正确。全码是指关系模式中的所有属性一起组成该关系的候选码。根据提供的实体关系图,“执行”关系中的任务明细和要求完成时间并不构成全码,因为它不包括所有属性。”, “答案”: “答案区域”}
# 由于这是一个理论题,不涉及代码实现,所以此部分不需要编写代码
from typing import List
# 定义答案区域
answer_area = {
"问题1": "联系 1:部门和员工,联系类型:1:n;联系 2:业务员和用户申请,联系类型:1:n;联系 3:用户和用户申请,联系类型:1:n;联系 4:策划员和策划任务,联系类型:m:n;联系 5:策划任务和用户申请,联系类型:1:1。",
"问题2": "部门号(部门关联),职位(员工关联),用户名(用户关联),预算费用(申请关联)/员工号(员工关联)。",
"问题3": "用户申请的主键为申请号,外键为关联的用户号与关联的业务员。策划任务的主键为策划任务的申请号(也是外键),关联另一个策划任务的申请号没有实际业务含义。",
"问题4": "不正确。策划任务中的任务明细和要求完成时间并不组成全码,因为全码要求包含所有属性组成候选码,而策划任务中的任务明细和要求完成时间并不包含全部属性。"
}
def get_answer(question_id: str) -> str:
return answer_area[question_id]
# 测试答案函数
print(get_answer("问题1"))
print(get_answer("问题2"))
print(get_answer("问题3"))
print(get_answer("问题4"))
3、【试题三】( 15 分)
阅读下列说明,回答问题 1 问题 3,将解答填入答题纸的对应栏内。
【说明】
某大学拟开发一个用于管理学术出版物(Pu blication) 的数字图书馆系统,用户可以从
该系统查询或下载己发表的学术出版物。系统的主要功能如下:
1.登录系统。系统的用户 (User)仅限于该大学的学生 (Student) 、教师(Faculty)
和其他工作人员(Staff) 。在访问系统之前,用户必须使用其校园账户和密码登录系统。
2. 查询某位作者 (Author)的所有出版物。系统中保存了会议文章 (ConfPaper)、期刊
文章 (JurnalArticle)和校内技术报告(TechReport )等学术出版物的信息,如题目、
作者以及出版年份等。除此之外,系统还存储了不同类型出版物的一些特有信息;
(1)对于会议文章,系统还记录了会议名称、召开时间以及召开地点;
(2)对于期刊文章,系统还记录了期刊名称、出版月份、期号以及主办单位;
(3)对于校内技术报告,系统记录了由学校分配的唯一 ID。
3. 查询指定会议集(Proceedings)或某个期刊特定期(Edition) 的所有文章。会议集包
含了发表在该会议(在某个特定时间段、特定地点召开)上的所有文章。期刊的每一期在特
定时间发行,其中包含若干篇文章。
4.下载出版物。系统记录每个出版物被下载的次数。
5.查询引用了某篇出版物的所有出版物。在学术出版物中引用他人或早期的文献作为相关工
作或背景资料是很常见的现象。用户也可以在系统中为某篇出版物注册引用通知,若有新的
出版物引用了该出版物,系统将发送电子邮件通知该用户。
现在采用面向对象方法对该系统进行开发,得到系统的初始设计类图如图 3-1 所示。
【问题 1】(9 分)
根据说明中的描述,给出图 3-1 中 C1~C9 所对应的类名。
【问题 2】(4 分)
根据说明中的描述,给出图 3-1 中类 C6~C9 的属性。
【问题 3】(2 分)
图 3-1 中包含了哪种设计模式?实现的是该系统的哪个功能?
参考答案:见解析
解析:
:
4、试题四(15分)
阅读下列说明和 C 代码,回答问题 1 至问题 2,将解答写在答题纸的对应栏内。
【说明】
一个无向连通图 G 点上的哈密尔顿(Hamiltion)回路是指从图 G 上的某个顶点出发,经过图上所有其他顶点一次且仅一次,最后回到该顶点的路径。一种求解无向图上哈密尔顿回
路算法的基础私下如下:假设图 G 存在一个从顶点 V0 出发的哈密尔顿回路 V1——V2——V3——...——Vn-1——V0。算法从顶点 V0 出发,访问该顶点的一个未被访问的邻接顶点 V1,接着从顶点 V1 出发,访问 V1 一个未被访问的邻接顶点 V2,..。;对顶点 Vi,重复进行以下操作:访问 Vi 的一个未被访问的邻接接点 Vi+1;若 Vi 的所有邻接顶点均已被访问,则返回到顶点 Vi-1,考虑Vi-1 的下一个未被访问的邻接顶点,仍记为 Vi;知道找到一条哈密尔顿回路或者找不到哈密尔顿回路,算法结束。
【C 代码】
下面是算法的 C 语言实现。
(1)常量和变量说明
n :图 G 中的顶点数
c[][]:图 G 的邻接矩阵
K:统计变量,当期已经访问的定点数为 k+1
x[k]:第 k 个访问的顶点编号,从 0 开始
Visited[x[k]]:第 k 个顶点的访问标志,0 表示未访问,1 表示已访问
⑵C 程序
【问题 1】(10 分)
根据题干说明。填充 C 代码中的空(1)~(5)。
【问题 2】(5 分)
根据题干说明和 C 代码,算法采用的设计策略为( ),该方法在遍历图的顶点时,采用的
是( )方法(深度优先或广度优先)。
参考答案:见解析
解析:
问题 1:根据算法描述和C代码上下文,空(1)应该填写的是图的顶点数n,作为算法的重要参数。空(2)应填写邻接矩阵c[][],这是表示图的结构的方式。空(3)是统计变量K,表示已经访问的顶点数。空(4)是x[k],表示第k个访问的顶点编号。空(5)是Visited[x[k]],表示第k个顶点的访问标志。
问题 2:根据题干说明和C代码,该算法采用的设计策略为回溯法,该方法在遍历图的顶点时,采用的是深度优先方法。
5、试题五(共 15 分)
阅读下列说明和 C++代码,将应填入( )处的字句写在答题纸的对应栏内。
【说明】
某图像预览程序要求能够查看 BMP 、JPEG 和 GIF 三种格式的文件,且能够 Windows 和
Linux 两种操作系统上运行.程序需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,现采用桥接(Bridge)模式进行设计,得到如图 5-1 所示的类图。
参考答案:见解析
解析:
根据题目描述和桥接模式的设计原则,为了满足图像预览程序的要求,需要定义接口(Interface)来规定文件操作和操作系统相关的操作。扩展类(Extension Classes)用于实现具体的文件格式和操作系统的特定操作。同时,还需要一个抽象类(Abstract Class)来规定文件预览的通用操作,作为桥接模式中的抽象化层。通过这样的设计,程序能够支持多种文件格式和操作系统,并且具有较好的扩展性。因此,应填入的字句为“接口定义类、扩展类、抽象类”。
6、试题六(共 15 分)
阅读下列说明和 Java 代码,将应填入一且上一处的字句写在答题纸的对应栏内。
【说明】
某图像预览程序要求能够查看 BMP 、JPEG 和 GIF 三种格式的文件,且能够在 Windows 和
Linux 两种操作系统上运行。程序需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,现采用桥接模式进行设计,得到如图 6-1 所示
的类图。
【Jave 代码】
Import java.util.*;
class Matrix{ //各种格式的文件最终都被转化为像素矩阵
//此处代码省略
};
abstract class Implementor{
Public(1);//显示像素矩阵 m
};
class WinImp extends Implementor{
public void doPaint(Matrix m){ //调用Windows 系统的绘制函数绘制像素矩阵
}
};
class LinuxImp extends Implementor{
public void doPaint(Matrix m){//调用Linux 系统的绘制函数绘制像素矩阵
}
};
abstract class Image{
public void setImp(Implementor imp){ this.imp= imp; }
public abstract void parseFile(String fileName);
protected Implementor imp;
};
class BMPImage extends Image{
//此处代码省略
};
class GIFImage extends Image{
public void parseFile(String fileName) {
//此处解析 BMP 文件并获得一个像素矩阵对象 m
(2);//显示像素矩阵 m
}
};
Class Main{
Public static viod main(String[]args){
//在 Linux 操作系统上查看 demo.gif 图像文件
Image image=(3)
Implementor imageImp=(4)
(5)
Image.parseFile(〝demo.gif〝);
}
}
参考答案:
1.abstract void doPaint(Matrix m)
2.imp.doPaint(m)
3.new GIFImage()
4.new LinuxImp()
5.image.setImp(imageImp)
解析:
(1)在抽象类Implementor中,由于需要定义显示像素矩阵的方法,所以此处应填写抽象方法声明,即"abstract void doPaint(Matrix m)"。
(2)在GIFImage类的parseFile方法中,需要先解析BMP文件获得像素矩阵对象m,然后调用实现类的doPaint方法显示像素矩阵。因此,此处应填写"imp.doPaint(m)"。
(3)在Main类的main方法中,需要创建一个GIFImage对象来查看GIF图像文件,所以此处应填写"new GIFImage()"。
(4)由于需要在Linux操作系统上查看图像,所以需要创建一个LinuxImp对象来调用Linux系统的绘制函数。因此,此处应填写"new LinuxImp()"。
(5)在Main类的main方法中,需要通过setImp方法将LinuxImp对象设置为GIFImage对象的实现类,以便在解析文件时调用对应的绘制函数。因此,此处应填写"image.setImp(imageImp)"。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!