2016上半年程序员考试真题及答案-下午卷.docVIP

  • 11
  • 0
  • 约7.9千字
  • 约 18页
  • 2021-08-24 发布于北京
  • 举报

2016上半年程序员考试真题及答案-下午卷.doc

2016上半年程序员考试真题及答案-下午卷 试题一 阅读以下说明和流程图,填补流程图和问题中的空缺(1)~(5),将解答填入答题纸的对应栏内。 【说明】 设整型数组A[1:N]每个元素的值都是1到N之间的正整数。一般来说,其中会有一些元素的值是重复的,也有些数未出现在数组中。下面流程图的功能是查缺查重,即找出A[1:N]中所有缺的或重复的整数,并计算其出现的次数(出现次数为0时表示缺)。流程图中采用的算法思想是将数组A的下标与值看作是整数集[1:N]加上的一个映射,并用数组C[1:N]记录各整数出现的次数,需输出所有缺少的或重复的数及其出现的次数。 【流程图】 【问题】 如果数组A[1:5]的元素分别为{3,2,5,5,1},则算法流程结束后输出结果为: (5) 输出格式为:缺少或重复的元素,次数(0表示缺少) 参考答案: (1)A[i] (2)C[k]+1 (3)0 (4)k 和C[k] (5)4,{1,1,1,0,2} 试题分析: (1)A[i] //A[i]赋给K, (2)C[k]+1//C[k]值加1,i循环中,将A{i}中存在的值在C[k]中相应位数上加1。以A[1:5]={3,2,5,5,1}为例,当i=1时,k=A[1]=3,则C[3]+1,即C[1:5]变成{0,0,1,0,0}。 (3)0 //判断C[k]值是否为0,为零这说明k未缺少值 (4)k 和C[k] //k位重复数,C[k]为重复次数 (5)在范例中,4没有出现,1、2、3分别出现了1次,5出现了两次。 试题二 阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明1】 递归函数is_elem(char ch, char *set)的功能是判断ch中的字符是否在set表示的字符集合中,若是,则返回1,否则返回0。 【C代码1】 int is_elem (char ch ,char*set) { If(*set==‘\0’) return 0; else If((1)) return 1; else return is_elem((2)) } 【说明2】 函数char*combine(char* setA,char *setB)的功能是将字符集合A(元素互异,由setA表示)和字符集合B(元素互异,由setB表示)合并,并返回合并后的字符集合。 【C代码2】 char*combine(char *setA, char*setB) { int i,lenA, lenB, lenC; lenA=strlen(setA); lenB=strlen(setB); char*setC=(char*)malloc(lenA+lenB+1); if(!setC) return NULL; strncpy(setC,setA,lenA); //将setA的前lenA个字符复制后存入setC lenC = (3); for(i=0;i<lenB;i++) if((4)) //调用is_elem判断字符是否在setA中 setC[lenC++]=setB[i]; (5) =‘/0’; //设置合并后字符集的结尾标识 return setC; } 参考答案: (1)set[0]==ch (2)ch,*set-1 (3)lenA (4)is_elem(setB[i],*setA)==0 (5)setC[lenC+1] 试题分析: If(set[0]==ch)//取出set第一个元素与ch字符比较是否相等 return is_elem(ch,*set-1) // 从set第二个元素开始重新递归代入函数执行 strncpy(setC,setA,lenA); //将setA的前lenA个字符复制后存入setC lenC=lenA; for(i=0;i<lenB;i++) ifis_elem(setB[i],*setA)==0) //调用is_elem判断字符是否在setA中 setC[lenC++]=setB[i]; setC[lenC+1]=‘/0’; //设置合并后字符集的结尾标识 returnsetC; 试题三 阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 某文本文件中保存了若干个日期数据,格式如下(年/月/日): 2005/12/1 2013/2/29 1997/10/11 1980/5/15 .... 但是其中有些日期是非法的,例如2013/2/29是非法日期,闰年(即能被400整除或者

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档