【计算机类职业资格】2016年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案解析.doc
《【计算机类职业资格】2016年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案解析.doc》由会员分享,可在线阅读,更多相关《【计算机类职业资格】2016年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案解析.doc(7页珍藏版)》请在麦多课文档分享上搜索。
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 道解
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 职业资格 2016 上半年 软件 水平 考试 初级 程序员 下午 应用技术 试卷 答案 解析 DOC

链接地址:http://www.mydoc123.com/p-1318040.html