1、软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 71及答案与解析 一、必答题(共 4道大题,每道大题 15分) 0 阅读下列说明和图,回答问题 1至问题 4,将解答填入答题纸的对应栏内。 【说明】 某高校欲开发一个成绩管理系统,记录并管理所有选修课程的学生的平时成绩和考试成绩,其主要功能描述如下。 (1)每门课程都由 3到 6个单元构成,每个单元结束后会进行一次测试,其成绩作为这门课程的平时成绩。课程结束后进行期末考试,其成绩作为这门课程的考试成绩。 (2)学生的平时成绩和考试成绩均由每门课程的主讲教师上 传给成绩管理系统。 (3)在记录学生成绩之前,系统需要验证这些成绩是否有效。
2、首先,根据学生信息文件来确认该学生是否选修这门课程,若没有,那么这些成绩是无效的;如果他的确选修了这门课程,再根据课程信息文件和课程单元信息文件来验证平时成绩是否与这门课程所包含的单元相对应,如果是,那么这些成绩是有效的,否则无效。 (4)对于有效成绩,系统将其保存在课程成绩文件中。对于无效成绩,系统会单独将其保存在无效成绩文件中,并将详细情况提交给教务处。在教务处没有给出具体处理意见之前,系统不会处理这些成绩。 (5)若一门课程的 所有有效的平时成绩和考试成绩都已经被系统记录,系统会发送课程完成通知给教务处,告知该门课程的成绩已经齐全。教务处根据需要,请求系统生成相应的成绩列表,用来提交考试
3、委员会审查。 (6)在生成成绩列表之前,系统会生成一份成绩报告给主讲教师,以便核对是否存在错误。主讲教师须将核对之后的成绩报告返还系统。 (7)根据主讲教师核对后的成绩报告,系统生成相应的成绩列表,递交考试委员会进行审查。考试委员会在审查之后,上交一份成绩审查结果给系统。对于所有通过审查的成绩,系统将会生成最终的成绩单,并通知每个选课学生。 现采用 结构化方法对这个系统进行分析与设计,得到如题图 1 1所示的顶层数据流图和题图 1 2所示的 0层数据流图。1 使用说明中的词语,给出题图 1 1中的外部实体 E1 E4的名称。 2 使用说明中的词语,给出题图 1 2中的数据存储 D1 D5的名称
4、。3 数据流题图 1 2缺少了三条数据流,根据说明及数据流题图 1 1提供的信息,分别指出这三条数据流的起点和终点。4 数据流图是在系统分析与总体设计阶段宏观地描述系统功能需求的重要图形化工具,程序流程图也是软件开发过程中比较常用的图形化工具。简要说明程序流 程图的适用场合与作用。 4 阅读下列说明,回答问题 1至问题 3,将解答填入答题纸的对应栏内。 【说明】 某医院的门诊管理系统实现了为患者提供挂号、处方药品收费的功能。具体的需求及设计如下。 (1)医院医师具有编号、姓名、科室、职称、出诊类型和出诊费用,其中出诊类型分为专家门诊和普通门诊,与医师职称无关;各个医师可以具有不同的出诊费用,与
5、职称和出诊类型无关。 (2)患者首先在门诊挂号处挂号,选择科室和医师,根据选择的医师缴纳挂号费 (医师出诊费 )。收银员为患者生成挂号单,如题表 2-1所示,其中,就诊类型为医师的 出诊类型。(3)患者在医师处就诊后,凭借挂号单和医师手写处方到门诊药房交费买药。收银员根据就诊号和医师处方中开列的药品信息,查询药品库 (如题表 2-2所示 ),并生成门诊处方单 (如题表 2-3所示 )。(4)由于药品价格会发生变化,因此,门诊管理系统必须记录处方单上药品的单价。根据需求阶段收集的信息,设计的实体联系图和关系模式 (不完整 )如题图 2-1所示。 实体联系图。 关系模式。 挂号单 (就诊号,病患姓
6、名,医师编号,时间, _(5) 收银员 (编号,姓名,级别 ) 医师 (编号,姓名,科室,职称,出 诊类型,出诊费用 ) 门诊处方(_(6),收银员,时间 ) 处方明细 (就诊号, _(7) 药品库 (药品编码,药品名称, _(8) 5 根据问题描述,填写题图 2-1实体联系图中 (1) (4)处联系的类型。 6 题图 2-1中还缺少几个联系 ?请指出每个联系两端的实体名,格式如下: 实体 1:实体 2 例如,收银员与门诊处方之间存在联系,表示为:收银员:门诊处方或门诊处方:收银员。 7 根据实体联系题图 2-1,填写挂号单、门诊处方、处方明细和药品库关系模式中的空 (5) (8)处 ,并指出
7、挂号单、门诊处方和处方明细关系模式的主键。 7 阅读下列说明和图,回答问题 1至问题 4,将解答填入答题纸的对应栏内。 【说明】 已知某唱片播放器不仅可以播放唱片,而且可以连接电脑并把电脑中的歌曲刻录到唱片上 (同步歌曲 )。连接电脑的过程中还可自动完成充电。 关于唱片,还有以下描述信息。 (1)每首歌曲的描述信息包括:歌曲的名字、谱写这首歌曲的艺术家以及演奏这首歌曲的艺术家。只有两首歌曲的这三部分信息完全相同时,才认为它们是同一首歌曲。艺术家可能是一名歌手或一支由 2名或 2名以上的歌手所组成的乐队。一名歌 手可以不属于任何乐队,也可以属于一个或多个乐队。 (2)每张唱片由多条音轨构成;一条
8、音轨中只包含一首歌曲或为空,一首歌曲可分布在多条音轨上;同一首歌曲在一张唱片中最多只能出现一次。 (3)每条音轨都有一个开始位置和持续时间。一张唱片上音轨的次序是非常重要的,因此对于任意一条音轨,播放器需要准确地知道,它的下一条音轨和上一条音轨是什么 (如果存在的话 )。 根据上述描述,采用面向对象方法对其进行分析与设计,得到了如题表 3-1所示的类列表、如题图 3-1所示的初始类图以及如题图 3-2所示的描述播放器行为的 UML状态图 。 8 根据说明中的描述,使用题表 3 1给出的类的名称,给出题图 3 1中的 A F所对应的类。 9 根据说明中的描述,给出题图 3 1中 (1) (6)处
9、的多重度。 10 题图 3 1中缺少了一条关联,请指出这条关联两端所对应的类以及每一端的多重度。 11 根据题图 3 2所示的播放器行为 UML状态图,给出从 “关闭 ”状态到 “播放 “状态所经过的最短事件序列 (假设电池一开始就是有电的 )。 12 阅读下列说明和 C语言函数,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】 在一个分布网络中,资源 (石 油、天然气、电力等 )可从生产地送往其他地方。在传输过程中,资源会有损耗。例如,天然气的气压会减少,电压会降低。我们将需要输送的资源信息称为信号。在信号从信源地送往消耗地的过程中,仅能容忍一定范围的信号衰减,称为容忍值。分布网络可
10、表示为一个树形结构,如题图4-1所示。信号源是树根,树中的每个节点 (除了根 )表示一个可以放置放大器的子节点,其中某些节点同时也是信号消耗点,信号从一个节点流向其子节点。每个节点有一个 d值,表示从其父节点到该节点的信号衰减量。例如,在题图 4-1中,节点 w、 p、 q的 d值分别为 2、 1、 3,树根节点表示信号源,其 d值为 0。 每个节点有一个 M值,表示从该节点出发到其所有叶子的信号衰减量的最大值。显然,叶子节点的 M值为 0。对于非叶子 j, M(j)=maxM(k)+d(k) k是 j的孩子节点 。在此公式中,要计算节点的 M值,必须先算出其所有子节点的 M值。 在计算 M值
11、的过程中,对于某个节点 i,其有一个子节点 k满足 d(k)+M(k)大于容忍值,则应在 k处放置放大器,否则,从节点 i到某叶子节点的信号衰减量会超过容忍值,使得到达该叶子节点时信号不可用,而在节点 i处放置放大器并不能解决到达叶子节点的信号衰 减问题。例如,在题图 4-1中,从节点 p到其所有叶子节点的最大衰减值为 4。若容忍值为3,则必须在 s处放置信号放大器,这样可使得节点 p的 M值为 2。同样,需要在节点 q、 v处放置信号放大器,如题图 4-2阴影节点所示。若在某节点放置了信号放大器,则从该节点输出的信号与信号源输出的信号等价。函数placeBoosters(TreeNode*r
12、oot)的功能是:对于给定树形分布网络中各个节点,计算其信号衰减量的最大值,并确定应在树中的哪些节点放置信号放大器。 全局变量Tolerance保存信号衰减容忍值。树的节点类型 定义如下: typedef struct TreeNode int id; *当前节点的识别号 * int ChildNum; *当前节点的子节点数目 * int d; *父节点到当前节点的信号衰减值 * struct TreeNode* childptr; *向量,存放当前节点到其所有子节点的指针 * int M; *当前节点到其所有子节点的信号衰减值中的最大值 * bool boost; *是否在当前节点放置信号放
13、大器的标志 * TreeNode; 【 C语言函数】 Void placeBoosters(TreeN0de *root) *计算 root所指节点处的衰减量,如果衰减量超出容忍值,则放置放大器 * TreeNode *p; int i,degradation; if(_(1) degradation=0; root- M=0; i=0; if(i =root- ChildNum) return; p=_(2); for(; i root- childNum 13 阅读下列说明和 C+代码,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】 已知某企业的采购审批是分级进行的,即根据采购金
14、额的不同由不同层次的主管人员来审批,主任可以审批 5万元以下 (不包括 5万元 )的采购单,副董事长可以审批 5万元至 10万元 (不包括 10万元 )的采购 单,董事长可以审批 10万元至 50万元 (不包括 50万元 )的采购单, 50万元及以上的采购单就需要开会讨论决定。 采用责任链设计模式 (Chain of Responsibility)对上述过程进行设计后得到的类图如题图 5 1所示。【 C+代码】 #include string #include iostream using namespace std; class PurchaseRequest public: double
15、Amount; 一个采购的金额 int Number; 采购单编号 string Purpose; 采购目的 ;class Approver 审批者类 public: Approver()successor=NULL; virtual void ProcessRequest(PurchaseRequest aRequest) if(successor!=NULL) successor-_(1); void SetSuccessor(Approver*aSuccessor)successor=aSuccessor; private: _(2)successor;; class Congress:
16、 public Approverpublic: void ProcessRequest(PurchaseRequest aRequest) if faRequest imount =500000) *决定是否审批的代码省略 * else _(3) ProcessRequest(aRequest); ;clasd mirector: public Approverpublic: void ProcessRequest(PurchaseRequest aRequest) *此处代码省略 * ;class President: public Approverpublic: void ProcessR
17、equest(PurchaseRequest aRequest) *此处代码省略 * ;class VicePresident: public Approverpublic: void ProcessRequest(PurchaseRequest aRequest) *此处代码省略 * ;void main() Congress Meeting; VicePresident Sam; Director Larry; President Tammy; 构造责任链 Meeting SetSuccessor(NULL); Sam SetSuccessor(_(4); Tammy SetSuccess
18、or(_(5); Larry SetSuccessor(_(6); PurchaseRequest aRequest; 构造一采购审批请求 cin aRequest Amount; 输入采购请求的金额 _(7) ProcessRequest(aRequest); 开始审批 return; 14 阅读下列说明和 Java代码,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】 已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批 5万元以下 (不包括 5万元 )的采购单,副董事长可以审批 5万元至 10万元 (不包括 10万元 )的采购单,董事长可
19、以审批 10万元至 50万元 (不包括 50万元 )的采购单, 50万元及以上的采购单就需要开会讨论决定。 采用责任链设计模式 (Chain of Responsibility)对上述过程进行设计后得到的类图如题图 6-1所示。【 Java代码】 class PurchaseRequest public double Amount; 一个采购的金额public int Number; 采购单编号 public String Purpose; 采购目的 ;class Approver 审批者类 public Approver() successor=null; public void Proce
20、ssRequest(PurchaseRequest aRequest) if(successor!=null)successor _(1); public void SetSucces sor(Approver aSuccesssor)successor=aSuccesssor; private _(2) successor;class CongresS extends Approver public void ProcessRequest(PurchaseRequest aRequest) if(aRequest Amount =500000) *决定是否审批的代码省略 * else _(3
21、) ProcessRequest(aRequest); ; class Director extends Approver public void ProcessRequest(PurchaseRequest aRequest) *此处代码省略 * ; class President extends Approver public void Proces sRequest(PurchaseRequest aRequest) *此处代码省略 * ; class VicePresident extends Approver public void ProcessRequest(PurchaseRe
22、quest aRequest) *此处代码省略 * ; public class rs public static void main(String args)throws IOException Congress Meeting=new Congress(); VicePresident Sam=new VicePresident(); Director Larry=new Director(); President Tammy=new President(); 构造责任链 Meeting SetSuccessor(null);Sam SetSucces sor(_(4) ); Tammy
23、SetSuccessor(_(5); Larry SetSuccessor(_(6); 构造一采购审批请求 PurchaseRequest aRequest =new PurchaseRequest(); BufferedReader br=new BufferedReader(new InputStreamReader(System in); aRequest Amount=Double parseDouble(br readLine(); _(7) ProcessRequest(aRequest); 开始审批 return; 软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 71
24、答案与解析 一、必答题(共 4道大题, 每道大题 15分) 1 【正确答案】 E1:考试委员会 E2:主讲教师 E3:学生或选课学生 E4:教务处 【试题解析】 外部实体是在系统边界之外的个人和组织,它提供数据,或者接受数据输出。根据主要功能描述,学生成绩 “均由每门课程的主讲教师上传给成绩管理系统 ”,所以主讲教师是一个外部实体,根据顶层数据流图,得知 E2为主讲教师。由 “对于无效成绩,系统会单独将其保存在无效成绩文件中,并将详细情况提交给教务处 ”、成绩 “已经被系统记录,系统会发送课程完成通知给教务处,告知该门课程的成绩已经齐全 ”可知, E4为教务处 。由 “根据主讲教师核对后的成绩
25、报告,系统生成相应的成绩列表,递交考试委员会进行审查。考试委员会在审查之后,上交一份成绩审查结果给系统 ”可知, E1为考试委员会。由 “对于所有通过审查的成绩,系统将生成最终的成绩单,并通知每个选课学生 ”可知, E3为选课学生。 2 【正确答案】 D1:学生信息文件 D2:课程单元信息文件 D3:课程信息文件 D4:课程成绩文件 D5:无效成绩文件 注: D2和 D3的答案可以互换。 【试题解析】 数据存储是保存数据的地方,将来一个或者多个过程会访问这些数据。根据 0层数据流图,在 “验证学生信息 ”处有 3个数据输入,由 “在记录学生成绩之前,系统需要验证这些成绩是否有效。首先,根据学生
26、信息文件来确认该学生是否选修这门课程,若没有,那么这些成绩是无效的;如果他的确选修了这门课程,再根据课程信息文件和课程单元信息文件来验证平时成绩是否与这门课程所包含的单元相对应,如果是,那么这些成绩是有效的,否则无效 ”可知,验证时需要学生信息文件、课程单元信息文件、课程信息文件共 3个文件。在 “生成成绩列表 ”处也要利用到 D1文件,这里已输入了成绩审查结果、核对后的成绩报告,只缺学生信息文件,所以 D1为学生信息文件; D2和 D3分别为课程单元信息文件和课程信息文件。 D4是 “记录有效成绩 ”的一个输出文件,由 “对于有效成绩,系统将其保存在课程成绩文件中 ”可知, D4为课程成绩文
27、件。 D5则为无效成绩文件。 3 【正确答案】 起点: D4或课程成绩文件 终点: 4或生成成绩列表 起点: D1或学生信息文件 终点: 5或生成最终成绩单 起点: 4或生成成绩列表 终点: 5或生成最终成绩单 【试题解析】 在 0层数据流图中的 “4生成成绩列表 ”处没有课程成绩文件输入,不可能生成成绩列表,所以在此处缺少一 条从 “D4课程成绩文件 ”到 “4生成成绩列表 ”的数据流。 “5生成最终成绩单 ”没有任何输入,不符合数据输入输出平衡,由“根据主讲教师核对后的成绩报告,系统生成相应的成绩列表,递交考试委员会进行审查。考试委员会在审查之后,上交一份成绩审查结果给系统。对于所有通过审
28、查的成绩,系统将会生成最终的成绩单 ”可知,根据学生信息文件和成绩列表才能生成最终成绩单,所以还应补充从 “D1学生信息文件 ”到 “5生成最终成绩单 ”的数据流和从 “4生成成绩列表 ”到 “5生成最终成绩单 ”的数据流。 4 【正确答案】 程序流程图通常在进行详细设计时使用,用来描述程序的逻辑结构。 【试题解析】 程序流程图通常在进行详细设计时使用,用来描述程序的逻辑结构(功能需求 )。 5 【正确答案】 (1)1分 (2)*或 n或 m (3)*或 n或 m (4)*或 n或 m 【试题解析】 该问题是求实体间的联系,这类问题主要通过 “生活常识 ”+“系统描述 ”解题。由 _一名医师在
29、不同时间段可以给多个病人看病,也就可以开多张门诊处方,而一张门诊处方由一名医师开出,所以医师实体与门诊处方实体之间的“开处方 ”联系的类型为一对多 (1: n)。所以空 (1)处为 1,空 (2)处为 n。由于一张门诊处方包含多种库存中的药品 (如 “医院门诊处方单 ”所示 ),一种库存中的药品也可以在多张门诊处方中,所以门诊处方实体与药品库实体之间联系的类型为多对多 (m: n)。空 (3)处和空 (4)处均为 n。 6 【正确答案】 缺少的联系数: 3 挂号单:收银员;挂号单:医师;挂号单:门诊处方 【试题解析】 根据 “医院门诊挂号单 ”可以看出,挂号单由收银员进行收费,同时收银员的编号
30、记录到了该挂号单中,因此挂号单实体与收银员实体之间存在联系 挂号单:收银员 。病人挂某个医师的号,将挂号信息记录在挂号单实体中,因此挂号单实体与医师实体之间存在联系 挂号单:医师。收银员根据挂号单和医师的手写处方生成门诊处方,所以挂号单实体与门诊处方实体之间存在联系 挂号单:门诊处方。 7 【正确答案】 (5)收银员 (6)就诊号 (7)药品编码,数量,单价 (8)类型,库存,货架编号,单位,价格,单价 挂号单主键:就诊号;门诊处方主键:就诊号;处方明细主键:就诊号,药品编码 【试题解析】 本问题考查将 E-R模型转换为关系模式。在此转换过程中,每一个实体转成 一个关系模式。对于联系的转换,相
31、对比较复杂,可单独转为关系模式,也可以将其并入实体关系模式中 (注意:多对多的联系只能单独转成一个关系模式,且该关系模式的主键为各个与之关联的实体主键的组合 )。所以一个关系模式的属性有两类,一类是实体本身具备的属性,另一类是为了保存实体与实体之间的联系而记录的属性。下面将根据实体及与之相关的联系类型结合系统说明来分析。 (1)对于挂号单关系模式,由于挂号单与收银员实体有联系,且它们之间的联系没有单独转成关系模式,所以需要在挂号单关系模式中记录对应的收银员,因此,挂号单关 系模式需补充属性:收银员。 (2)从 “医院门诊处方单 ”可以得知门诊处方关系模式应具有的信息。但在此需要注意的是,哪些信
32、息是门诊处方关系模式应直接存储的,哪些信息是可以通过查询从其他关系模式获取的。结合题目可知该关系模式应补充属性:就诊号。补充 “就诊号 ”之后,其他信息可通过 “明细 ”、 “收费 ”、 “挂号门诊联系 ”、 “开处方 ”等联系查询出来。 (3)由于多张门诊处方中包含多项药品信息,而一种药品也可以属于多张门诊处方,所以要通过处方明细关系模式来表示这种多对多的联系。并且由于每种药品的具体信息已 经在药品库关系模式中记录,所以,处方明细关系模式主要记录的是门诊处方与药品的对应关系和处方所需药品的具体数量。并且,根据题目描述,由于药品价格会发生变化,门诊管理系统必须记录处方单上药品的当前单价。因此,
33、药品库关系模式应补充属性:药品编码,数量,单价。其中,就诊号和药品编码一起作为主键。 (4)药品库关系模式主要记录药品的详细信息和库存信息, “药品库 ”表中已经说明需要记录的信息,所以应补充属性:类型,库存,货架编号,单位,规格,单价。 综上所述,挂号单与门诊处方关系模式的主键均为就诊号。而处 方明细是一个多对多的联系,它的主键应为与之关联的实体主键之组合,即 (就诊号,药品编码 )。 8 【正确答案】 A: Artist B: Song C: Band D: Musician E: Track F:Album 【试题解析】 根据 “每首歌曲的描述信息包括:歌曲的名字、谱写这首歌曲的艺术家
34、”和类图中类 A与类 B之间约束为 “编写 ”、 “演奏 ”可知,类 A与类 B只能是艺术家和歌曲,又根据类图上标示的关联关系 (1, 0 *),可以确定类 A为艺术家 (Artist);类 B为歌曲 (Song)。类 B与类 E之间是聚合关系,根据题中 “一条音轨中只包含一首歌曲或为空,一首歌曲可分布在多条音轨上 ”可知,类 E为音轨(Track)。类 E与类 F之间存在组合关系,根据 “每张唱片由多条音轨构成 ”可知,类 F为唱片 (Album)。再来看类 C和类 D,它们与类 A存在泛化关系,根据 “艺术家可能是一名歌手或一支由 2名或 2名以上的歌手所组成的乐队 ”可知,类 C和类D为
35、歌手和乐队,又因为类 C与类 D存在聚合关系,根据 “一名歌手可以不属于任何乐队,也可以属于一个或多个乐队 ”可知,类 C为乐队 (Band),类 D为歌手(Musician)。 9 【正确答案】 (1)0 * (2)2 * (3)0 1 (4)1 * (5)1 * (6)1 【试题解析】 由问题 1可知,类 C为乐队,类 D为歌手,根据 “一支由 2名或 2名以上的歌手所组成的乐队。一名歌手可以不属于任何乐队,也可以属于一个或多个乐队 ”,则空 (1)处是 0 *,空 (2)处是 2 *。类 B与类 E存在聚合关系,根据 “一条音轨中只包含一首歌曲或为空,一首歌曲可分布在多条音轨上 ”,所以
36、空 (3)处为 0 1,空 (4)处为 1 *。类 E与类 F存在泛化关系, 根据 “每张唱片由多条音轨构成 ”,所以空 (5)处为 1 *,空 (6)处为 1。 10 【正确答案】 类: Track 多重度: 0 1;类: Track: 多重度: 0 1 【试题解析】 本问题考查的是类对象关联中的一种特殊关联:递归关联,它描述的是同一个类的不同实例之间的关系。而类 Track的不同实例之间恰好具有这种关系 (“因此对于任意一条音轨,播放器需要准确地知道,它的下一条音轨和上一条音轨是什么 ”)。所以缺少的那条联系的两端都是类 Track,其多重度都为0 1。下限为 0,是对应不存在上一条 或下
37、一条音轨的情况。 11 【正确答案】 按任意键,选择歌曲 【试题解析】 状态图是描述系统动态行为的一种模型。这里对于状态图的考查仅限于能够理解它所描述的行为。状态图由状态及状态之间的迁移构成,迁移可以由相关的事件触发。问题 4给定了两个状态 “关闭 ”和 “播放 ”,要求找出从 “关闭 ”到 “播放 ”的最短事件序列。这就要求我们能够在状态图上找到连接这两个状态的最短迁移,然后将迁移上的事件记录下来就可以了。从 “关闭 ”状态到 “播放 ”状态可以选择经过迁移 “连接电脑 ”到达 “联机 ”状态,再经过迁移 “断开电脑 ”到达 “打开 ”状态,再从 “打开 ”状态的初始状态 “歌曲待选 ”,经
38、过迁移 “选择歌曲 ”到达 “播放状态 “。这样经过的事件序列为:连接电脑 电量饱和完成复制 断开电脑 选择歌曲。显然,这样的事件序列远比从 “关闭 ”状态经过 “按任意键 ”直接到达 “打开 ”状态要长得多。所以,从 “关闭 ”状态到 “播放 ”状态的最短事件序列是:按任意键,选择歌曲。 12 【正确答案】 (1)root (2)root- childptr0 (3)root- childptri (4)placeBoosters(p) (5)degradation 【试题解析】 本题考查数据结构中树的基本操作。题目说明部分对树的结构以及程序的目的有比较明确的说明。本程序的功能是在合适的位置
39、安放信号放大器。通过对题目说明部分的分析可以得知放置信号放大器的原则是判断当前节点的di+Mi是否大于容忍值。若大于,则在 i处设信号放大器。例如,对于节点 s,ds=2, Ms=2, ds+Ms=4,此时容忍值为 3,则 ds+Ms1 3,需要在此放置一个信号放大器。但在题目中,节点的 M值是未提供的,所以程序应完成两个操作,第一个是求出节点 的 M值,第二个是确定当前节点是否需要加信号放大器。 下面进行具体的代码分析。 空 (1)处是一个判断条件,当条件成立时,才能进入程序主体。这一空非常容易,在对树进行操作的过程中,只有当前节点不为空节点时才有必要进行相应的操作,所以此处应填入 root
40、。 通过对程序主体进行分析可知,指针 p用于指向子节点,其初始值应为第一个子节点 childptr0的指针,因此空 (2)处应填入 root- childptr0,此后 P依次指向下一个子节点。因此空 (3)处应填入 root- childptri。 空 (4)处是关键的一步,由于 “要计算节点的 M值,必须先算出其所有子节点的M值 ”,所以需要用到递归,利用递归来计算子节点的 M值,故此处填入placeBoosters(p)。 空 (5)处非常容易,是将已求得的 M值存入当前节点的 root- M中,由于程序中计算出来的 M记录在 degradation中,所以此处填入 degradatio
41、n。 13 【正确答案】 (1)ProcessRequest(aRequest) (2)Approver* (3)Approver: (4) virtual void ProcessRequest(PurchaseRequest aRequest) if(SuccesSor!=NULL) successor-(1)ProcessRequest(aRequest) ; *Chain of Responsibility(CoR)是用一系列类 (classes)试图处理一个请求aRequest,这些类之间是一个松散的耦合,唯一共同点是在它们之间传递aRequest。也就是说,来了一个请求, Dire
42、ctor类先处理,如果没有处理,就传递到 VicePresident类处理,如果还没有处理,就传递到 President类处理,构成责任链。审批者类定义一个虚函数,其子类可以重载该虚函数,用于处理采购请求,如 果继任者不为空,则执行相应审批者类的处理采购请求的函数 Proces sRequest(aRequest)。 * void SetSuccessor(Approver*aSuccessor)succeSsor=aSuccessor; private: (2)Approver* successor; *注意到此处成员变量为私有属性,只能在 Approver类中使用。由 void SetSu
43、ccessor (Approver*aSuccessor)successor=aSuccessor; 中的参数是 Approver指针 类型,再由 successor=aSuccessor可知 successor也应为 Approver指针类型,否 则无法赋值。 * ; clasS Congress: publiC Approver public: void ProcessRequest(PurchaseRequest aRequest) if(aRequest Amount: 500000) *决定是否审批的代码省略 * else (3)Approver: ProcessRequeSt(aR
44、equest); *该类只处理 50万元及以上的采购请求这种情况,如果是 50万元以下,则需交给其他类处理。由于此处调用的是父类中的成员函数 void ProcessRequest(Purchase RequestaRequest),故需 Approver: Proces sRequest(aRequest),此函数将请求传递给下一个继任者,即相应的子类。 * ; void msln() Congress Meeting; VicePresident Sam; Director Larry; PreSident Tammy; 构造责任链 Meeting SetSucceSSor(NULL);
45、Sam SetSucceSsor(4) Tammy SetSuccessor(5) Larry SetSuccessor(6) *由 Approver类中的函数 void SetSuccessor(Approver*aSuccessor) successor=aSuccessor; 可知这三处的参数值都是指针类型的,由于是一种责任链,当 Director 类的对象 Larry不能处理该请求时,必须将该请求传给上一级,即VicePresident类的对象 Sam,此时需将该继任者的地址传给 Director类的对象Larry,否则无法传递该请求。同理,其他上一级的对象也是如此。 * Purcha
46、seRequest aRequest;构造一采购审批请求 cin aRequest Amount;输入采购请求的金额 (7)Larry ProcessRequest(aRequest); *开始审批。一般采购请求是先由 Director类处理,看金额是否满足,不满足再交由上一级的 VicePresident类处理,不满足再如此传递下去。由上述创建的类对象 Director Larry可知,此处应填 Larry ProcessRequest(aRequest) * return; 14 【正确答案】 (1)ProcessRequest(aRequest) (2)Approver (3)super
47、 (4)Tammy (5)Meeting (6)Sam (7)Larry 【试题解析】 本题以用 Java解决某企业的采购审批分级为背景,考查考生对面向对象程序设计类的用例和继承,程序解释如下。 if(succesSor!=null)successor (1)ProcessRequest(aRequest); *Chain of Responsibility(CoR)是用一系列类 (classes)试图处理一个请求aRequest,这些类之间是一个松散的耦合,唯一共同点是存它们之间传递aRequest。也就是说,来了一个请求, Director类先处理,如果没有处理,就传递到 VicePres
48、ident类处理,如果还没有处理,就传递到 President类处理,构成责任链。审批者类定义一个虚函数,其子类可以重载该虚函数,用于处理采购请求,如果继任者不为窄,则执行相应审批者类的处理采购请求的函数ProcessRequest(aRequest)。 * public void SetSuccessor(Approver aSuccesSsor)successot=aSuccesssor; private (2) Approver successor; *注意到此处成员变量为私有属性,只能存Approver类中使用。由 void SetSuccesSOt(Approver aSuccessor)succesSor=aSuccessor; 中的参数是 Approver类型,再由successot=aSuccessor可知, successor也应为 Approver类型,否则无法赋