1、2007年上半年软件水平考试(中级)软件设计师下午(应用技术)试题真题试卷及答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 阅读以下说明和图,回答问题 1至问题 3。【说明】 某房屋租赁公司欲建立一个房屋租赁服务系统,统一管理房主和租赁者的信息,从而快速地提供租赁服务。该系统具有以下功能: 1登记房主信息。对于每名房主,系统需登记其姓名、住址和联系电话,并将这些信息写入房主信息文件。 2登记房屋信息。所有在系统中登记的房屋都有一个唯一的识别号 (对于新增加的房屋,系统会自动为其分配一个识别号 )。 除此之外,还需登记该房屋的地址、房型 (如平房、带阳台的楼房、独立式住宅等 )、最
2、多能够容纳的房客数、租金及房屋状态 (待租赁、已出租 )。这些信息都保存在房屋信息文件中。一名房主可以在系统中登记多个待租赁的房屋。 3登记租赁者信息。所有想通过该系统租赁房屋的租赁者,必须首先在系统中登记个人信息,包括:姓名、住址、电话号码、出生年月和性别。这些信息都保存在租赁者信息文件中。 4租赁房屋。已经登记在系统中的租赁者,可以得到一份系统提供的待租赁房屋列表。一旦租赁者从中找到合适的房屋,就可以提出看房请求。系统会安排租 赁者与房主见面。对于每次看房,系统会生成一条看房记录并将其写入看房记录文件中。 5收取手续费。房主登记完房屋后,系统会生成一份费用单,房主根据费用单交纳相应的费用。
3、 6变更房屋状态。当租赁者与房主达成租房或退房协议后,房主向系统提交变更房屋状态的请求。系统将根据房主的请求,修改房屋信息文件。 数据流图 10-1和图 10-2分别给出了该系统的顶层数据流图和 0层数据流图。1 使用 说明 中给出的词汇,将数据流图 10-1中 (1) (4)处的数据流补充完整。 2 使用 说明 中给出的词汇,将数据流图 10-2中的 (5) (8)补充完整。 3 数据流程图 10-2中缺失了三条数据流,请指出这三条数据流的起点、终点和数据流名称。 4 阅读下列说明,回答问题 1至问题 3。 【说明】 某医院的门诊管理系统实现了为患者提供挂号、处方药品收费的功能。具体的需求及
4、设计如下: 1医院医师具有编号,姓名,科室,职称,出诊类型和出诊费用,其中出诊类型分为专家门诊和普通门诊,与医师职称无关;各个医师可以具有不同的出诊费用,与职称和出诊类型无关。 2患者首先在门诊挂号处挂号,选择科室和医师,根据选择的医师缴纳挂号费 (医师出 诊费 )。收银员为患者生成挂号单,如表 10-1所示,其中,就诊类型为医师的出诊类型。3患者在医师处就诊后,凭借挂号单和医师手写处方到门诊药房交费买药。收银员根据就诊号和医师处方中开列的药品信息,查询药品库 (如表 10-2所示 )并生成门诊处方单 (如表10-3所示 )。4由于药品价格会发生变化,因此,门诊管理系统必须记录处方单上药品的单
5、价。 根据需求阶段收集的信息,设计的实体联系图和关系模式 (不完整 )如下所示: 1实体联系图 2关系模式 挂号单 (就诊号,病患姓名,医师编号,时间, (5) 收银员 (编号,姓名,级别 ) 医师 (编号,姓名,科室,职称,出诊类型,出诊费用 ) 门诊处方 (6),收银员,时间 ) 处方明细 (就诊号, (7) 药品库 (药品编码,药品名称, (8) 4 根据问题描述,填写图 10-3实体联系图中 (1) (4)处联系的类型。 5 图 10-3中还缺少几个联系 ?请指出每个联系两端的实体名,格式如下。 实体 1:实体 2 例如,收银员与门诊处方之间存在联系,表示为: 收银员:门诊处方 或 门
6、诊处方:收银员 6 根据实体联系图 10-3,填写 挂号单、门诊处方、处方明细和药品库关系模式中的空 (5) (8)处,并指出挂号单、门诊处方和处方明细关系模式的主键。 7 阅读下列说明和图,回答问题 1至问题 3。 【说明】 某图书管理系统的主要功能如下: 1图书管理系统的资源目录中记录着所有可供读者借阅的资源,每项资源都有一个唯一的索引号。系统需登记每项资源的名称、出版时间和资源状态 (可借阅或已借出 )。 2资源可以分为两类:图书和唱片。对于图书,系统还需登记作者和页数;对于唱片,还需登记演唱者和介质类型 (CD或者磁带 )。 3读者信息保存在图书管理系统 的读者信息数据库中,记录的信息
7、包括:读者的识别码和读者姓名。系统为每个读者创建了一个借书记录文件,用来保存读者所借资源的相关信息。 现采用面向对象方法开发该图书管理系统。识别类是面向对象分析的第一步。比较常用的识别类的方法是寻找问题描述中的名词,再根据相关规则从这些名词中删除不可能成为类的名词,最终得到构成该系统的类。表 10-4给出了 说明 中出现的所有名词。通过对表 10-4中的名词进行分析,最终得到了图 10-4所示的 UML类图 (类的说明如表 10-5所示 )。7 表 10-5所给出的类并不完整,根据 说 明 和表 10-4,将图 10-4中的 (a) (c)处补充完整。 8 根据【说明】中的描述,给出图 10-
8、4中的类 CatalogItem以及 (b)、 (c)处所对应的类的关键属性 (使用表 10-4中给出的词汇 ),其中, CamlogItem有 4个关键属性;(b)、 (c)处对应的类各有两个关键属性。 9 识别关联的多重度是面向对象建模过程中的一个重要步骤。根据 说明 中给出的描述,完成图 10-4中的 (1) (6)。 10 阅读以下说明和图,填补流程图中的空缺。 【说明】 在一条农村公路的一边稀疏地分布着房子 ,其分布如图 10-5所示。某电信公司需要在某些位置放置蜂窝电话基站,由于基站的覆盖范围是 6公里,因此必须使得每栋房子到某个基站的直线距离不超过 6公里。为简化问题,假设所有房
9、子在同一直线上,并且基站沿该直线放置。现采用贪心策略实现用尽可能少的基站覆盖所有的房子。 实现贪心算法的流程如图 10-6所示,请填充其中空白并计算该算法的时间复杂度,其中: 1 di(1iN)表示第 i个房子到公路 A端的距离, N表示房子的总数,房子的编号按照房子到公路 A端的距离从小到大进行编号。 2 sk表示第 k(k1)个基 站到公路 A端的距离,算法结束后 k的值为基站的总数。 该算法的时间复杂度为 (5)。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 11 阅读以下说明和 C语言函数,
10、应填入 (n)处。 【说明】 在一个分布网络中,资源 (石油、天然气、电力等 )可从生产地送往其他地方。在传输过程中,资源会有损耗。例如,天然气的气压会减少,电压会降低。我们将需要输送的资源信息称为信号。在信号从信源地送往消耗地的过程中,仅能容忍一定范围的信号衰减,称 为容忍值。分布网络可表示为一个树型结构,如图 10-9所示。信号源是树根,树中的每个节点 (除了根 )表示一个可以放置放大器的子节点,其中某些节点同时也是信号消耗点,信号从一个节点流向其子节点。 每个节点有一个 d值,表示从其父节点到该节点的信号衰减量。例如,在图 10-9中,节点 w、 p、 q的 d值分别为 2、 1、3,树
11、根节点表示信号源,其 d值为 0。 每个节点有一个 M值,表示从该节点出发到其所有叶子的信号衰减量的最大值。显然,叶子节点的 M值为 0。对于非叶子节点 j, M(j)=maxM(k)+d(k)|k是 j的孩子节点 。 在此公式中,要计算节点的 M值,必须先算出其所有子节点的 M值。 在计算 M值的过程中,对于某个节点 i,其有一个子节点 k满足 d(k)+M(k)大于容忍值,则应在 k处放置放大器,否则,从节点 i到某叶子节点的信号衰减量会超过容忍值,使得到达该叶子节点时信号不可用,而在节点 i处放置放大器并不能解决到达叶子节点的信号衰减问题。 例如,在图 10-9中,从节点 p到其所有叶子
12、节点的最大衰减值为 4。若容忍值为 3,则必须在 s处放置信号放大器,这样可使得节点 p的 M值为 2。同样,需要在节点小 v处放置信号放大器,如图 1010阴影节点 所示。若在某节点放置了信号放大器,则从该节点输出的信号与信号源输出的信号等价。 函数placeBoosters(TreeNode*root)的功能是:对于给定树型分布网络中各个节点,计算其信号衰减量的最大值,并确定应在树中的哪些节点放置信号放大器。 全局变量Tolerance保存信号衰减容忍值。 树的节点类型定义如下: typedef struct TreeNode int id; /*当前节点的识别号 */ int Child
13、Num; /*当前节点的子节点数目*/ int d; /*父节点到当前节点的信 号衰减值 */ struct TreeNode *childptr; /*向量,存放当前节点到其所有子节点的指针 */ int M; /*当前节点到其所有子节点的信号衰减值中的最大值 */ bool boost; /*是否在当前节点放置信号放大器的标志*/ TreeNode;【 C语言函数】 void placeBoosters(TreeNode *root) /* 计算 root所指节点处的衰减量,如果衰减量超出了容忍值,则放置放大器 */ TreeNode *p; int i, degradation; if(
14、 (1) ) degradation = 0; root- M = 0; i=0; if (i =root-ChildNum) return; p=(2); for(;i root- ChildNum i root- ChildNum & p; i+, p = (3) ) p- M = 0; (4) ; if (p- d+p- M Tolerance) /*在 p 所指节点中放置信号放大器 */ p- boost = true; p- M = 0; if (p- d + p- M degradation) degradation = p- d + p- M; root- M= (5) ; 分析
15、以上代码可知,指针 p用于指向子节点,其初始值应为第一个子节点“childptr0”的指针,因此空 (2)处应填入 “root- childptr0”,此后 p 依次指向下一个子节点,因此空 (3)处填入 “root- childpbtri”或 “p+”。 由于树结构是递归的,因此,可用递归方法计算所有子节点的信号衰减量。在设计思路上,应考虑节 点为叶子时的情况 (递归终止 )以及从子节点返回父节点后需要处理的情况。对于当前的子节点 (childptri),显然需要通过递归调用去处理,因此空 (4)处应填入 “placeBoosters(p)” 在计算 M值的过程中,对于某个节点 i,其有一个
16、子节点 k 满足 d(k)+M(k)大于容忍值 (p- d+p- M Tolerance),则应在 k处放置放大器 (p- boost true),否则,从节点 i到某叶子节点的信号衰减量会超过容忍值,使得到达该叶子节点时信号不可用,而在节点 i处放置放大器并不能解决到达叶子节点 的信号衰减问题。 当 root所指节点的所有子节点的信号衰减量最大值求出来并按要求放置信号放大器后,就可以记录该节点的信号衰减量最大值了,因此空 (5)处应填入“degradation”。 12 【正确答案】 (1) std (2) virtual void (3) virtual void (4) fiyBehav
17、ior (5) quackBehavior (6) flyBehavior- fly() (7) quackBehavior- quack() (8) FlyNoWay() (9) Squeak() 【试题解析】 C+标准的输出输入的命名空间为 std,在本题的代码中使用了cout,因此必须使用标准的命名空间,空 (1)处应该填写 std; FlyWithWings 和FlyNoWay类继承了 FlyBehavior,根据它们的成员函数 fly 的定义可知, fly 函数的返回值为 void,又因为 FlyBehavior中函数为纯虚拟函数,因此,空 (2)处应该填写 virtual void
18、,空 (3)处的原理和空 (2)相同; Duck是各种鸭子种类的基类,而每一种鸭子都具有飞行特征和发声特征,这两种特征分 别通过 FlyBehavior 和 QuackBehavior来实现,因此空 (4)和 (5)处应该为这两个类的对象或者指针 (这两个类为纯虚类,因此只能采用指针形式 )。每一种具体的鸭子种类的飞行特征和发声特征是不同的,因此,在每一种具体鸭子类的构造函数中需要指定其具有的飞行特征和发声特征,表 10-6已经指出了 RubberDuck 的这两种特征分别为FlyNoWay 和 Squeak,所以,通过构造相应类的对象来实现该特征。 13 【正确答案】 (1) interfa
19、ce (2) interface (3) flyBehavior (4) quackBehavior (5) flyBehavior.fly() (6) quackBehavior.quack() (7) abstract (8) FlyNoWay() (9) Squeak() 【试题解析】 FlyBehavior与 QuackBehavior分别表示抽象的飞行特征,它们仅仅规定了接口,因此空 (1)和 (2)应该填写 interface; Duck是各种鸭子种类的基类,而每一种鸭子都具有飞行特征和发声特征,这两种特征分别通过 FlyBehavior和QuackBehavior来实现,因此空 (3)和 (4)处应该为这两个类的对象引用, Duck的飞行动作和发声动作通过 abstract与其飞行特征对象和发声特征对象相关,所以,直接调用这两个类的飞行和发声动作即可。因为每一种 Duck的显示特征是不相同的,因此 display 方法应该为抽象的方法;每一种具体的鸭子种类的飞行特征和发声特征是不同的,因此,在每一种具体鸭子类的构造函数中需要指定其具有的飞行特征和发声特征。表 10-7已经指出了 RubberDuck 的这两种特征分别为FlyNoWay和 Squeak,所以,通过构造相 应类的对象来实现该特征。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1