2023年新版中级软件设计师下半年下午试题_第1页
2023年新版中级软件设计师下半年下午试题_第2页
2023年新版中级软件设计师下半年下午试题_第3页
2023年新版中级软件设计师下半年下午试题_第4页
2023年新版中级软件设计师下半年下午试题_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中级软件设计师2023下半年下午试题试题一阅读以下说明和图,回答问题1至问题4,将解答填入相应栏内。

【说明】

某高校欲开发一个成绩管理系统,记录并管理所有选修课程的学生的平时成绩和考试成绩,其重要功能描述如下;

1.每门课程都有3到6个单元构成,每个单元结束后会进行一次测试,其成绩作为这门课程的千时成绩。课程结束后进行期末考试,其成绩作为这门课程的考试成绩。

2.学生的平时成绩和考试成绩均由每门课程的主讲教师上传给成绩管理系统。

3.在记录学生成绩之前,系统需要验证这些成绩是否有效。一方面,根据学生信息文献来确认该学生是否选修这门课程,若没有,那么这些成绩是无效的:假如他的确选修了这门课程,再根据课程信息文献和课程单元信息文献来验证平时成绩是否与这门课程所包含的单元相相应,假如是,那么这些成绩足有效的,否则无效。

4.对于有效成绩,系统将其保存在课程成绩文献中。对于无效成绩,系统会单独将其保存在无效成绩文献中,并将具体情况提交给教务处。在教务处没有给出具体解决意见之前,系统不会解决这些成绩。

5.若一门课程的所有有效的平时成绩和考试成绩都已经被系统记录,系统会发送课程完毕告知给教务处,告知该门课程的成绩已经齐全。教务处根据需要,请求系统生成相应的成绩列表,用来提交考试委员会审查。

6.在生成成绩列表之前,系统会生成一份成绩报告给主讲教师,以便核对是否存在错误。主讲教师须将核对之后的成绩报告返还系统。

7.根据主讲教师核对后的成绩报告,系统生成相应的成绩列表,递交考试委员会进行审查。考试委员会在审查之后,上交一份成绩审查结果给系统。对于所有通过审查的成绩,系统将会生成最终的成绩单,并告知每个选课学生。

现采用结构化方法对这个系统进行分析与设计,得到如图1-1所示的顶层数据流图和图1-2所示的0层数据流图。1.【问题1】

使用说明中的词语,给山图l-1中的外部实体E1~E4的名称。这道题您没有回答答案:E1:考试委员会;E2:主讲教师;E3:学生或选课学生:E4:教务处11.【问题2】

使用说明中的词语,给出图1-2中的数据存储D1~D5的名称。

这道题您没有回答答案:D1:学生信息文献;D2:课程单元信息文献:D3:课程信息文献;D4:课程成绩文献;

D5:无效成绩文献。

注:D2和D3的答案可以互换。12.【问题3】

数据流图1-2缺少了三条数据流,根据说明及数据流图1-1提供的信息,分别指出这三条数据流的起点和终点。起点终点这道题您没有回答答案:起点终点D4或课程成绩文献4或生成成绩列表D1或学生信息文献5或生成最终成绩单4或生成成绩列表5或生成最终成绩单注:数据流起点、终点所有答对才可给分,数据流不分先后顺序。18.【问题4】

数据流图是在系统分析与总体设计阶段宏观地描述系统功能需求的重要图形化工具,程序流程图也是软件开发过程中比较常用的图形化工具。简要说明程序流程图的合用场合与作用。这道题您没有回答答案:程序流程图通常在进行具体设计时使用,用来描述程序的逻辑结构。[分析]

本题考察的是DFD的应用,属于比较传统的题目,考察点也与往年类似。

问题1考察的是顶层DFD。顶层DFD通常用来拟定系统边界,其中只包含一个唯一的加工(即待开发的系统)、外部实体及外部实体与系统之间的输入输出数据流。题目规定填充的正是外部实体。

从顶层DFD可以看出,数据流是完整的。所以只要根据数据流从题目说明的上下文中,找出E1~E4所相应的外部实体,分别为考试委员会、主讲教师、学生和教务处。

0层DFD中缺少的东西比较多,规定填写数据存储及缺失的数据流。先来拟定数据存储。一方面,从说明中找出也许是数据存储的元素来。很明显,学生信息文献、课程信息文献、课程单元信息文献、课程成绩文献和无效成绩文献应当是数据存储。下面的工作就是对号入座。

从0层DFD上可以看到,加工3到D5有一条数据流;而加工3所完毕的操作是“记录无效成绩”。从说明中可知,“对于无效成绩,系统会单独将其保存在无效成绩文献中”,所以D5应当是数据存储“无效成绩文献”。类似地,从加工2“记录有效成绩”到D4有一条数据流,这说明D4就是数据存储“课程成绩文献”。

D1输出两条数据流,分别流向加工1“验证学生信息”和加工4“生成成绩列表”。由说明“根据学生信息文献来确认该学生是否选修这门课程”可知,验证学生信息时,需要根据学生信息文献来进行;而生成成绩列表及成绩单时,学生信息都是必要的。所以D1应当是“学生信息文献”。

这样的话,D2和D3就应当分别与“课程单元信息文献”和“课程信息文献”相应。由于D2和D3都只与加工1有关,所以它们的相应关系就是随意的了。这样5个数据存储就填充完整了。下面要补充缺失的数据流。

一方面,从说明的第5条可知,生成成绩列表时,是需要从课程成绩文献中获取信息的,“课程成绩文献”事实上就是图中的D4。而D4和加工4之间并没有数据流,因此这就是一条缺失的数据流。

此外,前面在拟定D1所相应的数据存储时提到过,生成成绩单时是需要学生信息的。所以,加工5应当从D1中获取相应的信息,这样就找到了第二条数据流。

第三条数据流也比较容易找。说明的第7条告诉我们,只有“对于所有通过审查的成绩,系统将会生成最终的成绩单,并告知每个选课学生”。也就是说,从成绩列表到成绩单的生成是有条件的。这意味着,在加工4和加工5之间应当存在一条数据流,这就是第3条数据流。

问题4事实上是为了考察大家对DFD的进一步理解,明确DFD在软件开发中用于描述功能需求。试题二阅读下列说明,回答问题1至问题4,将解答填入相应栏内。

【说明】

某汽车维修站拟开发一套小型汽车维修管理系统,对车辆的维修情况进行管理。

1.对于新客户及车辆,汽车维修管理系统一方面登记客户信息,涉及:客户编号、客户名称、客户性质(个人、单位)、折扣率、联系人、联系电话等信息;还要记录客户的车辆信息,涉及:车牌号、车型、颜色等信息。一个客户至少有一台车。客户及车辆信息如表2-1所示。

表2-1客户及车辆信息客户编号GX0051客户名称XX公司客户性质单位折扣率95%联系人杨浩东联系电话82638779车牌号颜色车型车辆类别**0765白色帕萨特微型车

2.记录维修车辆的故障信息。涉及:维修类型(普通、加急)、作业分类(大、中、小修)、结算方式(自付、三包、索赔)等信息。维修厂的员工分为:维修员和业务员。车辆维修一方面委托给业务员。业务员对车辆进行检查和故障分析后,与客户磋商,拟定故障现象,生成维修委托书。如表2-2所示。

表2-2维修委托书

No.登记日期:2023-07-02车牌号**0765客户编号GS0051维修类型普通作业分类中修结算方式自付进厂时间2023070211:09业务员张小红业务员编号012预计竣工时间故障描述车头损坏,水箱漏水3.维修车间根据维修委托书和车辆的故障现象,在已有的维修项目中选择并拟定一个或多个具体维修项目,安排相关的维修工及工时,生成维修派工单。维修派工单如表2-3所示。

表2-3维修派工单

No.维修项目编号维修项目工时维修员编号维修员工种012维修车头5.00012机修012维修车头2.00023漆工015水箱焊接补漏1.00006焊工017更换车灯1.00012机修4.客户车辆在车间修理完毕后,根据维修项目单价和维修派工单中的工时计算车辆本次维修的总费用,记录在委托书中。

根据需求阶段收集的信息,设计的实体联系图(图2-1)和关系模式(不完整)如下所示。图2-1中业务员和维修工是员工的子实体。

【概念结构设计】

【逻辑结构设计】

客户((5),折扣率,联系人,联系电话)

车辆(车牌号,客户编号,车型,颜色,车辆类别)

委托书((6),维修类型,作业分类,结算方式,进厂时间,

预计竣工时间,登记日期,故障描述,总费用)

维修项目(维修项目编号,维修项目,单价)

派工单((7),工时)

员工((8),工种,员工类型,级别)2.【问题1】

根据问题描述,填写图2-1中(1)~(4)处联系的类型。联系类型分为一对一、一对多和多对多三种,分别使用1:1,1:n或1:*,m:n或*:*表达。这道题您没有回答答案:*(或n或m)(2)1

(3)*(或n或m)(4)*(或n或m)10.【问题2】

补充图2-1中的联系并指明其联系类型。联系名可为:联系1,联系2,…这道题您没有回答答案:13.【问题3】

根据图2-1和说明,将逻辑结构设计阶段生成的关系模式中的空(5)~(8)补充完整。这道题您没有回答答案:客户编号,客户名称,客户性质

(6)委托书编号,客户编号,车牌号,业务员编号

或:委托书编号,车牌号,业务员编号

(7)委托书编号,维修工编号,维修项目编号

(8)员工编号,员工姓名17.【问题4】

根据问题描述,写出客户、委托书和派工单这三个关系的主键。这道题您没有回答答案:客户:客户编号

委托:委委托书编号

派工单:委托书编号,维修项目编号,维修工编号[分析]

本题考察数据库设计,属于比较传统的题目,考察点也与往年类似。

问题1、问题2考察的是数据库的概念结构设计,题目规定补充完整实体联系图中的联系和联系的类型。

根据题目的需求描述和表2-1中的数据可知,一个客户至少拥有一台车,每台车辆有一个相应的客户。所以,客户实体和车辆实体之间存在“拥有”联系,联系的类型为一对多(1:*)。

根据题目的需求描述和表2-2中的数据可知,一份委托书由一个业务员负责接受委托,一个业务员可以负责多份委托书。所以,业务员实体和委托书实体之间存在“委托”联系,联系的类型为一对多(1:*)。

根据题目的需求描述和表2-3中的数据可知,一份委托书可以相应多个维修项目和维修员工,一个维修项目也许涉及多个维修工,一个维修工可以参与多个维修项目。因此,维修派工单的信息涉及三个实体,是由三个实体互相联系而形成的。所以,委托书实体和维修工实体之间存在“派工”联系,联系的类型为一对多(1:*),维修项目实体和维修工实体之间存在联系“派工”,联系的类型为多对多(*:*)。

问题3考察的是数据库的逻辑结构设计,题目规定补充完整各关系模式,并给出各关系模式的主键。

根据实体联系图和表2-1中的数据,对于“客户”关系模式需补充属性:客户编号,客户名称和客户性质。

根据实体联系图和表2-1中的数据,对于“车辆”关系模式,由于车辆实体与客户实体有联系,需记录相应的客户信息,并且车辆有自己的属性——车牌号,因此,“车辆”关系模式需补充属性:车牌号,客户编号。

根据实体联系图和表2-2中的数据,对于“委托书”关系模式,由于车辆实体与委托书实体和业务员实体都有联系,需记录相应的车辆和业务员信息,并且委托书有自己的属性——委托书编号,因此,“委托书”关系模式需补充属性;委托书编号,车牌号和业务员编号。

根据实体联系图和表2-3中的数据,“派工单”关系模式记录的是委托书、维修项目和维修工三个实体之间的联系,因此,“派工单”关系模式需补充属性:委托书编号,维修项目编号和维修员编号。

根据实体联系图和表2-1中的数据,对于“员工”关系模式需补充属性:员工编号,员工姓名。

问题4指定给定关系模式的主键,显然,管理客户数据时,应为每位客户设立唯一的编码,因此客户关系模式的主键为“客户编号”。类似的,委托书关系模式的主键为“委托书编号”。根据E-R图中派工联系与相关实体的关系,派工单关系模式的主键为“委托书编号,维修项目编号和维修员编号”。试题三阅读下列说明和图,回答问题1至问题4,将解答填入相应栏内。

【说明】

已知某唱片播放器不仅可以播放唱片,并且可以连接电脑并把电脑中的歌曲刻录到唱片上(同步歌曲)。连接电脑的过程中还可自动完毕充电。

关于唱片,尚有以下描述信息:

1.每首歌曲的描述信息涉及:歌曲的名字、谱写这首歌曲的艺术家以及演奏这首歌曲的艺术家。只有两首歌曲的这三部分信息完全相同时,才认为它们是同一首歌曲。艺术家也许是一名歌手或一支由2名或2名以上的歌手所组成的乐队。一名歌手可以不属于任何乐队,也可以属于一个或多个乐队。

2.每张唱片由多条音轨构成;一条音轨中只包含一首歌曲或为空,一首歌曲可分布在多条音轨上;同一首歌曲在一张唱片中最多只能出现一次。

3.每条音轨都有一个开始位置和连续时间。一张唱片上音轨的顺序是非常重要的,因此对于任意一条音轨,播放器需要准确地知道,它的下一条音轨和上——条音轨是什么(假如存在的话)。

根据上述描述,采用面向对象方法对其进行分析与设计,得到了如表3-1所示的类列表、如图3-1所示的初始类图以及如图3-2所示的描述播放器行为的UML状态图。

表3-1类列表类名说明Artist艺术家Song歌曲Band乐队Musician歌手Track音轨Album唱片3.【问题1】

根据说明中的描述,使用表3-1给出的类的名称,给出图3-1中的A~F所相应的类。这道题您没有回答答案:A:ArtistB:SongC:BandD:MusicianE:TrackF:Album9.【问题2】

根据说明中的描述,给山图3-1中(1)~(6)处的多重度。这道题您没有回答答案:0..*(2)2..*:(3)0..1(4)1..*(5)1..*(6)114.【问题3】

图3-1中缺少了一条关联,请指出这条关联两端所相应的类以及每一端的多重度。类多重度这道题您没有回答答案:类多重度Track或E(1分)0..11分)Track或E(1分)0..1(1分)16.【问题4】

根据图3-2所示的播放器行为UML状态图,给出从“关闭”状态到“播放”状态所通过的最短事件序列(假设电池一开始就是有电的)。这道题您没有回答答案:按任意键,选择歌曲[分析]

本题考察的是面向对象的分析与设计。前三个问题的考点比较传统,考察的是类图的设计要素。今年增长了一个关于状态图的考点:如何理解给定的状态图。

问题1属于传统的考法,规定考生根据说明将类图填充完整。事实上就是把表3-1中的类和图中的A-E对号入座。针对这道题目的类图而言,完毕这个问题是比较简朴的,由于类图中出现了三个典型的类/对象关系结构:继承(类A、C、D)、聚集(类B、e)和组装(类E、F)。从说明可以明显地看出,也许具有继承关系的只能是Artist、Band和Musician。这样类A、C、D就拟定了,下面来看B。B和A之间两条关联的名字,已经很明确地告诉了我们,可以被Artist编写、演奏的只能是歌曲(Song)。这样B也拟定下来了,剩下的E和F就显而易见了。音轨(Track)中包含的是歌曲,而唱片是由音轨构成的。所以E应当是Track,F应当是Album。

第二步是要拟定关键类之间的多重度。这在说明中已有了明确的描述。(1)和(2)处的多重度描述的是类Band和Musician的实例之间的关系。由“艺术家也许是——名歌手或一支由2名或2名以上的歌手所组成的乐队”可知,组成乐队的最少人数应当是2,所以(2)应当是2..*。由“一名歌手可以不属于任何乐队,也可以属于一个或多个乐队”可知,(1)应当是0..*。

(3)~(4)处的多重度描述的是类Song和Track的实例之间的关系。由“一条音轨中只包含一首歌曲或为空”可知,(3)应当为0..1。由“一首歌曲可分布在多条音轨上”可知,(4)应当为1..*。同理可以得到,(5)应当是1..*(一张唱片上有多条音轨);(6)应当为1。

问题3考察的是类对象关联中的一种特殊关联:递归关联,它描述的是同一个类的不同实例之间的关系。而类Track的不同实例之间恰好具有这种关系(因此对于任意一条音轨,播放器需要准确地知道,它的下一条音轨和上一条音轨是什么)。所以缺少的那条联系的两端都是类Track,其多重度都为0..1。下限为0,是相应不存在上一条或下一条音轨的情况。

状态图是描述系统动态行为的一种模型。这里状态图的考察仅限于可以理解它所描述的行为。状态图由状态及状态之间的迁移构成,迁移可以由相关的事件触发。问题4给定了两个状态“关闭”和“播放”,规定找出从“关闭”到“播放”的最短事件序列。这就规定我们可以在状态图上找到连接这两个状态的最短迁移,然后将迁移上的事件记录下来就可以了。

从“关闭”状态到“播放”状态可以选择通过迁移“连接电脑”、到达“联机”状态,再通过迁移“断开连接”到达状态“打开”,再从“打开”状态的初始状态“歌曲待选”,通过迁移“选择歌曲”到达“播放状态”。这样通过的事件序列为;连接电脑——电量饱和/完毕复制——断开连接——选择歌曲。显然这样的事件序列远比从“关闭”通过“按任意键”直接到达“打开”状态要长得多。所以从“关闭”到“播放”的最短事件序列是:按任意键,选择歌曲。试题四阅读下列说明和图,回答问题1至问题3,将解答填入相应栏内。

【说明】

某机器上需要解决n个作业.job1,job2,…,jobn,其中:

(1)每个作jobi(1≤i≤n)的编号为i,jobi有一个收益值p[i]和最后期限值d[i]小

(2)机器在一个时刻只能解决一个作业,并且每个作业需要一个单位时间进行解决,一旦作业开始就不可中断,每个作业的最后期限值为单位时间的正整数倍;

(3)job1~jobn的收益值呈非递增顺序排列,即p[1)≥P[2]≥…[n):

(4)假如作业jobi在其期限之内完毕,则获得收益9[i];假如在其期限之后完毕,则没有收益。

为获得较高的收益,采用贪心策略求解在期限之内完毕的作业序列。图4*1是基于贪心策略求解该问题的流程图。

(1)整型数组J[]有n个存储单元,变量k众表达在期限之内完毕的作业J[1..k]存储所有可以在期限内完毕的作业编号,数组J[1..k]里的作业按其最后期限非递减排序,即d[J[1]]≤…≤d[J[k]]。

(2)为了便于在数组J中加入作业,增长一个虚拟作业Job0,并令d[0]=0,j[0]=0。

(3)算法大体思想:先将作业.job1的编号1放入J[1],然后,依次对每个作业.jobi(2≤i≤n)进行鉴定,看其能否插入到数组J中。若能,则将其编号插入到数组J的适当位置,并保证J中作业按其最后期限非递减排列;否则不插入。

jobi能插入数组J的充要条件是:jobi和数组J中已有作业均能在其期限之内完毕。

(4)流程图中的重要变量院明如下。

i:循环控制变量,表达作业的编号;

k:表达在期限内完毕的作业数:

r:若.jobi能插入数组J,则其在数组了中的位置为r+1:

q:循环控制变量,用于移动数组J中的元素。4.【问题1】

请填充图4-1中的空缺(1)、(2)和(3)处。这道题您没有回答答案:i<=n

(2)d[J[r]]>d[i]

(3)J[r+1]=i,或J[q+1]=i8.【问题2】

假设有6个作业job1,job2,…,job6;

完毕作业的收益数组p=(p[1],p[2],p[3],p[4],p[5],p[6])=(90,80,50,30,20,10):

每个作业的解决期限数组d=(d[1],d[2],d[3],d[4],d[5],d[6])=(1,2,1,3,4,3)。

请应用试题中描述的贪心策略算法,给出在期限之内解决的作业编号序列(4)(按作业解决的顺序给出),得到的总收益为(5)。这道题您没有回答答案:1,2,4,5或job1、job2、job4、job5及其等价描述形式

(5)22015.【问题3】

对于本题的作业解决问题,用图4-1的贪心算法策略,能否求得最高收益?(6)。用贪心算法求解任意给定问题时,是否一定能得到最优解?(7)。

这道题您没有回答答案:能,或可以、行及其他含义相同的词语

(7)不能,或不可以、不行及其他含义相同的词语[分析]

本题考察的是算法的设计和分析技术。

问题1考察的是贪心算法的流程图。第(1)空表达第2个作业到第n个作业的主循环,i是循环控制变量,故第(1)空填入i<=n。

应注意到数组/中的作业J[i](1≤i≤k)是在其期限之前完毕的作业,且d[J[i]]≤d[J[i+1]](1≤id[i]。另一方面,J[D[R]]与r的关系只有两种:J[d[r]]>r,表达还也许在J[1]与J[r]之间插入作业i;J[d[r]]=r,表达不也许在J[1]~J[r]之间插入作业i。J[d[r]]

问题2是本题算法的一个实例。6个作业的收益已经按降序排好序。根据流程图,将作业1,2,4和5放入数组J中,并得到总收益为220,具体过程如表4-1所示。

表4-1算法执行过程J数组收益考虑的作业期限操作Ф0job11放入J中190job22放入J中1,2170job31不放入J中1,2170job43放入J中1,2,4200job54放入J中1,2,4,5220job63不放入J中1,2,4,5220

问题3考察算法策略。对于该题,贪心策略可以求得最优解。但不是所有的问题都能通过贪心策略来求得最优解,一个典型的例子是0-1背包问题。举例如下,有三件物品,背包可容纳50磅重的东西,每件物品的具体信息如表4-2所示,问如何装包使得其价值最大?表4-2物品信息物品编号重量价值单位价值11060622010053301204

假如按贪心策略求解该问题,优先选择单位价值最大的物品,则先选择物品1,然后选择物品2。由于此时背包容量还剩下50-10-20=20,局限性以容纳物品3,故总价值为60+100=160美元。但若选择物品2和物品3,容量总和为20+30,小于等于总容量50,得到总价值为100+120=220,会得到更优解。此时用贪心策略不能得到最优解。试题五阅读以下说明和C代码,将应填入(n)处的字句写在的相应栏内。5.【说明】

在一个简化的绘图程序中,支持的图形种类有点(point)和圆(circle),在设计过程中采用面向对象思想,认为所有的点和圆都是一种图形(shape),并定义了类型shapet、pointt和circlet分别表达基本图形、点和圆,并且点和圆具有基本图形的所有特性。

【C代码】

typedefenum{point,circle}shapetype;/*程序中的两种图形:点和圆*/

typedefstruct{/*基本的图形类型*/

shape_typetype;/*图形中类标记:点或者圆*/

void(*destroy)();/*销毁图形操作的函数指针*/

void(*draw)();/*绘制图形操作的函数指针*/

}shape_t;

typedefstruct{shape_tcommon;intx;ihty;}point_t;/*定义点类

型,x,y为点坐标*/

voiddestroyPoint(point_t*this){free(this);printf("Pointdestoryed!

\n");})/*销毁点对象*/

voiddrawPoint(point_t*this){printf("P(%d,%d)",this->x,this->y);}

/*绘制点对象*/

shape_t*createPoint(va_list*ap)(/*创建点对象,并设立其属性*/

point_t*p_point;

if((p_point=(point_t*)malloc(sizeof(point_t)))==NULL)returnNULL;

p_point->common,type=point;p_point->common,destroy=destroyPoint;

p_point->common.draw=drawPoint;

p_point->x=va_arg(*ap,int);/*设立点的横坐标*/

p_point->y=va_arg(*ap,int);/*设立点的纵坐标*/

return(shape_t*)p_ooint;/*返回点对象指针*/

}

typedefstruct{/*定义圆类型*/

shape_tcommon;

point_t4center;/*圆心点*/

intradius;/*圆半径*/

}circle_t;

voiddestroyCircle(circle_t*this){

free((1));free(this);printf("Circledestoryed!\n");

}

voiddrawCircle(circle_t*this){

printf("C(");

(2).draw(this->center);/*绘制圆心*/

printf(",%d)",this->radius);

}

shape_t*createCircle(va_list4ap){/*创建一个圆,并设立其属性*/

circle_t4pcircle;

if((p_circle=(circle_t4)malloc(sizeof(circle_t)))==NULL)returnNULL;

p_circle->common.type=circle;p_circle->common.destroy=destroy

Circle;

p_circle->common.draw=drawCircle;

(3)=createPoint(ap);/*设立圆心*/

p_circle->radius=va_arg(*ap,int);/*设立圆半径*/

returnp_circle;

}

shape_t*createShape(shape_typest,"'){/*创建某一种具体的图形*/

va_listap;/*可变参数列表*/

shape_t4p_shape=NULL;

(4)(ap,st);

if(st==point)pshape=createPoint(&ap);/*创建点对象*/

if(st==circle)pshape=createCircle(&ap);/*创建圆对象*/

va_end(ap);

returnp_shape;

}

intmain(){

inti;/*循环控制变量,用于循环计数*/

shape_t*shapes[2];/*图形指针数组,存储图形的地址*/

shapes[0]=createShape(point,2,3);/*横坐标为2,比值坐标为3*/

shapes[ii=createShape(circle,20,40,10);/*圆心坐标(20,40),

半径为10*/

for(i=0i<2;i++){shapes[i]->draw(shapes[i]);printf("\n");}/*

纵制数组中图形*/

for(i=1;i>=0;i--)shapes[i]->destroy(shapes[i]);/*销毁

数组中图形*/

return0;

}

【运营结果】

P(2,3)

(5)

Circledestoryed!

Pointdestoryed!这道题您没有回答答案:this->center(2)this->center->common

(3)p_circle->center(4)vastart

(5)C(P(20,40),10)本题考察C语言中指针机制、可变数目参数机制及结构体存储映像。本题中涉及的三个数据结构shape_t、circle_t和point_t的关系如下图所示。

通过阅读给出的程序代码可以看出,point_t和circle_t两种结构通过其成员shape_tcommon表达了上图中的继承关系:circlet中的数据成员point_t*center表达了与pornt_t之间的引用关系。

函数destroyCircle(circle_t*this)完毕一个circlet对象的内存释放工作。在结构circlet定义中,由于数据成员center是一个指针,所以必须释放相应内存,即free(this->center)。

函数drawCircle(circlet*this)完毕圆形的显示工作。其中需要显示其圆心的信息,而此信息由circle_mon.draw()函数完毕,即this->center->common.draw(this.center)。point_t类型的显示工作由函数drawPoint完毕,其在屏幕上显示的信息格式为P(x,y),其中x表达点的横坐标,y表达点的纵坐标。圆形的显示函数drawCirele在屏幕卜显示的信息格式为C(P(x,y),r),其中x表达圆心的横坐标,y表达圆心的纵坐标,r表达半径。

函数ereateCircle(va_list*叩)完毕创建一个圆形工作,其中需要创建其圆心对象,a圆心对象的地址保存在circlet.center数据成员中。该函数的参数采用了C语言提供的标准类型valist,以解决可变数目的函数实参。对于可变数目的参数列表的一般解决方式如下:

#include<stdarg.h>

voidfoo(char*fmt,…)/*表达fmt后面的参数个数可变*/

{

valistap;/*保存可变数目的参数列表*/

vastart(ap,fmt);/*初始化ap,保存参数fmt后面的实参列表*/

//…

vaarg(ap,TYPE);/*获取下一个实参,其中TYPE指明该参数的类型*/

//…

vaend(ap);/*释放ap占用的资源*/

}试题六阅读下列说明和C++代码,将应填入(n)处的字句写在相应栏内。6.【说明】

已知某公司的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不涉及5万元)的采购单,副董事长可以审批5万元至10万元(不涉及10万元)的采购单,董事长可以审批10万元至50万元(不涉及50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。

采用责任链设计模式(ChainofResponsibility)对上述过程进行设计后得到的类图如图6-1所示。

【C++代码】

#include<string>

#include<iostream>

usingnamespacestd;

classPurchaseRequest{

public:

doubleAmount;/*一个采购的金额*/

intNumber;/*采购单编号*/

stringPurpose;/*采购目的*/

};

classApprover{/*审批者类*/

public:

Approver(){successor=NULL;}

virtualvoidProcessRequest(PurchaseRequestaRequest){

if(successor!=NULL){successor->(1);}

}

voidSetSuccessor(Approver*aSuccesssor){successor=aSuccesssor;}private:

(2)successor;};

classCongress:publicApprover{

public:

voidProcessRequest(PurchaseRequestaRequest){

if(aRequest.Amount>=500000){/*决定是否审批的代码少略*/}

else(3)ProcessRequest(aRequest);

}

classDirector:publicApprover{

public:

voidProcessRequest(PurchaseRequestaRequest){/*此处代码省略*/

}

};

classPresident:publicApprover{

public:

voidProcessRequest(PurchaseRequestaRequest)/*此处代码省略*/}

};

classVicePresident:publicApprover{

public:

voidProcessRequest(PurchaseRequestaRequest)/*此处代码省略*/}

};

voidmain(){

CongressMeeting;VicePresidentSam;DirectorLarry;President

Tammy;

Meeting.SetSuccessor(NULL);Sam.SetSuccessor((4));

Tammy.SetSuccessor((5));Larry.SetSuccessor((6));

PurchaseRequestaRequest;/*构造一采购审批请求*/

cin>>aRequest.Amount;/*输入采购请求的金额*/

(7).ProcessRequest(aRequest);/*开始审批*/

return;

}这道题您没有回答答案:(1)ProcessRequest(aRequest)(2)Approver*(3)Approver::

(4)&Tammy(5)&Meeting(6)&Sam

(7)Larry[分析]

本题考察的是设计模式的应用,属于比较传统的题目。责任链设计模式属于常用的23种没计模式之一,其目的是为了将一个请求发送给一个对象集合,对象被组织成一条链,而负责解决该请求的对象将获取请求消息并加以解决,其余对象则仅仅负责将该请求消息按照责任链的顺序传递到下一个对象。因此负责人链模式的关键在于组织不同的对象成为一条链并传递消息。

代码中空(1)处位于条件判断if(successor!=NULL)内,因此其含义是判断当前对象是否存在后继对象,假如存在,按照责任链设计模式,可以把请求消息进行传递,也就是调用后继对象的ProcessRequest方法。空(2)处规定填写successor的类型,由于责任链模式中的每一个对象都继承自同一个父类,在本题中,就是Approver类型。空(3)处位于Congress类中的ProcessRequest方法中,该方法表达解决外界的请求,else块的含义表白Congress对象不解决审批金额大于50万元的请求,因此,Congress对象应当将该请求转发到下一个对象进行解决,可以直接调用父类的ProcessRequest方法。空(4)、(5)、(6)则重要用来将各种对象串接成一个链,根据题目的规定,对象在责任链中的顺序应当为DirectorLarry:VicePresidentSam;PresidentTammy:CongressMeeting,而审批的请求应当从Larry开始。试题七阅读下列说明和Java代码,将应填入(n)处的字句写在相应栏内。7.【说明】

已知某公司的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不涉及5万元)的采购单,副董事长可以审批5万元至10万元(不涉及10万元)的采购单,董事长可以审批10万元至50万元(不涉及50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。

采用责任链设计模式(ChainofResponsibility)对上述过程进行设计后得到的类图如图7-1所示。

【Java代码】

classPurchaseRequest{

publicdoubleAmount;//一个采购的金额

publicintNumber;//采购单编号

publicStringPurpose;//采购目的

};

classApprover{//审批者类

publicApprover(){successor=null;}

publicvoidProcessRequest(PurchaseRequestaRequest){

if(successor!=null){successor.(1);}

}

publicvoidSetSuccesser(ApproveraSuccesssor){successor=aSuccesssor;}

private(2)successor;

};

classCongressextendsApprover{

publicvoidProcessRequest(PurchaseRequ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论