【计算机类职业资格】初级程序员下午试题-110及答案解析.doc

上传人:ideacase155 文档编号:1330073 上传时间:2019-10-17 格式:DOC 页数:14 大小:85KB
下载 相关 举报
【计算机类职业资格】初级程序员下午试题-110及答案解析.doc_第1页
第1页 / 共14页
【计算机类职业资格】初级程序员下午试题-110及答案解析.doc_第2页
第2页 / 共14页
【计算机类职业资格】初级程序员下午试题-110及答案解析.doc_第3页
第3页 / 共14页
【计算机类职业资格】初级程序员下午试题-110及答案解析.doc_第4页
第4页 / 共14页
【计算机类职业资格】初级程序员下午试题-110及答案解析.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、初级程序员下午试题-110 及答案解析(总分:90.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)说明某大学城图书馆需要在无线阅览厅的某些位置上放置无线接入点 AP(Access Poin)。假设每个无线 AP 覆盖范围的半径是 6 米,因此必须使得每台笔记本计算机上的无线网卡到某个无线 AP 的直线距离不超过 6米。为了简化问题,假设所有无线网卡都在同一直线卜,并且无线 AP 沿该直线放置。该问题可以建模为如图 8-1 所示,其中直线表示无线网卡所在的直线,实心正方形表示无线网卡。现采用贪心策略来实现用尽可能少的无线 AP 覆盖所有的无线网卡。基于贪心算法实现以上应用

2、需求的基本思想是:问题的规模为 N,从第 1 个无线网卡(最左端)开始布局无线 AP,把第 1 个无线 AP 放置在该无线网卡右方的 6 米处,此时该无线 AP 会覆盖从第 1 个无线网卡到该无线网卡右方直线长度为 12 米的所有无线网卡,假设覆盖了 N1 个无线网卡。此时间题规模变成了 N-N1,接着把第 1 个无线 AP 覆盖的无线网卡去掉,再从 N-N1 中选择第 1 个(最左端)无线网卡开始布局无线AP,将第 2 个无线 AP 放置在该无线网卡右方的 6 米处。依此布局,直到覆盖所有的无线网卡为止。图 8-2 是问题解的模型,其中,直线表示无线网卡所在的直线,实心正方形表示无线网卡,实

3、心圆形表示无线AP,虚线圆对应无线 AP 为圆心,虚线圆的直径为相应无线 AP 的覆盖范围(12 米)。实现以上贪心算法的流程如图 8-3 所示。其中,di(1iN)表示第 i 张无线网卡到通道 A 端的距离,N 表示无线网卡的总数,无线网卡的编号按照无线网卡到通道 A 端的距离从小到大进行编号;sk表示第 k(k1)个无线 AP 到通道 A 端的距离。算法结束后,k 的值为无线 AP 的总数。(分数:15.00)(1).请填补图 8-3 流程图中空缺处的内容。(分数:7.50)填空项 1:_(2).该贪心算法的时间复杂度为_。(分数:7.50)填空项 1:_二、试题二(总题数:2,分数:15

4、.00)1.说明 1下面C 程序代码 1的设计意图是:计算 1100 各数的平方。运行该段代码后,没有得到应有的运算结果。C 程序代码 1以上C 程序代码 1中共有 3 处错误。请在表 8-1 中指出这些错误所在代码的行号,并在不增加和删除代码行的情况下进行修改,写出修改正确后的完整代码行,使之符合上述设计意图。(分数:9.00)填空项 1:_说明 2有两个进程(编号分别为 0 和 1)需要访问同一个共享资源。为了解决竞争条件(race condition)的问题,需要实现一种互斥机制,使得在任何时刻只能有一个进程访问该共享资源。以下C 程序代码 2给出了一种实现方法。C 程序代码 2int

5、flag2; /*flaq 数组, 初始化为 FALSE*/Enter_Critical_Section (int my_task_id, int other_task_id)while (flag other_task_id=TRUE); /*空循环语句*/flagmy_task_id=TRUE;Exit_Critical_Section (int my_task_id, int other_task_id)flagmy_task id=FALSE;当一个进程要访问临界资源时,就可以调用C 程序代码 2给出的这两个函数。C 程序代码 3给出了进程0 的一个例子。C 程序代码 3Enter_C

6、ritical_Section(0,1) ;使用这个资源Exit_Critical_Section (0,1) ;做其他的事情(分数:6.00)(1).C 程序代码 2所示的方法_实现共享资源的互斥访问。A能够 B不能(分数:2.00)填空项 1:_(2).C 程序代码 2采用了一种繁忙等待(busy waiting)的策略,这种策略的主要缺点是什么? 请用 100字以内的文字简要说明。(分数:2.00)填空项 1:_(3).如果将 Enterl_Critical_Section()函数中的两条语句互换一下位置,则可能会出现什么情况? 请用100 字以内的文字简要说明。(分数:2.00)填空项

7、 1:_三、试题三(总题数:1,分数:15.00)2.说明某超市集团为发展业务向社会公开招聘 N 个工种的工作人员,每个工种各有不同的编号(1M)和计划招聘人数。每位应聘者需申报两个工种,并参加集团组织的考试。该集团公司将按应聘者的成绩从高分至低分的顺序进行排队录取。具体录取原则是:从高分到低分依次对每位应聘者先按其第一志愿录取;当不能按其第一志愿录取时,便将他的成绩扣去 5 分后,重新排队,并按其第二志愿考虑录取。以下 C 程序为输出各工种实际招聘的应聘人员,每个工种都保留一个录取者的有序队列。录取处理循环直至招聘额满或已对全部应聘者都做了录取处理后跳出。在 C 程序中,类型 STU 包含有

8、应聘者的基本信息:编号、成绩、志愿、排队成绩和录取志愿号。数组 rz的每个元素对应一个工种,包含计划招聘人数和已录取的人数。C 程序代码#include#define N 36#define EDMARK 5typedef struct stu int no, total, z2, sortm, zi;struct stu *next;STU;struct rznode int lmt , count;STU *next;rz N ;STU *head = NULL, *over = NULL;int allFILE *fp;char dataf = “zp2008.dat“;print (S

9、TU *p)for (;p!=NULL; p = p-next)printf(“%d(%d)/t“, p-no, p-total) ;insert(STU *p, STU *u)STU *v, *q;for (q = *p;q != NULL; v = q , (1) )if ( q- sortm u-sortm)break;if ( q = *p)(2) ;else(3) ;u-next = q ;main ( )int zn, i, no, total, z1, z2 ;STU *p, *v, *q;fp = fopen (dataf, “r“) ;if (fp = NULL)printf

10、 (“Cant open file %s./n“,dataf);exit (0) ;fscanf (fp,“%d“,for (all = 0, i = i; i = zn; i+)fscanf (fp, “%d“, rz i .count = 0;rzi .next = NULL;all += (4) ;for (;)if (fscanf(fp,“%d%d%d%d“,p = ( STU *) malloc (sizeof (STU) ;p-no = no; p-total = p-sortm = total;p-zi = 0; p-z0 : z1;p-z1 = z2;(5) ;fclose (

11、fp);for (;all )p = head;head = head-next;if (rzp-zp-zi.count (6) )rzp-zp-zi.count +;insert( all-; continue;if (p-zi = 1 )p-next = over; over = p;continue;p-sortm -= DEMARK;(7) ;insert( for ( i = 1; i = zn; i+ )printf(“%d:/n“,i);print( rzi .next);printf(“/n“);printf(“over:/n“);print (head);print(over

12、);printf(“/n“)(分数:15.00)填空项 1:_四、试题四(总题数:1,分数:15.00)3.说明已知包含头结点(不存储元素)的单链表元素已经按照非递减方式排序,函数 compress(NODE*head)的功能是去掉其中重复的元素,使得链表中的元素互不相同。在处理过程中,当元素重复出现时,保留元素第 1 次出现时所在的结点。图 8-4(a)、(b)是经函数 compress()处理前后的链表结构示例图。(分数:15.00)填空项 1:_五、试题五(总题数:1,分数:15.00)4.说明某绘图系统存在 Point、Line 和 Square 3 种图元,它们具有 Shape 接口

13、,图元的类图关系如图 8-5 所示。现要将 Circle 图元加入此绘图系统以实现功能扩充。已知某第三方库已经提供了 XCircle 类,且完全满足系统新增的 Circle 图元所需的功能,但 XCircle 不是由 Shape 派生而来的,它提供的接口不被系统直接使用。C+代码 1既使用了 Xcircle,又遵循了 Shape 规定的接口,既避免了从头开发一个新的Circle 类,又可以不修改绘图系统中已经定义的接口。C+代码 2根据用户指定的参数生成特定的图元实例,并对其进行显示操作。该绘图系统定义的接口与 XCircle 提供的显示接口及其功能如表 8-2 所示。(分数:15.00)填空

14、项 1:_六、试题六(总题数:1,分数:15.00)5.说明某绘图系统存在 Point、Line 和 Square 3 种图元,它们具有 Shape 接口,图元的类图关系如图 8-6 所示。现要将 Circle 图元加入此绘图系统以实现功能扩充。已知某第三方库已经提供了 XCircle 类,且完全满足系统新增的 Circle 图元所需的功能,但 XCircle 不是由 Shape 派生而来的,它提供的接口不被系统直接使用。Java 代码 1既使用了 XCircle 又遵循了 Shape 规定的接口,既避免了从头开发一个新的Circle 类,又可以不修改绘图系统中已经定义的接口。Java 代码

15、2根据用户指定的参数生成特定的图元实例,并对其进行显示操作。该绘图系统定义的接口与 XCircle 提供的显示接口及其功能如表 8-3 所示。(分数:15.00)填空项 1:_初级程序员下午试题-110 答案解析(总分:90.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)说明某大学城图书馆需要在无线阅览厅的某些位置上放置无线接入点 AP(Access Poin)。假设每个无线 AP 覆盖范围的半径是 6 米,因此必须使得每台笔记本计算机上的无线网卡到某个无线 AP 的直线距离不超过 6米。为了简化问题,假设所有无线网卡都在同一直线卜,并且无线 AP 沿该直线放置。该问题

16、可以建模为如图 8-1 所示,其中直线表示无线网卡所在的直线,实心正方形表示无线网卡。现采用贪心策略来实现用尽可能少的无线 AP 覆盖所有的无线网卡。基于贪心算法实现以上应用需求的基本思想是:问题的规模为 N,从第 1 个无线网卡(最左端)开始布局无线 AP,把第 1 个无线 AP 放置在该无线网卡右方的 6 米处,此时该无线 AP 会覆盖从第 1 个无线网卡到该无线网卡右方直线长度为 12 米的所有无线网卡,假设覆盖了 N1 个无线网卡。此时间题规模变成了 N-N1,接着把第 1 个无线 AP 覆盖的无线网卡去掉,再从 N-N1 中选择第 1 个(最左端)无线网卡开始布局无线AP,将第 2

17、个无线 AP 放置在该无线网卡右方的 6 米处。依此布局,直到覆盖所有的无线网卡为止。图 8-2 是问题解的模型,其中,直线表示无线网卡所在的直线,实心正方形表示无线网卡,实心圆形表示无线AP,虚线圆对应无线 AP 为圆心,虚线圆的直径为相应无线 AP 的覆盖范围(12 米)。实现以上贪心算法的流程如图 8-3 所示。其中,di(1iN)表示第 i 张无线网卡到通道 A 端的距离,N 表示无线网卡的总数,无线网卡的编号按照无线网卡到通道 A 端的距离从小到大进行编号;sk表示第 k(k1)个无线 AP 到通道 A 端的距离。算法结束后,k 的值为无线 AP 的总数。(分数:15.00)(1).

18、请填补图 8-3 流程图中空缺处的内容。(分数:7.50)填空项 1:_ (正确答案:k=0 (2) j=N 或其等价形式(3) k=k+1 或其等价形式 (4) di+6 或其等价形式)解析:本试题的题干说明中已将无线网卡分布问题建模(如图 8-1 所示)。其中,直线表示无线网卡所在的直线,实心正方形表示无线网卡。而要求解的问题是要求如何在该直线上布局无线 AP,使其能覆盖所有的无线网卡,并且所用无线 AP 的数量要尽可能少。这是一个通过进行一系列选择求最优解的问题。分析该问题,可以发现其具有最优子结构,并且具有贪心选择性质,故该问题可以用贪心算法来求解。实现贪心算法的流程见题干中的图 8-

19、3。由于“算法结束后 k 的值为无线 AP 的总数”,因此在算法开始处需要对变量尼赋初值,即(1)空缺处所填写的内容是“k=0”。该贪心算法中,N 表示无线网卡的总数,且无线网卡的编号按照无线网卡到通道 A 端的距离从小到大进行编号,di(1fN)表示第 i 个无线网卡到通道 A 端的距离。当判断第 i 个无线网卡未超过无线网卡总数 N,而求解下一个无线网卡(即第 i+1 个无线网卡,或第 j 个无线网卡)所归属的无线 AP 时,也需要判断第,个无线网卡是否超过无线网卡总数,以及第 j 个无线网卡与第 i 个无线网卡之间的距离是否超过12 米,因此(2)空缺处所在的判断条件是“j=N”,第 6

20、 行的语句修改为“i+;”或其等价表达形式。该 C 程序代码的另一个错误之处是,在 printf 语句中错误使用了取地址运算符号”。说明 2有两个进程(编号分别为 0 和 1)需要访问同一个共享资源。为了解决竞争条件(race condition)的问题,需要实现一种互斥机制,使得在任何时刻只能有一个进程访问该共享资源。以下C 程序代码 2给出了一种实现方法。C 程序代码 2int flag2; /*flaq 数组, 初始化为 FALSE*/Enter_Critical_Section (int my_task_id, int other_task_id)while (flag other_t

21、ask_id=TRUE); /*空循环语句*/flagmy_task_id=TRUE;Exit_Critical_Section (int my_task_id, int other_task_id)flagmy_task id=FALSE;当一个进程要访问临界资源时,就可以调用C 程序代码 2给出的这两个函数。C 程序代码 3给出了进程0 的一个例子。C 程序代码 3Enter_Critical_Section(0,1) ;使用这个资源Exit_Critical_Section (0,1) ;做其他的事情(分数:6.00)(1).C 程序代码 2所示的方法_实现共享资源的互斥访问。A能够 B

22、不能(分数:2.00)填空项 1:_ (正确答案:B 或不能)解析:解析 中的方法不能实现资源的互斥访问。例如,考虑如下的情形。(1) 初始化的时候,flag 数组的两个元素值均为 FALSE。(2) 进程 0 先执行,在执行 while 循环语句时,由于 flag1=FALSE,所以顺利结束,不会被卡住。假设这个时候来了一个时钟中断,打断它的运行。(3) 进程 1 去执行,在执行 while 循环语句时,由于 flag0=FALSE,所以顺利结束,不会被卡住,然后就进入了临界区。(4) 后来当进程 0 再执行时,也进入了临界区,这样就同时有两个进程在临界区。(2).C 程序代码 2采用了一种

23、繁忙等待(busy waiting)的策略,这种策略的主要缺点是什么? 请用 100字以内的文字简要说明。(分数:2.00)填空项 1:_ (正确答案:该算法策略每个任务进程要循环地去判断当前能否访问临界资源,因此会浪费大量的 CPU 时间,而且当设计不合理时,容易导致死锁)解析:本题考查的是进程之间的互斥问题,即基于繁忙等待(busy waiting)的进程互斥实现方法。其基本思路是,当一个进程要进入临界区时,首先需要检查是否允许它进入,若允许,则直接进入;否则,则循环等待。在多道程序系统中,各个进程是并发执行的,由于时钟中断的原因,使进程之间的执行顺序变得难以预测,每个进程都有可能在任意一

24、条语句的后面被中断。在这种情形下,如果要采用基于繁忙等待的互斥实现方法,就必须考察所有的可能,即如果每个进程在不同的位置被中断时,能否正确地实现进程间的互斥。由于该算法策略需要使用一个循环语句不断执行测试指令,即每个进程要循环地去判断当前能否访问临界资源,因此会浪费大量的 CPU 时间,而且当设计不合理时,容易导致死锁。(3).如果将 Enterl_Critical_Section()函数中的两条语句互换一下位置,则可能会出现什么情况? 请用100 字以内的文字简要说明。(分数:2.00)填空项 1:_ (正确答案:可能会出现死锁)解析:在“Enter_Critical_Section(int

25、 my_task_id,int other_task_id)”函数中,已提示“whiIe(flagother_task id=TRUE);”是一条空循环语句。如果将它调到“flagmy_task_id=TRUE;”语句之后,则将可能导致程序进入死锁状态。三、试题三(总题数:1,分数:15.00)2.说明某超市集团为发展业务向社会公开招聘 N 个工种的工作人员,每个工种各有不同的编号(1M)和计划招聘人数。每位应聘者需申报两个工种,并参加集团组织的考试。该集团公司将按应聘者的成绩从高分至低分的顺序进行排队录取。具体录取原则是:从高分到低分依次对每位应聘者先按其第一志愿录取;当不能按其第一志愿录取

26、时,便将他的成绩扣去 5 分后,重新排队,并按其第二志愿考虑录取。以下 C 程序为输出各工种实际招聘的应聘人员,每个工种都保留一个录取者的有序队列。录取处理循环直至招聘额满或已对全部应聘者都做了录取处理后跳出。在 C 程序中,类型 STU 包含有应聘者的基本信息:编号、成绩、志愿、排队成绩和录取志愿号。数组 rz的每个元素对应一个工种,包含计划招聘人数和已录取的人数。C 程序代码#include#define N 36#define EDMARK 5typedef struct stu int no, total, z2, sortm, zi;struct stu *next;STU;stru

27、ct rznode int lmt , count;STU *next;rz N ;STU *head = NULL, *over = NULL;int allFILE *fp;char dataf = “zp2008.dat“;print (STU *p)for (;p!=NULL; p = p-next)printf(“%d(%d)/t“, p-no, p-total) ;insert(STU *p, STU *u)STU *v, *q;for (q = *p;q != NULL; v = q , (1) )if ( q- sortm u-sortm)break;if ( q = *p)(

28、2) ;else(3) ;u-next = q ;main ( )int zn, i, no, total, z1, z2 ;STU *p, *v, *q;fp = fopen (dataf, “r“) ;if (fp = NULL)printf (“Cant open file %s./n“,dataf);exit (0) ;fscanf (fp,“%d“,for (all = 0, i = i; i = zn; i+)fscanf (fp, “%d“, rz i .count = 0;rzi .next = NULL;all += (4) ;for (;)if (fscanf(fp,“%d

29、%d%d%d“,p = ( STU *) malloc (sizeof (STU) ;p-no = no; p-total = p-sortm = total;p-zi = 0; p-z0 : z1;p-z1 = z2;(5) ;fclose (fp);for (;all )p = head;head = head-next;if (rzp-zp-zi.count (6) )rzp-zp-zi.count +;insert( all-; continue;if (p-zi = 1 )p-next = over; over = p;continue;p-sortm -= DEMARK;(7) ;

30、insert( for ( i = 1; i = zn; i+ )printf(“%d:/n“,i);print( rzi .next);printf(“/n“);printf(“over:/n“);print (head);print(over);printf(“/n“)(分数:15.00)填空项 1:_ (正确答案:q=q-next 或 q=v-next 或其等价形式(2) *p=u 或其等价形式(3) v-next=u 或其等价形式(4) rzi.1mt(5) insert(”可以保留重复序列的第 1 个结点,并将重复序列中的其余结点从链表中删除。(4) 空缺处所处的第 2 个 whil

31、e 内循环通过函数 free()、临时指针 s 和临时指针 t 实现逐个释放重复序列中除第 1 个结点之外的其余结点存储空间的功能。当指针 s 还没到达指针 q 所指示的位置时,则进入第2 个 while 内循环体执行相关结点存储空间的释放任务。因此,(4)空缺处应填入的表达式是 s!=q。(5) 空缺处应使指针 ptr 指向刚被删除的重复序列之后的第 1 个相异元素,为下一轮的遍历操作做准备,即该空缺处应填入 ptr。其对应的完整 C 代码如下。void compress (NODE *head) NODE *ptr,*q;ptr = head - next; /* 取得第一个元素结点的指针

32、 */while(ptr while(q /* 继续扫描后继元素 */s = ptp-next; /* 需要删除的第一个结点 */ptr - next = q; /* 保留重复序列的第一个结点,将其余结点从链表中删除 */while(s frees); s = n;ptr = ptr - next; /* 令指针 ptr 指向刚被删除的重复序列之后第 1 个相异元素 */* end of while */* end of compress */设计思路 2:顺序地遍历链表。仔细通读题干的说明信息,以及所给出的整段 C 程序代码,试题要求去掉链表中的重复元素;使得链表中的元素互不相同,这就需要对

33、链表进行查找和删除操作。对于元素已经按照非递减方式排序的单链表,删除其中重复的元素,可以顺序地遍历链表;对于逻辑上相邻的两个元素,比较它们是否相同,若相同,则删除后一个元素的结点,以此类推,直至表尾。单链表中每个结点的存储地址是存放在其前趋结点 next 域中,而开始结点无前趋,故应设头指针 head 指向开始结点。结合图所示的链表结构,要取得第 1 个元素结点的指针,则需要在(1)空缺处填入 head-next。在 while 外循环条件表达式中,应使指针 ptr 指示出重复序列的第一个元素结点,因此(2)空缺处应填入ptr。结合注释信息“处理重复元素”,根据前述算法思想,在 while 外

34、循环条件表达式中,当指针 ptr 所指结点的元素值与其后继结点的元素值相同时,则进入该 while 循环体进行相关的删除操作。因此(3)空缺处应填入表达式 ptr-next-data=ptr-data 或 q-data=ptr-data。在 while 内循环体中,使用语句“ptr-next=q-next;”将逻辑上相邻的两个相同元素的后一个结点从链表中删除。因此(4)空缺处应填入 ptr-next。(5) 空缺处应使指针 ptr 指向刚被删除的重复序列之后的第一个相异元素,为下一轮的遍历操作做准备,即该空缺处应填入 ptr。五、试题五(总题数:1,分数:15.00)4.说明某绘图系统存在 P

35、oint、Line 和 Square 3 种图元,它们具有 Shape 接口,图元的类图关系如图 8-5 所示。现要将 Circle 图元加入此绘图系统以实现功能扩充。已知某第三方库已经提供了 XCircle 类,且完全满足系统新增的 Circle 图元所需的功能,但 XCircle 不是由 Shape 派生而来的,它提供的接口不被系统直接使用。C+代码 1既使用了 Xcircle,又遵循了 Shape 规定的接口,既避免了从头开发一个新的Circle 类,又可以不修改绘图系统中已经定义的接口。C+代码 2根据用户指定的参数生成特定的图元实例,并对其进行显示操作。该绘图系统定义的接口与 XCi

36、rcle 提供的显示接口及其功能如表 8-2 所示。(分数:15.00)填空项 1:_ (正确答案:Shape(2) XCircte(3) displaylt()(4) Shape*(5) getShapeInstance(type)(6) delete s)解析:这是一道考查用接口实现类的功能扩充的程序分析题。本试题的解答思路如下。由于 C+具有多继承性,因此在 C+实现中,通常采用多继承来代替接口。由题干关键信息“某绘图系统存在 Point、Line 和 Square 3 种图元,它们具有 Shape 接口现要将Circle 图元加入此绘图系统以实现功能扩充”可知,试题明确要求 Circl

37、e 具有 Shape 接口,因此(1)空缺处应填入“Shape”。由于C+代码 1既使用了 XCircle,又遵循了 Shape 规定的接口,即重用 xCinle 类而不用从头开发一个新的 Circle 类,因此,凡是在 Circle 类实现 Shape 的接口时,都应调用相应的 XCircle 类提供的方法。即(2)空缺处应填入“Xcircle”,(3)空缺处应填入“displayIt()”。通过阅读C+代码 2程序,由于(5)空缺处调用。factory 对象的方法,而类 Factory 只有一个方法为getShapeInstance,因此(5)空缺处应填入“getShapeInstance

38、(type)”。其中,参数 type 为用户运行程序时指定的参数,表明需要生成哪种类型的对象。同理,由于 s 是 Shape*类型,因此(4)空缺处所在的语句“getShapeInstance(int type)”的返回值类型为 Shape*,即(4)空缺处应填入“Shape*”。由于程序退出前需要释放指针 s 所占用的内存空间,因此(6)空缺处应填入“delete s”。六、试题六(总题数:1,分数:15.00)5.说明某绘图系统存在 Point、Line 和 Square 3 种图元,它们具有 Shape 接口,图元的类图关系如图 8-6 所示。现要将 Circle 图元加入此绘图系统以实

39、现功能扩充。已知某第三方库已经提供了 XCircle 类,且完全满足系统新增的 Circle 图元所需的功能,但 XCircle 不是由 Shape 派生而来的,它提供的接口不被系统直接使用。Java 代码 1既使用了 XCircle 又遵循了 Shape 规定的接口,既避免了从头开发一个新的Circle 类,又可以不修改绘图系统中已经定义的接口。Java 代码 2根据用户指定的参数生成特定的图元实例,并对其进行显示操作。该绘图系统定义的接口与 XCircle 提供的显示接口及其功能如表 8-3 所示。(分数:15.00)填空项 1:_ (正确答案:implements Shape(2) XC

40、ircle(3) Xcircle()(4) displayIt()(5) Shape(6) getShapeInstance(type))解析:这是一道要求考生掌握 Java 接口的程序分析题。本试题的解答思路如下。Java 接口是用来实现类间多重继承功能的结构,它定义了若干个抽象方法和常量用以实现多重继承的功能。所谓多重继承,是指一个子类可以同时从多个父类继承其行为与特征的功能。该概念是与单一继承相对而言的,单一继承是指一个子类只可以继承自一个父类。Java 语言不支持多重继承,只支持单重继承,然而在解决实际问题的程序设计中,仅靠单重继承尚不能解决更复杂的问题。为了使 Java 程序的类层次

41、结构更加合理,更符合实际问题的需要,就把用于完成特定功能的若干属性组织成相对独立的属性集合,这种属性集合就称为接口。定义接口与定义类非常相似。实际上完全可以把接口理解成为一种特殊的类,接口是由常量和抽象方法组成的特殊类。一个类只能有一个父类,但是它可以同时实现若干个接口。这种情况下如果把接口理解成特殊的类,那么这个类利用接口实际上就获得了多个父类,即实现了多重继承。与类定义相仿,声明接口时也需要给出访问控制符,不同的是接口的访问控制符只有 public 一个。用 public 修饰的接口是公共接口,可以被所有的类和接口使用,而没有 public 修饰符的接口则只能被同一个包中的其他类和接口利用

42、。接口也具有继承性。定义一个接口时可以通过 extends 关键字声明该新接口是某个已经存在的父接口的派生接口,它将继承父接口的所有属性和方法。与类的继承不同的是,一个接口可以有一个以上的父接口,它们之间用逗号分隔,形成父接口列表。新接口将继承所有父接口中的属性和方法。由试题给出的关键信息“某绘图系统存在 Point、Line 和 Square 3 种图元,它们具有 Shape 接口现要将 Circle 图元加入此绘图系统以实现功能扩充”可知,Circle 图元也具有 Shape 接口,因此(1)空缺处所应填写的内容是“implements Shape”。由于Java 代码 1既使用了 Xci

43、rcle,又遵循了 Shape 规定的接口,即要重用类 XCilrcle 而不是从头开发一个新的 Circle 类,因此,凡是类 Circle 实现 Shape 的接口时,都调用相应的类 XCircle 所提供的方法,即(2)空缺处所应填写的内容是“Xcircle”。(3) 空缺处所应填写的内容是“Xcircle()”,以生成相应的 XCircle 的一个实例。(4) 空缺处所应填写的内容是“displayIt()”,即调用 displayIt()来实现 Shape 接口中的 display 方法。仔细阅读Java 代码 2可知,(6)空缺处所在的语句通过调用 factory 对象的方法,而类 factory 只有一个方法为 getShapeInstance,因此(6)空缺处应填入 getShapeInstame(type),参数为用户运行程序时指定的参数(即该程序段中的 type 参数),表明需要生成哪一种类型的对象。同理,由于 s 是 Shape 类型的引用,因此 getShapeInstance 的返回值类型为 Shape,即(5)空缺处所应填写的内容是“Shape”。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试资料 > 职业资格

copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1