1、2017年上半年软件水平考试(中级)软件设计师下午(应用技术)真题试卷及答案与解析 一、必答题(共 4道大题,每道大题 15分) 0 阅读下列说明和图,回答以下问题,将解答填入答题纸的对应栏内。【说明】某医疗器械公司作为复杂医疗产品的集成商,必须保持高质量部件的及时供应。为了实现这一目标,该公司欲开发一采购系统。系统的主要功能如下。 1检查库存水平。采购部门每天检查部件库存量,当特定部件的库存量降至其订货点时,返回低存量部件及库存量。 2下达采购订单。采购部门针对低存量部件及库存量提交采购请求,向其供应商 (通过供应商文件访问供应商数据 )下达采购订单,并存储于采购订单文件中。 3交运部件。当
2、供应商提交提单并交运部件时,运输和接收 (SR)部门通过执行以下三步过程接收货物: (1)验证装运部件。通过访问采购订单并将其与提单进行比较来验证装运的部件,并将提单信息发给 S R职员。如果收货部件项目出现在采购订单和提单上,则已验证的提单和收货部件项目将被送去检验。否则,将 S R职员提交的装运错误信息生成装运错误通知发送给供应商。 (2)检验部件质量。通过访问质量标准来检查装运部件的质量,并将已验证的提单发给检验员。如果部件满 足所有质量标准,则将其添加到接受的部件列表用于更新部件库存。如果部件未通过检查,则将检验员创建的缺陷装运信息生成缺陷装运通知发送给供应商。 (3)更新部件库存。库
3、管员根据收到的接受的部件列表添加本次采购数量,与原有库存量累加来更新库存部件中的库存量。标记订单采购完成。现采用结构化方法对该采购系统进行分析与设计,获得如图 11所示的上下文数据流图和图 12所示的 0层数据流图。1 使用说明中的词语,给出图 11中的实体 E1 E5。 2 使用说明中的词语,给出图 12中的数据存储 D1 D4的名称。 3 根据说明和图中术语,补充图 12中缺失的数据流及其起点和终点。 4 用 200字以内文字,说明建模图 11和图 12时如何保持数据流图平衡。 4 阅读下列说明,回答以下问题,将解答填入答题纸的对应栏内。【说明】某房屋租赁公司拟开发一个管理系统用于管理其持
4、有的房屋、租客及员工信息。请根据下述需求描述完成系统的数据库设计。【需求描述】 1公司拥有多幢公寓楼,每幢公寓楼有唯一的楼编号和地址。每幢公寓楼中有多套公寓,每套公寓在楼内有唯一的编号 (不同公寓楼内的公寓号可相同 )。系统需记录每套公寓的卧室数和卫生间数。 2员工和租客在系统中有唯一的编号 (员工编号和租客编号 )。 3对于每个租客,系统需记录姓名、多个联系电话、一个银行账号 (方便自动扣房租 )、一个紧急联系人的姓名及联系电话。 4系统需记录每个员工的姓名、一个联系电话和月工资。员工类别可以是经理或维修工,也可兼任。每个经理可以管理多幢公寓楼。每幢公寓楼必须由一个经理管理。系统需记录每个维
5、修工的业务技能,如:水暖维修、电工、木工等。 5租客租赁公寓必须和公司签订租赁合同。一份租赁合同通常由一个或多个租客 (合租 )与该公寓楼的经理签订,一个租客也可租赁多套公寓。合 同内容应包含签订日期、开始时间、租期、押金和月租金。【概念模型设计】根据需求阶段收集的信息,设计的实体联系图 (不完整 )如图 21所示。【逻辑结构设计】根据概念摸型设计阶段完成的实体联系图,得出如下关系模式 (不完整 ):联系电话 (电话号码,租客编号 )租客 (租客编号,姓名,银行账号,联系人姓名,联系人电话 )员工 (员工编号,姓名,联系电话,类别,月工资, (a)公寓楼 (b),地址,经理编号 )公寓 (楼编
6、号,公寓号,卧室数,卫生间数 )合同 (合同编号,租客编号,楼编号,公寓号,经理编号,签订日期,起始日期,租期, (c),押金 ) 5 补充图 21中的 “签约 ”联系所关联的实体及联系类型。 6 补充逻辑结构设计中的 (a)、 (b)、 (c)三处空缺。 7 在租期内,公寓内设施如出现问题,租客可在系统中进行故障登记,填写故障描述,每项故障由系统自动生成唯一的故障编号,由公司派维修工进行故障维修,系统需记录每次维修的维修日期和维修内容。请根据此需求,对图 21进行补充,并将所补充的 ER图内容转换为一个关系模式,请给出该关系模式。 7 阅读下列系统设计说明,回答以下问题,将解答填入答题纸的对
7、应栏内。【说明】某玩具公司正在 开发一套电动玩具在线销售系统,用于向注册会员提供端对端的玩具定制和销售服务。在系统设计阶段, “创建新订单 (New Order)”的设计用例详细描述如表 31所示,候选设计类分类如表 32所示,并根据该用例设计出部分类图如图 31所示。在订单处理的过程中,会员可以点击 “取消订单 ”取消该订单。如果支付失败,该订单将被标记为挂起状态,可后续重新支付,如果挂起超时 30分钟未支付,系统将自动取消该订单。订单支付成功后,系统判断订单类型: (1)对于常规订单,标记为备货状态,订单信息发送到货运部,完成打包后交付快递发货 ; (2)对于定制订单,会自动进入定制状态,
8、定制完成后交付快递发货。会员在系统中点击 “收货 ”按钮变为收货状态,结束整个订单的处理流程。根据订单处理过程所设计的状态图如图 32所示。8 根据表 31中所标记的候选设计类,请按照其类别将编号 C1 C12分别填入表32中的 (a)、 (b)和 (c)处。 9 根据创建新订单的用例描述,请给出图 3 1中 x1 x4处对应类的名称。 10 根据订单处理过程的描述,在图 32中 S1 S5处分别填入对应的状态名称。 10 阅读下列说明和 C代码,回答以下问题,将 解答写在答题纸的对应栏内。 【说明】 假币问题:有 n枚硬币,其中有一枚是假币,已知假币的重量较轻。现只有一个天平,要求用尽量少的
9、比较次数找出这枚假币。 【分析问题】 将 n枚硬币分成相等的两部分: (1)当 n为偶数时,将前后两部分,即 1n 2和, n 2+10 ,放在天平的两端,较轻的一端里有假币,继续在较轻的这部分硬币中用同样的方法找出假币: (2)当 n为奇数时,将前后两部分,即 1(n -1) 2和 (n+1) 2+10 ,放在天平的两端,较轻的一端里有假币,继续在较轻的这部分硬币中用同样的方法找出假币;若两 端重量相等,则中间的硬币,即第 (n+1) 2枚硬币是假币。 【 C代码】 下面是算法的 C语言实现,其中: coins:硬币数组 first, last:当前考虑的硬币数组中的第一个和最后一个下标 #
10、include stdio h int getCounterfeitCoin(int coins, int first, int last) int firstSum=0, lastSum=0; inti; If(first=last-1)( *只剩两枚硬币 * if(coinsfirst coinslast) return first; return last, if(last-first+1) 2=0)( *偶数枚硬币 * for(i=first, i (1); i+) firstSum+=coinsi, for(i=first+(last-first) 2+1; i last+1, i+
11、) lastSum+=coinsi, if(2) Return getCounterfeitCoin(coins, first, first+(last-first) 2; ) else Return getCounterfeitCoin(coins, first+(last-first) 2+1, last, ) else *奇数枚硬币 * For(i=first; i first+(last-first) 2; i+) firstSum+=coinsi; For(i=first+(last-first) 2+1; i last+1; i+) lastSum+=coinsi; If(firs
12、tSum lastSum) return getCounterfeitCoin(coins, first, first+(last-first) 2-1); else if(firstSum lastSum) return getCounterfeitCoin(coins, first+(last-first) 2-1, last); else Return(3) 11 根据题干说明,填充 C代码中的空 (1)-(3)。 12 根据题干说明和 c代码,算法采用了 ( )设计策略。 函数 getCounterfeitCoin的时间复杂度为 ( )(用 O表示 )。 13 若输入的硬币数为 30,
13、则最少的比较次数为 ( ),最多的比较次数为 ( )。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 14 阅读下列说明和 C+代码,将应填入 (n)处的字句写在答题纸的对应栏内。【说明】阅读下列说明和 Java代码,将应填入 (n)处的字句写在答题纸的对应栏内。【说明】某快餐厅主要制作并出售儿童套餐,一般包括主餐 (各类比萨 )、饮料和玩具,其餐品种类可能不同,但其制作过程相同。前台服务员 (Waiter)调度厨师制作套餐。现采用生成器 (Builder)模式实现制作过程,得到如图 61所示的类图。
14、【 Java代码】class Pizzaprivate String parts; public void setParts(String parts)this parts=parts, public String toString()return thiS parts; abstract class PizzaBuiiderprotected Pizza pizza, public Pizza getPizza()return piZza; public void createNewPizza()pizza=new Pizza(); public(1); class HawaiianPizz
15、aBuilder extends PizzaBuilderpublic void buildParts()pizza setParts(“cross+miid+ham&pineapple“; class SpicyPizzaBuiider extends PizzaBuilderpublic void buildParts()pizza setParts(“pan baked+hot+pepperoni&salami“); class Waiterprivate PizzaBuilder pizzaBuilder;public void setPizzaBuilder(PizzaBuilder
16、 pizzaBuilder) *设置构建器 * (2); public Pizza getPizza()return pizzaBuiider getPiZza(); public void construct() *构建 *PizzaBuilder createNewPizza(); (3); Class FastFoodOrdering(public static viod mainStingargs)Waiter waiter=new Waiter(), PizzaBuilder hawaiian_pizzabuilder=new HawaiianPizzaBuilder(); (4);
17、 (5);System out println(“pizza: “+waiter getPizza(); 程序的输出结果为:Pizzacross+mild+ham&pineapple 15 阅读下列说明和 Java代码,将应填入 (n)处的字句写在答题纸的对应栏内。【说明】某快餐厅主要制作并出售儿童套餐,一般包括主餐 (各类比萨 )、饮料和玩 具,其餐品种类可能不同,但其制作过程相同。前台服务员 (Waiter)调度厨师制作套餐。现采用生成器 (Builder)模式实现制作过程,得到如图 61所示的类图。【 Java代码】 class Pizzaprivate String parts: pu
18、blic void setParts(String parts)this parts=parts, public String toString()return this parts; abstract class PizzaBuiiderprotected Pizza pizza; public Pizza getPizza()return pizza; )public void createNewPizza()pizza=new Pizzac), public(1); class HawaiianPizzaBuilder extends PizzaBuilderpublic void bu
19、ildParts()pizza setParts(“cross+mild+ham&pineapple“; class SpicyPizzaBuilder extends PizzaBuilderpublic void buildParts()pizza setParts(“pan baked+hot+pepperoni&salami“); class Waiterprirate PizzaBuilder pizzaBuilder;public void setPizzaBuilder(PizzaBuilder pizzaBuilder) *设置构建器 * (2), public Pizza g
20、etPizza()return pizzaBuilder getPizza(); public void construct() *构建 *pizzaBuilder createNewPizza(); (3), Class FastFoodorderingpublic static viod mainStingargs)Waiter waiter=new Waiter(); PizzaBuilder hawaiian_pizzabuilder=new HawaiianPizzaBuilder(); (4), (5),System out println(“pizza: “+waiter get
21、Pizza(); 程序的输出结果为: Pizza:cross+mild+ham&pineapple 2017年上半年软件水平考试(中级)软件设计师下午(应用技术)真题试卷答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 【正确答案】 E1:供应商 E2:采购部门 E3:检验员 E4:库管员 E5: S R职员 2 【正确答案】 D1:库存表 D2:采购订单表 D3:质量标准表 D4:供应商表 3 【正确答案】 检查库 存信息: P1(检查库存水平 )D1(部件库存表 ) 产品送检: P3(验证装运部件 )P4(校验部件质量 ) 装运错误通知: P3(验证装运部件 )E1(供应商 )
22、 缺陷装运通知: P4(校验部件质量 )E1(供应商 ) 4 【正确答案】 父图 (图 11)中某个加工的输入输出数据流必须与其子图 (图 12)的输入输出数据流在数量上和内容上保持一致。父图的一个输入 (或输出 )数据流对应子图中几个输入 (或输出 )数据流,而子图中组成的这些数据流的数据项全体正好是父图中的这一个数据流。 5 【正确答案】 6 【 正确答案】 (a)业务技能 (b)楼编号 (c)月租金 7 【正确答案】 新增维修关系,维修工维修公寓,关系模式为维修情况。维修情况 (故障编号,员工编号,楼编号,公寓号,维修日期,维修内容 )。 8 【正确答案】 (a): C4、 C5、 C7
23、、 C10、 C11 (b): C3、 C8 (c): C1、 C2、 C6、 C9、 C12 9 【正确答案】 X1:收货地址 X2:支付方式 X3:邮箱地址 X4:定制属性 10 【正确答案】 S1:订单挂起 S2:订单备货 S3:订单定制 S4:订单发货 S5:订单收 货 11 【正确答案】 (1)first+(last-first) 2或 (first+last) 2 (2)firstSum lastSum (3)first+(last-first) 2或 (first+last) 2 12 【正确答案】 分治法、 O(nlogn) 13 【正确答案】 2、 4 二、选答题(共 3道大
24、题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 14 【正确答案】 (1)virtual void buildParts() (2)this- pizzaBuilder=pizzaBuilder (3)pizzaBuilder- buildParts() (4)waiter- setPizzaBuilder(hawaiian pizzabuilder) (5)waiter- construct() 15 【正确答案】 (1)abstract void buildParts(); (2)this pizzaBuilder=pizzaBuilder (3)pizzaBuilder buildParts() (4)waiter setPizzaBuilder(hawaiian pizzabuilder) (5)waiter construct()