一、问答题
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:主管
【问题 2】D1:通用信息表 D2:预约表 D3:在职医生表
D4:出诊时间表 D5:药品库存信息表
【问题 3】数据流名称:删除解聘医生的预约信息
起点:P2 终点:D2
数据流名称:删除解聘医生的出诊安排 起点:P2 终点:D4
数据流名称:查询相关药品库存信息 起点:D5 终点:P4
数据流名称:更新治疗信息 起点: P4 终点:D2
【问题 4】
“预约处理”可以分为预约就诊、安排出诊时间两个子加工。
父图与子图要在数据流的数量与流向上保持一致。
解析:
问题1中,根据说明中的描述,E1~E3分别代表系统中的不同实体,E1为客户,E2为医生,E3为系统或管理模块(如主管的操作界面或处理模块)。
问题2中,数据存储D1~D5分别对应系统中的不同数据表。根据说明中的功能描述和上下文数据流图,可以得知D1为通用信息存储,D2为预约信息存储,D3为医生信息存储,D4为出诊时间信息存储,D5为药品库存信息存储。
问题3中,缺失的数据流主要包括在医生解聘过程中的信息删除和药品管理中的信息查询与更新。这些数据流的起点和终点已在答案中详细给出。
问题4中,"预约处理"作为医疗管理系统的一个主要功能,可以细分为预约就诊和安排出诊时间两个子加工。在数据流图中,保持平衡意味着每个加工的输入数据流总数等于其输出数据流总数。在建模图1-1和图1-2中,"预约处理"作为一个加工,其输入输出数据流关系清晰,而子加工"预约就诊"和"安排出诊时间"作为细化,同样保持了输入和输出的平衡,从而保持了整个数据流图的平衡。
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】
【问题 2】
(a)商品条码、顾客编号
(b)订单ID
【问题 3】运送关系模式新增联系,与顾客地址。
解析:
问题1要求补充实体联系图。根据业务描述,需要增加商品条码、顾客编号和订单ID等关键信息在实体间的联系。这些联系反映了系统中商品、顾客和订单之间的关联关系。
问题2要求补充逻辑结构设计中的两处空缺。根据业务逻辑,这两处空缺分别代表商品在系统中的唯一标识(商品条码)和代购员操作的订单的唯一标识(订单ID)。
问题3要求增加"顾客地址"弱实体并对图进行补充,同时修改"运送"关系模式。这反映了系统中需要处理顾客的多组收货地址的需求。在实体联系图中增加"顾客地址"弱实体后,需要调整相关实体间的联系以体现这一变化。同时,"运送"关系模式也需要进行相应的修改以包含新的联系信息。具体细节需要根据实际需求和系统设计进行调整。
3、阅读下列说明,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。
【说明】
某 ETC( Electronic Toll Collection,不停车收费)系统在高速公路沿线的特定位置上设置一个横跨道路上空的龙门架( Toll gantry),龙门架下包括 6条车道( Trafficlanes),每条车道上安装有雷达传感器( 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:Central system/Driver
A2:Driver/Central system
A3:Regional center/Traffic advice center
A4:Traffic advice center/Regional center
【问题 2】
U1:Underpaid transaction/Record Illegal use
U2:Record Illegal use/Underpaid transaction
U3:Create transaction
U4:Record traffic event
U5:Charge card
【问题 3】
C1:Center system
C2: Toll gantry
C3: Traffic lanes
C4:Radar sensor/Radio transceiver/Digital Camera
C5:Radio transceiver/Radar sensor/Digital Camera
C6: Digital Camera/Radar sensor/Radio transceiver
解析:
<问题 1>根据说明中的描述,A1表示中央系统与驾驶员之间的交互,因为驾驶员需要使用车载器与中央系统进行通信。A2表示驾驶员与中央系统之间的信息交互更为明确。A3表示区域系统与交通广播电台之间的通信,因为区域系统需要获取交通事件信息并与交通广播电台进行交互。A4则表示交通广播电台与区域系统之间的信息交互。
<问题 2>根据说明中的描述和表3-1,U1表示记录失败的交易或处理非法使用,因为当车辆没有安装车载器或车载器发生故障时,需要进行记录。U2是处理非法使用和记录失败的交易的后续操作。U3是创建交易,即计算通行费用并创建收费交易。U4是记录交通事件。U5是充值操作。
<问题 3>根据说明中的描述,C1表示整个系统。C2表示收费设备,即龙门架下的设备。C3表示车道,即车辆行驶的路径。C4表示车道上的设备,包括雷达传感器、无线传输器和数码相机。C5主要表示感应设备,即雷达传感器和无线传输器。C6主要表示相机设备,即数码相机。
4、
阅读下列说明和 C 代码,回答问题 1 和问题 2,将解答填入答题纸的对应栏内。
【说明】
某公司购买长钢条,将其切割后进行出售。切割钢条的成本可以忽略不计,钢条的长度为整英寸。已知价格表 P,其中中 Pi(i=1,2,...,m)表示长度为 i 英寸的钢条的价格。现要求解使销售收益最大的切割方案。求解此切割方案的算法基本思想如下:
假设长钢条的长度为 n 英寸,最佳切割方案的最左边切割段长度为 i 英寸,则继续求解剩余长度为 n-i 英寸钢条的最佳切割方案。考虑所有可能的 i,得到的最大收益 rn对应的切割方案即为最佳切割方案。rn的递归定义如下:
rn =max1≤ i ≤n(pi +rn-i)
对此递归式,给出自顶向下和自底向上两种实现方式
【C 代码】
/*常量和变量说明
n:长钢条的长度
P[]:价格数组
*/
#define LEN 100
int Top_Down_ Cut_Rod(int P[],int n){/*自顶向下*/
int r=0;
int i;
if(n==0){
retum 0;
}
for(i=1;(1);i++){
int tmp=p[i]+Top_Down_ Cut_Rod(p,n-i);
r=(r>=tmp)?r:tmp;
}
return r;
}
int Bottom_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];
}
【问题 1】(8 分)
根据说明,填充 C 代码中的空(1)~(4)。
【问题 2】(7 分)
根据说明和 C 代码,算法采用的设计策略为(5)。
求解 rn时,自顶向下方法的时间复杂度为(6);自底向上方法的时间复杂度为(7)(用O 表示)。
参考答案:【问题 1】
(1)i<=n
(2)i<=j
(3)temp=(temp>=p[i]+r[j-1])?temp:(p[i]+r[j-1])
(4)r[j]=temp
【问题 2】
(5)动态规划
(6)O(2n)
(7)O(n2)
解析:
问题1:对于第一个空,由于循环需要遍历所有可能的i值,因此应为i <= n;第二个空,因为内部循环是针对剩余长度为j-i的钢条进行计算的,所以应为i <= j;第三个空,这里是在更新temp值,表示当前长度的钢条价格与剩余钢条的最佳切割方案收益之和的最大值,所以应为temp = (temp >= p[i] + r[j-i]) ? temp : (p[i] + r[j-i]);第四个空,需要存储长度为j的钢条的最大收益,所以应为r[j] = temp;。
问题2:对于第五空,根据说明和代码,算法采用的是动态规划策略;第六空,自顶向下的方法在每个长度上都进行了递归计算,且递归的深度为n,所以时间复杂度为O(n^2);第七空,自底向上的方法需要先计算所有子问题的解,然后再利用这些子问题的解来计算原问题的解,时间复杂度也是O(n^2)。
5、阅读下列说明和 C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
生成器( Builder)模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。图 5-1 所示为其类图。
【C++代码】
#include <iostream>
#include <string>
using namespace std;
class Product {
private:
string partA, partB;
public:
Product() { }
void
setPartA(const string& s) { PartA = s;}
void
setPartB(const string& 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();
Product* p = builder->getResult();
解析:
本题考察的是对生成器模式的理解以及C++中抽象类和纯虚函数的运用。
(1)在Builder类中,由于建造者模式要求将对象的构建与其表示分离,因此Builder类需要提供构建对象各个部分的方法。这里需要定义两个纯虚函数buildPartA和buildPartB,以提供给具体建造者类(如ConcreteBuilder1)实现。所以此处应填写"virtual void buildPartA() = 0;"。
(2)建造完成后,需要提供一个方法获取构建好的产品对象。在Builder类中,应提供一个返回产品对象的方法,此处应填写"virtual Product* getResult() = 0;"。
(3)在ConcreteBuilder1类的buildPartA方法中,需要实现具体的构建过程,即调用Product类的setPartA方法设置部件A的值。所以此处应填写"product->setPartA"。
(4)同理,在ConcreteBuilder1类的buildPartB方法中,需要实现具体的构建过程,即调用Product类的setPartB方法设置部件B的值。所以此处应填写"product->setPartB"。
(5)在Director类的construct方法中,需要调用建造者对象的buildPartA和buildPartB方法以构建产品对象,然后调用getResult方法获取产品对象。所以此处应填写"builder->buildPartA(); builder->buildPartB(); Product* p = builder->getResult;"。
6、阅读下列说明和 Java 代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
生成器( Builder)模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。图 6-1 所示为其类图。
【说明】
生成器(Builder)模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。图5-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 ConcreteBuilder1 implements Builder {
private Product product;
public ConcreteBuilder1() { 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 director1 = new
Director(new ConcreteBuilder1());
director1.construct();
}
参考答案:
(1)abstract void buildPart A()
(2) abstract Product getResult()(3)product.setPartA
(4)product.setPartB
(5)builder.buildPartA();
builder.buildPartB();
Product p=builder.getResult();
解析:
这是一个关于生成器(Builder)模式的问题。生成器模式用于创建复杂对象,将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。下面是关于每个答案的详细解析:
- (1) 和 (2) 的答案是抽象方法的声明,因为这是 Builder 接口的要求。buildPartA() 方法用于构建对象的一部分,getResult() 方法用于返回构建好的对象。
- (3) 的答案是 product.setPartA,这是 ConcreteBuilder1 类中 buildPartA() 方法的实现,用于设置 Product 对象的 partA 部分。
- (4) 的答案是 product.setPartB,这是 ConcreteBuilder1 类中 buildPartB() 方法的实现,用于设置 Product 对象的 partB 部分。
- (5) 的答案是构建对象的完整过程,首先调用 builder.buildPartA() 构建对象的一部分,然后调用 builder.buildPartB() 构建对象的另一部分,最后通过 builder.getResult() 获取构建好的对象,并将其赋值给 Product 类型的变量 p。这个过程在 Director 类的 construct() 方法中进行。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!