1、2016年下半年软件水平考试(中级)软件设计师下午(应用技术)真题试卷及答案与解析 一、必答题(共 4道大题,每道大题 15分) 0 阅读下列说明和图,回答问题 1至问题 4,将解答填入答题纸的对应栏内。【说明】某证券交易所为了方便提供证券交易服务,欲开发一证券交易平台,该平台的主要功能如下: (1)开户。根据客户服务助理提交的开户信息,进行开户,并将客户信息存入客户记录中,账户信息 (余额等 )存入账户记录中: (2)存款。客户可以向其账户中存款,根据存款金额修改账户余额; (3)取款。客户可以从其账户中取款,根据取款 金额修改账户余额; (4)证券交易。客户和经纪人均可以进行证券交易 (客
2、户通过在线方式,经纪人通过电话 ),将交易信息存入交易记录中; (5)检查交易。平台从交易记录中读取交易信息,将交易明细返回给客户。现采用结构化方法对该证券交易平台进行分析与设计,获得如图 1-1所示的上下文数据流图和图 1-2所示的 0层数据流图。1 使用说明中的词语,给出图 1-1中的实体 E1 E3的名称。 2 使用说明中的词语,给出图 1-2中的数据存储 D1 D3的名称。 3 根据说明和图中的术语,补充图 1-2中缺失的数据流及其起 点和终点。 4 实际的证券交易通常是在证券交易中心完成的,因此,该平台的 “证券交易 ”功能需将交易信息传递给证券交易中心。针对这个功能需求,需要对图
3、1-1和图 1-2进行哪些修改,请用 200字以内的文字加以说明。 4 阅读下列说明,回答问题 1至问题 3,将解答填入答题纸的对应栏内。【说明】某宾馆为了有效地管理客房资源,满足不同客户需求,拟构建一套宾馆信息管理系统,以方便宾馆管理及客房预订等业务活动。【需求分析结果】该系统的部分功能及初步需求分析的结果如下: (1)宾馆有多个部门,部门信息包括部门号、部门名称、 电话、经理。每个部门可以有多名员工,每名员工只属于一个部门;每个部门只有一名经理,负责管理本部门。 (2)员工信息包括员工号、姓名、岗位、电话、工资,其中,员工号唯一标识员工关系中的一个元组,岗位有经理、业务员。 (3)客房信息
4、包括客房号 (如 1301、 1302等 )、客房类型、收费标准、入住状态 (已入住未入住 ),其中客房号唯一标识客房关系中的一个元组,不同客房类型具有不同的收费标准。 (4)客户信息包括客户号、单位名称、联系人、联系电话、联系地址,其中客户号唯一标识客户关系中的一个元组。 (5)客户预订客房时,需要 填写预订申请。预订申请信息包括申请号、客户号、入住时间、入住天数、客房类型、客房数量,其中,一个申请号唯一标识预订申请中的一个元组;一位客户可以有多个预订申请,但一个预订申请对应唯一的一位客户。 (6)当客户入住时,业务员根据客户的预订申请负责安排入住客房事宜。安排信息包括客房号、姓名、性别、身
5、份证号、入住时间、天数、电话,其中客房号、身份证号和入住时间唯一标识一次安排。一名业务员可以安排多个预订申请,一个预订申请只由一名业务员安排,而且可安排多间同类型的客房。【概念模型设计】根据需求阶段收集的信息,设计的实 体联系图如图 2-1所示。【关系模式设计】部门 (部门号,部门名称,经理,电话 )员工 (员工号, (a) ,姓名,岗位,电话,工资 )客户 (b),联系人,联系电话,联系地址 )客房 (客房号,客房类型,收费标准,入住状态 )预订申请 (c),入住时间,天数,客房类型,客房数量 )安排 (申请号,客房号,姓名,性别, (d),天数,电话,业务员 ) 5 根据问题描述,补充四个
6、联系,完善图 2-1的实体联系图。联系名可用联系 1、联系 2、联系 3和联系 4代替,联系的类型为 1: 1、 1: n和 m: n(或 1: 1、 1: *和 *: *)。 6 (1)根据题意,将关系模式中的空 (a) (d)补充完整,并填入答题纸对应的位置上。 (2)给出 “预订申请 ”和 “安排 ”关系模式的主键和外键。 7 【关系模式设计】中的 “客房 ”关系模式是否存在规范性问题,请用 100字以内文字解释你的观点 (若存在问题,应说明如何修改 “客房 ”关系模式 )。 7 阅读下列说明,回答问题 1至问题 3,将解答填入答题纸的对应栏内。【说明】某种出售罐装饮料的自动售货机 (V
7、ending MaChine)的工作过程描述如下: (1)顾客选择所需购买的饮料及数量。 (2)顾客从投币口向自动售货机 中投入硬币 (该自动售货机只接收硬币 )。硬币器收集投入的硬币并计算其对应的价值。如果所投入的硬币足够购买所需数量的这种饮料且饮料数量足够,则推出饮料,计算找零,顾客取走饮料和找回的硬币;如果投入的硬币不够或者所选购的饮料数量不足,则提示用户继续投入硬币或重新选择饮料及数量。 (3)一次购买结束之后,将硬币器中的硬币移走 (清空硬币器 ),等待下一次交易。自动售货机还设有一个退币按钮,用于退还顾客所投入的硬币。已经成功购买饮料的钱是不会被退回的。现采用面向对象方法分析和设计
8、该自动售货机的软件系统,得到如图 3 1所示 的用例图,其中,用例 “购买饮料 “的用例规约描述如下。参与者:顾客。主要事件流: 1顾客选择需要购买的饮料和数量,投入硬币:2自动售货机检查顾客是否投入足够的硬币; 3自动售货机检查饮料储存仓中所选购的饮料是否足够: 4自动售货机推出饮料; 5自动售货机返回找零。备选事件流: 2a.若投入的硬币不足,则给出提示并退回到 1; 3a.若所选购的饮料数量不足,则给出提示并退回到 1。根据用例 “购买饮料 ”得到自动售货机的 4个状态:“空闲 ”状态、 “准备服务 ”状态、 “可购买 ”状态以及 “饮料出售 ”状态,对应的状态图如图 3-2所 示。所设
9、计的类图如图 3-3所示。8 根据说明中的描述,使用说明中的术语,给出图 3-2中的 S1 S4所对应的状态名。 9 根据说明中的描述,使用说明中的术语,给出图 3-2中 E1 E4所对应的事件名称。10 根据说明中的描述,使用说明中的术语,给出图 3 3中 C1 C5所对应的类名。 10 阅读下列说明和 C代码,回答问题 1至问题 3,将解答写在答题纸的对应栏内。 【说明】 模式匹配是指给定主串 t和子串 s,在主串 t中寻找子串 s的过程,其中 s称为模式。如果匹配成功,返回 s在 t中的位置,否则返回一 1。 KMP算法用 next数组对匹配过程进行了优化。 KMP算法的伪代码描述如下:
10、 1在串 t和串 s中,分别设比较的起始下标 i=j=0。 2如果串 t和串 s都还有字符,则循环执行下列操作: (1)如果 j=1或者 ti=sj,则将 i和 j分别加 1;继续比较 t和 s的下一个字符; (2)否则,将 j向右滑动到 nextj的位置,即 j=nextj。 3如果 s中所有字符均已比较完毕,则返回匹配的起始位置 (从 1开始 );否则返回一 1。其中, next数组根据子串 s求解。求解 next数组的代码已由 get next函数给出。 【 C代码】 (1)常量和变量说明 t, s:长度为 1t和 1s的字符串 next: next数组,长度为 1s (2)C程序 #i
11、nclude #include #include *求 next的值 * void get next(int*next, char*s, int is) int i=0, j=一 1; next0=一 1; *初始化 next0* while(i=ls) return (4); else return一 1; 11 根据题干说明,填充 C代码中的空 (1) (4)。 12 根据题干说明和 C代码,分析出 KMP算法的时间复杂度为 (5) (主串和子串的长度分别为 1t和 1s,用 O符号表示 )。 13 根据 C代码,字符串 “BBABBCAC”的 next数组元素值为 (6) (直接写元素值
12、,之间用逗号隔开 )。若主串为 “AABBCBBABBCACCD”,子串为 “BBABBCAC”,则函数 kmp的返回值是 (7)。 14 阅读下列说明和 C+代码,将应填入 (n)处的字句写在答题纸的对应栏内。【说明】某发票 (Invoice)由抬头 (Head)部分、正文部分和脚注 (Foot)部分构成。现采用装饰 (Decorator)模式实现打印发票的功能,得到如图 5-1所示的类图。【 C+代码】 #include using namespace std; class Invoice public: (1) cout 15 阅读下列说明和 Java代码,将应填入 (n)处的字句写在答
13、题纸的对应栏内。【说明】某发票 (Invoice)由抬头 (Head)部分、正文部 分和脚注 (Foot)部分构成。现采用装饰 (Decorator)模式实现打印发票的功能,得到如图 6-1所示的类图。Java代码 class Invoice public void print工nVoice() System out println(“This is the content of the invoice!”); class Decorator extends Invoice protected Invoice ticket; publ ic Decorator(Invoice t) ticke
14、t=t; public void print Invoice() if(ticket!=null) (1); ) clas s HeadDecorator extends Decorator public HeadDecorator(Invoice t) super(t); public void printInVoice() System out println(“This is the header of the invoice!”); (2); class FootDecorator extends Decorator public FootDecorator(Invoice t) su
15、per(t); public void printInVoice() (3); System out println(“This is the footnote of the invoice!”); class Test public static void main(Stringargs) Invoice t=new Invoice(); Invoice ticket; ticket= (4); ticket printInvoice(); System out println(“一一一一一一 ”); ticket= (5) ; ticket printInvoice(); 程序的输出结果为
16、: This is the header of the invoice!This is the content of the invoice!This is the footnote of the invoice!This is the header of the invoice!This is the footnote of the invojce! 2016年下半年软件水平考试(中级)软件设计师下午(应用技术)真题试卷答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 【正确答案】 E1:客户服务助理 E2:客户 E3:经纪人 2 【正确答案】 D1:客户记录 D2:账户记录 D
17、3:交易记录 3 【正确答案】 4 【正确答案】 在图 1-1中,将 “证券交易中心 ”作为外部实体,添加从 “证券交易平台 ”到此外部实体的 数据流 “交易信息 ”。在图 1-2中,将证券交易中心作为外部实体,添加从加工 “证券交易 (在线 )”到此外部实体的数据流 “交易信息 ”,添加从加工 “证券交易 (电话 )”到此外部实体的数据流 “交易信息 ”。 5 【正确答案】 完善后的实体联系图如下所示 (所补充的联系和类型如虚线所示 ):【试题解析】 根据题意 “每个部门可以有多名员工,每名员工只属于一个部门 ”,所以部门和员工之间有一个 “所属 ”联系,联系类型为 1: *。 根据题意 “
18、每个部门有一名经理,只负责管理本部门的事务 ”,所以部门和经理之间有一个 “负责 ”联系,联系类型为 1: 1。 根据题意 “一个客户可以有多个预订申请,但一个预订申请对应唯一的一个客户号 ”,所以客户和预订申请之间有一个 “预订 ”联系,联系类型为 1: *。 根据题意 “一个业务员可以安排多个预订申请,一个预订申请只由一个业务员安排,而且可安排多个同类型的客房 ”,即一份预订申请可以预订多间同类型的客房,所以业务员与客房和预订申请之间的 “安排 ”联系类型为 1:*: *。根据上述分析,完善图 2-1所示的实体联系图如图 2-2所示。6 【正确答案】 (1)(a)部门号 (b)客户号,单位
19、名称 (c)申请号,客户号 (d)身份证号,入住时间 (2)“预订申请 ”关系模式:主键为申请号 外键为客户号 “安排 ”关系模式:主键为客房号,身份证号,入住时间 外键为申请号,客房号,业务员 【试题解析】 由于部门和员工之间有一个 12一 s的 “所属 ”联系需要将一端的码 “部门号 ”并入多端,故员工关系模式中 的空 (a)应填写 “部门号 ”。 根据题意,客户信息包括客户号、单位名称、联系人、联系电话、联系地址,给定的客户关系模式中,不含客户号、单位名称,故空 (b)应填写 “客户号,单位名称 ”。 由于预订申请信息包括申请号、客户号、预订入住时间、入住天数、客房类型、客房数量,故空
20、(c)应填写 “申请号,客户号 ”。 根据题意 “客房号、身份证号和入住时间唯一标识安排联系的每一个元组 ”,所以空 (d)应填写 “身份证号,入住时间 ”。 根据题意, “一个申请号对应唯一标识预订申请中的每一个元组 ”,所以预订申请关系模式的主键为申请号;又因 为客户号是客户关系的主键,根据外键定义可知,客户号是预订申请关系的外建。 根据题意 “客房号、身份证号和入住时间唯一标识安排联系的每一个元组 ”,所以安排关系模式的主键为客房号,身份证号,入住时间;外键为申请号,客房号,业务员,因为申请号和客房号为预约申请和客房关系的主键,而 “业务员 ”是员工关系子实体必须参考员工关系的主键 “员
21、工号 ”,所以业务员也是外键。 7 【正确答案】 存在问题。 关系模式存在传递依赖,没有达到 3NF。 应将客房关系模式分解为客房 1(客房号,客房类型,入住状态 )客房 2(客房类型,收费标准 )。 【试题解析】 客房关系模式存在问题。因为客房号为主键,所以客房号可以决定全属性,即客房号 ( 客房类型,收费标准,入住状态 )。又因为客房类型 收费标准,所以该关系模式存在传递依赖,没有达到 3NF,应将客房关系模式分解为客房 1(客房号,客房类型,入住状态 ),客房 2(客房类型,收费标准 )。 8 【正确答案】 S1:空闲 S2:准备服务 S3:饮料出售 S4:可购买 【试题解析】 题目说明
22、中已经给出了自动售货机的 4个状态分别是: “空闲 ”状态、 “准备服务 ”状态、 “可购买 ”状态以及 “饮 料出售 ”状态。解答本题需要根据用例规约推出这 4个状态之间的迁移关系,这样才能与图 3-2中的状态 S1 S4对应。 首先从状态图的初始状态 “”开始, S1代表的就是自动售货机的初始状态。在上述 4个状态中,只有在 “空闲 ”下,才能开始一次售卖,所以 S1对应的是 “空闲 ”状态。 根据 S2相关的事件来看,在该状态时,自动售货机在接收顾客的请求 (顾客选择的饮料以及投入的硬币 ),因此应对应 “准备服务 ”状态。 状态 S3有一个自迁移事件 “计算找零 ”,根据说明和用例规约
23、可知,饮料出售之后进行找零,所以 S3对应 “饮料出售 ”状态。 S4则对应 “可购买 ”状态。 9 【正确答案】 E1:所选购的饮料数量不足 E2:选择饮料【硬币足够购买饮料】 E3:所选购的饮料数量足够推出饮料 E4:取走饮料找零并清空硬币器 【试题解析】 确定了状态图中的各个状态,接下来就需要进行状态之间迁移事件的获取。 E2是从 “准备服务 ”状态变换到 “可购买 ”状态的事件, “选择饮料 硬币不足】 ”时仍然停留在 “准备服务 ”状态,对应用例规约中的 2a;根据用例规约若硬币足够则进入下一步,所以 E2所对应的事件是 “选择饮料【硬币足够购买饮料】 ”。 E1事件的触发将使得自
24、动售货机从 “可购买 ”状态变换到 “准备服务 ”状态,对应用例规约中的 3a,所以 E1对应的事件应是 “所选购的饮料数量不足 ”。 E3事件的触发将使得自动售货机从 “可购买 ”状态迁移到 “饮料出售 ”状态。根据说明,能够售出饮料必须满足两个条件:该饮料数量足够以及顾客投入的硬币足够。硬币是否足够以及饮料数量不足在状态 S2已经进行了判断,因此 E3对应的事件应是 “所选购的饮料数量足够推出饮料 ”。 E4对应的事件是自动售货机完成一次售卖,回到 “空闲 ”状态时需处理的事件,根据说明可知, E4对应的事件应是 “取走饮料找零并清空硬币 器 ”。 10 【正确答案】 C1:自动售货机 C
25、2:硬币器 C3:饮料存储仓 C4:硬币 C5:饮料 或者 C1:自动售货机 C2:饮料存储仓 C3:硬币器 C4:饮料 C5:硬币 【试题解析】 本题要求根据说明和用例规约创建对应的类模型。根据说明和用例规约可知自动售货机有几个重要的组成元素:饮料、硬币、硬币器和饮料存储仓。 1台自动售货机有 1个硬币器、 1个饮料存储仓;硬币器可以接收多枚硬币,饮料存储仓中可以容纳多种饮料。由此可知,图 3 3中的两个 0 *聚集关系 应该分别对应 “硬币器硬币 ”和 “饮料存储仓饮料 ”这两对 “部分 -整体 ”关系;而 C1就是自动售货机。 11 【正确答案】 (1)j 1s (2)ti=sj (3)
26、j=nextj (4)i-j+1 【试题解析】 本题考查算法设计与分析以及用 C程序设计语言实现算法的能力。 KMP算法是一个非常经典的模式匹配算法。其核心思想是核心思想:匹配过程中字符对不相等时,不需回溯主串,而是利用已经得到的部分匹配结果将模式向右滑动尽可能远的一段距离继续比较。滑动的距离由 next数组给出。该 算法提出之后,有一些改进的思想,使得 next数组的计算有多种方式。本题干不需要考生考虑如何计算 next数组,已经直接给出计算该数组的 C代码。只需要根据已经计算的 next数组进行模式匹配即可。 在 C函数 kmp中, while循环是判断串 s和 t是否还有字符,因此空 (
27、1)处应填写“jprintlnvoice0 (3)Decorator: printlnvoice() (4)Decorator: printlnvoice() (5)&a 【试题解析】 本题考查装饰 (Decorator)模式的基本概念和应用。装饰模式属于结构型设计模式,其设计意图是动态地给一个对象添加一些额外的 职责。就增加功能而言,装饰模式比生成子类更加灵活。装饰模式的结构如图 5-2所示。其中: Component定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent定义一个对象,可以给这个对象添加一些职责。 Decorator维持一个指向 Component
28、对象的指针,并定义一个与 Component接口一致的接口。 ConcreteDecorator向组件添加职责。装饰模式适用于:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。处理那些可以撤销的职责。当不能采用生成子类的方 式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,由于类定义被隐藏,或类定义不能用于生成子类。本题将装饰模式用于实现打印发票问题。图 5 1的类图中,类 Invoice对应图 5-2中的 Component,其功能是打印发票的内容; HeadDecorator和 FootDecora
29、tor是两个ConcreteDecorator,向组件中添加打印发票抬头和发票脚注的功能。方法printlnvoice是 Invoice中定义的接口, Component类中应定义一个与之一致的接口。在 C+中,父类和子类之间共享接口,通常采用虚拟函数。由此可知,空 (1)处应填写 “virtual void printlnvoice()”。这个接口在类 Decorator、 HeadDecorator和 FootDecorator中分别进行了重置,分别对应代码中的空 (2) (4)。类 Decorator中保持了一个指向 Component对象的指针 ticket,用来接收所要装饰的组件In
30、voice。因此空 (2)处应填写 “ticket printlnvoice0”。类 HeadDecorator和FootDecorator是在打印发票内容的基础上,打印发票的抬头和脚注,所以空 (3)、(4)处都应填写 “Decorator: printlnvoice0”。最后一空考查的是装饰模式的调用,由 main()函数中给出的第一次调用可以获得一些提示,推断出空 (5)出应填写“&a”。 15 【正确答案】 (1)ticket printlnvoice() (2)super printlnvoice() (3)super printlnvoice() (4)new HeadDecora
31、tor(new FootDecorator(t) (5)new HeadDecorator(new FootDecorator(null) 【试题解析】 本题考查装饰 (Decorator)模式的基本概念和应用。装饰模式属于结构型设计模式,其设计意图是动态地给一个对象添加一些额外的职责。就增加功能而言,装饰模式比生成子类更加灵活。装饰模式的结构如图 6-2所示。其中: Component定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent定义一个对象,可以给这个对象添加一些职责。 Decorator维持一个指向 Component对象的指针,并定义一个与 Comp
32、onent接口一致的接口。 ConcreteDecorator向组件添加职责。装饰模式适用于:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。处理那些可以撤销的职责。当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,由于类定义被隐藏,或类定义不能用于生成子类。本题将装饰模式用于实现打印发票问题。图 6-1的类图中,类 Invoice对应图 6-2中的 Component,其功能是打印发票的内容: HeadDecorator和 FootDecorator是两个ConcreteDeco
33、rator,向组件中添加打印发票头和发票脚注的功能。方法printlnvoice是 Invoice中定义的接口, Component类中应定义一个与之一致的接口。这个接口在类 Decorator、 HeadDecorator和 FootDecorator中分别进行了重新定义,分别对应代码中的空 (1) (3)。类 Decorator中保持了一个 Component对象 ticket,用来接收所要装饰的组件 Invoice。因此空 (1)处应填写“ticket printlnvoice()”。类 HeadDecorator和 FootDecorator:是在打印发票内容的基础上,打印发票的抬头和脚注,所以空 (2)、 (3)处都应填写“super printInvoice()”。空 (4) (5)考查的是装饰模式的调用,分别应填写为 “new HeadDecorator(new FootDecorator(t)”和 “new HeadDecorator(new FootDecorator(null)”。