软件设计师-2018年下半年案例分析真题解析【下篇】
四季读书网
1
软件设计师-2018年下半年案例分析真题解析【下篇】
阅读下列说明和数据流图,回答问题 1 至问题 4, 将解答填入答题纸的对应栏内。某房产中介连锁企业欲开发一个基于 Web 的房屋中介信息系统,以有效管理房源和客 户,提高成交率。该系统的主要功能是:(1) 房源采集与管理。系统自动采集外部网站的潜在房源信息,保存为潜在房源。由 经纪人联系确认的潜在房源变为房源,并添加出售 / 出租房源的客户。由经纪人或客户登记 的出售 / 出租房源,系统将其保存为房源。房源信息包括基本情况、配套设施、交易类型、 委托方式、业主等。经纪人可以对房源进行更新等管理操作。(2 ) 客户管理。求租 / 求购客户进行注册、更新,推送客户需求给经纪人,或由经纪人 对求租 / 求购客户进行登记、更新。客户信息包括身份证号、姓名、手机号、需求情况、委 托方式等。(3) 房源推荐。根据客户的需求情况 (求购 / 求租需求情况以及出售 / 出租房源信息), 向已登录的客户推荐房源。(4) 交易管理。经纪人对租售客户双方进行交易信息管理,包括订单提交和取消,设 置收取中介费比例。财务人员收取中介费之后,表示该订单已完成,系统更新订单状态和房 源状态,向客户和经纪人发送交易反馈。(5) 信息查询。客户根据自身查询需求查询房屋供需信息。现采用结构化方法对房屋中介信息系统进行分析与设计,获得如图 1-1 所示的上下文数 据流图和图 1- 2 所示的 0 层数据流图。图1-1上下文数据流图
使用说明中的词语,给出图 1-1 中的实体 E1~E4 的名称。使用说明中的词语,给出图 1-2 中的数据存储 D1~D4 的名称。根据说明和图中术语,补充图 1-2 中缺失的数据流及其起点和终点。根据说明中术语,给出图 1-1 中数据流 “客户信息”“房源信息” 的组成。E1:求租/求购客户 E2:经纪人 E3:财务人员 E4:外部网站E1 与系统有查询需求、查询结果、推荐信息的交互,对应说明中的求租 / 求购客户E2 与系统有客户需求、交易反馈、房源确认信息、新增 / 取消订单信息的交互,对应说明中的经纪人E3 与系统有收费信息、已提交订单的交互,对应说明中的财务人员E4 向系统提供潜在房源信息,对应说明中的外部网站D1:客户信息文件 D2:潜在房源信息文件 D3:房源信息文件 D4:订单信息文件D1 与客户管理功能交互,存储客户信息,对应客户信息文件D2 与房源采集与管理的新增潜在房源功能交互,存储潜在房源,对应潜在房源信息文件D3 与房源采集与管理、房源推荐、信息查询功能交互,存储房源信息,对应房源信息文件D4 与交易管理功能交互,存储订单信息,对应订单信息文件 | | |
检索潜在房源 或 潜在房源 | D2 或 潜在房源 | P1 或 房源采集与管理 |
| | |
| | |
| | |
房源推荐功能需要客户管理提供的客户需求情况,因此缺少从 P2 到 P3 的 "客户需求情况" 数据流交易管理需要经纪人设置的中介费比例,因此缺少从 E2 到 P4 的 "中介费比例" 数据流交易完成后需要更新房源状态,因此缺少从 P4 到 D3 的 "房源状态更新" 数据流客户信息组成:身份证号、姓名、手机号、需求情况、委托方式房源信息组成:基本情况、配套设施、交易类型、委托方式、业主阅读下列说明,回答问题 1 至问题 4, 将解答填入答题纸的对应栏内。某集团公司拥有多个分公司,为了方便集团公司对分公司各项业务活动进行有效管理,集团公司决定构建一个信息系统以满足公司的业务管理需求。(1) 分公司关系需要记录的信息包括分公司编号、名称、经理、联系地址和电话。分 公司编号唯一标识分公司信息中的每一个元组。每个分公司只有一名经理,负责该分公司的 管理工作。每个分公司设立仅为本分公司服务的多个业务部门,如研发部、财务部、采购部、 销售部等。(2) 部门关系需要记录的信息包括部门号、部门名称、主管号、电话和分公司编号。 部门号唯一标识部门信息中的每一个元组。每个部门只有一名主管,负责部门的管理工作。 每个部门有多名员工,每名员工只能隶属于一个部门。(3) 员工关系需要记录的信息包括员工号、姓名、隶属部门、岗位、电话和基本工资。 其中,员工号唯一标识员工信息中的每一个元组。岗位包括:经理、主管、研发员、业务员 等 。根据需求阶段收集的信息,设计的实体联系图 (不完整) 如图 2-1 所示。根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整):分公司(分公司编号,名称, (a), 联系地址,电话) 根据问题描述,补充 4 个联系,完善图 2-1 的实体联系图。联系名可用联系 1、联系 2、 联系 3 和联系 4 代替,联系的类型为 1:1、1 :n 和 m:n (或 1:1、1:和:*)。根据题意,将关系模式中的空 (a)~(c) 补充完整。给出 “部门” 和 “员工” 关系模式的主键和外键。假设集团公司要求系统能记录部门历任主管的任职时间和任职年限,那么是否需要在数 据库设计时增设一个实体?为什么?每个分公司有多个部门,每个部门属于一个分公司,因此分公司与部门是 1:n 联系每个部门有多个员工,每个员工属于一个部门,因此部门与员工是 1:n 联系每个分公司有一名经理,一名经理只能管理一个分公司,因此分公司与经理是 1:1 联系每个部门有一名主管,一名主管只能管理一个部门,因此部门与主管是 1:1 联系分公司关系需要记录经理信息,由于经理是员工的一种,因此存储经理的员工号,即 (a) 为经理员工号部门关系需要记录主管员工号和所属分公司编号,因此 (b) 为主管员工号、分公司编号员工关系需要记录所属部门的编号,因此 (c) 为隶属部门号,再加上岗位部门关系中部门号唯一标识部门,为主键;分公司编号引用分公司关系的主键,主管员工号引用员工关系的主键,因此为外键员工关系中员工号唯一标识员工,为主键;隶属部门号引用部门关系的主键,因此为外键需要增设实体。因为一个部门有历任主管,存在一对多的关系,且需要记录任职时间和任职年限等属性,这些属性无法直接依附在部门或员工实体上,因此需要增设 "主管任职" 实体来记录这些信息。原有的部门与主管是 1:1 联系,只能记录当前主管。当需要记录历任主管及任职时间时,一个部门对应多个主管任职记录,属于一对多关系,且任职时间和年限是该关系的属性,因此需要增设独立的实体来存储这些信息。阅读下列说明和 UML 图 , 回 答 问 题 1 至 问 题 3, 将解答填入答题纸的对应栏内。(1) 社 交 网 络 平 台 (SNS) 的主要功能之 一 是建立在线群组,群组中的成员之间可以 互相分享或挖掘兴趣和活动。每个群组包含标题、管理员以及成员列表等信息。(2 ) 社交网络平台的用户可以自行选择加入某个群组。每个群组拥有 一 个主页,群组 内的所有成员都可以查看主页上的内容。如果在群组的主页上发布或更新了信息,群组中的 成员会自动接收到发布或更新后的信息。(3) 用户可以加入 一 个群组也可以退出这个群组。用户退出群组后,不会再接收到该 群组发布或更新的任何信息。现采用面向对象方法对上述需求进行分析与设计,得到如表 3 - 1 所示的类列表和如图 3-1 所示的类图。根据说明中的描述,给出图 3-1 中 C1~C3 所对应的类名。图 3-1 中采用了哪一种设计模式?说明该模式的意图及其适用场合。现在对上述社交网络平台提出了新的需求: 一个群体可以作为另外一个群体中的成员, 例如群体 A 加入群体 B 。那 么,群 体 A 中的所有成员就自动成为群体 B 中的成员。若要实现这个新需求,需要对图 3-1 进行哪些修改?(以文字方式描述)C1:SNSGroup C2:SNSUser C3:SNSAdminC1 继承自 SNSSubject,拥有发布信息的功能,对应 SNSGroup(群组)C2 实现 SNSObserver 接口,是群组的普通成员,对应 SNSUser(平台用户)C3 实现 SNSObserver 接口,且是群组的管理员,对应 SNSAdmin(群组管理员)设计模式:观察者模式(Observer Pattern)意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用当一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即不希望这些对象是紧耦合的类图中 SNSSubject 作为被观察者,维护观察者列表,提供添加、移除和通知观察者的方法;SNSObserver 作为观察者,定义更新接口。符合观察者模式的结构,用于实现群组主页更新时自动通知所有成员的需求。让 SNSGroup 类继承 SNSObserver 接口,使群组可以作为观察者在 SNSSubject 类中修改 AddUser () 和 RemoveUser () 方法,支持接收 SNSObserver 类型的对象(包括 SNSUser 和 SNSGroup)在 SNSGroup 类中实现 Update () 方法,当接收到通知时,将通知转发给群组内的所有成员新需求要求群组可以作为另一个群组的成员,因此需要让群组具备观察者的能力,同时在被观察者中支持添加群组作为观察者,并且群组接收到通知时需要转发给内部成员。阅读下列说明和 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ₖ和字(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) 可以递归定义为:【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 )。根据题干说明和 C 代码,算法采用的设计策略为 (5) 。 算法的时间复杂度为 (6) , (用 O 表示)。给定字符序列 ACCGGUAGU, 根据上述算法求得最大字符对数为 (7) 。(3) isMatch (B [t], B [j])(1) 根据递归定义,首先初始化 max 为 C [i][j-1],即不考虑第 j 个字符配对的情况(2) t 需要从 i 开始遍历到 j-4,因此初始值为 i(3) 需要判断 B [t] 和 B [j] 是否配对,调用 isMatch 函数(4) 最终返回整个序列的最大配对数,即 C [1][n]算法采用动态规划策略,通过填充二维数组 C [i][j] 来存储子问题的解,避免重复计算。时间复杂度方面,有三层嵌套循环(k 从 5 到 n-1,i 从 1 到 n-k,t 从 i 到 j-4),因此时间复杂度为 O (n³)。A (1) 与 U (9) 配对,剩余序列 CCGGUAG (2-8)C (2) 与 G (7) 配对,剩余序列 GGUA (3-6)G (3) 与 C (6) 配对,剩余序列 GU (4-5) 无法配对阅读下列说明和 C++ 代码,将应填入 (n) 处的字句写在答题纸的对应栏内。某航空公司的会员积分系统将其会员划分为:普卡 (Basic) 、银 卡 (Silver) 和金卡 (Gold) 三个等级。非会员 (NonMember) 可以申请成为普卡会员。会员的等级根据其一年内累积的 里程数进行调整。描述会员等级调整的状态图如图 5-1 所示。现采用状态 (State) 模式实现 上述场景,得到如图 5-2 所示的类图。
#include <iostream>using namespace std;classCFrequentFlyer; classCBasic; classCsilver; classCGold; classCNoCustomer;//提前引用 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; } }; classCNoCustomer: publiccstate{//非会员 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 状态阅读下列说明和 Java 代码,将应填入 (n) 处的字句写在答题纸的对应栏内。某航空公司的会员积分系统将其会员划分为:普卡 (Basic) 、银 卡 (Silver) 和金卡 (Gold) 三个等级。非会员 (NonMember) 可以申请成为普卡会员。会员的等级根据其一年内累积的 里程数进行调整。描述会员等级调整的状态图如图 6-1 所示。现采用状态 (State) 模式实现 上述场景,得到如图 6-2 所示的类图。
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 状态知识点盘点:
【试题一知识点】
【试题二知识点】
【试题三知识点】
【试题四知识点】
【试题五知识点】
【试题六知识点】
THE END -
点击下方卡片关注我 点个小赞你必上岸↓↓↓
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至23467321@qq.com举报,一经查实,本站将立刻删除;如已特别标注为本站原创文章的,转载时请以链接形式注明文章出处,谢谢!