软件设计师-2018年下半年案例分析真题解析【下篇】

四季读书网 1 0
软件设计师-2018年下半年案例分析真题解析【下篇】
【第 1 】(题型:简答题)
题目:
阅读下列说明和数据流图,回答问题 1 至问题 4, 将解答填入答题纸的对应栏内。
【说明】
某房产中介连锁企业欲开发一个基于 Web 的房屋中介信息系统,以有效管理房源和客 户,提高成交率。该系统的主要功能是:
(1) 房源采集与管理。系统自动采集外部网站的潜在房源信息,保存为潜在房源。由 经纪人联系确认的潜在房源变为房源,并添加出售 / 出租房源的客户。由经纪人或客户登记 的出售 / 出租房源,系统将其保存为房源。房源信息包括基本情况、配套设施、交易类型、 委托方式、业主等。经纪人可以对房源进行更新等管理操作。
(2 ) 客户管理。求租 / 求购客户进行注册、更新,推送客户需求给经纪人,或由经纪人 对求租 / 求购客户进行登记、更新。客户信息包括身份证号、姓名、手机号、需求情况、委 托方式等。
(3) 房源推荐。根据客户的需求情况 (求购 / 求租需求情况以及出售 / 出租房源信息), 向已登录的客户推荐房源。
(4) 交易管理。经纪人对租售客户双方进行交易信息管理,包括订单提交和取消,设 置收取中介费比例。财务人员收取中介费之后,表示该订单已完成,系统更新订单状态和房 源状态,向客户和经纪人发送交易反馈。
(5) 信息查询。客户根据自身查询需求查询房屋供需信息。
现采用结构化方法对房屋中介信息系统进行分析与设计,获得如图 1-1 所示的上下文数 据流图和图 1- 2 所示的 0 层数据流图。
软件设计师-2018年下半年案例分析真题解析【下篇】 第1张

1-1上下文数据流图

软件设计师-2018年下半年案例分析真题解析【下篇】 第2张
【问题 1】(4 分)
使用说明中的词语,给出图 1-1 中的实体 E1~E4 的名称。
【问题 2】(4 分)
使用说明中的词语,给出图 1-2 中的数据存储 D1~D4 的名称。
【问题 3】(3 分)
根据说明和图中术语,补充图 1-2 中缺失的数据流及其起点和终点。
【问题 4】(4 分)
根据说明中术语,给出图 1-1 中数据流 “客户信息”“房源信息” 的组成。
案 】
问题 1】
E1:求租/求购客户   E2:经纪人   E3:财务人员   E4:外部网站
【解析】
E1 与系统有查询需求、查询结果、推荐信息的交互,对应说明中的求租 / 求购客户
E2 与系统有客户需求、交易反馈、房源确认信息、新增 / 取消订单信息的交互,对应说明中的经纪人
E3 与系统有收费信息、已提交订单的交互,对应说明中的财务人员
E4 向系统提供潜在房源信息,对应说明中的外部网站
问题 2】
D1:客户信息文件   D2:潜在房源信息文件   D3:房源信息文件   D4:订单信息文件
【解析】
D1 与客户管理功能交互,存储客户信息,对应客户信息文件
D2 与房源采集与管理的新增潜在房源功能交互,存储潜在房源,对应潜在房源信息文件
D3 与房源采集与管理、房源推荐、信息查询功能交互,存储房源信息,对应房源信息文件
D4 与交易管理功能交互,存储订单信息,对应订单信息文件
问题 3】
数据
起点
终点

检索潜在房源 或 潜在房源

D2 或 潜在房源

P1 或 房源采集与管理

客户需求情况
P2(客户管理)
P3(房源推荐)
中介费比例
E2(经纪人)
P4(交易管理)
房源状态更新
P4(交易管理)
D3(房源信息文件)
解析
房源推荐功能需要客户管理提供的客户需求情况,因此缺少从 P2 到 P3 的 "客户需求情况" 数据流
交易管理需要经纪人设置的中介费比例,因此缺少从 E2 到 P4 的 "中介费比例" 数据流
交易完成后需要更新房源状态,因此缺少从 P4 到 D3 的 "房源状态更新" 数据流
问题 4】
客户信息组成:身份证号、姓名、手机号、需求情况、委托方式
房源信息组成:基本情况、配套设施、交易类型、委托方式、业主
【第 2 题】(题型:简答题)
题目:
阅读下列说明,回答问题 1 至问题 4, 将解答填入答题纸的对应栏内。
【说明】
某集团公司拥有多个分公司,为了方便集团公司对分公司各项业务活动进行有效管理,集团公司决定构建一个信息系统以满足公司的业务管理需求。
【需求分析结果】
(1) 分公司关系需要记录的信息包括分公司编号、名称、经理、联系地址和电话。分 公司编号唯一标识分公司信息中的每一个元组。每个分公司只有一名经理,负责该分公司的 管理工作。每个分公司设立仅为本分公司服务的多个业务部门,如研发部、财务部、采购部、 销售部等。
(2) 部门关系需要记录的信息包括部门号、部门名称、主管号、电话和分公司编号。 部门号唯一标识部门信息中的每一个元组。每个部门只有一名主管,负责部门的管理工作。 每个部门有多名员工,每名员工只能隶属于一个部门。
(3) 员工关系需要记录的信息包括员工号、姓名、隶属部门、岗位、电话和基本工资。 其中,员工号唯一标识员工信息中的每一个元组。岗位包括:经理、主管、研发员、业务员 等 。
【概念模型设计】
根据需求阶段收集的信息,设计的实体联系图 (不完整) 如图 2-1 所示。
软件设计师-2018年下半年案例分析真题解析【下篇】 第3张
【逻辑结构设计】
根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整):
分公司(分公司编号,名称,        (a), 联系地址,电话) 
部门(部门号,部门名称,        (b)       , 电 话 )
员工(员工号,姓名,        (c)        ,电话,基本工资)
【问题 1】(4 分)
根据问题描述,补充 4 个联系,完善图 2-1 的实体联系图。联系名可用联系 1、联系 2、 联系 3 和联系 4 代替,联系的类型为 1:1、1 :n 和 m:n (或 1:1、1:和:*)。
【问题 2】(5 分)
根据题意,将关系模式中的空 (a)~(c) 补充完整。
【问题 3】(4 分)
给出 “部门” 和 “员工” 关系模式的主键和外键。
【问题 4】(2 分)
假设集团公司要求系统能记录部门历任主管的任职时间和任职年限,那么是否需要在数 据库设计时增设一个实体?为什么?
案 】
问题 1】
软件设计师-2018年下半年案例分析真题解析【下篇】 第4张
解析
每个分公司有多个部门,每个部门属于一个分公司,因此分公司与部门是 1:n 联系
每个部门有多个员工,每个员工属于一个部门,因此部门与员工是 1:n 联系
每个分公司有一名经理,一名经理只能管理一个分公司,因此分公司与经理是 1:1 联系
每个部门有一名主管,一名主管只能管理一个部门,因此部门与主管是 1:1 联系
问题 2】
(a) 经理员工号
(b) 主管员工号,分公司编号
(c) 隶属部门号,岗位
解析
分公司关系需要记录经理信息,由于经理是员工的一种,因此存储经理的员工号,即 (a) 为经理员工号
部门关系需要记录主管员工号和所属分公司编号,因此 (b) 为主管员工号、分公司编号
员工关系需要记录所属部门的编号,因此 (c) 为隶属部门号,再加上岗位
问题 3】
部门关系:
主键:部门号
外键:分公司编号、主管员工号
员工关系:
主键:员工号
外键:隶属部门号
解析
部门关系中部门号唯一标识部门,为主键;分公司编号引用分公司关系的主键,主管员工号引用员工关系的主键,因此为外键
员工关系中员工号唯一标识员工,为主键;隶属部门号引用部门关系的主键,因此为外键
问题 4】
需要增设实体。因为一个部门有历任主管,存在一对多的关系,且需要记录任职时间和任职年限等属性,这些属性无法直接依附在部门或员工实体上,因此需要增设 "主管任职" 实体来记录这些信息。
解析
原有的部门与主管是 1:1 联系,只能记录当前主管。当需要记录历任主管及任职时间时,一个部门对应多个主管任职记录,属于一对多关系,且任职时间和年限是该关系的属性,因此需要增设独立的实体来存储这些信息。
【第 3 题】(题型:简答题)
题目:
阅读下列说明和 UML 图 , 回 答 问 题 1 至 问 题 3, 将解答填入答题纸的对应栏内。
【 说明 】
(1) 社 交 网 络 平 台 (SNS) 的主要功能之 一 是建立在线群组,群组中的成员之间可以 互相分享或挖掘兴趣和活动。每个群组包含标题、管理员以及成员列表等信息。
(2 ) 社交网络平台的用户可以自行选择加入某个群组。每个群组拥有 一 个主页,群组 内的所有成员都可以查看主页上的内容。如果在群组的主页上发布或更新了信息,群组中的 成员会自动接收到发布或更新后的信息。
(3) 用户可以加入 一 个群组也可以退出这个群组。用户退出群组后,不会再接收到该 群组发布或更新的任何信息。
现采用面向对象方法对上述需求进行分析与设计,得到如表 3 - 1 所示的类列表和如图 3-1 所示的类图。
软件设计师-2018年下半年案例分析真题解析【下篇】 第5张
【问题 1】(6 分)
根据说明中的描述,给出图 3-1 中 C1~C3 所对应的类名。
【问题 2】(6 分)
图 3-1 中采用了哪一种设计模式?说明该模式的意图及其适用场合。
【问题 3】(3 分)
现在对上述社交网络平台提出了新的需求: 一个群体可以作为另外一个群体中的成员, 例如群体 A 加入群体 B 。那 么,群 体 A 中的所有成员就自动成为群体 B 中的成员。
若要实现这个新需求,需要对图 3-1 进行哪些修改?(以文字方式描述)
案 】
问题 1】
C1:SNSGroup   C2:SNSUser   C3:SNSAdmin
解析
C1 继承自 SNSSubject,拥有发布信息的功能,对应 SNSGroup(群组)
C2 实现 SNSObserver 接口,是群组的普通成员,对应 SNSUser(平台用户)
C3 实现 SNSObserver 接口,且是群组的管理员,对应 SNSAdmin(群组管理员)
问题 2】
设计模式:观察者模式(Observer Pattern)
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
适用场合:
当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用
当一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变
当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即不希望这些对象是紧耦合的
解析
类图中 SNSSubject 作为被观察者,维护观察者列表,提供添加、移除和通知观察者的方法;SNSObserver 作为观察者,定义更新接口。符合观察者模式的结构,用于实现群组主页更新时自动通知所有成员的需求。
问题 3】
让 SNSGroup 类继承 SNSObserver 接口,使群组可以作为观察者
在 SNSSubject 类中修改 AddUser () 和 RemoveUser () 方法,支持接收 SNSObserver 类型的对象(包括 SNSUser 和 SNSGroup)
在 SNSGroup 类中实现 Update () 方法,当接收到通知时,将通知转发给群组内的所有成员
解析
新需求要求群组可以作为另一个群组的成员,因此需要让群组具备观察者的能力,同时在被观察者中支持添加群组作为观察者,并且群组接收到通知时需要转发给内部成员。
【第 4 题】(题型:填空题 + 简答题)
题目:
阅读下列说明和 C 代码,回答问题 1 至问题 3, 将解答填入答题纸的对应栏内。
【说明】
给定一个字符序列 B=b₁b₂….bₙ, 其中 bᵢ∈{A,C,G,U} 。B 上的二级结构是一 组字符对集合 S={(bᵢ,bⱼ)}, 其中 i,j∈{1,2,…,n}, 并满足以下四个条件:
(1) S 中的每对字符是 (A,U),(U,A),(C,G) 和 ( G,C) 四种组合之一;
(2) S 中的每对字符之间至少有四个字符将其隔开,即 i<j-4;
(3) S 中每一个字符 (记为 bₖ) 的配对存在两种情况:bₖ不参与任何配对;bₖ和字
符 bₜ, 其中 t<k-4;
(4)(不交叉原则) 若 (bᵢ,bⱼ) 和 ( bₖ,bₗ) 是 S 中的两个字符对,且 i<k, 则 i<k <j<l 不成立。
B 的具有最大可能字符对数的二级结构 S 被称为最优配对方案,求解最优配对方案中 的字符对数的方法如下:
假设用 C (i,j) 表示字符序列 bᵢbᵢ+1…bⱼ的最优配对方案 (即二级结构 S) 中的字符对 数,则 C (i,j) 可以递归定义为:
软件设计师-2018年下半年案例分析真题解析【下篇】 第6张

【C代码】

#include<stdio.h>#include<stdlib.h>#define LEN 100/*判断两个字符是否配对*/intisMatch(char a,char b){  if((a =='A'&&b=='U')ll(a =='U'&&b =='A'))    return 1;  if((a=='C'&&b=='G')ll(a == 'G'&&b == 'C'))    return 1;  return 0;}/*求最大配对数*/intRNA_2(char B[LEN],int n){  int i,j,k,t;  int max;  int C[LEN][LEN] = {0};  for(k = 5; k<=n - 1; k++){    for(i= 1; i<= n - k; i++){      j=i+ k;      (1);      for((2);t<=j-4; t++){        if((3)&&max<c[i][t-1]+1+C[t+1][j-1])           max = C[i][t- 1]+1+C[t+ 1][j- 1];      }      C[i][j] = max;      printf("c[Sd][Sd] = sd--",i,j,C[i][j]);   }  }  return (4);}

【问题 1】(8 分)

根据题干说明,填充 C 代 码 中 的 空 ( 1 ) ~ (4 )。
【问题 2】(4 分)
根据题干说明和 C 代码,算法采用的设计策略为     (5)     。 算法的时间复杂度为     (6)     , (用 O 表示)。
【问题 3】(3 分〉
给定字符序列 ACCGGUAGU, 根据上述算法求得最大字符对数为    (7)    
案 】
问题 1】
(1) max = C [i][j-1]
(2) t = i
(3) isMatch (B [t], B [j])
(4) C [1][n]
解析
(1) 根据递归定义,首先初始化 max 为 C [i][j-1],即不考虑第 j 个字符配对的情况
(2) t 需要从 i 开始遍历到 j-4,因此初始值为 i
(3) 需要判断 B [t] 和 B [j] 是否配对,调用 isMatch 函数
(4) 最终返回整个序列的最大配对数,即 C [1][n]
问题 2】
(5) 动态规划
(6) O (n³)
解析
算法采用动态规划策略,通过填充二维数组 C [i][j] 来存储子问题的解,避免重复计算。时间复杂度方面,有三层嵌套循环(k 从 5 到 n-1,i 从 1 到 n-k,t 从 i 到 j-4),因此时间复杂度为 O (n³)。
问题 3】
(7) 3
解析
字符序列 ACCGGUAGU(索引 1-9):
A (1) 与 U (9) 配对,剩余序列 CCGGUAG (2-8)
C (2) 与 G (7) 配对,剩余序列 GGUA (3-6)
G (3) 与 C (6) 配对,剩余序列 GU (4-5) 无法配对
总配对数为 3
【第 5 题】(题型:填空题)
题目:
阅读下列说明和 C++ 代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
某航空公司的会员积分系统将其会员划分为:普卡 (Basic) 、银 卡 (Silver) 和金卡 (Gold) 三个等级。非会员 (NonMember) 可以申请成为普卡会员。会员的等级根据其一年内累积的 里程数进行调整。描述会员等级调整的状态图如图 5-1 所示。现采用状态 (State) 模式实现 上述场景,得到如图 5-2 所示的类图。
软件设计师-2018年下半年案例分析真题解析【下篇】 第7张
【C++代码】
#include <iostream>using namespace std;classCFrequentFlyerclassCBasicclassCsilverclassCGoldclassCNoCustomer;//提前引用  classCstate{  private:int flyMiles;//里程数  public:    (1);//根据累积里程数调整会员等级  };  classCFrequentFlyer{-    friend classCBasic;friend classCsilver;friend classCGold;    private:      CState *state; Cstate *nocustomer; cstate *basic;Cstate *silver;cstate *gold;      double flyMiles;  public:    CFrequentFlyer(){flyMiles = 0;setstate(nocustomer);}    void setstate(CState *state){this->state = state;}    void travel(int miles) {      double bonusMiles = state->travel(miles, this);      flyMiles = flyMiles + bonusMiles;    }  };  classCNoCustomerpubliccstate{//非会员  public;    double travel(int miles, CFrequentFlyer* context){//不累积里程数      cout <<"Your travel will not account for points\n"return miles;    }  };  classCBasic :publicCState{//普卡会员  public:    double trarellint milesCrremontrlyer* context){      if(context->flyMiles >= 25000 && context->flyMiles < 50000)        (2);      if(context->flyMiles >= 50000) (3)      return miles + 0.5*miles;//累积里程数    }  };  classCGold :publicCState{//金卡会员  public:    double travel(int miles, CFrequentFlyer* context){      if(context-> flyMiles>= 25000 && context-> flyMiles < 50000)        (4);      if(context-> flyMiles < 25000)(5)      return miles + 0.5*miles;//累积里程数    }  };  classcsilver:publicCstate{ //银卡会员  public:    double travel(int miles, CFrequentFlyer* context){      if(context-> flyMiles < 25000)        context->setstate(context->basic);      if(context-> flyMiles >= 50000)        context->setstate(context->gold);      return(miles + 0.25*miles);    }  };
案 】
(1) virtual double travel (int miles, CFrequentFlyer* context) = 0;
(2) context->setState (context->silver);
(3) context->setState (context->gold);
(4) context->setState (context->silver);
(5) context->setState (context->basic);
解析
(1) CState 是抽象基类,需要定义纯虚函数 travel 作为状态转换的接口,供子类实现
(2) 普卡会员里程数达到 25000-50000 时,转换为银卡会员,调用 setState 设置为 silver 状态
(3) 普卡会员里程数达到 50000 以上时,转换为金卡会员,调用 setState 设置为 gold 状态
(4) 金卡会员里程数下降到 25000-50000 时,转换为银卡会员,调用 setState 设置为 silver 状态
(5) 金卡会员里程数下降到 25000 以下时,转换为普卡会员,调用 setState 设置为 basic 状态
【第 6 题】(题型:填空题)
题目:
阅读下列说明和 Java 代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
某航空公司的会员积分系统将其会员划分为:普卡 (Basic) 、银 卡 (Silver) 和金卡 (Gold) 三个等级。非会员 (NonMember) 可以申请成为普卡会员。会员的等级根据其一年内累积的 里程数进行调整。描述会员等级调整的状态图如图 6-1 所示。现采用状态 (State) 模式实现 上述场景,得到如图 6-2 所示的类图。
软件设计师-2018年下半年案例分析真题解析【下篇】 第8张
【Java 代码】
import java. util.*;abstract class Cstate {  public int flyMiles;//里程数  public(1);//根据累积里程数调整会员等级}class CNoCustomer extends CState {//非会员  public double travel(int miles, CFrequentFlyer context){    System.out.println("Your travel will not account for points");    return miles;//不累积里程数  }}class CBasic extends Cstate {//普卡会员  public double travel(int miles, CFrequentFlyer context){    if(context.flyMiles >= 25000 && context.flyMiles < 50000)      (2);    if(context.flyMiles >= 50000)      (3);    return miles;  }}class CGold extends CState {//金卡会员  public double travel(int miles, CFrequentFlyer context){    if(context.flyMiles >= 25000 && context.flyMiles < 50000)      (4);    if(context.flyMiles < 25000)      (5);    return miles + 0.5*miles;//累积里程数  }}class Csilver extends Cstate {//银卡会员  public double travel(int miles, CFrequentFlyer context){    if(context.flyMiles <= 25000)      context.setstate(new CBasic());    if(context.flyMiles >= 50000)      context.setstate(new CGold());    return(miles + 0.25*miles);//累积里程数  }}class CFrequentFlyer {  Cstate state;  double flyMiles;  public CFrequentFlyer(){    state = new CNoCustomer();    flyMiles = 0;    setstate(state);  }  public void setState(CState state){this.state = state; }    public void travel(int miles) {      double bonusMiles = state.travel(miles, this);      flyMiles = flyMiles + bonusMiles;  }}
案 】
(1) abstract double travel (int miles, CFrequentFlyer context);
(2) context.setState (new CSilver ());
(3) context.setState (new CGold ());
(4) context.setState (new CSilver ());
(5) context.setState (new CBasic ());
解析
(1) CState 是抽象类,需要定义抽象方法 travel 作为状态转换的接口,供子类实现
(2) 普卡会员里程数达到 25000-50000 时,转换为银卡会员,调用 setState 创建并设置 CSilver 状态
(3) 普卡会员里程数达到 50000 以上时,转换为金卡会员,调用 setState 创建并设置 CGold 状态
(4) 金卡会员里程数下降到 25000-50000 时,转换为银卡会员,调用 setState 创建并设置 CSilver 状态
(5) 金卡会员里程数下降到 25000 以下时,转换为普卡会员,调用 setState 创建并设置 CBasic 状态

知识点盘点:

【试题一知识点】

・数据流图 DFD 的基本概念与绘制规则
・实体、数据存储、加工的识别方法
・数据流的完整性检查
・结构化分析方法的核心思想

【试题二知识点】

・ER 图的设计与实体联系类型识别
・关系模式的转换与完整性约束
・主键与外键的概念与设计
・数据库设计中的实体拆分原则

【试题三知识点】

・观察者模式的结构与应用场景
・UML 类图的识别与分析
・面向对象设计中的依赖关系
・需求变更对软件设计的影响

【试题四知识点】

・动态规划算法的设计与应用
・字符串配对问题的求解思路
・算法时间复杂度的分析方法
・递归定义到迭代实现的转换

【试题五知识点】

・状态模式的结构与应用
・C++ 抽象类与纯虚函数的使用
・面向对象设计中的状态转换实现
・多态性在状态管理中的应用

【试题六知识点】

・状态模式的 Java 语言实现
・抽象类与抽象方法的使用
・Java 面向对象设计中的状态管理
・多态性在状态转换中的应用

THE  END -

点击下方卡片关注我   点个小赞你必上岸↓↓↓

软件设计师-2018年下半年案例分析真题解析【下篇】 第9张
软件设计师-2018年下半年案例分析真题解析【下篇】 第10张
 点个小“赞” 你必上岸

抱歉,评论功能暂时关闭!