ImageVerifierCode 换一换
格式:DOC , 页数:7 ,大小:73.50KB ,
资源ID:1318040      下载积分:5000 积分
快捷下载
登录下载
邮箱/手机:
温馨提示:
如需开发票,请勿充值!快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝扫码支付 微信扫码支付   
注意:如需开发票,请勿充值!
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【http://www.mydoc123.com/d-1318040.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(【计算机类职业资格】2016年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案解析.doc)为本站会员(周芸)主动上传,麦多课文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知麦多课文库(发送邮件至master@mydoc123.com或直接QQ联系客服),我们立即给予删除!

【计算机类职业资格】2016年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案解析.doc

1、2016 年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案解析(总分:16.00,做题时间:90 分钟)一、必答题(总题数:3,分数:6.00)1.必答题(共 4 道大题,每道大题)(分数:2.00)_2.阅读以下说明和流程图,填补流程图和问题中的空缺(1)(5),将解答填入答题纸的对应栏内。【说明】设整型数组 A1:N每个元素的值都是 l 到 N 之间的正整数。一般来说,其中会有一些元素的值是重复的,也有些数未出现在数组中。下面流程图的功能是查缺查重,即找出 A1:N中所有缺失的或重复的整数,并计算其出现的次数(出现次数为 0 时表示缺)。流程图中采用的算法思想是将数组 A

2、的下标与值看作是整数集1:N上的一个映射,用数组 C1:N依次记录各整数 k 出现的次数 ck,并输出所有缺失的或重复的数及其出现的次数。【流程图】 (分数:2.00)_3.阅读以下说明和 C 代码,填补代码中的空缺,将解答填入答题纸的对应栏内。说明 1递归函数 is elem(char ch,char*set)的功能是判断 ch 中的字符是否在 set 表示的字符集合中,若是,则返回 1,否则返回 0。C 代码 1 int iselem(char ch,char*set) if(*set=0) return 0; else if ( (1) ) return 1; else return i

3、selem( (2) ); 【说明 2】函数char*combine(char*setA,char*setB)的功能是将字符集合 A(元素互异,由 setA 表示)和字符集合 B(元素互异,由 setB 表示)合并,并返回合并后的字符集合。【C 代码 2】char* combj ne(char*setA,char*setB) int i, lenA, lenB, lenC; lenA=strlen(setA); lenB=strlen(setB);char*setC= (char*)malloc(1enA+lenB+1); if (!setC) return NULL ; strncpy(se

4、tc, setA, lenA); 将 setA 的前 lenA 个字符复制后存入 setc lenc= (3); for (i=0; ilenB; i+) if(4) ) 调用 iselem 判断字符是否在 setA 中 setC1enC+ =setBi; (5)=0; 设置合并后字符集的结尾标识 return SetC; (分数:2.00)_二、选答题(总题数:5,分数:10.00)4.选答题(共 3 道大题,每道大题)从下列 3 道试题中任选 1 道解答,如果解答的试题数超过 1 道,则仅题号小的 1 道题解答有效。(分数:2.00)_5.阅读以下说明和 C 代码,填补代码中的空缺,将解答

5、填入答题纸的对应栏内。【说明】某文本文件中保存了若干个日期数据,格式如下(年月日): 20051 21 2013229 19971011 1980515但是其中有些日期是非法的,例如 2013229 是非法日期,闰年(即能被 400 整除或者能被 4 整除而不能被 100 整除的年份)的 2 月份有 29 天,2013 年不是闰年。现要求将其中自 198511 开始、至20101231 结束的合法日期挑选出来并输出。下面的 C 代码用于完成上述要求。【C 代码】 #includestdioh typedef struct int year,month,day; *年,月,日* DATE; in

6、t isLeapYear(int y) *判断 y 表示的年份是否为闰年,是则返回 1,否则返回 0* return(y4=0y100 1=0)(y400=0); int isLegal(DATE date) *判断 date 表示的日期是否合法,是则返回 1,否则返回 0* int y=dateyear,m=datemonth,d=dateday; if(y1 985 y201 0 m1 m12 d1 d31) return 0; if(m=4 m=6 m=9m=i 1)& (1) ) return 0; if(m=2) if(isLeapYear(y) (2) ) return 1; ei

7、se if (d2 8) return 0; return 1; int Lteq(DATE dl,DATE d2) *比较日期 d1 和 d2,若 dl 在 d2之前或相同则返回 1,否则返回 0* long t1,t2; t1=d1year*10000+d1month*100+d1day; t2=d2year*10000+d2month*100+d2day; if( (3) ) return 1; else return 0; int main() DATE date,start=1 98 5,1,1,end=2 01 0,12,31); FILE*fp; fp=fopen(“dtxt”,

8、“r”);if( (4) ) return 一 1; while(!feof(fp) if(fscanf(fp,“ddd”,&dateyear,&datemonth,&dateday)!=3) break; if( (5) ) *判断是否为非法日期* continue; if( (6) )*调用 Lteq 判断是否在起至日期之间* printf(“dddn”,dateyear,datemonth,dateday); fclose(fp); return 0; (分数:2.00)_6.阅读以下说明和 C 代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 二叉查找树又称为二叉排序树,

9、它或者是一棵空树,或者是具有如下性质的二叉树。 (1)若它的左子树非空,则左子树上所有结点的值均小于根结点的值。 (2)若它的右子树非空,则右子树上所有结点的值均大于根结点的值。(3)左、右子树本身就是两棵二叉查找树。 二叉查找树是通过依次输入数据元素并把它们插入到二叉树的适当位置上构造起来的,具体的过程是:每读入一个元素,建立一个新结点,若二叉查找树非空,则将新结点的值与根结点的值相比较,如果小于根结点的值,则插入到左子树中,否则插入到右子树中;若二叉查找树为空,则新结点作为二叉查找树的根结点。 根据关键码序列46,25,54,1 3,29,91构造一个二叉查找树的过程如图 41 所示。 设

10、二叉查找树采用二叉链表存储,结点类型定义如下: typedef int KeyType; typedef struct BSTNode KeyType key; struct BSTNode*left,*right ; BSTNode,*BSTree; 图 4 一 1(g)所示二叉查找树的二叉链表表示如图 4-2 所示。 (分数:2.00)_7.阅读下列说明和 C+代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 以下 C+代码实现两类交通工具(Flight 和 Train)的简单订票处理,类 Vehicle、Flight、Train 之间的关系如图61 所示。 (分数:2.00

11、)_8.阅读以下说明和 Java 代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】以下 Java 代码实现两类交通工具(Flight 和 Train)的简单订票处理,类 Vehicle、Flight、Train 之间的关系如图 5-1 所示。 Java 代码 import Java.utilArrayList; import Java.utilList; abstract clasS Vehicle void book(int n) 订 n 张票 if(getTicket()=n) decreaseTicket(n); else Systemoutprintln(“余票不足!”);

12、 abstract int getTicket(); abstract void decreaseTicket(int n); ; class Flight (1) private (2)tickets=216; Flight 的票数 int getTicket() return tiCkets ; void decreaseTicket(int n) tickets=ticketsn; class Train (3) private(4)tickets=201 6; Train 的票数 int getTicket() return tickets; void decreaseTicket(i

13、nt n) tickets=ticketsn; public class Test public static void main(Stringargs) (分数:2.00)_2016 年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷答案解析(总分:16.00,做题时间:90 分钟)一、必答题(总题数:3,分数:6.00)1.必答题(共 4 道大题,每道大题)(分数:2.00)_解析:2.阅读以下说明和流程图,填补流程图和问题中的空缺(1)(5),将解答填入答题纸的对应栏内。【说明】设整型数组 A1:N每个元素的值都是 l 到 N 之间的正整数。一般来说,其中会有一些元素的值是重复的

14、,也有些数未出现在数组中。下面流程图的功能是查缺查重,即找出 A1:N中所有缺失的或重复的整数,并计算其出现的次数(出现次数为 0 时表示缺)。流程图中采用的算法思想是将数组 A 的下标与值看作是整数集1:N上的一个映射,用数组 C1:N依次记录各整数 k 出现的次数 ck,并输出所有缺失的或重复的数及其出现的次数。【流程图】 (分数:2.00)_正确答案:(正确答案:(1)Ai (2)Ck+1 (3)1 (4)k,Ck (5)4,0 5, 2)解析:解析:本题考查程序设计算法即流程图的设计。 先以问题中的简例来理解算法过程。 已知A1:5=3,2,5,5,1。初始时计数数组 c1:5=0,0

15、,0,0,0。 再逐个处理数组 A 的各个元素(根据 Ai的值在 cAi/中计数加 1): A1=3,计数 c3=1;A2:2,计数 c2=1;A3=5,计数 c5=1;A4=5,计数 c5=2;A5=1,计数 c1=1。最后,计算得到 c1:5=1,1,1,0,2),即表明 A1:5中数 4 缺失,数 5 有 2,其他数都只有 1 个。 再看流程图。左面先对数组 C 初始化(赋值都是 0)。再对 Ai各个元素逐个进行处理。将 Ai送 k,再对 ck计数加 1。因此,(1)处应填 Ai,(2)处应填 ck+1ck。 流程图右面需要输出计算结果。对于 k 的循环,当 ck=1 时(非缺非重)不需

16、要输出;否则,应按要求的格式输出:缺或重的数,以及出现的次数。为此,(3)处应填 1(与 1 比较),(4)处应填 k,ck。 再看简例的输出,先输出 4,0(数 4 缺失);再输出 5,2(数 5 有 2 个)。3.阅读以下说明和 C 代码,填补代码中的空缺,将解答填入答题纸的对应栏内。说明 1递归函数 is elem(char ch,char*set)的功能是判断 ch 中的字符是否在 set 表示的字符集合中,若是,则返回 1,否则返回 0。C 代码 1 int iselem(char ch,char*set) if(*set=0) return 0; else if ( (1) ) r

17、eturn 1; else return iselem( (2) ); 【说明 2】函数char*combine(char*setA,char*setB)的功能是将字符集合 A(元素互异,由 setA 表示)和字符集合 B(元素互异,由 setB 表示)合并,并返回合并后的字符集合。【C 代码 2】char* combj ne(char*setA,char*setB) int i, lenA, lenB, lenC; lenA=strlen(setA); lenB=strlen(setB);char*setC= (char*)malloc(1enA+lenB+1); if (!setC) re

18、turn NULL ; strncpy(setc, setA, lenA); 将 setA 的前 lenA 个字符复制后存入 setc lenc= (3); for (i=0; ilenB; i+) if(4) ) 调用 iselem 判断字符是否在 setA 中 setC1enC+ =setBi; (5)=0; 设置合并后字符集的结尾标识 return SetC; (分数:2.00)_正确答案:(正确答案:(1)set0=ch 或*set=ch 或等价形式 (2)ch,set+1 或 ch,+set 或等价形式 (3)lenA 或等价形式 (4)!iselem(setBi,setA) 或等价

19、形式 (5)setC1enC 或*(setC+lenC)或等价形式)解析:解析:本题考查 C 程序设计的基本结构和运算逻辑。 函数 is_elem(char ch,char*set)的功能是判断给定字符是否在一个字符串中,其运算逻辑是:若 ch 所存的字符等于字符数组 set 的第一个字符,则结束;否则再与 set 中的第二个字符比较,依此类推,直到串尾。因此空(1)处应填入“set【0】=ch”或其等价表示。题目要求该函数以递归方式处理,并在空(2)处填入递归调用时的实参。显然,根据函数is elem 的首部信息,递归调用时第一个参数仍然为“ch”,第二个参数是需给出 set 中字符串的下一

20、个字符的地址(第一次递归时为字符串第二个字符的地址,第二次递归时实际为字符串第三个字符的地址,由于传进来时与 ch 进行比较的字符都是*set,那么下一个字符就都表示为 set+1),即为&set1,或者为 set+1,所以空(2)处应填入参数“ch,set+1”或其等价表示。 函数combine(char*setA,char*setB)的功能是将字符集合 A 和字符集合 B 合并,并返回合并后的字符集合,处理思路是:现将 A 集合的元素全部复制给集合 C(stmcpy(setC,setA,lenA),然后按顺序读取集合 B中的字符,判断其是否出现在 A 中。如果来自集合 B 的字符已经在 A

21、 中,则忽略该字符,否则,将其加入集合 C。 变量 lenC 表示集合 C 的元素个数,其初始值应等于 lenA,因此空(3)应填入“lenA”。 根据注释,空(4)应填入“!is_elem(setBi,setA)”,判断来自集合 B 的元素 setBi是否在集合 setA 中。空(5)处的代码作用是设置字符数组 setC 的尾部字符“0”,由于 lenC 的值跟踪了该集合中元素数目的变化,其最后的值正好表示了 setC 的元素个数,所以该空应填入“setC1enC”或其等价表示。二、选答题(总题数:5,分数:10.00)4.选答题(共 3 道大题,每道大题)从下列 3 道试题中任选 1 道解

22、答,如果解答的试题数超过 1 道,则仅题号小的 1 道题解答有效。(分数:2.00)_解析:5.阅读以下说明和 C 代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】某文本文件中保存了若干个日期数据,格式如下(年月日): 20051 21 2013229 19971011 1980515但是其中有些日期是非法的,例如 2013229 是非法日期,闰年(即能被 400 整除或者能被 4 整除而不能被 100 整除的年份)的 2 月份有 29 天,2013 年不是闰年。现要求将其中自 198511 开始、至20101231 结束的合法日期挑选出来并输出。下面的 C 代码用于完成上述要求。

23、【C 代码】 #includestdioh typedef struct int year,month,day; *年,月,日* DATE; int isLeapYear(int y) *判断 y 表示的年份是否为闰年,是则返回 1,否则返回 0* return(y4=0y100 1=0)(y400=0); int isLegal(DATE date) *判断 date 表示的日期是否合法,是则返回 1,否则返回 0* int y=dateyear,m=datemonth,d=dateday; if(y1 985 y201 0 m1 m12 d1 d31) return 0; if(m=4 m

24、=6 m=9m=i 1)& (1) ) return 0; if(m=2) if(isLeapYear(y) (2) ) return 1; eise if (d2 8) return 0; return 1; int Lteq(DATE dl,DATE d2) *比较日期 d1 和 d2,若 dl 在 d2之前或相同则返回 1,否则返回 0* long t1,t2; t1=d1year*10000+d1month*100+d1day; t2=d2year*10000+d2month*100+d2day; if( (3) ) return 1; else return 0; int main(

25、) DATE date,start=1 98 5,1,1,end=2 01 0,12,31); FILE*fp; fp=fopen(“dtxt”,“r”);if( (4) ) return 一 1; while(!feof(fp) if(fscanf(fp,“ddd”,&dateyear,&datemonth,&dateday)!=3) break; if( (5) ) *判断是否为非法日期* continue; if( (6) )*调用 Lteq 判断是否在起至日期之间* printf(“dddn”,dateyear,datemonth,dateday); fclose(fp); retur

26、n 0; (分数:2.00)_正确答案:(正确答案:(1)d30 或 d=31 或等价形式 (2)d30”或其等价形式。当月份为 2 时,需要考虑是否闰年,闰年的 2 月是 29 天、平年是 28 天,因此空(2)处应填入“dkey!=kword 或等价形式 (3)P 或 p!=0 或 p!=NULL (4)sizeof(BSTNode)或等价形式 (5)*rootptr (6)father-left=P (7)father-right=P)解析:解析:本题考查 C 程序设计的基本结构和数据结构的实现。 根据二叉查找树的定义,其左子树中结点的关键码均小于树根结点的关键码,其右子树中结点的关键码

27、均大于根结点的关键码,因此,将一个新关键码插入二叉查找树时,若等于树根或某结点的关键码,则不再插入,若小于树根,则将其插入到左子树中,否则将其插入到右子树中。 根据注释,空(1)处需将 father 设置为空指针,应填入“father=NULL”或其等价形式。 空(2)所在语句用于查找新关键码的插入位置,p 指向当前结点。查找结果为两种:若找到,则 p 指向的结点的关键码等于新关键码,若没有找到,则 p 得到空指针值。因此空(2)处应填入“p-key!=kword”或其等价形式,在得到结果前使得查找过程可以继续,并且用 father 记录新插入结点的父结点指针。 空(3)处应填入“p”或其等价

28、形式,表明查找到了与 kword 相同的结点,无须再插入该关键码。 空(4)处应填入“sizeof(BSTNode)”,在申请新结点空间时提供结点所需的字节数。 空(5)处应填入“*rootptr”,使得新结点作为树根结点时,树根结点的指针作为二叉链表的标识能得到更新。 根据注释,空(6)应填入“father-left=P”、空(7)应填入“father-right=P”。7.阅读下列说明和 C+代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 以下 C+代码实现两类交通工具(Flight 和 Train)的简单订票处理,类 Vehicle、Flight、Train 之间的关系如

29、图61 所示。 (分数:2.00)_正确答案:(正确答案:(1)public Vehicle (2)static int (3)public Vehicle (4)static int (5)(*vi)book (6)212 (7)2010 (8)2005)解析:解析:本题考查 C+语言程序设计,涉及类、继承、对象、函数的定义和相关操作。要求考生根据给出的案例和代码说明,认真阅读理清程序思路,然后完成题目。 先考查题目说明,实现两类交通工具(Flight 和 Train)的简单订票处理,根据说明进行设计,题目说明中图 61 的类图给出了类Vehicle、Flight、Train 之间的关系。涉

30、及到交通工具类 Vehicle、其子类 Flight 和 Train 两类具体交通工具。简单订票就针对这两类具体的交通工具,每次订票根据所选订票的交通工具和所需订票数进行操作。 不论哪类交通工具,订票操作 book 在余票满足条件的情况下将余票减少所订票数,不足时则给出“余票不足”提示,所以在父类 Vehicle 中定义并实现 void book(int n)函数。每类具体交通工具获取自身类型的票数(getTicket),订票也只减少自身类型票数(decreaseTicket(int n)等类以及相关操作。因此,在父类 Vehicle 中,分别定义针对上述两个操作的虚函数: Virtual i

31、nt getTicket() = 0 ; Virtual void decreaseTicket(int)=0 ; 在 C+中,virtual 作为虚函数的关键字,“=0;”表示为纯虚函数,包含虚函数的类本身也是虚拟类,而且,虚函数必须由其子类实现。从题目说明给出的类图(图61)也可以看出,Vehicle 的两种具体类(子类)为 Flight 和 Train。C+中,子类继承父类用“:”,即:class 子类名:继承的方式父类名 考查主控函数 main(),需要将 Flight 和 Train 类型的对象加入模板类型为 Vehicle 的向量中,因此,Flight 和 Train 的实现分别为

32、: class Flight: public Vehicle clas s Train: public Vehicle Flight 类和 Train 类中必须实现 getTicket 和 decreaseTicket 函数才能进行获取票数和减少余票的操作。因此,这两个类中都实现了 getTicket 和 decreaseTicket 函数。 Flight 和 Train 两类具体交通工具的票数需要分别记录,并且每次订票操作需要对总数进行操作,所以需要定义为类变量,同一类的所有对象共享此变量。在 C+中,定义类变量的方式是将变量定义为静态变量,即用 static 关键字修饰。同时分析对票数的使

33、用,getTicket 和 decreaseTicket 两个函数的返回值和参数都用类型 int,因此,票数 tickets 也定义为 int。综合上述两个方面知,tickets 定义为 static int 类型。而且,在 C+中,staticint 类型的变量必须在类外进行初始化,即: int Train:tickets=2016; 初始化 Train 的票数为 2016 int Flight:tickets=216; 初始化Flight 的票数为 216 主函数:main()中实现了订票系统的简要控制逻辑,其中创建欲进行订票的对象、持有对象的集合、订票逻辑等。定义 vectorVehic

34、le向量类型变量 v,此处采用模板类集合,在 v 中,可以持有 Vehicle 类型及其子类型的对象指针。vectorE向量中的函数 push back(E e)用于给向量的最末端添加元素,采用向量元素下标 index 获取向量中索引位置为 index 的元素,即对象指针,size()用以获取向量的元素个数。主控逻辑中创建 Flight 和 Train 两个具体类的一些订票请求对象加入 v 中,因为 Flight 和 Train 均为 Vehicle 的子类型,而且是具体类,所以满足加入元素的要求,故采用 new Flight()和 new Train()来创建相应的对象加入 v 中;然后通过

35、 for 循环使每个订票请求对象进行订票,并输出剩余票数: for(int i=0;ivsi ze();i+) (*vi)book(i+1); 订 i+1 张票 cout“剩余票数:” (*vi)getTicket() endl; 即从 v 中取每个对象指针,用其指向的对象调用 book 函数进行订票操作。vi获得 v 中位置为 i 的元素,(*vi)则是 Vehicle 类型的对象,由于面向对象的多态机制使得不同对象接收同一消息后发生不同的响应,即具体行为由位置为 i 的对象指针所引用的对象决定。此处无须类型转换,这是因为在父类 Vehicle 中,已经定义了 book 函数,并且声明了 b

36、ook 所调用的 getTicket 和 decreaseTicket 函数接口,子类分别加以实现。另外,在上述getTicket 和 decreaseTicket 两个函数执行时,因为每次操作 tickets 为 static 静态类型,所以,每个操作均作用在当前类变量的剩余票数,即具体子类型的有唯一一个当前剩余票数,每次操作都是上次对象修改之后的值的基础上继续更新。 在 main()函数中,依次新建并加入了 5 个对象,按顺序类型分别为:Flight、Train、Flight、Train、Train,加入 v 中的 index 分别为 0、1、2、3、4。在 for 循环中,按顺序获取向量

37、中的对象元素,并进行订票,数量为 i+1 张,然后输出剩余票数。因此,采用(*vi)book(i+1)进行订票,采用(*vi)getTicket0 获得当前对象元素所属类的剩余票数。其中 Flight 的剩余票数 2161=215、2153=212;Train 的剩余票数为 20162=2014、2014-4=2010、20105=2005。按对象顺序则为:215、2014、212、2010、2005。 综上所述,空(1)和(3)需要表示继承 Vehicle 虚类,即 public Vehicle;空(2)和(4)需要分别表示 Flight 和 Train 中 tickets 变量为静态整型变

38、量,即static int;空(5)处为调用获取 v 中对象元素并订票的(*vi)book;空(6)为 212;空(7)为 2010;空(8)为 2005。8.阅读以下说明和 Java 代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】以下 Java 代码实现两类交通工具(Flight 和 Train)的简单订票处理,类 Vehicle、Flight、Train 之间的关系如图 5-1 所示。 Java 代码 import Java.utilArrayList; import Java.utilList; abstract clasS Vehicle void book(int n)

39、 订 n 张票 if(getTicket()=n) decreaseTicket(n); else Systemoutprintln(“余票不足!”); abstract int getTicket(); abstract void decreaseTicket(int n); ; class Flight (1) private (2)tickets=216; Flight 的票数 int getTicket() return tiCkets ; void decreaseTicket(int n) tickets=ticketsn; class Train (3) private(4)ti

40、ckets=201 6; Train 的票数 int getTicket() return tickets; void decreaseTicket(int n) tickets=ticketsn; public class Test public static void main(Stringargs) (分数:2.00)_正确答案:(正确答案:(1)extends Vehicle (2)stmic int (3)extends Vehicle (4)static int (5)vget(i)book (6)212 (7)2010 (8)2005)解析:解析:本题考查 Java 语言程序设计

41、,涉及类、继承、对象、方法的定义和相关操作。要求考生根据给出的案例和代码说明,认真阅读理清程序思路,然后完成题目。 先考查题目说明,实现两类交通工具(Flight 和 Train)的简单订票处理,根据说明进行设计。题目说明中图 51 的类图给出了类Vehicle、Flight、Train 之间的关系。涉及到交通工具类 Vehicle、其子类 Flight 和 Train 两类具体交通工具。简单订票就针对这两类具体的交通工具,每次订票根据所选订票的交通工具和所需订票数进行操作。 不论哪类交通工具,订票操作 book 在余票满足条件的情况下将余票减少所订票数,不足时则给出“余票不足”提示,所以在父

42、类 Vehicle 中定义并实现 void book(int n)方法。每类具体交通工具获取自身类型的票数(getTicket),订票也只减少自身类型票数(decreaseTicket(int n)等类以及相关操作。因此,在父类 Vehicle 中,分别定义针对上述两个操作的抽象方法: abstract int getTicket(); abstract Void decreaseTicket(int n); 在 Java 中,abstract 作为抽象方法的关键字,包含抽象方法的类本身也必须是抽象类,因此,类 Vehicle 前需要有 abstract 关键字修饰,即: abstract c

43、lass Vehicle 而且,抽象方法必须由其子类实现。从题目说明给出的类图(图 51)也可以看出,Vehicle 的两种具体类(子类)为 Flight 和 Train。Java 中,子类继承父类用关键字 extends,不论父类是抽象类还是具体类,即: class 子类名 extends 父类名 因此,Flight 和 Train 的定义分别为: class Fli Cfht extends Vehicle Class Traln eXtendS VenlCe Flight 类和 Train 类中必须实现 getTicket和 decrease Ticket 方法才能进行获取票数和减少余票的操作。因此,这两个类中都实现了 get Ticket和 decrease Ticket 方法。 Flight 和 Train 两类具体交通工具的票数需要分别记录,并且每次订票操作需要对总数进行操作,所以需要定义为类变量,同一类的所有对象共享此变量。在 Java 中,定义类变量的方式是将变量定义为静态变量,即用 static 关键字修饰。同时分析对票数的使用,g

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