刘一辰的软件工程随笔
2010 年上半年软件设计师考试下午真题(参考答案)
- 阅读下列说明和图,回答问题 1 至问题 4,将解答填入答题纸的对应栏内。
【说明】
某大型企业的数据中心为了集中管理、控制用户对数据的访问并支持大量的连接需求,欲 构建数据管理中间件,其主要功能如下:
(1) 数据管理员可通过中间件进行用户管理、操作管理和权限管理。用户管理维护用户信息,用户信息(用户名、密码)存储在用户表中;操作管理维护数据实体的标准操作及其所 属的后端数据库信息,标准操作和后端数据库信息存放在操作表中;权限管理维护权限表,该 表存储用户可执行的操作信息。
(2) 中间件验证前端应用提供的用户信息。若验证不通过,返回非法用户信息;若验证 通过,中间件将等待前端应用提交操作请求。
(3) 前端应用提交操作请求后,中间件先对请求进行格式检查。如果格式不正确,返回 格式错误信息;如果格式正确,则进行权限验证(验证用户是否有权执行请求的操作), 若用户无权执行该操作,则返回权限不足信息,否则进行连接管理。
(4) 连接管理连接相应的后台数据库并提交操作。连接管理先检查是否存在空闲的数据 库连接,如果不存在,新建连接;如果存在,则重用连接。
(5) 后端数据库执行操作并将结果传给中间件,中间件对收到的操作结果进行处理后, 将其返回给前端应用。
现采用结构化方法对系统进行分析与设计,获得如图 1-1 所示的顶层数据流图和图 1-2 所示的
0 层数据流图。
【问题 1】(3 分)
使用说明中的词语,给出图 1-1 中的实体 E1~E3 的名称。
【问题 2】(3 分)
使用说明中的词语,给出图 1-2 中的数据存储 D1~D3 的名称。
【问题 3】(6 分)
给出图 1-2 中加工 P 的名称及其输入、输出流。
除加工 P 的输入与输出流外,图 1-2 还缺失了两条数据流,请给出这两条数据流的起点和终点。
注:名称使用说明中的词汇,起点和终点均使用图 1-2 中的符号或词汇。
【问题 4】(3 分)
在绘制数据流图时,需要注意加工的绘制。请给出三种在绘制加工的输入、输出时 可能出现的错误。
- 阅读下列说明和图,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。
【说明】
某学校拟开发一套实验管理系统,对各课程的实验安排情况进行管理。
【需求分析】
一个实验室可进行多种类型不同的实验。由于实验室和实验员资源有限,需根据学生人数 分批次安排实验室和实验员。一门课程可以为多个班级开设,每个班级每学期可以开设多门课 程。一门课程的一种实验可以根据人数、实验室的可容纳人数和实验类型,分批次开设在多个 实验室的不同时间段。一个实验室的一次实验可以分配多个实验员负责辅导实验,实验员给出 学生的每次实验成绩。
(1)课程信息包括:课程编号、课程名称、实验学时、授课学期和开课的班级等信息; 实验信息记录该课程的实验进度信息,包括:实验名、实验类型、学时、安排周次等信息,如 表 2-1 所示。
(2)以课程为单位制定实验安排计划信息,包括:实验地 点,实验时间、实验员等信息,实验计划如表 2-2 所示。
(3) 由实验员给出每个学生每次实验的成绩,包括:实验名、学号、姓名、班级、实验
成绩等信息,实验成绩如表 2-3 所示。
(4) 学生的实验课程总成绩根据每次实验的成绩以及每次实验的难度来计算。
【概念模型设计】
根据需求阶段收集的信息,设计的实体联系图(不完整)如图 2-1 所示。
【逻辑结构设计】
根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整): 课程(课程编号,课程名称,授课院系,实验学时)
班级(班级号,专业,所属系) 开课情况( (1) ,授课学期)
实验( (2) ,实验类型,难度,学时,安排周次) 实验计划( (3) ,实验时间,人数)
实验员( (4) ,级别)
实验室(实验室编号,地点,开放时间,可容纳人数,实验类型) 学生( (5) ,姓名,年龄,性别)
实验成绩( (6) ,实验成绩,评分实验员)
【问题 1】(6 分)
补充图 2-1 中的联系和联系的类型。
【问题 2】(6 分)
根据图 2-1,将逻辑结构设计阶段生成的关系模式中的空(1)~(6)补充完整并用下划线指出这六个关系模式的主键。
【问题 3】(3 分)
如果需要记录课程的授课教师,新增加“授课教师”实体。请对图 2-1 进行修改,画出修改后的实体间联系和联系的类型。
- 阅读下列说明和图,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。
【说明】
某运输公司决定为新的售票机开发车票销售的控制软件。图 3-1 给出了售票机的面板示意
图以及相关的控制部件。
售票机相关部件的作用如下所述:
(1) 目的地键盘用来输入行程目的地的代码(例如,200 表示总站)。
(2) 乘客可以通过车票键盘选择车票种类(单程票、多次往返票和座席种类)。
(3) 继续/取消键盘上的取消按钮用于取消购票过程,继续按钮允许乘客连续购买多张
票。
(4) 显示屏显示所有的系统输出和用户提示信息。
(5) 插卡口接受 MCard(现金卡),硬币口和纸币槽接受现金。
(6) 打印机用于输出车票。
假设乘客总是支付恰好需要的金额而无需找零,售票机的维护工作(取回现金、放入空白
车票等)由服务技术人员完成。
系统采用面向对象方法开发,使用 UML 进行建模。系统的顶层用例图和类图分别如图 3-
2 和图 3-3 所示。
【问题 1】(5 分)
根据说明中的描述,给出图 3-2 中 A1 和 A2 所对应的参与者,U1 所对应的用例,以及
(1) 、(2)处所对应的关系。
【问题 2】(7 分)
根据说明中的描述,给出图 3-3 中缺少的 C1~C4 所对应的类名以及(3)~(6)处所对应的多重度。
【问题 3】(3 分)
图 3-3 中的类图设计采用了中介者(Mediator)设计模式,请说明该模式的内涵。
- 阅读下列说明和 C 代码,回答问题 1 至问题 3,将解答写在答题纸的对应栏内。
【说明】
对有向图进行拓扑排序的方法是:
(1) 初始时拓扑序列为空;
(2) 任意选择一个入度为 0 的顶点,将其放入拓扑序列中,同时从图中删除该顶点以及从该顶点出发的弧;
(3) 重复(2),直到不存在入度为 0 的顶点为止(若所有顶点都进入拓扑序列则完成拓扑排序,否则由于有向图中存在回路无法完成拓扑排序)。
函数 int* TopSort(LinkedDigraph G)的功能是对有向图 G 中的顶点进行拓扑排序,返回拓扑序列中的顶点编号序列,若不能完成拓扑排序,则返回空指针。其中,图 G 中的顶点从 1 开始依次编号,顶点序列为 v1,v2,…,vn,图 G 采用邻接表示,其数据类型定义如下:
#define MAXVNUM 50 /*最大顶点数*/ typedef struct ArcNode{ /*表结点类型*/ int adjvex; /*邻接顶点编号*/
struct ArcNode *nextarc; /*指示下一个邻接顶点*/
}ArcNode;
typedef struct AdjList{ /*头结点类型*/ char vdata; /*顶点的数据信息*/
ArcNode *firstarc; /*指向邻接表的第一个表结点*/
}AdjList;
typedef struct LinkedDigraph{ /*图的类型*/
int n; /*图中顶点个数*/
AdjList Vhead[MAXVNUM]; /*所有顶点的头结点数组*/
}LinkedDigraph;
例如,某有向图 G 如图 4-1 所示,其邻接表如图 4-2 所示。
函数 TopSort 中用到了队列结构(Queue 的定义省略),实现队列基本操作的函数原型如下表所示:
【C 代码】
int *TopSort(LinkedDigraph G) {
ArcNode *p; /*临时指针,指示表结点*/
Queue Q; /*临时队列,保存入度为 0 的顶点编号*/ int k = 0; /*临时变量,用作数组元素的下标*/
int j = 0, w = 0; /*临时变量,用作顶点编号*/ int *topOrder, *inDegree;
topOrder = (int *)malloc((G.n+1) * sizeof(int)); /*存储拓扑序列中的顶点编号*/ inDegree = (int *)malloc((G.n+1) * sizeof(int)); /*存储图 G 中各顶点的入度*/ if (!inDegree || !topOrder) return NULL;
(1) ; /*构造一个空队列*/
for ( j = 1; j <= G.n; j++ ) { /*初始化*/ topOrder[j] = 0; inDegree[j] = 0;
}
for (j = 1; j <= G.n; j++) /*求图 G 中各顶点的入度*/ for( p = G.Vhead[j].firstarc; p; p = p->nextarc ) inDegree[p-> adjvex] += 1;
for (j = 1; j <= G.n; j++) /*将图 G 中入度为 0 的顶点保存在队列中*/ if ( 0 == inDegree[j] ) EnQueue(&Q,j);
while (!IsEmpty(Q)) {
(2) ; /*队头顶点出队列并用 w 保存该顶点的编号*/ topOrder[k++] = w;
/*将顶点 w 的所有邻接顶点的入度减 1(模拟删除顶点 w 及从该顶点出发的弧的操作)*/ for(p = G.Vhead[w].firstarc; p; p = p->nextarc) {
(3)-= 1;
if (0 ==(4)) EnQueue(&Q, p->adjvex);
}/* for */
}/* while */
free(inDegree); if ( (5) ) return NULL;
return topOrder;
} /*TopSort*/
【问题 1】(9 分)
根据以上说明和 C 代码,填充 C 代码中的空(1)~(5)。
【问题 2】(2 分)
对于图 4-1 所示的有向图 G,写出函数 TopSort 执行后得到的拓扑序列。若将函数
TopSort 中的队列改为栈,写出函数 TopSort 执行后得到的拓扑序列。
【问题 3】(4 分)
设某有向无环图的顶点个数为 n、弧数为 e,那么用邻接表存储该图时,实现上述拓扑排序算法的函数 TopSort 的时间复杂度是(6)。
若有向图采用邻接矩阵表示(例如,图 4-1 所示有向图的邻接矩阵如图 4-3 所示),且将函数 TopSort 中有关邻接表的操作修改为针对邻接矩阵的操作,那么对于有 n 个顶点、e 条弧的有向无环图,实现上述拓扑排序算法的时间复杂度是(7)。
从下列的 2 道试题(试题五和试题六)中任选 1 道解答。如果解答的试题数超过 1
道,则题号小的 1 道解答有效。
- 阅读下列说明和 C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与 起飞特征。需要模拟的飞机种类及其特征如表 5-1 所示。
为支持将来模拟更多种类的飞机,采用策略设计模式(Strategy)设计的类图如图 5-1 所
示。
图 5-1 中,AirCraft 为抽象类,描述了抽象的飞机,而类 Helicopter、AirPlane、Fighter 和
Harrier 分别描述具体的飞机种类,方法 fly (5) 和 takeOff (6) 分别表示不同飞机都具有飞行特征和起飞特征;类 FlyBehavior 与 TakeOffBehavior 为抽象类,分别用于表示抽象的飞行为与起飞行为;类 SubSonicFly 与 SuperSonicFly 分别描述亚音速飞行和超音速飞行的行为;类VerticalTakeOff 与 LongDistanceTakeOff 分别描述垂直起飞与长距离起飞的行为。
【C++ 代码】
#include<iostream>
using namespace std; class FlyBehavior {
public : virtual void fly() = 0;
};
class SubSonicFly:public FlyBehavior{
public: void fly(){ cout << "亚音速飞行!" << endl; }
};
class SuperSonicFly:public FlyBehavior{
public: void fly(){ cout << "超音速飞行!" << endl; }
};
class TakeOffBehavior {
public: virtual void takeOff() = 0;
};
class VerticalTakeOff:public TakeOffBehavior{
public: void takeOff(){ cout << "垂直起飞!" << endl; }
};
class LongDistanceTakeOff:public TakeOffBehavior { public: void takeOff (){ cout << "长距离起飞!" << endl; }
};
class AirCraft{ protected:
(1) ;
(2) ; public:
void fly(){(3); }
void takeOff() {(4); };
};
class Helicopter: public AirCraft { public:
Helicopter (){
flyBehavior = new(5); takeOffBehavior = new(6);
}
(7){
if(!flyBehavior) delete flyBehavior; if(!takeOffBehavior) delete takeOffBehavior;
}
};
//
其它代码省略
- 阅读下列说明和 Java 代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与 起飞特征。需要模拟的飞机种类及其特征如表 6-1 所示。
为支持将来模拟更多种类的飞机,采用策略设计模式(Strategy)设计的类图如图 6-1 所
示。
图 6-1 中,AirCraft 为抽象类,描述了抽象的飞机,而类 Helicopter、AirPlane、Fighter 和
Harrier 分别描述具体的飞机种类,方法 fly (6) 和 takeOff (7) 分别表示不同飞机都具有飞行特征和起飞特征类 FlyBehavior 与 TakeOffBehavior 为抽象类,分别用于表示抽象的飞行为与起飞行为;类 SubSonicFly 与 SuperSonicFly 分别描述亚音速飞行和超音速飞行的行为;类VerticalTakeOff 与 LongDistanceTakeOff 分别描述垂直起飞与长距离起飞的行为。
【Java 代码】
interface FlyBehavior {
public void fly();
};
class SubSonicFly implements FlyBehavior{
public void fly(){ System.out.println("亚音速飞行!"); }
};
class SuperSonicFly implements FlyBehavior{
public void fly(){ System.out.println("超音速飞行!" ); }
};
interface TakeOffBehavior { public void takeOff();
};
class VerticalTakeOff implements TakeOffBehavior {
public void takeOff (){ System.out.println("垂直起飞!" ); }
};
class LongDistanceTakeOff implements TakeOffBehavior { public void takeOff(){ System.out.println("长距离起飞!"); }
};
abstract class AirCraft {
protected (1) ; protected (2) ;
public void fly(){ (3) ; }
public void takeOff() { (4) ; };
};
class Helicopter(5)AirCraft{
public Helicopter (){ flyBehavior = new (6) ; takeOffBehavior = new (7) ;
}
};
//其它代码省略
2010 年下半年软件设计师考试下午真题(参考答案)
- 阅读以下说明和图,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。
【说明】
某时装邮购提供商拟开发订单处理系统,用于处理客户通过电话、传真、邮件或 Web 站点所下订单。其主要功能如下:
(1) 增加客户记录。将新客户信息添加到客户文件,并分配一个客户号以备后续使用。
(2) 查询商品信息。接收客户提交商品信息请求,从商品文件中查询商品的价格和可订购 数量等商品信息,返回给客户。
(3) 增加订单记录。根据客户的订购请求及该客户记录的相关信息,产生订单并添加到订 单文件中。
(4) 产生配货单。根据订单记录产生配货单,并将配货单发送给仓库进行备货;备好货 后,发送备货就绪通知。如果现货不足,则需向供应商订货。
(5) 准备发货单。从订单文件中获取订单记录,从客户文件中获取客户记录,并产生发货 单。
(6) 发货。当收到仓库发送的备货就绪通知后,根据发货单给客户发货;产生装运单并发 送给客户。
(7) 创建客户账单。根据订单文件中的订单记录和客户文件中的客户记录,产生并发送客 户账单,同时更新商品文件中的商品数量和订单文件中的订单状态。
(8) 产生应收账户。根据客户记录和订单文件中的订单信息,产生并发送给财务部门应收 账户报表。
现采用结构化方法对订单处理系统进行分析与设计,获得如图 1-1 所示的顶层数据流图和图 1-
2 所示 0 层数据流图。
【问题 1】(3 分)
使用说明中的词语,给出图 1-1 中的实体 E1~E3 的名称。
【问题 2】(3 分)
使用说明中的词语,给出图 1-2 中的数据存储 D1~D3 的名称。
【问题 3】(9 分)
(1) 给出图 1-2 中处理(加工)P1 和 P2 的名称及其相应的输入、输出流。
(2) 除加工 P1 和 P2 的输入输出流外,图 1-2 还缺失了 1 条数据流,请给出其起点和终点。
- 阅读以下说明,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。
【说明】
某公司拟开发一套小区物业收费管理系统。初步的需求分析结果如下:
(1) 业主信息主要包括:业主编号,姓名,房号,房屋面积,工作单位,联系电话等。房 号可唯一标识一条业主信息,且一个房号仅对应一套房屋;一个业主可以有一套或多套的房屋。
(2) 部门信息主要包括:部门号,部门名称,部门负责人,部门电话等;一个员工只能属 于一个部门,一个部门只有一位负责人。
(3) 员工信息主要包括:员工号,姓名,出生年月,性别,住址,联系电话,所在部门 号,职务和密码等。根据职务不同员工可以有不同的权限,职务为“经理”的员工具有更改(添 加、删除和修改)员工表中本部门员工信息的操作权限;职务为“收费”的员工只具有收费的操 作权限。
(4) 收费信息包括:房号,业主编号,收费日期,收费类型,数量,收费金额,员工号
等。收费类型包括物业费、卫生费、水费和电费,并按月收取,收费标准如表 2-1 所示。其中:物业费=房屋面积(平方米)×每平米单价,卫生费=套房数量(套)×每套房单价,水费= 用水数量(吨)×每吨水单价,电费=用电数量(度)×每度电单价。
(5)
收费完毕应为业主生成收费单,收费单示例如表 2-2 所示。
【概念模型设计】
根据需求阶段收集的信息,设计的实体联系图(不完整)如图 2-1 所示。图 2-1 中收费员和经理是员工的子实体。
【逻辑结构设计】
根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整): 业主( (1) ,姓名,房屋面积,工作单位,联系电话)
员工( (2) ,姓名,出生年月,性别,住址,联系电话,职务,密码)
部门( (3) ,部门名称,部门电话) 权限( 职务,操作权限)
收费标准( (4) )
收费信息( (5) ,收费类型,收费金额,员工号)
【问题 1】(8 分)
根据图 2-1,将逻辑结构设计阶段生成的关系模式中的空(1)~(5)补充完整,然后给出各关系模式的主键和外键。
【问题 2】(5 分)
填写图 2-1 中(a)~(f)处联系的类型(注:一方用 1 表示,多方用 m 或 n 或 *表示),并补充完整图 2-1 中的实体、联系和联系的类型。
【问题 3】(2 分)
业主关系属于第几范式?请说明存在的问题。
- 阅读下列说明和图,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。
【说明】
某网上药店允许顾客凭借医生开具的处方,通过网络在该药店购买处方上的药品。该网上药 店的基本功能描述如下:
(1) 注册。顾客在买药之前,必须先在网上药店注册。注册过程中需填写顾客资料以及付款方式(信用卡或者支付宝账户)。此外顾客必须与药店签订一份授权协议书,授权药店可以 向其医生确认处方的真伪。
(2) 登录。已经注册的顾客可以登录到网上药房购买药品。如果是没有注册的顾客,系统 将拒绝其登录。
(3) 录入及提交处方。登录成功后,顾客按照“处方录入界面”显示的信息,填写开具处方 的医生的信息以及处方上的药品信息。填写完成后,提交该处方。
(4) 验证处方。对于已经提交的处方(系统将其状态设置为“处方已提交”),其验证过程 为:
①核实医生信息。如果医生信息不正确,该处方的状态被设置为“医生信息无效”,并取消这个处方的购买请求;如果医生信息是正确的,系统给该医生发送处方确认请求,并将处方状态 修改为“审核中”。
②如果医生回复处方无效,系统取消处方,并将处方状态设置为“无效处方”。如果医生没有 在 7 天内给出确认答复,系统也会取消处方,并将处方状态设置为“无法审核”。
③如果医生在 7 天内给出了确认答复,该处方的状态被修改为“准许付款”。
系统取消所有未通过验证的处方,并自动发送一封电子邮件给顾客,通知顾客处方被取消以 及取消的原因。
(5) 对于通过验证的处方,系统自动计算药品的价格并邮寄药品给己经付款的顾客。 该网上药店采用面向对象方法开发,使用 UML 进行建模。系统的类图如图 3-1 所示。
【问题 1】(8 分)
根据说明中的描述,给出图 3-1 中缺少的 C1~C5 所对应的类名以及(1)~(6)处所对应的多重度。
【问题 2】(4 分)
图 3-2 给出了“处方”的部分状态图。根据说明中的描述,给出图 3-2 中缺少的 S l ~S4 所对应的状态名以及(7)~(10)处所对应的迁移(transition)名。
图3-1中的符号“”和“?”在UML中分别表示类和对象、之间的哪两种关系?两者之间的区别是什么?
试题四(共15分)
阅读下列说明和C代码,回答问题1至间题3,将解答写在答题纸的对应栏内。【说明】
堆数据结构定义如下:
对于n个元素的关键字序列{4,az……,.ag),当且仅当满足下列关系时称其为堆。
a二a或! a2其中,i=1,2…[%]
l4sa241l4二2i+1
在一个堆中,若堆顶元素为最大元素,则称为大顶堆;若堆顶元素为最小元素,则称为小顶堆。堆常用完全二叉树表示,图4-1是一个大顶堆的例子。堆数据结构常用于优先队列中,以维护由一组元素构成的集合。对应于两类堆结构,优先队列也有最大优先队列和最小优先队列,其中最大优先队列采用大顶堆,最小优先队列采用小顶堆。以下考虑最大优先队列。
假设现已建好大顶堆A,且已经实现了调整堆的函数heapify(A,n, index)
试题五(共15分)。
阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】
某公司的组织结构图如图5-1所示,现采用组合(Composition)设计模式来构造该公司的组织结构,得到如图5-2所示的类图。
试题六(共15分)
阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】
某公司的组织结构图如图6-1所示,现采用组合(Composition)设计模式来设计,得到如图6-2所示的类图。其中 Company为抽象类,定义了在组织结构图上添加(Add)和删除(Delete)分公司/办事处或者部门的方法接口。类ConcreteCompany,表示具体的分公司或者办事处,分公司或办事处下可以设置不同的部门.类 HRDepartment,和 FinanceDepartment,分别表示人力资源部和
2011 年上半年软件设计师考试下午真题(参考答案)
- 阅读下列说明和图,回答问题 1 至问题 4,将解答填入答题纸的对应栏内。
【说明】
某医院欲开发病人监控系统。该系统通过各种设备监控病人的生命体征,并在生命体征异常 时向医生和护理人员报警。该系统的主要功能如下:
(1) 本地监控:定期获取病人的生命体征,如体温、血压、心率等数据。
(2) 格式化生命体征:对病人的各项重要生命体征数据进行格式化,然后存入日志文件并 检查生命体征。
(3) 检查生命体征:将格式化后的生命体征与生命体征范围文件中预设的正常范围进行比 较。如果超出了预设范围,系统就发送一条警告信息给医生和护理人员。
(4) 维护生命体征范围:医生在必要时(如,新的研究结果出现时)添加或更新生命体征 值的正常范围。
(5) 提取报告:在医生或护理人员请求病人生命体征报告时,从日志文件中获取病人生命 体征生成体征报告,并返回给请求者。
(6) 生成病历:根据日志文件中的生命体征,医生对病人的病情进行描述,形成病历存入 病历文件。
(7) 查询病历:根据医生的病历查询请求,查询病历文件,给医生返回病历报告。
(8) 生成治疗意见:根据日志文件中的生命体征和病历,医生给出治疗意见,如处方等, 并存入治疗意见文件。
(9) 查询治疗意见:医生和护理人员查询治疗意见,据此对病人进行治疗。
现采用结构化方法对病人监控系统进行分析与设计,获得如图 1-1 所示的顶层数据流图和图
1-2 所示的 0 层数据流图。
【问题 1】(3 分)
使用说明中的词语,给出图 1-1 中的实体 E1~E3 的名称。
【问题 2】(4 分)
使用说明中的词语,给出图 1.2 中的数据存储 D1~D4 的名称。
【问题 3】 (6 分)
图 1-2 中缺失了 4 条数据流,使用说明、图 1-1 和图 1-2 中的术语,给出数据流的名称及其起点和终点。
【问题 4】(2 分)
说明实体 El 和 E3 之间可否有数据流,并解释其原因。
- 阅读下列说明,回答问题 l 至问题 3,将解答填入答题纸的对应栏内。
【说明】
某服装销售公司拟开发一套服装采购管理系统,以便对服装采购和库存进行管理。
【需求分析】
(1) 采购系统需要维护服装信息及服装在仓库中的存放情况。服装信息主要包括:服装编码、服装描述、服装类型、销售价格、尺码和面料,其中,服装类型为销售分类,服装按销售 分类编码。仓库信息包括:仓库编码、仓库位置、仓库容量和库管员。系统记录库管员的库管 员编码、姓名和级别。一个库管员可以管理多个仓库,每个仓库有一名库管员。一个仓库中可 以存放多类服装,一类服装可能存放在多个仓库中。
(2) 当库管员发现有一类或者多类服装缺货时,需要生成采购订单。一个采购订单可以包含多类服装。每类服装可由多个不同的供应商供应,但具有相同的服装编码。采购订单主要记 录订单编码、订货日期和应到货日期,并详细记录所采购的每类服装的数量、采购价格和对应 的多个供应商。
(3) 系统需记录每类服装的各个供应商信息和供应情况。供应商信息包括:供应商编码、供应商名称、地址、企业法人和联系电话。供应情况记录供应商所供应服装的服装类型和服装 质量等级。一个供应商可以供应多类服装,一类服装可由多个供应商供应。库管员根据入库时 的服装质量情况,设定或修改每个供应商所供应的每类服装的服装质量等级,作为后续采购服 装时,选择供应商的参考标准。
【概念模型设计】
根据需求阶段收集的信息,设计的实体联系图(不完整)如图 2-1 所示。
【逻辑结构设计】
根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整): 库管员(库管员编码,姓名,级别)
仓库信息( (1) ,仓库位置,仓库容量)
服装(服装编码,服装描述,服装类型,尺码,面料,销售价格) 供应商(供应商编码,供应商名称,地址,联系电话,企业法人)
供应情况( (2) ,服装质量等级)
采购订单( (3) )
采购订单明细( (4) )
【问题 1】(6 分)
根据需求分析的描述,补充图 2.1 中的联系和联系的类型。
【问题 2】(6 分)
根据补充完整的图 2-1,将逻辑结构设计阶段生成的关系模式中的空(1)~(4)补充完整,并给出其主键(用下划线指出)。
【问题 3】(3 分)
如果库管员定期需要轮流对所有仓库中的服装质量进行抽查,对每个仓库中的每一类 被抽查服装需要记录一条抽查结果,并且需要记录抽查的时间和负责抽查的库管员。请 根据该要求,对图 2-1 进行修改,画出修改后的实体间联系和联系的类型。
- 阅读下列说明和图,回答问题 l 至问题 3,将解答填入答题纸的对应栏内。
【说明】
一个简单的图形编辑器提供给用户的基本操作包括:创建图形、创建元素、选择元素以及删 除图形。图形编辑器的组成及其基本功能描述如下:
(1) 图形由文本元素和图元元素构成,图元元素包括线条、矩形和椭圆。
(2) 显示在工作空间中,一次只能显示一张图形(即当前图形,current)。
(3) 提供了两种操作图形的工具:选择工具和创建工具。对图形进行操作时,一次只能使 用一种工具(即当前活动工具,active)
① 创建工具用于创建文本元素和图元元素。
② 于显示在工作空间中的图形,使用选择工具能够选定其中所包含的元素,可以选择一个元素,也可以同时选择多个元素。被选择的元素称为当前选中元素( selected)。
③ 种元素都具有对应的控制点。拖拽选定元素的控制点,可以移动元素或者调整元素的大小。
现采用面向对象方法开发该图形编辑器,使用 UML 进行建模。构建出的用例图和类图分别如图 3-1 和 3-2 所示。
【问题 1】 (4 分)
根据说明中的描述,给出图 3-1 中 U1 和 U2 所对应的用例,以及(1)和(2)处所对应的关系。
【问题 2】(8 分)
根据说明中的描述,给出图 3.2 中缺少的 C1~C8 所对应的类名以及(3)~(6)处所对应的多重度。
【问题 3】(3 分)
图 3-2 中的类图设计采用了桥接(Bridge)设计模式,请说明该模式的内涵。
- 阅读下列说明和 C 代码,回答问题 1 至问题 3,将解答写在答题纸的对应栏内。
【说明】
某应用中需要对 100000 个整数元素进行排序,每个元素的取值在 0~5 之间。排序算法的基本思想是:对每一个元素 x,确定小于等于 x 的元素个数(记为 m),将 x 放在输出元素序列的 第 m 个位置。对于元素值重复的情况,依次放入第 m-l、m-2、…个位置。例如,如果元素值小于等于 4 的元素个数有 10 个,其中元素值等于 4 的元素个数有 3 个,则 4 应该在输出元素
序列的第 10 个位置、第 9 个位置和第 8 个位置上。算法具体的步骤为: 步骤 1:统计每个元素值的个数。
步骤 2:统计小于等于每个元素值的个数。
步骤 3:将输入元素序列中的每个元素放入有序的输出元素序列。
【C 代码】
下面是该排序算法的 C 语言实现。
(1)常量和变量说明
R: 常量,定义元素取值范围中的取值个数,如上述应用中 R 值应取 6 i:循环变量
n:待排序元素个数 a:输入数组,长度为 n
b:输出数组,长度为 n
c:辅助数组,长度为 R,其中每个元素表示小于等于下标所对应的元素值的个数。(2)函数 sort
1 void sort(int n,int a[],int b[]){
2 int c[R],i;
3 for (i=0;i< (1) :i++){
4 c[i]=0;
5 }
6 for(i=0;i<n;i++){ 7 c[a[i]] = (2) ;
8 }
9 for(i=1;i<R;i++){
10 c[i]= (3)
11 }
12 for(i=0;i<n;i++){
13 b[c[a[i]]-1]= (4) ;
14 c[a[i]]=c[a[i]]-1;
15 }
16 }
【问题 1】(8 分)
根据说明和 C 代码,填充 C 代码中的空缺(1)~(4)。
【问题 2】(4 分)
根据 C 代码,函数的时间复杂度和空间复杂度分别为 (5) 和 (6) (用 O 符号表示)。
【问题 3】(3 分)
根据以上 C 代码,分析该排序算法是否稳定。若稳定,请简要说明(不超过 100
字);若不稳定,请修改其中代码使其稳定(给出要修改的行号和修改后的代码)。
- 阅读下列说明和 C++代码,将应填入空(n)处的字句写在答题纸的对应栏内。
【说明】
某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如下图所示。
现在采用组合(Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中增加新的 餐饮形式,得到如下图所示的类图。其中 MenuComponent 为抽象类,定义了添加(add)新菜单和打印饭店所有菜单信息(print)的方法接口。类 Menu 表示饭店提供的每种餐饮形式的菜单, 如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图中的甜点菜单。类MenuItem 表示菜单中的菜式。
()
【C++代码】#include<iostream> #include<list> #include <string>
using namespace std; class MenuComponent{ protected: string name; public:
MenuComponent(string name){ this->name= name;) string getName(){ return name;)
(1) ; //添加新菜单
virtual void print()=0;//打印菜单信息
};
class Menultem: public MenuComponent{ private:double price;
public:
Menultem(string name, double price):MenuComponent(name){ this->price= price; double getPrice(){ return price;)
void add(MenuComponent* menuComponent){ retum;}//添加新菜单void print(){ cout<<" " <<getName0<<","<<getPrice0<<endl;)
};
class Menu:public MenuComponent{ private: list< (2) > menuComponents; public:
Menu(string name): MenuComponent(name){}
void add(MenuComponent* menuComponent) //添加新菜单
{ (3) ; }
void print(){
cout<<"\n"<<getNameO<<"\n----------------- "<<endl;
std::list<MenuComponent *>::iterator iter,
for(iter= menuComponents.begin0; iter!=menuComponents.end0; iter++)
(4) ->print();
}
};
void main0{
MenuComponent* alIMenus= new Menu("ALL MENUS"); MenuComponent* dinerMenu= new Menu("DINER MENU");
……//创建更多的 Menu 对象,此处代码省略
alIMenus->add(dinerMenu); //将 dinerMenu 添加到餐厅菜单中
……//为餐厅增加更多的菜单,此处代码省略
(5) ->printO; //打印饭店所有菜单的信息
- 阅读下列说明和 Java 代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如下图所示。
现在采用组合( Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中增加新的餐饮形式,得到如下图所示的类图。其中 MenuComponent 为抽象类,定义了添加(add)新菜单和打印饭店所有菜单信息(print)的方法接口。类 Menu 表示饭店提供的每种餐饮形式的菜单, 如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图中的甜点菜单。类Menultem 表示菜单中的菜式。
【Java 代码】
import jav
(6)A.util.*;
(1) MenuComponent{ protected String name;
(2) ;//添加新菜单
public abstract void print(); //打印菜单信息public String getName(){ return name;}
}
class Menultem extends MenuComponent{ private double price;
public MenuItem(String name, double price){ this.name= name; this.price= price;
}
public double getPrice(){return price;)
public void add(MenuComponent menuComponent){ return;)//添加新菜单public void print(){
System.out.print(" "+ getName()); System.out.println(","+ getPrice());
}
}
class Menu extends MenuComponent{
private List<MenuComponent> menuComponents= new ArrayList<MenuComponent>(); public Menu(String name){ this.name= name;)
public void add(MenuComponent menuComponent){//添加新菜单menuComponents. (3);
}
public void print(){ System.out.print("\n"+ getName()); System.out.println(","+"------------- ");
Iterator iterator = menuComponents.iterator(); while(iterator.hasNext()){
MenuComponent menuComponent= (MenuComponent)iterator.next();
(4) ;
}
}
}
class MenuTestDrive{
public static void main(String args[]){
MenuComponent aIIMenus= new Menu("ALL MENUS"); MenuComponent dinerMenu = new Menu("DINER MENU”);
……//创建更多的 Menu 对象,此处代码省略
allMenus.add(dinerMenu); //将 dinerMenu 添加到餐厅菜单中
……//为餐厅增加更多的菜单,此处代码省略(5); //打印饭店所有菜单的信息
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2020-10-21 2020/10/21 刘一辰的JAVA随笔