上半年软件设计师考试下午真题.docx
《上半年软件设计师考试下午真题.docx》由会员分享,可在线阅读,更多相关《上半年软件设计师考试下午真题.docx(19页珍藏版)》请在冰豆网上搜索。
![上半年软件设计师考试下午真题.docx](https://file1.bdocx.com/fileroot1/2023-3/28/18325153-022f-441b-984d-ccb7905d8761/18325153-022f-441b-984d-ccb7905d87611.gif)
上半年软件设计师考试下午真题
2016 年上半年软件设计师考试下午真题(参考答案)
试题部分
1.
试题一(共 15 分)
阅读下列说明和图,回答问题 1 至问题 4,将解答填入答题纸的对应栏内。
【说明】
某会议中心提供举办会议的场地设施和各种设备,供公司与各类组织机构租用。
场地包
括一个大型报告厅、一个小型报告厅以及诸多会议室。
这些报告厅和会议室可提供的设备有
投影仪、白板、视频播放/回放设备、计算机等。
为了加强管理,该中心欲开发一会议预订
系统,系统的主要功能如下。
(1)检查可用性。
客户提交预订请求后,检查预订表,判定所申请的场地是否在申请
日期内可用;如果不可用,返回不可用信息。
(2)临时预订。
会议中心管理员收到客户预定请求的通知之后,提交确认。
系统生成
新临时预订存入预订表,并对新客户创建一条客户信息记录加以保存。
根据客户记录给客户
发送临时预订确认信息和支付定金要求。
(3)分配设施与设备。
根据临时预订或变更预定的设备和设施需求,分配所需设备(均
能满足用户要求)和设施,更新相应的表和预订表。
(4)确认预订。
管理员收到客户支付定金的通知后,检查确认,更新预订表,根据客
户记录给客户发送预订确认信息。
(5)变更预订。
客户还可以在支付余款前提交变更预订请求,对变更的预订请求检查
可用性,如果可用,分配设施和设各;如果不可用,返回不可用信息。
管理员确认变更后,
根据客户记录给客户发送确认信息。
(6)要求付款。
管理员从预订表中查询距预订的会议时间两周内的预定,根据客户记
录给满足条件的客户发送支付余款要求。
(7)支付余款。
管理员收到客户余款支付的通知后,检查确认,更新预订表中的已支
付余款信息。
现采用结构化方法对会议预定系统进行分析与设计,获得如图 1-1 所示的上下文数据流
图和图 1-2 所示的 0 层数据流图(不完整)。
【问题 1】(2 分)
使用说明中的词语,给出图 1-1 中的实体 E1~E2 的名称。
【问题 2】(4 分)
使用说明中的词语,给出图 1-2 中的数据存储 D1~D4 的名称。
【问题 3】(6 分)
根据说明和图中术语,补充图 1-2 之中缺失的数据流及其起点和终点。
【问题 4】(3 分)
如果发送给客户的确认信息是通过 Email 系统向客户信息中的电子邮件地址进行发送
的,那么需要对图 1-1 和 1-2 进行哪些修改?
用 150 字以内文字加以说明。
2.
阅读下列说明,回答问题 1 至问题 3;将解答填入答题纸的对应栏内。
(共 15 分)
【说明】
某销售公司当前的销售业务为商城实体店销售。
现该公司拟开展网络销售业务,需要开
发一个信息化管理系统。
请根据公司现有业务及需求完成该系统的数据库设计。
【需求描述】
(1)记录公司所有员工的信息。
员工信息包括工号、身份证号、姓名、性别、出生日
期和电话,并只登记一部电话。
(2)记录所有商品的信息。
商品信息包括商品名称、生产厂家、销售价格和商品介绍。
系统内部用商品条码唯一区别每种商品。
(3)记录所有顾客的信息。
顾客信息包括顾客姓名、身份证号、登录名、登录密码、
和电话号码。
一位顾客只能提供一个电话号码。
系统自动生成唯一的顾客编号。
(4)顾客登录系统之后,在网上商城购买商品。
顾客可将选购的商品置入虚拟的购物
车内,购物车可长期存放顾客选购的所有商品。
顾客可在购物车内选择商品、修改商品数量
后生成网购订单。
订单生成后,由顾客选择系统提供的备选第三方支付平台进行电子支付,
支付成功后系统需要记录唯一的支付凭证编号,然后由商城根据订单进行线下配送。
(5)所有的配送商品均由仓库统一出库。
为方便顾客,允许每位顾客在系统中提供多
组收货地址、收货人及联系电话。
一份订单所含的多个商品可能由多名分检员根据商品所在
仓库信息从仓库中进行分拣操作,分拣后的商品交由配送员根据配送单上的收货地址进行配
送。
(6)新设计的系统要求记录实体店的每笔销售信息,包括营业员、顾客、所售商品及
其数量。
【概念模型设计】
根据需求阶段收集的信息,设计的实体联系图(不完整)如图所示。
【逻辑结构设计】
:
根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整)
员工(工号,身份证号,姓名,性别,出生日期,电话)
商品(商品条码,商品名称,生产厂家,销售价格,商品介绍, (a))
顾客(顾客编号,姓名,身份证号,登录名,登录密码,电话)
收货地点(收货 ID,顾客编号,收货地址,收货人,联系电话)
购物车(顾客编号,商品条码,商品数量)
订单(订单 ID,顾客编号,商品条码,商品数量, (b))
分检(分拣 ID,分拣员工号,(c),分拣时间)
配送(配送 ID,分拣 ID,配送员工号,收货 ID,配送时间,签收时间,签收快照)
销售(销售 ID,营业员工号,顾客编号,商品条码,商品数量)
【问题 1】(4 分)
补充图中的“配送”联系所关联的对象及联系类型。
【问题 2】(6 分)
补充逻辑结构设计中的(a)、(b)和(c)三处空缺。
【问题 3】(5 分)
对于实体店销售,若要增加送货上门服务,由营业员在系统中下订单,与网购的订单进
行后续的统一管理。
请根据该需求,对图进行补充,并修改订单关系模式。
3.
试题三(共 15 分)
阅读下列说明和图,回答问题 1 至问题 3,将解答填入答题纸的对应栏内。
【说明】
某软件公司欲设计实现一个虚拟世界仿真系统。
系统中的虚拟世界用于模拟现实世界中
的不同环境(由用户设置并创建),用户通过操作仿真系统中的 1~2 个机器人来探索虚拟世
界。
机器人维护着两个变量 b1 和 b2,用来保存从虚拟世界中读取的字符。
该系统的主要功能描述如下:
(1)机器人探索虚拟世界(Run Robots)。
用户使用编辑器(Editor)编写文件以设置
想要模拟的环境,将文件导入系统(Load File)从而在仿真系统中建立虚拟世界(Setup World)。
机器人在虚拟世界中的行为也在文件中进行定义,建立机器人的探索行为程序(Setup
Program)。
机器人在虚拟世界中探索时(Run Program),有 2 种运行模式:
①自动控制(Run):
事先编排好机器人的动作序列(指令(Instruction)),执行指令,
使机器人可以连续动作。
若干条指令构成机器人的指令集(Instruction Set)。
②单步控制(Step):
自动控制方式的一种特殊形式,只执行指定指令中的一个动作。
(2)手动控制机器人(Manipulate Robots)。
选定 1 个机器人后(Select Robot),可以
采用手动方式控制它。
手动控制有 4 种方式:
①Move:
机器人朝着正前方移动一个交叉点。
②Left:
机器人原地沿逆时针方向旋转 90 度。
③Read:
机器人读取其所在位置的字符,并将这个字符的值赋给 b1;如果这个位置上
没有字符,则不改变 b1 的当前值。
④Write:
将 b1 中的字符写入机器人当前所在的位置,如果这个位置上已经有字符,该
字符的值将会被 b1 的值替代。
如果这时 b1 没有值,即在执行 Write 动作之前没有执行过任
何 Read 动作,那么需要提示用户相应的错误信息(Show Errors)。
手动控制与单步控制的区别在于,单步控制时执行的是指令中的动作,只有一种控制方
式,即执行下个动作;而手动控制时有 4 种动作。
现采用面向对象方法设计并实现该仿真系统,得到如图 3-1 所示的用例图和图 3-2 所示
的初始类图。
图 3-2 中的类“Interpreter”和“Parser”用于解析描述虚拟世界的文件以及机
器人行为文件中的指令集。
图 3-1用例图
图 3-2 初始类图
【问题 1】(6 分)
根据说明中的描述,给出图 3-1 中 U1~U6 所对应的用例名。
【问题 2】(4 分)
图 3-1 中用例 U1~U6 分别与哪个(哪些)用例之间有关系,是何种关系?
【问题 3】(5 分)
根据说明中的描述,给出图 3-2 中 C1~C5 所对应的类名。
4.
试题四(共 15 分)
阅读下列说明和 C 代码,回答问题 1 至问题 3,将解答写在答题纸的对应栏内。
【说明】
在一块电路板的上下两端分别有 n 个接线柱。
根据电路设计,用(i,π (i))表示将上端接
线柱 i 与下端接线柱π (i)相连,称其为该电路板上的第 i 条连线。
如图 4-1 所示的π (i)排列
为{8,7,4,2,5,1,9,3,10,6}。
对于任何 1≤i(i)>π (j)。
图 4-1 电路布线示意
在制作电路板时,要求将这 n 条连线分布到若干绝缘层上,在同一层上的连线不相交。
现在要确定将哪些连线安排在一层上,使得该层上有尽可能多的连线,即确定连线集
Nets={(i,π (i)),1≤i≤n}的最大不相交子集。
【分析问题】
记 N(i,j)={t|(t, π (t)) ∈ Nets,t ≤ i, π (t) ≤ j} 。
N(i,j) 的 最 大 不 相 交 子 集 为 MNS(i,j) ,
size(i,j)=|MNS(i,j)|。
经分析,该问题具有最优子结构性质。
对规模为 n 的电路布线问题,可以构造如下递归式:
【C 代码】
下面是算法的 C 语言实现。
(1)变量说明
size[i][j]:
上下端分别有 i 个和 j 个接线柱的电路板的第一层最大不相交连接数
pi[i]:
π (i),下标从 1 开始
(2)C 程序
#include "stdlib.h"
#include
#defineN10/*问题规模*/
int m=0;/*牢记录最大连接集合中的接线柱*/
Void maxNum(int pi[],int size[N+1][N+1],int n) {/*求最大不相交连接数*/
int i, j;
for(j=0; j < pi[1]; j++)size[1][j] = 0;/*当 j<π
(1)时*/
for(j=pi[1];j<=n;j++)
(1); /*当 j>=π
(1)时*/
for(i=2; i < n; i++){
for(j=0; j < pi[i]; j++)
(2); /*当 jfor(j=pi[i];j<=n;j++){/*当 j>=c[i]时,考虑两种情况*/
size[i][j]=size[i-1][j]>=size[i-1][pi[i]-1]+1 ?
size[i-1][j]:
size[i-1][pi[i]-1]+1;
}
}
/*最大连接数*/
size[n][n]=size[n-1][n]>=size[n-1][pi[n]-1]+1 ?
size[n-1][n]:
size[n-1][pi[n]-1]+1;
}
/*构造最大不相交连接集合,net[i]表示最大不相交子集中第 i 条连线的上端接线柱的序号
*/
void constructSet(int pi[],int size[N+1][N+1],int n,int net[n]){
int i,j=n;
m=0;
for(i=n ; i>1 ; i--){/*从后往前*/
if(size[i][j]!
=size[i-1][j]){/*(i,pi[i])是最大不相交子集的一条连线*/
(3);/*将 i 记录到数组 net 中,连接线数自增 1*/
j= pi[i]-1;/*更新扩展连线柱区间*/
}
}
if(j>=pi[1])net[m++]=1;/*当 i=1 时*/
}
【问题 1】(6 分)
根据以上说明和 C 代码,填充 C 代码中的空
(1)~(3)。
【问题 2】(6 分)
据题干说明和以上 C 代码,算法采用了(4)算法设计策略。
函数 maxNum 和 constructSet 的时间复杂度分别为 (5)和(6) (用 O 表示)。
【问题 3】(3 分)
若连接排列为{8,7,4,2,5,1,9,3,10,6},即如图 4-1 所示,则最大不相交连接数为(7),
包含的连线为(8)(用(i,π(i))的形式给出)。
5.
阅读下列说明和 C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
某软件系统中,已设计并实现了用于显示地址信息的类Address(如图 5-1 所示),现要
求提供基于 Dutch 语言的地址信息显示接口。
为了实现该要求并考虑到以后可能还会出现新
的语言的接口,决定采用适配器(Adapter)模式实现该要求,得到如图 5-1 所示的类图。
图 5-1 适配器模式类图
【C++代码】
#include
using namespace std;
class Address{
public:
void stree(){ /*实现代码省略*/}
void zip(){ /*实现代码省略*/}
void city(){ /*实现代码省略*/}
∥其他成员省略
};
class DutchAddress {
public:
virtual void straat()=0;
virtual void postcode()=0;
virtual void plaats()=0;
//其他成员省略
};
class DutchAddressAdapter :
public DutchAddress {
private:
(1);
public:
DutchAddressAdapter(Address *addr) {
address = addr;
}
void straat() {
(2) ;
}
void postcode(){
(3) ;
}
void plaat(){
(4) ;
}
//其他成员省略
};
void testDutch(DutchAddress *addr){
addr->straat();
addr->postcode();
addr->plaats();
}
int main(){
Address*addr = new Address();
(5);
cout<< "\n The DutchAddress\n"<< endl;
testDutch(addrAdapter);
return 0;
}
6.
试题六(共 15 分)
阅读下列说明和 Java 代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
某软件系统中,已设计并实现了用于显示地址信息的类Address(如图 6-1 所示),现要
求提供基于 Dutch 语言的地址信息显示接口。
为了实现该要求并考虑到以后可能还会出现新
的语言的接口,决定采用适配器(Adapter)模式实现该要求,得到如图 6-1 所示的类图。
图 6-1 适配器模式类图
【Java 代码】
import java.util.*;
Class Address{
public void street(){//实现代码省略}
public void zip(){//实现代码省略}
public void city(){//实现代码省略}
∥其他成员省略
}
class DutchAddress{
public void straat(){//实现代码省略}
public void postcode(){//实现代码省略}
public void plaats(){//实现代码省略}
//其他成员省略
}
class DutchAddressAdapter extends DutchAddress {
private
(1);
public DutchAddressAdapter (Address addr){
address= addr;
}
public void straat() {
(2);
}
public void postcode() {
(3);
}
public void plaats(){
(4);
}
//其他成员省略
}
class Test {
public static void main(String[] args) {
Address addr= new Address();
(5);
System.out.println("\n The DutchAddress\n");
testDutch(addrAdapter);
}
Static voidtestDutch(DutchAddress addr){
addr.straat();
addr.postcode();
addr.plaats();
}
}
参考答案
1.
参考答案:
【问题 1】
E1:
客户
E2:
管理员
【问题 2】
D1:
预定表
D2:
客户信息记录表
D3:
设施表
D4:
设备表
【问题 3】
预订信息起点:
D1终点 1 检查可用性
预订确认信息 起点:
4 确认预定终点:
E1
【问题 4】
图 1-1 中:
增加外部实体“第三方Email 系统”,将临时预订/预订/变更确认信息终点均修改
至“第三方 Email 系统”。
图 1-2 中:
增加外部实体“第三方 Email 系统”,增加加工“发送邮件”,将临时预订/预订/
变更确认信息终点均修改至“发送邮件”加工,并增加从D2 到“发送邮件”加工的数据流
“电子邮件地址”,再从发送邮件加工引出数据流 临时预订/预订/变更确认信息 终点为 第
三方 Email 系统。
试题分析:
lming082016-11-04
第三问,缺少的数据流,觉得不止两条吧。
起点 D1,终点 1 检查可用性,这条就没有,题目里说检查可用性,需要根据预定表信息来查,
为什么就没有呢。
这个第三问答案是不是有点问题
jihuan2016-11-04
引用:
第三问,缺少的数据流,觉得不止两条吧。
起点 D1,终点 1 检查可用性,这条就没有,题目里说检查可用性,需要根据预定表信息来查,
为什么就没有呢。
这个第三问答案是不是有点问题
(6)要求付款。
管理员从预订表中查询距预订的会议时间两周内的预定,根据客户记录给满足条件的客户发送支付余款要求。
这个是不是还缺少一条 从 D1 到 6 要求付款的数据流, 难道管理员自己手动查表
MegumiIsh2016-11-07
可以加这样的数据流,题目有考虑不周全的地方
poopoogood2016-11-08
第四问中,是不是存在这样一条数据流
数据名:
确认信息和邮箱地址
起点:
发送邮件
终点:
邮件系统
poopoogood2016-11-09
数据流名称:
不可用信息 起点:
变更预定,终点:
客户
MegumiIsh2016-11-10
是的,有这样的数据流了
2.
参考答案:
【问题 1】
配送员--配送--地点,多对多联系
【问题 2】
(a)商品数量,仓库信息
(b)支付凭证编号
(c)商品条码,订单 ID
【问题 3】
在营业员与订单之间增加联系“送货上门”,并将联系记录于订单关系中,即在订单关系中
增加属性“营业员 ID”作为外键。
试题分析:
yangzhaohui19922017-04-06
这里的 a 中“商品数量”字段需要么?
高婧 1232017-04-07
需要的,商品数量字段可以表示出仓库中该商品的数量情况,而且用户购买商品的数量不能
大于商品的数量。
3.
参考答案:
【问题 1】
U1/U2:
Run、Step
U3:
Write
U4/U5/U6:
Move、Left、Read
【问题 2】
U1 和 U2 和 Run Program 有泛化关系
U3,U4,U5,U6 和 Select Robot 有扩展关系
【问题 3】
C1:
文件
C2:
机器人在虚拟世界的行为
C3:
Instruction
C4:
InstructionSet
C5:
仿真系统
andy_2013142016-05-25
U4\U5\U6 有顺序关系吗 ,填的 U4:
Read U5 LEFT U6 MOVE
MegumiIsh2016-05-26
没有顺序关系,应该都能得分
4.
参考答案:
【问题 1】
(1)size[i][j]=1
(2)size[i][j]=size[i-1][j]
(3)net[m++]=i;
【问题 2】
(4)动态规划算法
(5)O(n2)
(6)O(n)
【问题 3】
(9,π (9),(7,π (7)),(5,π (5)),(3,π (3))
试题分析:
andy_2013142016-05-25
题目说是递归式,为啥不是分治法
MegumiIsh2016-05-26
动态规划将分解后的子问题理解为相互间有联系 ,有重叠部分.
动态规划通常利用迭代法自底向上求解,但也能用具有记忆功能的递归法自顶向下求解 .
题中的子问题相互直接联系的,而分治法处理的子问题都相互独立。
题中使用的是动态规划。
poopoogood2016-11-02
问题 1 中
(2)答案是:
size【1】【j】=1 还是 size【i】【j】=1?
MegumiIsh2016-11-03
i,j=1
poopoogood2016-11-03
可是题目是 i=1 时的两种情况,
第一种 j<π
(1),size【1】【j】=0
第二种 j>=π
(1),应该是 size【1】【j】=1?
MegumiIsh2016-11-03
初始 i=1,写成 size[1][j]应该是一样的。
uckreys2017-02-20
问题三 答案是不是应该是两个呢 9753,9754 都可以吧
MegumiIsh2017-02-22
答案 9753,9754 达不到要求
5.
参考答案:
(1)Address* address;
(2)address->street();
(3)address->zip();
(4)address->city();
(5)DutchAddress *addr=new DutchAddressAdaptor(addr);
试题分析:
6.
参考答案:
(1)Address address;
(2)address.street();
(3)address.zip();
(4)address.city();
(5)DutchAddress addrAdapter=new DutchAddressAdaptor(addr);
试题分析:
andy_2013142016-05-25
不应该是 Add