资源描述
中级软件设计师下半年下午试题
资料仅供参考
中级软件设计师 下半年下午试题
试题一
阅读以下说明和图,回答问题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. 070 登记日期: -07-02
车牌号
**0765
客户编号
GS0051
维修类型
普通
作业分类
中修
结算方式
自付
进厂时间
0702 11:09
业务员
张小红
业务员编号
012
预计完工时间
故障描述
车头损坏,水箱漏水
3.维修车间根据维修委托书和车辆的故障现象,在已有的维修项目中选择并确定一个或多个具体维修项目,安排相关的维修工及工时,生成维修派工单。维修派工单如表2-3所示。
表2-3维修派工单
No. 070
维修项目编号
维修项目
工时
维修员编号
维修员工种
012
维修车头
5.00
012
机修
012
维修车头
2.00
023
漆工
015
水箱焊接补漏
1.00
006
焊工
017
更换车灯
1.00
012
机修
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:Artist B:Song C:Band D:Musician E:Track F:Album
9. 【问题2】
根据说明中的描述,给山图3-1中(1)~(6)处的多重度。
这道题您没有回答
答案:0..* (2)2..*: (3)0..1 (4)1..* (5)1..* (6)1
14. 【问题3】
图3-1中缺少了一条关联,请指出这条关联两端所对应的类以及每一端的多重度。
类
多重度
这道题您没有回答
答案:
类
多重度
Track或E (1分)
0..1 1分)
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]=i
8. 【问题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)220
15. 【问题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数组
收益
考虑的作业
期限
操作
Ф
0
job1
1
放入J中
1
90
job2
2
放入J中
1,2
170
job3
1
不放入J中
1,2
170
job4
3
放入J中
1,2,4
200
job5
4
放入J中
1,2,4,5
220
job6
3
不放入J中
1,2,4,5
220
问题3考查算法策略。对于该题,贪心策略能够求得最优解。但不是所有的问题都能经过贪心策略来求得最优解,一个典型的例子是0-1背包问题。举例如下,有三件物品,背包可容纳50磅重的东西,每件物品的详细信息如表4-2所示,问如何装包使得其价值最大? 表4-2 物品信息
物品编号
重量
价值
单位价值
1
10
60
6
2
20
100
5
3
30
120
4
如果按贪心策略求解该问题,优先选择单位价值最大的物品,则先选择物品1,然后选择物品2。由于此时背包容量还剩下50-10-20=20,不足以容纳物品3,故总价值为 60+100=160美元。但若选择物品2和物品3,容量总和为20+30,小于等于总容量50,得到总价值为100+120=220,会得到更优解。此时用贪心策略不能得到最优解。
试题五
阅读以下说明和C代码,将应填入 (n)处的字句写在的对应栏内。
5. 【说明】
在一个简化的绘图程序中,支持的图形种类有点(point)和圆(circle),在设计过程中采用面向对象思想,认为所有的点和圆都是一种图形(shape),并定义了类型shape t、 point t和circle t分别表示基本图形、点和圆,而且点和圆具有基本图形的所有特征。
【C代码】
typedef enum { point,circle } shape type; /* 程序中的两种图形:点和圆 */
typedef struct { /* 基本的图形类型 */
shape_type type; /* 图形中类标识:点或者圆*/
void (*destroy) (); /* 销毁图形操作的函数指针*/
void (*draw) (); /* 绘制图形操作的函数指针*/
} shape_t;
typedef struct { shape_t common; int x; iht y; } point_t; /* 定义点类
型, x, y为点坐标*/
void destroyPoint (point_t* this) { free (this); printf ("Point destoryed!
\n"); } ) /* 销毁点对象*/
void drawPoint(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; /*返回点对象指针*/
}
typedef struct { /*定义圆类型*/
shape_t common;
point_t 4center; /*圆心点*/
int radius; /*圆半径*/
} circle_t;
void destroyCircle(circle_t* this){
free( (1)); free(this); printf("Circle destoryed!\n");
}
void drawCircle(circle_t* this) {
print f ("C (");
(2).draw(this->center); /*绘制圆心*/
printf(",%d) ", this->radius);
}
shape_t* createCircle(va_list4 ap) { /*创立一个圆,并设置其属性*/
circle_t4 p circle;
if ((p_circle = (circle_t4)malloc (sizeof (circle_t)) ) ==NULL ) return NULL;
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); /* 设置圆半径*/
return p_circle;
}
shape_t* createShape(shape_type st, "') { /* 创立某一种具体的图形*/
va_list ap; /*可变参数列表*/
shape_t4 p_shape = NULL;
(4)(ap, st);
if( st == point ) p shape = createPoint(&ap); /* 创立点对象*/
if( st == circle ) p shape = createCircle(&ap); /*创立圆对象*/
va_end (ap);
return p_shape;
}
int main( ) {
int i; /* 循环控制变量,用于循环计数*/
shape_t* shapes[2]; /* 图形指针数组,存储图形的地址*/
shapes[0] = createShape( point, 2, 3); /* 横坐标为2,比值坐标为3*/
shapes[ii = createShape( circle, 20, 40, 10); /* 圆心坐标(20,40),
半径为 10*/
for(i=0 i<2; i++) { shapes[i]->draw(shapes[i]); printf("\n"); } /*
纵制数组中图形*/
for( i = 1; i >= 0; i-- ) shapes[i]->destroy(shapes[i]); /* 销毁
数组中图形*/
return 0;
}
【运行结果】
P(2,3)
(5)
Circle destoryed !
Point destoryed !
这道题您没有回答
答案:this->center (2)this->center->common
(3)p_circle->center (4)va start
(5)C(P(20,40),10)
本题考查C语言中指针机制、可变数目参数机制及结构体存储映像。本题中涉及的三个数据结构shape_t、circle_t和point_t的关系如下图所示。
经过阅读给出的程序代码能够看出,point_t和circle_t两种结构经过其成员shape_t common表示了上图中的继承关系:circle t中的数据成员point_t *center表示了与 pornt_t之间的引用关系。
函数destroyCircle(circle_t*this)完成一个circle t对象的内存释放工作。在结构circle t定义中,由于数据成员center是一个指针,因此必须释放对应内存,即free(this->center)。
函数drawCircle(circle t* this)完成圆形的显示工作。其中需要显示其圆心的信息,而此信息由circle_t. common. draw()函数完成,即this->center->common.draw(this.center)。 point_t类型的显示工作由函数draw Point完成,其在屏幕上显示的信息格式为P(x,y),其中x表示点的横坐标,y表示点的纵坐标。圆形的显示函数drawCirele在屏幕卜显示的信息格式为C(P(x,y),r),其中x表示圆心的横坐标,y表示圆心的纵坐标,r表示半径。
函数ereateCircle(va_list*叩)完成创立一个圆形工作,其中需要创立其圆心对象,a圆心对象的地址保存在circle t.center数据成员中。该函数的参数采用了C语言提供的标准类型va list,以处理可变数目的函数实参。对于可变数目的参数列表的一般处理方式如下:
#include <stdarg.h>
void foo(char*fmt,…) /*表示fmt后面的参数个数可变*/
{
va list ap; /*保存可变数目的参数列表*/
va start(ap, fmt); /*初始化ap,保存参数fmt后面的实参列表*/
//…
va arg(ap,TYPE); /*获取下一个实参,其中TYPE指明该参数的类型*/
//…
va end(ap); /*释放ap占用的资源*/
}
试题六
阅读下列说明和C++代码,将应填入 (n)处的字句写在对应栏内。
6. 【说明】
已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任能够审批5万元以下(不包括5万元)的采购单,副董事长能够审批5万元至10万元(不包括10万元)的采购单,董事长能够审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。
采用责任链设计模式(Chain of Responsibility)对上述过程进行设计后得到的类图如图6-1所示。
【C++代码】
#include <string>
#include <iostream>
using namespace std;
class PurchaseRequest {
public:
double Amount; /*一个采购的金额*/
int Number; /*采购单编号*/
string Purpose; /*采购目的*/
};
class Approver { /*审批者类*/
public:
Approver() { successor = NULL; }
virtual void ProcessRequest(PurchaseRequest aRequest){
if (successor != NULL){ successor-> (1); }
}
void SetSuccessor(Approver *aSuccesssor) { successor = aSuccesssor; } private:
(2)successor; };
class Congress : public Approver {
public:
void ProcessRequest(PurchaseRequest aRequest) {
if(aRequest.Amount >= 500000){ /*决定是否审批的代码少略*/ }
else (3)ProcessRequest(aRequest);
}
class Director : public Approver {
public:
void ProcessRequest(PurchaseRequest aRequest){ /*此处代码省略*/
}
};
class President : public Approver {
public:
void ProcessRequest(PurchaseRequest aRequest) /*此处代码省略*/ }
};
class VicePresident : public Approver {
public:
void ProcessRequest(PurchaseRequest aRequest) /*此处代码省略*/ }
};
void main(){
Congress Meeting; VicePresident Sam; Director Larry ; President
Tammy;
Meeting. SetSuccessor(NULL); Sam. SetSuccessor( (4));
Tammy. SetSuccessor( (5)); Larry. SetSuccessor( (6));
PurchaseRequest aRequest; /*构造一采购审批请求*/
cin >> aRequest.Amount; /*输入采购请求的金额*/
(7).ProcessRequest(aRequest); /*开始审批*/
return ;
}
这道题您没有回答
答案:(1)ProcessRequest(aRequest) (2)Approver* (3)Approver::
(4)&Tammy (5)&Meeting (6)&Sam
(7)Larry
[分析]
本题考查的是设计模式的应用,属于比较传统的题目。责任链设计模式属于常见的 23种没计模式之一,其目的是为了将一个请求发送给一个对象集合,对象被组织成一条链,而负责处理该请求的对象将获取请求消息并加以处理,其余对象则仅仅负责将该请求消息按照责任链的顺序传递到下一个对象。因此责任
展开阅读全文