1、软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 70及答案与解析 一、必答题(共 4道大题,每道大题 15分) 0 阅读下列说明和图,回答问题 1至问题 3,将解答填入答题纸的对应栏内。 【说明】 某房屋租赁公司欲建立一个房屋租赁服务系统,统一管理房主和租赁者的信息,从而快速地提供租赁服务。该系统具有以下功能。 (1)登记房主信息。对于每名房主,系统需登记其姓名、住址和联系电话,并将这些信息写入房主信息文件。 (2)登记房屋信息。所有在系统中登记的房屋都有一个唯一的识别号 (对于新增加的房屋,系统会自动 为其分配一个识别号 )。除此之外,还需登记该房屋的地址、房型 (如平房、带阳台
2、的楼房、独立式住宅等 )、最多能够容纳的房客数、租金及房屋状况 (待租赁、已出租 )。这些信息都保存在房屋信息文件中。一名房主可以在系统中登记多个待租赁的房屋。 (3)登记租赁者信息。所有想通过该系统租赁房屋的租赁者,必须首先在系统中登记个人信息,包括:姓名、住址、电话号码、出生年月和性别。这些信息都保存在租赁者信息文件中。 (4)租赁房屋。已经登记在系统中的租赁者,可以得到一份系统提供的待租赁房屋列表。一旦租赁者从中找到合适的房屋,就可以 提出看房请求。系统会安排租赁者与房主见面。对于每次看房,系统会生成一条看房记录并将其写入看房记录文件中。 (5)收取手续费。房主登记完房屋后,系统会生成一
3、份费用单,房主根据费用单缴纳相应的费用。 (6)变更房屋状态。当租赁者与房主达成租房或退房协议后,房主向系统提交变更房屋状态的请求。系统将根据房主的请求,修改房屋信息文件。数据流题图 1-1和题图 1-2分别给出了该系统的顶层数据流图和 0层数据流图。1 使用说明中给出的词汇,将数据流题图 1-1中 (1) (4)处的数据流补充完整。 2 使用说明中给出 的词汇,将数据流图题图 1-2中的 (5) (8)补充完整。 3 数据流程图题图 1-2中缺失了三条数据流,请指出这三条数据流的起点、终点和数据流名称。 3 阅读下列说明,回答问题 l至问题 4,将解答填入答题纸的对应栏内。 【说明】 某汽车
4、维修站拟开发一套小型汽车维修管理系统,对车辆的维修情况进行管理。 (1)对于新客户及车辆,汽车维修管理系统首先登记客户信息,包括:客户编号、客户名称、客户性质 (个人、单位 )、折扣率、联系人、联系电话等信息;还要记录客户的车辆信息,包括:车牌号、车型、颜色、车辆类别等信息。一 个客户至少有一台车。客户及车辆信息如题表 2-1所示。(2)记录维修车辆的故障信息。包括:维修类型 (普通、加急 )、作业分类 (大、中、小修 )、结算方式 (自付、三包、索赔 )等信息。维修厂的员工分为:维修员和业务员。车辆维修首先委托给业务员。业务员对车辆进行检查和故障分析后,与客户磋商,确定故障现象,生成维修委托
5、书,如题表 2-2所示。(3)维修车间根据维修委托书和车辆的故障现象,在已有的维修项目中选择并确定一个或多个具体维修项目,安排相关的维修工及工时,生成维修派工单。维修派工单如题表 2-3所示。(4)客户 车辆在车间修理完毕后,根据维修项目单价和维修派工单中的工时计算车辆此次维修的总费用,记录在委托书中。 根据需求阶段收集的信息,设计的实体联系图 (见题图 2-1)和关系模式 (不完整 )如下所示。题图 2-1中业务员和维修工是员工的子实体。 【概念结构设计】【逻辑结构设计】 客户 ( _(5),折扣率,联系人,联系电话 ) 车辆 (车牌号,客户编号,车型,颜色,车辆类别 ) 委托书 ( _(6
6、),维修类型,作业分类,结算方式,进厂时间,预计完工时间,登记日期,故障描述,总费用 ) 维修项目 (维修项目编号,维修 项目,单价 ) 派工单 ( _(7),工时 ) 员工 ( _(8),工种,员工类型,级别 ) 4 根据问题描述,填写题图 2-1中 (1) (4)处联系的类型。联系类型分为一对一、一对多和多对多三种,分别使用 1: 1、 1: n或 1: *、 m: n或 *: *表示。 5 补充题图 2 1中的联系并指明其联系类型。联系名可为:联系 1,联系2, 。 6 根据题图 2-1和说明,将逻辑结构设计阶段生成的关系模式中的空 (5) (8)补充完整。 7 根据问题描述,写出客户、
7、委托书和派工单这三个关系的主键。 7 阅 读下列说明和图,回答问题 1至问题 3,将解答填入答题纸的对应栏内。 【说明】 某图书管理系统的主要功能如下。 (1)图书管理系统的资源目录中记录着所有可供读者借阅的资源,每项资源都有一个唯一的索引号。系统需登记每项资源的名称、出版时间和资源状态 (可借阅或已借出 )。 (2)资源可以分为两类:图书和唱片。对于图书,系统还需登记作者和页数;对于唱片,还需登记演唱者和介质类型(CD或者磁带 )。 (3)读者信息保存在图书管理系统的读者信息数据库中,记录的信息包括:读者的识别码和读者姓名。系统为每个读者创建了一个借书记录 文件,用来保存读者所借资源的相关信
8、息。 现采用面向对象方法开发该图书管理系统。识别类是面向对象分析的第一步。比较常用的识别类的方法是寻找问题描述中的名词,再根据相关规则从这些名词中删除不可能成为类的名词,最终得到构成该系统的类。题表 3-1给出了说明中出现的所有名词。通过对题表 3-1中的名词进行分析,最终得到了题图 3-1所示的 UML类图 (类的说明见题表 3-2)。8 题表 3-2所给出的类并不完整,根据说明和题表 3-1,将题图 3-1中的 (a) (c)处补充完整。 9 根据说明中的描述,给出题图 3 1中的类 CatalogItern以及 (b)、 (c)处所对应的类的关键属性 (使用题表 3-1中给出的词汇 ),
9、其中, CatalogItem有 4个关键属性;(b)、 (c)处对应的类各有 2个关键属性。 10 识别关联的多重度是面向对象建模过程中的一个重要步骤。根据说明中给出的描述,完成题图 3-1中的 (1) (6)。11 阅读下列说明、图和 C代码,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】 一般的树结构常采用孩子一兄弟表示法表示,即用二叉链表作树的存储结构,链表中节点的两个链域分别指向该节点的第一个 孩子节点和下一个兄弟节点。例如,题图 4-1(a)所示的树的孩子一兄弟表示如题图 4-1(b)所示。函数LevelTraVerse()的功能是对给定树进行层序遍历。例如,对题图 4-
10、1所示的树进行层序遍历时,节点的访问次序为: D B A E F P C。 对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如下表所示。Bool、 Status类型定义如下: typedef enumFALSE=0, TRUE=1 Bool; typedef enumOVERFLOW=-2, UNDERFLOW=-1, ERROR=0, OK=1Status;树的二叉链表节点定义如下: typedef struct Node char data; Struct Node *firstchiid,*nextbrother; Node, *TreeNode;【函数】 Status Le
11、ve1Traverse(TreeNode root) *层序遍历树,树采用孩子一兄弟表示法, root是树根节点的指针 * Queue tempQ; TreeNode ptr, brOtherptr; if(!root) return ERROR; InitQueue( tempQ); _(1); brotherptr = root - nextbrother; while (brotherptr) EnQueue( _(2); *end-while* while(_(3) _(4); printf( c t,ptr- data); if(_(5)continue; _(6); brother
12、ptr=ptr- firstchiid-nextbrother; while(brotherptr) EnQueue( tempQ, brotherptr); _(7); *end-while* ) *end-while* return OK; ) *LevelTraverse* 12 阅读下列说明和 C+代码,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】 某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如下表所示。为支持将来能够模 拟更多种类鸭子的特征,采用策略设计模式 (Strategy)设
13、计的类图如题图 5-1所示。其中, Duck为抽象类,描述了抽象的鸭子,而类 RubberDuck、 MallardDuck、CottonDuck和 RedHeadDuck分别描述具体的鸭子种类,方法 fly()、 quack()和display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;类FlyBehavior与 QuackBehavior为抽象类,分别用于表示抽象的飞行行为与发声行为;类 FlyNoWay与 FlyWithWings分别描述不 能飞行的行为和用翅膀飞行的行为;类 Quack、 Squeak与 QuackNoWay分别描述发出 “嘎嘎 ”声的行为、发出橡皮与
14、空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。 【 C+代码】#include iostream using namespace_(1);class FlyBehaViorpublic: _(2) fly()=0; ;class QuackBehaviorpublic: _(3) quack()=0;; class FlyWithWings:public FlyBehavior public: void fly()cout 使用翅膀飞行 ! end1; ;class FlyNoWay: public FlyBehavior public: void fly()cout 不能飞行 !e
15、nd1; ;class Quack: public QuackBehaVior public: void quack()cout 发出 嘎嘎 声 ! end1; ; class Squeak: publiC QuackBehavior public: void quack()cout 发出空气与橡皮摩擦声 ! end1; ; class QuackNoWay: public QuackBehavior public: void quack()cout 不能发声 ! end1; ;Class Duck protected: FlyBehavior *_(4); QuackBehaVior *_(
16、5); public: void fly() _(6); void quack() _(7); ; virtual void display()=0; ;clasS RubberDuck: public Duck(public: RubberDuCk() flyBehaVior=new_(8); quackBehavior=new_(9); RubberDuck() if(!flyBehavior)delete flyBehavior; if (!quackBehaVior)delete quackBehavior; void display() *此处省 略显示橡皮鸭的代码 * ;其他代码省
17、略 13 阅读下列说明和 Java代码,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】 某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中种种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如下表所示。为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式 (Strategy)设计的类图如题图 6-1所示。其中, Duck为抽象类,描述了抽象的鸭子,而类 RubberDuck、 MallardDuck、CottonDuck和 RedHeadDuck分别描述具体的鸭子种类,方法 fly()、 quack()和display()分别表示不同种类的鸭子都具
18、有飞行特征、发声特征和外观特征;接口FlyBehavior与 QuackBehavior分别用于表示抽象的飞行行为与发声行为;类FlyNoWay与 FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、 Squeak与 QuackNoWay分别描述发出 “嘎嘎 ”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。【 Java代码】_(1)FlyBehaVior public void fly(); ; _(2) QuackBehavior public void quack(); ;class FlyWithWings implements
19、FlyBehaVior public void fly()System out println(使用翅膀飞行 !); ; class FlyNoWay implements FlyBehaVior public void fly()(System out println(不能 飞行 !); ;class Quack implements QuackBehavior public void quack()System out println(发出 嘎嘎 声 !); ; class Squeak implements QuackBehavior public void quack()System
20、out println(发出空气与橡皮摩擦声 !); ;class QuackNOWay implements QuackBehavior public void quack()System out println(不能发声 !); ;Abstract class Duck protected FlyBehaVior_(3); protected QuackBehavior_(4); public void fly()_(5); ; public void quack()_(6); ; public _(7) void display(); ;class RubberDuck extends
21、Duck public RubberDuck( ) flyBehaVior=new_(8); quackBehaVior=new _(9); public void display() *此处省略显示橡皮鸭的代码 * ;其他代码省略 软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 70答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 【正确答案】 (1)费用单 (2)待租赁房屋列表 (3)看房请求 (4)变更房屋状态请求 【试题解析】 本题考查的是分层数据流图,该题型每年必考,是需要重点掌握的内容。 解题的两大原则是:数据平衡原则,系统功能描述与数据流图的一致性原则。
22、首先根据数据平衡原则分析如下。 在 0层图中,与 “房主 ”相关的数据流有 5条。根据数据平衡原则,顶层图应有与之对应的数据流,但 “费用单 ”数据流在顶层图中找不到,所以空 (1)处应是 “费用单 ”数据流。 通过比较顶层图和 0层图中与外部实体 “租赁者 ”相关的数据流可以发现,出现在 0层图中的数据流 “待租赁房屋列表 ”是顶层图中没有的,且与空 (2)处的数据流方向一致。由此可以判定,空 (2)处的数据流就是 “待租赁房屋列表 ”。而顶层图中的数据流 “租赁者信息 ”却是 0层图中没有的。这样就找到了 0层图中缺失的一条数据流:租赁者信息,它的起点是 “租赁者 ”,终点是加工 “登记租
23、赁者信息 ”。 其次根据系统功能描述与数据流图的一致性原则分析如下。 由于空 (4)处缺失的数据流是一条输入数据流,从说明中可以看出,只有功能(6)“当租赁者与房主达成租房或退房协议后,房主向系统提交变更房屋状态的请求 ”所描述的数据流没有在 “房主 ”与系统之间体现出来。因此可以确 定,空 (4)处缺失的数据流就是 “变更房屋状态请求 ”。相应地,可以确定,在 0层图中缺失的其中一条数据流也是它,其起点是 “房主 ”,终点是 “变更房屋状态 ”这个加工。 由于说明中与 “租赁者 ”相关的功能 “一旦租赁者从中找到合适的房屋,就可以提出看房请求 ”未在图中体现出来,这样就能确定空 (3)处的数
24、据流应该是 “看房请求 ”。而 0层图中也没有出现这条数据流。所以, 0层图中缺失的第 3条数据流就是 “看房请求 ”,它的起点是 “租赁者 ”,终点是加工 “安排租赁者看房 ”。 由说明的描述可以得知,本系统中的数据存储有:房主 信息文件、房屋信息文件、租赁者信息文件、看房记录文件。下面就可以根据相应的加工对号入座了。显然,空 (5)处为房主信息文件;空 (6)处为租赁者信息文件;空 (7)处为房屋信息文件;空 (8)处为看房记录文件。 2 【正确答案】 (5)房主信息文件 (6)租赁者信息文件 (7)房屋信息文件 (8)看房记录文件 3 【正确答案】 (1)起点:房主 终点:变更房屋状态
25、数据流名称:变更房屋状态请求 (2)起点:租赁者终点:登记租赁者信息 数据流名称:租赁者信息 (3)起点:租赁者终点:安排租赁者 看房 数据流名称:看房请求 4 【正确答案】 (1)n或 m或 * (2)1 (3)n或 m或 * (4)n或 m或 * 【试题解析】 由维修委托书的故障描述、维修类型、作业分类可知,一台车可能有多个故障,对应多个维修委托书,所以空 (1)处为 *;由题目中 “维修车间根据维修委托书和车辆的故障现象,在已有的维修项目中选择并确定一个或多个具体维修项目,安排相关的维修工及工时,生成维修派工单 ”,很明显,一份委托书包含了一个或多个维修项目,而每个维修项目可以由多个维修
26、工来完成,每一个维修工又可以完成多个维修 项目,所以空 (2)处为 1,空 (3)处和空 (4)均为 *。 5 【正确答案】 完整的实体联系图如下图所示。【试题解析】 需要补充车辆和客户之间以及委托书和业务员之间的联系。由 “一个客户至少有一台车 ”可知,客户和车辆之间是 “拥有 ”联系,且是一对多的联系;由 “业务员对车辆进行检查和故障分析后,与客户磋商,确定故障现象,生成维修委托书 ”可知,业务员与委托书之间是 “委托 ”联系,且一名业务员可以受理多份委托书,而一份委托书由一名业务员来生成。 6 【正确答案】 (5)客户编号,客户名称,客户性质 (6)委 托书编号,客户编号,车牌号,业务员
27、编号 或委托书编号,车牌号,业务员编号 (7)委托书编号,维修工编号,维修项目编号 (8)员工编号,员工姓名 【试题解析】 本问题又是补充逻辑结构设计题,几乎每年都考,这类题目只要仔细看需求分析结果或者仔细观察题目中已知的表,很容易就能做出,关键是需要细心,不要漏掉什么属性。根据客户及车辆信息表可知,客户关系应包括客户编号、客户名称、客户性质、折扣率、联系人等属性,主键显然为客户编号;而车辆关系应包括车牌号、客户编号、车型、颜色、车辆类别等属性,主键为车牌号。根据维 修委托书表可知,委托书关系应包括委托书编号、车牌号、客户编号、业务员编号、维修类型等属性,其主键为委托书编号。根据维修派工单可知
28、,派工单关系应包括委托书编号、维修项目编号、维修工编号、工时等属性,主键是委托书编号、维修项目编号和维修工编号。根据实体联系图可知,员工包括业务员和维修工,他们共有的属性是员工编号、员工姓名、工种、员工类型、级别等,主键为员工编号。 7 【正确答案】 客户主键:客户编号 委托书主键:委托书编号 派工单主键:委托书编号,维修项目编号,维修工编号 8 【正确答案】 (a)资源目 录; (b)图书; (c)唱片 【试题解析】 本题主要考查 UML中的类图设计, 3个问题都是对类图的元素进行补充。类图的设计是根据系统的功能需求而来的,所以解题的关键在于对 “系统功能说明 ”的理解。下面将通过对 “系统
29、功能说明 ”的分析,来解答试题。 由 “图书管理系统的资源目录中记录着所有可供读者借阅的资源 ”和 “资源可以分为两类:图书和唱片 ”可知,一个资源目录中对应着多个可供读者借阅的资源,这些资源分为图书类与唱片类,所以 (a)为资源目录, (b)和 (c)分别为图书和唱片,同时空 (1)处为 1,空 (2)处为 0 *。 (所有可供读者借阅的资源数有可能为 0,即还未录入任何资源的状态。 ) 由 “每项资源都有一个唯一的索引号。系统需登记每项资源的名称、出版时间和资源状态 ”可知,资源目录中的每项资源,即类图中的 CatalogItem,有索引号、名称、出版时间和资源状态这 4个关键属性。 由
30、“对于图书,系统还需登记作者和页数;对于唱片,还需登记演唱者和介质类型 (CD或者磁带 )”可知,图书有作者和页数 2个关键属性,唱片有演唱者和介质类型 2个关键属性。 Borrower代表读者,而 Borrowerltems为借书记录文件,同时系统功能说明中有 “系统为每个读者创建了一个借书记录文件,用来保存读者所借资源的相关信息 ”,所以它们之间的关系应为 1对 1;即空 (5)处和空 (6)处均为 1。 9 【正确答案】 CatalogItem的属性:索引号、名称、出版时间、资源状态 图书的属性:作者、页数 唱片的属性:演唱者、介质类型 10 【正确答案】 (1)1 (2)0 * (3)
31、1 (4)0 * (5)1 (6)1或者 0 1 11 【正确答案】 (1)EnQueue( QuackBehavior* (5)quackBehavior; 由 “FlyBehavior*flyBehavior; QuackBehavior*quackBehavior; ”及函数名可知,该函数体应调用 FlyBehavior类中的 fly函数和 QuackBehavior类中的 quack函数。所以空 (6)处和空 (7)处填空如下: public: void fly() (6)flyBehavior- fly(); void quack() (7)quackBehavior- quack;
32、 ; virtual void display()=0; ; (4)由题中所给信息可知 RubberDuck是 “发出橡皮与空气摩擦声 ”并且 “不能飞行 ”的鸭子种类,因此构造函数中创建的对象 flyBehavior和 quackBehavior对应的类型分别为 FlyNoWay和 Squeak。所以空 (8)处和空 (9)处的填空如下: class RubberDuck: public Duck public: RubberDuck() flyBehavior=new(8)FlyNoWay(); quackBehaVior=neW(9)Squeak(); 13 【正确答案】 (1)Inte
33、rface (2)Interface (3)flyBehavior (4)quackBehavior (5)flyBehavior.fly (6)quackBehavior quack() (7)abstract (8)FlyNoWay() (9)Squeak() 【试题解析】 本题考查面向对象的程序设计的抽象类和多态,使用的语言是Java。 由题中所给信息,接口 FlyBehavior与 QuackBehavior分别用于表示抽象的飞行行为与发声行为,可知空 (1)处和空 (2)处都应填入 interface。 由子类 RubberDuck类中出现的 flyBehavior和 quackBe
34、havior在之前并没有被定义过可知,空 (3)处和空 (4)处需要声明这两个对象分别为 FlyBehavior和QuackBehavior类型,否则出错。 由 “Protected FlyBehavior flyBehavior; Protected QuackBehavior quackBehavior; ”及函数名可知该函数体应调用类 FlyBehavior中的 fly函数和类QuackBehavior中的 quack函数。所以空 (5)处和空 (6)处应分别填入:flyBehavior fly和 quackBehavior quack()。 由于 Duck类为抽象类,因此需要一个抽象函数来描述鸭子的总体外观特征,所以空 (7)处应填入 abstract。 对于空 (8)处和空 (9)处,由题中所给信息可知 RubberDuck是 “发出橡皮与空气摩擦声 ”并且 “不能飞行 ”的鸭子种类,因此构造函数中创建的对象 flyBehavior和quackBehavior对应的类型分别为 FlyNoWay和 Squeak。