201105软设下午真题
第 1 题
阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。
【说明】
某医院欲开发病人监控系统。该系统通过各种设备监控病人的生命体征,并在生命体征异常时向医生和护理人员报警。该系统的主要功能如下:
(1)本地监控:定期获取病人的生命体征,如体温、血压、心率等数据。
(2)格式化生命体征:对病人的各项重要生命体征数据进行格式化,然后存入日志文件并检查生命体征。
(3)检查生命体征:将格式化后的生命体征与生命体征范围文件中预设的正常范围进行比较。如果超出了预设范围,系统就发送一条警告信息给医生和护理人员。
(4)维护生命体征范围:医生在必要时(如,新的研究结果出现时)添加或更新生命体征值的正常范围。
(5)提取报告:在医生或护理人员请求病人生命体征报告时,从日志文件中获取病人生命体征生成体征报告,并返回给请求者。
(6)生成病历:根据日志文件中的生命体征,医生对病人的病情进行描述,形成病历存入病历文件。
(7)查询病历:根据医生的病历查询请求,查询病历文件,给医生返回病历报告。
(8)生成治疗意见:根据日志文件中的生命体征和病历,医生给出治疗意见,如处方等,并存入治疗意见文件。
(9)查询治疗意见:医生和护理人员查询治疗意见,据此对病人进行治疗。
现采用结构化方法对病人监控系统进行分析与设计,获得如图1-1所示的顶层数据流图和图1-2所示的0层数据流图。
图1-1 顶层数据流图
图1-2 0层数据流图
【问题1】(3分)
使用说明中的词语,给出图1-1中的实体E1~E3的名称。
【问题2】(4分)
使用说明中的词语,给出图1.2中的数据存储D1~D4的名称。
【问题3】 (6分)
图1-2中缺失了4条数据流,使用说明、图1-1和图1-2中的术语,给出数据流的名称及其起点和终点。
【问题4】(2分)
说明实体E1和E3之间可否有数据流,并解释其原因。
答案与解析
- 试题难度:较难
- 知识点:数据流图>数据流图
- 试题答案:
【问题1】(3分,各1分)
E1:病人 E2:护理人员 E3:医生
【问题2】 (4分,各1分).
D1:生命体征范围文件 D2:日志文件
D3:病历文件 D4:治疗意见文件
【问题3】(6分)
注:上表中各行次序无关,但每行的数据流名称(….表示不计分)、起点、终点必须相对应
【问题4】(2分)
E1和E3之间不可以有数据流,因为数据流的起点和终点中必须有一个是加工(处理)。
本题考查数据流图(DFD)的应用,是一种比较传统的题目,要求考生细心分析题目中所描述的内容。DFD是一种便于用户理解、分析系统数据流程的图形工具。是系统逻辑模型的重要组成部分。
解答这类问题,有以下两个原则:
(1)紧扣试题的系统说明部分,数据流图与系统说明有着严格的对应关系,系统说明部分的每一句话都能对应到图中,解题时可以一句一句地对照着图来分析。
(2)数据的平衡原则,这一点在解题过程中也是至关重要的。数据平衡原则有两方面的意思:一方面是分层数据流图中父子图之间的数据流平衡原则;另一方面是每张数据流图中输入与输出数据流的平衡原则。
【问题1】
本问题要求我们给出图1-1中的实体E1~E3的名称。这个需要我们从题目中的描述和该图来获得。题目中有信息描述:定期获取病人的生命体征,如体温、血压、心率等数据,我们结合顶层数据流图可知,E1为实体病人;另外,根据题目描述“将格式化后的生命体征与生命体征范围文件中预设的正常范围进行比较。如果超出了预设范围,系统就发送一条警告信息给医生和护理人员”,我们可以知道E2和E3他们分别可能是护理人员或医生,再结合描述“医生在必要时添加或更新生命体征值的正常范围”和顶层数据流图可知,E3是医生,那么E2就是护理人员。
【问题2】
本问题考查数据存储的确定。根据题目的描述“对病人的各项重要生命体征数据进行格式化,然后存入日志文件并检查生命体征”,结合0层数据流图我们可知D2为日志文件;根据题目描述“根据日志文件中的生命体征,医生对病人的病情进行描述,形成病历存入病历文件”,再结合0层数据流图我们可知D3为病历文件,并且确失生成病历至病历文件的数据流和日志文件至生成病历的数据流;根据题目描述“根据日志文件中的生命体征和病历,医生给出治疗意见,如处方等,并存入治疗意见文件”,再结合0层数据流图我们可知D4为治疗意见文件。在确定了上面三个文件后,题目中还剩下生命体征范围文件,很显然,D1就是生命体征范围文件。
【问题3】
本题主要考查数据流的查找,即要求我们找出0层数据流图中缺失的4条数据流。在问题2中,我们已经找到了生成病历至病历文件的数据流和日志文件至生成病历的数据流。
另外,根据数据流图的原则,即每个加工必须有输入流和输出流,我们可以找到加工本地监控只有输入数据流,而没有输出数据流,那么它肯定缺少一个输出数据流,而根据题目描述“对病人的各项重要生命体征数据进行格式化”我们可知,0层数据流图中应该缺少从本地监控至格式化生命体征的数据流重要生命体征,这样就是加工格式化生命体征也有了输入数据流。
最后一条缺失的数据流是从格式化生命体征至检查生命体征的数据流,这个可以根据题目描述“对病人的各项重要生命体征数据进行格式化,然后存入日志文件并检查生命体征”找出,在这个描述中明显的说到要将生命体征数据格式化后进行检查。这个数据流名称就为格式化后的生命体征。
【问题4】
根据上面的分析,我们已经知道E1和E3分别为病人和医生。显然他们都是实体,因此他们之间不能有数据流,因为数据流的起点和终点中必须有一个是加工。
第 2 题
阅读下列说明,回答问题l至问题3,将解答填入答题纸的对应栏内。
【说明】
某服装销售公司拟开发一套服装采购管理系统,以便对服装采购和库存进行管理。
【需求分析】
(1)采购系统需要维护服装信息及服装在仓库中的存放情况。服装信息主要包括:服装编码、服装描述、服装类型、销售价格、尺码和面料,其中,服装类型为销售分类,服装按销售分类编码。仓库信息包括:仓库编码、仓库位置、仓库容量和库管员。系统记录库管员的库管员编码、姓名和级别。一个库管员可以管理多个仓库,每个仓库有一名库管员。一个仓库中可以存放多类服装,一类服装可能存放在多个仓库中。
(2)当库管员发现有一类或者多类服装缺货时,需要生成采购订单。一个采购订单可以包含多类服装。每类服装可由多个不同的供应商供应,但具有相同的服装编码。采购订单主要记录订单编码、订货日期和应到货日期,并详细记录所采购的每类服装的数量、采购价格和对应的多个供应商。
(3)系统需记录每类服装的各个供应商信息和供应情况。供应商信息包括:供应商编码、供应商名称、地址、企业法人和联系电话。供应情况记录供应商所供应服装的服装类型和服装质量等级。一个供应商可以供应多类服装,一类服装可由多个供应商供应。库管员根据入库时的服装质量情况,设定或修改每个供应商所供应的每类服装的服装质量等级,作为后续采购服装时,选择供应商的参考标准。
【概念模型设计】
根据需求阶段收集的信息,设计的实体联系图(不完整)如图2-1所示。
图2-1 实体联系图
【逻辑结构设计】
根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整):
库管员(库管员编码,姓名,级别)
仓库信息( (1) ,仓库位置,仓库容量)
服装(服装编码,服装描述,服装类型,尺码,面料,销售价格)
供应商(供应商编码,供应商名称,地址,联系电话,企业法人)
供应情况( (2) ,服装质量等级)
采购订单( (3) )
采购订单明细(____(4) )
【问题1】(6分)
根据需求分析的描述,补充图2.1中的联系和联系的类型。
【问题2】(6分)
根据补充完整的图2-1,将逻辑结构设计阶段生成的关系模式中的空(1)~(4)补充完整,并给出其主键(用下划线指出)。
【问题3】(3分)
如果库管员定期需要轮流对所有仓库中的服装质量进行抽查,对每个仓库中的每一类被抽查服装需要记录一条抽查结果,并且需要记录抽查的时间和负责抽查的库管员。请根据该要求,对图2-1进行修改,画出修改后的实体间联系和联系的类型。
答案与解析
- 试题难度:较难
- 知识点:数据库设计>数据库设计
- 试题答案:
【问题1】(6分) ‘
(联系各1分,联系的类型各1分)【问题2】 (6分)
(每个空1分,主键各0.5分)
(1)仓库编码,库管员编码 主键:仓库编码
(2)供应商编码,服装编码 主键:供应商编码,服装编码
(3)订单编码,订货日期,应到货日期 主键:订单编码
(4)订单编码,服装编码,供应商编码,数量,采购价格 主键:订单编码,服装编码,供应商编码
【问题3】 (3分)
(联系“抽查”2分,联系的类型1分) - 试题解析:
本题考查数据库概念结构设计、概念至逻辑结构转换等内容。
此类题目要求考生认真阅读题目,根据题目的需求描述,给出实体间的联系。
【问题1】
本题主要考查根据题目描述补充完整ER图。
在本题中,根据题目描述“一个仓库中可以存放多类服装,一类服装可能存放在多个仓库中”,我们可以知道服装与仓库间存在多对多的联系“存放”;根据题目描述“一个供应商可以供应多类服装,一类服装可由多个供应商供应。”我们可以知道,供应商与服装之间存在多对多的供应关系;然后我们根据题目描述“一个采购订单可以包含多类服装。每类服装可由多个不同的供应商供应”可知,在服装、供应商和采购订单之间存在一个采购联系,其中三端都是多端。
【问题2】
该问题要我们补充完整各关系模式中缺失的属性并给出各关系模式的主键。要补充各关系模式缺失的属性应该根据题目的描述来完成。第1空是要我们补充仓库信息关系模式所缺失的属性,根据题目的描述,仓库信息包括:仓库编码、仓库位置、仓库容量和库管员,因此第1空应该填(仓库编码,库管员编码),这里用库管员编码而不用库管员的原因是库管员编码是库管员关系模式的主键,而本关系模式的主键是仓库编码。
第2空是要我们补充供应情况所缺失的属性,供应是供应商与服装之间的联系,而这里是一个多对多的联系,多对多的联系在转换为单独的关系模式时,属性包括两端实体的主键其自身的一些属性,因此第2空应该填(供应商编码,服装编码),而该关系模式的主键为(供应商编码,服装编码)。
第3空要与第4空一起来考虑。第3空要我们补充采购订单关系模式所缺失的属性,根据题目的描述,采购订单主要记录订单编码、订货日期和应到货日期,并详细记录所采购的每类服装的数量、采购价格和对应的多个供应商。这里由于有关系模式采购订单明细,所以第3空应该填(订单编码,订货日期,应到货日期),而第4空应该填(订单编码,服装编码,供应商编码,数量,采购价格)。而采购订单的主键为订单编码,另外,由于题目描述“一个采购订单可以包含多类服装。每类服装可由多个不同的供应商供应”,可知采购订单明细的主键为(订单编码,服装编码,供应商编码)。
【问题3】
本题描述“如果库管员定期需要轮流对所有仓库中的服装质量进行抽查”,我们可以知道抽查与库管员、仓库及服装这三个实体有关系,而且三端都是多端。这样就很容易画图ER图(见试题答案)。
第 3 题
阅读下列说明和图,回答问题l至问题3,将解答填入答题纸的对应栏内。
【说明】
一个简单的图形编辑器提供给用户的基本操作包括:创建图形、创建元素、选择元素以及删除图形。图形编辑器的组成及其基本功能描述如下:
(1)图形由文本元素和图元元素构成,图元元素包括线条、矩形和椭圆。
(2)显示在工作空间中,一次只能显示一张图形(即当前图形,current)。
(3)提供了两种操作图形的工具:选择工具和创建工具。对图形进行操作时,一次只能使用一种工具(即当前活动工具,active)
① 创建工具用于创建文本元素和图元元素。
② 对于显示在工作空间中的图形,使用选择工具能够选定其中所包含的元素,可以选择一个元素,也可以同时选择多个元素。被选择的元素称为当前选中元素( selected)。
③ 每种元素都具有对应的控制点。拖拽选定元素的控制点,可以移动元素或者调整元素的大小。
现采用面向对象方法开发该图形编辑器,使用UML进行建模。构建出的用例图和类图分别如图3-1和3-2所示。
图3-1 用例图
图3-2 类图
【问题1】 (4分)
根据说明中的描述,给出图3-1中U1和U2所对应的用例,以及(1)和(2)处所对应的关系。
【问题2】(8分)
根据说明中的描述,给出图3.2中缺少的C1~C8所对应的类名以及(3)~(6)处所对应的多重度。
【问题3】(3分)
图3-2中的类图设计采用了桥接(Bridge)设计模式,请说明该模式的内涵。
答案与解析
- 试题难度:较难
- 知识点:UML建模>用例图
- 试题答案:
【问题1】
UI:移动元素 U2:调整元素大小(Ul和U2的答案可以互换)
(1)<<extend>> (2)<<extend>>
【问题2】
C1:创建工具 C2:选择工具 C3:线条工具 C4:矩形工具
C5:椭圆工具 C6:线条 C7:矩形 C8:椭圆
注:C3~C5的答案可以互换;C6-C8的答案可以互换。
(3)0..1 (4)1 (5)1 (6)1..*
【问题3】
桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化,对一个抽象的实现部分的修改应该对使用它的程序不产生影响。 - 试题解析:
本题考查面向对象开发相关知识,涉及UML用例图、类图以及类图设计时的设计模式。UML目前在面向对象软件开发中广泛使用,是面向对象软件开发考查的重要内容。
【问题1】
本题主要考查用例图。
用例之间的关系主要有以下三种:
(1)包含关系。当可以从两个或两个以上的用例中提取公共行为时,应该使用包含关系来表示它们。用《include》表示。
(2)扩展关系。如果一个用例明显地混合了两种或两种以上的不同场景,即根据情况可能发生多种分支,则可以将这个用例分为一个基本用例和一个或多个扩展用例,这样使描述可能更加清晰。用《extend》表示。
(3)泛化关系。当多个用例共同拥有一种类似的结构和行为的时候,可以将它们的共性抽象成为父用例,其他的用例作为泛化关系中的子用例。
在本题中,从用例图中,我们不难看出U1和U2都与选择元素用例有关系。然后根据题目的描述,可知U1和U2应该分别是移动元素和调整元素的大小,这里我们假定U1是移动元素用例,而U2是调整元素的大小用例。那么接着我们再来确定空(1)与空(2)的内容。这里很显然U1和U2与选择元素用例的关系是扩展关系,因此空(1)与空(2)都应该填<<extend>>。
【问题2】
本问题考查类图。对于这个题目,我们应该结合题目的描述及给出的类图来求解。从题目给出的类图中我们可以看出,C1和C2是继承(泛化)于工具类的,而题目描述告诉我们系统提供了两种操作图形的工具,即选择工具和创建工具,因此C2与C2应该分别是选择工具和创建工具之一,然后我们可以看到文本工具类是继承于C1的,结合题目描述“创建工具用于创建文本元素和图元元素”,我们可以知道C1应该为创建工具类,而C2应该为选择工具类,另外,根据题目描述“图元元素包括线条、矩形和椭圆”,可以知道C6至C8应该分别是线条类、矩形类及椭圆类,当然这三者的答案可以互换。而要能得到这些图形元素,就应该有相应的画图工具,因此C3至C5应该分别是线条工具类、矩形工具类及椭圆工具类,这三者的答案也可以互换。
在UML中,多重度又称重复度,多重度表示为一个整数范围n..m,整数n定义所连接的最少对象的数目,而m则为最多对象数(当不知道确切的最大数时,最大数用*号表示)。最常见的多重性有0..1、0..*、1..1和1..*,而*与0..*是等价的。
由于一个图形编辑器实例可以有一个工具实例,当然也可以没有工具实例,而一个工具实例只能属于一个图形编辑器实例,因此空(3)与空(4)分别为0..1和1。而一个图形至少需要包含一个图形元素,也可以包含多个图形元素,而一个图形元素实例只能属于一个图形实例,所以空(5)与空(6)应该分别是1和1..*。
【问题3】
本问题主要考查桥接模式的基本内容。
桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化,对一个抽象的实现部分的修改应该对使用它的程序不产生影响。
第 4 题
阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。
【说明】
某应用中需要对100000个整数元素进行排序,每个元素的取值在0~5之间。排序算法的基本思想是:对每一个元素x,确定小于等于x的元素个数(记为m),将x放在输出元素序列的第m个位置。对于元素值重复的情况,依次放入第m-1、m-2、…个位置。例如,如果元素值小于等于4的元素个数有10个,其中元素值等于4的元素个数有3个,则4应该在输出元素序列的第10个位置、第9个位置和第8个位置上。算法具体的步骤为:
步骤1:统计每个元素值的个数。
步骤2:统计小于等于每个元素值的个数。
步骤3:将输入元素序列中的每个元素放入有序的输出元素序列。
【C代码】
下面是该排序算法的C语言实现。
(1)常量和变量说明
R: 常量,定义元素取值范围中的取值个数,如上述应用中R值应取6
i:循环变量
n:待排序元素个数
a:输入数组,长度为n
b:输出数组,长度为n
c:辅助数组,长度为R,其中每个元素表示小于等于下标所对应的元素值的个数。
(2)函数sort
1 void sort(int n,int a[],int b[]){
2 int c[R],i;
3 for (i=0;i< (1) :i++){
4 c[i]=0;
5 }
6 for(i=0;i<n;i++){
7 c[a[i]] = (2) ;
8 }
9 for(i=1;i<R;i++){
10 c[i]= (3)
11 }
12 for(i=0;i<n;i++){
13 b[c[a[i]]-1]= (4) ;
14 c[a[i]]=c[a[i]]-1;
15 }
16 }
【问题1】(8分)
根据说明和C代码,填充C代码中的空缺(1)~(4)。
【问题2】(4分)
根据C代码,函数的时间复杂度和空间复杂度分别为 (5) 和 (6) (用O符号表示)。
【问题3】(3分)
根据以上C代码,分析该排序算法是否稳定。若稳定,请简要说明(不超过100字);若不稳定,请修改其中代码使其稳定(给出要修改的行号和修改后的代码)。
答案与解析
- 试题难度:较难
- 知识点:数据结构与算法应用>其它
- 试题答案:
【问题1】
(1)R
(2)c[a[i]]+1
(3)c[i]+c[i -1]
(4)a[i]
【问题2】
(5)O(n+R)或者O(n)或n或线性
(6)O(n+R)或者O(n)或n或线性
【问题3】
不稳定。修改第12行的for循环为:for(i=n-1;i>=0;i--)即可。 - 试题解析:
【问题1】
本题考查排序的相关内容。
题目告诉我们排序算法的基本思想是:对每一个元素x,确定小于等于x的元素个数(记为m),将x放在输出元素序列的第m个位置。对于元素值重复的情况,依次放入第m-1、m-2、…的位置。而且题目告诉我们算法的步骤。
下面我们来具体分析本试题。第(1)空所处的位置为函数sort()中第一个for循环中,从题目的描述和程序不难看出该循环的作用是给数组c赋初值,而根据题目描述可知数组c是一个辅助数组,长度为R,因此第一空应填R。
第(2)空在函数sort()中的第二个for循环中,很显然第(2)空是给数组c赋值,而且其下标为数组a的相应的元素值。再根据题目的描述“c数组中每个元素表示小于等于下标所对应的元素值的个数”,很显然,这个for循环的作用是统计每个元素值的个数,因此第(2)空的答案应该是c[a[i]]+1。
第(3)空在第三个for循环中,而且第(3)空是调整数组c的值,根据题目提供的算法的步骤,我们可知,这个时候应该要统计小于等于每个元素值的个数,而等于的元素个数记录在c[i]中,小于的元素个数记录在c[i-1]中,因此第(3)空的答案是c[i]+ c[i-1]。
第(4)空在最后一个for循环中,按题目要求,我们可以知道该for循环应该完成剩余的步骤3,即将输入元素序列中的每个元素放入有序的输出元素序列。而第(4)空是给数组b赋值,题目告诉我们b是输出数组,而a是输入数组,那么应该是将a中的值赋值值b中,因此第(4)空的答案应该为a[i]。
【问题2】
本题主要考查时间复杂度与空间复杂度的分析。
首先我们来看空间复杂度,空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。在sort()函数中,声明了两个整型变量n和i(可忽略),两个整型数组b和c,而a不属于函数sort的临时空间,因此函数sort()的空间复杂度为O(n+R),这里由于在本题中R的值为6,因此也可以忽略,所以答案也可以是O(n)。
接着我们来分析时间复杂度,时间复杂度是度量算法执行的时间长短,函数sort()中有并列的四个循环,其中有两个循环n次,而另外两个分别循环R-1和R次,因此时间复杂度应该为O(n+R),由于R的值为6,这里可以忽略,因此答案也可以是O(n)。
【问题3】
所谓稳定性是指两个关键字相等的元素在排序前后的相对位置不发生变化,一般来讲,只要排序过程中比较和移动操作发生在相邻的元素间,排序方法是稳定的。本题中的排序是不稳定的,可以修改第12行的for循环为:for(i=n-1;i>=0;i--)即可。
第 5 题
阅读下列说明和C++代码,将应填入空(n)处的字句写在答题纸的对应栏内。(15分)
【说明】
某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如下图所示。
图5-1 菜单结构图
现在采用组合(Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中增加新的餐饮形式,得到如下图所示的类图。其中MenuComponent为抽象类,定义了添加(add)新菜单和打印饭店所有菜单信息(print)的方法接口。类Menu表示饭店提供的每种餐饮形式的菜单,如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图中的甜点菜单。类MenuItem表示菜单中的菜式。
图5-2 类图
【C++代码】
#include<iostream>
#include<list>
#include <string>
using namespace std;
class MenuComponent{
protected: string name;
public:
MenuComponent(string name){ this->name= name;)
string getName(){ return name;)
(1) ; //添加新菜单
virtual void print()=0;//打印菜单信息
};
class Menultem: public MenuComponent{
private:double price;
public:
Menultem(string name, double price):MenuComponent(name){ this->price= price;
double getPrice(){ return price;)
void add(MenuComponent* menuComponent){ retum;}//添加新菜单
void print(){ cout<<" " <<getName()<<","<<getPrice()<<endl;)
};
class Menu:public MenuComponent{
private: list< (2) > menuComponents;
public:
Menu(string name): MenuComponent(name){}
void add(MenuComponent* menuComponent) //添加新菜单
{ (3) ; }
void print(){
cout<<"\n"<<getName()<<"\n-------------------"<<endl;
std::list<MenuComponent *>::iterator iter,
for(iter= menuComponents.begin(); iter!=menuComponents.end(); iter++)
(4) ->print();
}
};
void main(){
MenuComponent* alIMenus= new Menu("ALL MENUS");
MenuComponent* dinerMenu= new Menu("DINER MENU");
……//创建更多的Menu对象,此处代码省略
alIMenus->add(dinerMenu); //将dinerMenu添加到餐厅菜单中
……//为餐厅增加更多的菜单,此处代码省略
(5) ->print(); //打印饭店所有菜单的信息
答案与解析
- 试题难度:较难
- 知识点:面向对象程序设计>C++程序设计
- 试题答案:
(1) virtual void add(MenuComponent* menuComponent)=0
(2) MenuComponent*
(3) menuComponents.push_back(menuComponent)
(4) (*iter)
(5) allMenus
- 试题解析:
本题考查基本面向对象设计模式的运用能力。
组合设计模式主要是表达整体和部分的关系,并且对整体和部分对象的使用无差别。由UML结构图知MenuComponent是MenuItem类和Menu类的父类,它抽象了两个类的共有属性和行为。在使用中,无论是MenuItem对象还是Menu对象,都可被当作MenuComponent对象来使用。另外由UML结构图可知,类MenuComponent和Menu之间存在共享关系,即Menu对象可以共享其它的Menu对象和MenuItem对象。
第(1)空是要在类MenuComponent中定义添加新菜单的方法,即add方法,而类MenuComponent是抽象类,因此该方法也应该是抽象方法,及需要加关键字virtual,因此空(1)应填virtual void add(MenuComponent* menuComponent)=0,而第(2)空很明显应该填MenuComponent*;空(3)是要实现Menu类下的add函数,而根据题目描述“每种菜单中都可以添加子菜单”,因此这里要实现添加子菜单,因此本空应填menuComponents.push_back(menuComponent)。在类Menu类下的print函数中,定义了对象iter,因此第4空可以通过这个对象来引用print()方法,因此第(4)空答案应该填(*iter)。而第5空为了能打印饭店所有菜单的信息,应该填alIMenus。
第 6 题
阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如下图所示。
图6-1 菜单结构图
现在采用组合( Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中增加新的餐饮形式,得到如下图所示的类图。其中MenuComponent为抽象类,定义了添加(add)新菜单和打印饭店所有菜单信息(print)的方法接口。类Menu表示饭店提供的每种餐饮形式的菜单,如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图中的甜点菜单。类Menultem表示菜单中的菜式。
图6-2 类图
【Java代码】
import java.util.*;
(1) MenuComponent{
protected String name;
(2) ;//添加新菜单
public abstract void print(); //打印菜单信息
public String getName(){ return name;}
}
class Menultem extends MenuComponent{
private double price;
public MenuItem(String name, double price){
this.name= name; this.price= price;
}
public double getPrice(){return price;)}
public void add(MenuComponent menuComponent){ return;}//添加新菜单
public void print(){
System.out.print(" "+ getName());
System.out.println(","+ getPrice());
}
}
class Menu extends MenuComponent{
private List<MenuComponent> menuComponents= new ArrayList<MenuComponent>();
public Menu(String name){ this.name= name;)
public void add(MenuComponent menuComponent){//添加新菜单
menuComponents. (3);
}
public void print(){
System.out.print("\n"+ getName());
System.out.println(","+"---------------");
Iterator iterator = menuComponents.iterator();
while(iterator.hasNext()){
MenuComponent menuComponent= (MenuComponent)iterator.next();
(4) ;
}
}
}
class MenuTestDrive{
public static void main(String args[]){
MenuComponent aIIMenus= new Menu("ALL MENUS");
MenuComponent dinerMenu = new Menu("DINER MENU”);
……//创建更多的Menu对象,此处代码省略
allMenus.add(dinerMenu); //将dinerMenu添加到餐厅菜单中
……//为餐厅增加更多的菜单,此处代码省略
(5); //打印饭店所有菜单的信息
}
}
答案与解析
- 试题难度:一般
- 知识点:面向对象程序设计>Java程序设计>组合模式
- 试题答案:
(1) abstract class或public abstract class
(2) public abstract void add(MenuComponent menuComponent)
或abstract void add(MenuComponent menuComponent)
或protected abstract void add(MenuComponent menuComponent)
(3) add(menuComponent)
(4) menuComponent.print()
(5) aIIMenus.print() - 试题解析:
本题考查基本面向对象设计模式的运用能力。
组合设计模式主要是表达整体和部分的关系,并且对整体和部分对象的使用无差别。由UML结构图知MenuComponent是MenuItem类和Menu类的父类,它抽象了两个类的共有属性和行为。在使用中,无论是MenuItem对象还是Menu对象,都可被当作MenuComponent对象来使用。另外由UML结构图可知,类MenuComponent和Menu之间存在共享关系,即Menu对象可以共享其它的Menu对象和MenuItem对象。
第(1)空是要在类MenuComponent定义前加一个关键字,而类MenuComponent是抽象类,因此空(1)应填abstract class或public abstract class,而第(2)空是要定义添加新菜单的方法,该方法应该是抽象方法,因此第(2)空的答案应该是public abstract void add(MenuComponent menuComponent);空(3)是要实现Menu类下的add函数,而根据题目描述“每种菜单中都可以添加子菜单”,因此这里要实现添加子菜单,因此本空应填add(menuComponent)。在空(4)需要调用print()方法,因此空(4)处应填menuComponent.print()。而第5空为了能打印饭店所有菜单的信息,应该填aIIMenus.print()。