最新程序员考试真题及答案下午卷2.docx
- 文档编号:23907942
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:21
- 大小:162.77KB
最新程序员考试真题及答案下午卷2.docx
《最新程序员考试真题及答案下午卷2.docx》由会员分享,可在线阅读,更多相关《最新程序员考试真题及答案下午卷2.docx(21页珍藏版)》请在冰豆网上搜索。
最新程序员考试真题及答案下午卷2
2016下半年程序员考试真题及答案-下午卷
试题一〔共15分〕
阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。
【说明】
设有整数数组A[1:
N]〔N>1〕,其元素有正有负。
下面的流程图在该数组中寻找连续排列的假设干个元素,使其和到达最大值,并输出其起始下标K、元素个数L以及最大的和值M。
例如,假设数组元素依次为3,-6,2,4,-2,3,-1,那么输出K=3,L=4,M=7。
该流程图中考察了A[1:
N]中所有从下标i到下标j〔j≥i〕的各元素之和S,并动态地记录其最大值M。
【流程图】
注:
循环开场框内应给出循环操纵变量的初值和终值,默认递增值为1,格式为:
循环操纵变量=初值,终值
1、i,N
2、S+A[j]
3、S
4、j-i+1
5、S
要想在数组中寻找连续排列的假设干个元素,使其和到达最大值,并输出其起始下标K、元素个数L以及最大的和值M。
那么,会将数组从第一个元素出发,依次比拟A[1],A[1]+A[2],A[1]+A[2]+A[3],……,A[1]+A[2]+…+A[N],然后再比拟A[2],A[2]+A[3],A[2]+A[3]+A[4],……,A[2]+A[3]+…+A[N],然后再比拟A[3]+A[4],A[3]+A[4]+A[5],……,A[3]+A[4]+…+A[N],直到最后一个元素A[N].
按照这种逻辑,要使用两个循环,且要保存之前求和项。
一个是i循环,从1到N递增,另一个是j循环,j表示的是求和项的最大下标值,那么j从i开场,且要小于N。
S+A[j]—>S不断保存A[i]+A[i+1]+…A[j]的值,直到j循环完毕。
并将S的值与之前保存的M的值进展比拟,如果S>M,那么将S的值赋给M,并求出L值,在这里,i是最小下标值,j是最大下标值,那么L=j-i+1。
如果S 试题二〔共15分〕 阅读以下代码,答复以下问题: 1至问题3,将解答填入答题纸的对应栏内。 【代码1】 #include voidswap(intx,inty) { inttmp=x;x=y;y=tmp; } intmaim() { inta=3,b=7; printf("a1=%db1=%d\n",a,b); Swap(a,b); Printf("a2=%db2=%d\n〞,a,b); return0; } 【代码2】 #include #defineSPACE¨//空格字符 Intmain() { charstr[128]=〞Nothingisimpossible! “; inti,num=0,wordMark=0; for(i=0;str[i];i++) If(str[i]=SPACE) WordMark=0; else If(wordMark=0){ wordMark=1; Mun++; } Printf(“%d/n〞,num) retun0; } 【代码3】 #include #defineSPACE“//空格字符 intcountStrs(char*); intmain() { charstr[128]="Nothingisimpossible! "; Printf(‘%d/n,〔1〕(str)) retum0; } intcountStrs(char*p) { intnum=0,wordMark=0; for(;〔2〕;p++){ If(〔3〕=SPACE) wordMark=0; else if(! wordMark){ wordMark=1; ++num } } return〔4〕 } 【问题1】〔4分〕 写出代码1运行后的输出结果。 a1=3 b1=7 a2=3 b2=7 【问题2】〔3分〕 写出代码2运行后的输出结果。 3 【问题3】〔8分〕 代码3的功能与代码2完全一样,请补充3中的空缺,将解答写入答题纸的对应栏内。 1)CountStr 2)*p 3)*p 4)num 此题考察C语言程序设计能力,要求掌握形参与实参,值传递与引用传递的区别 1、此题考察函数中值传递与引用传递,在实参与形参传递过程中可以是值传递,值传递时,形参的改变不会影响实参,引用传递是地址的传递,实参将地址传递给形参时,形参的改变会影响实参的改变。 在此题中的第一次输出a,b变量的值时,结果是直接输出,所以a1=3,b1=7,而在调用swap函数时,实参a,b传递的是值传递,在函数swap(intx,inty)中形参x,y也是值类型,在函数swap内部是交换两个变量的值,交换完毕后x=y,y=x,但这个改变不会影响实参a,b,所以第二次输出a2,b2时,a,b的值不变还是3,7,所以输出结果是: a1=3b1=7a2=3b2=7 2、此题是计算出字符数组中有多少个单词,单词之间是以空格’‘为标识,即遇到空格时变量wordMark=0,程序中再推断wordMark是否等于0,假设等于0,那么变量workMark置为1,同时变量num是用于统计单词个数,此时num加1,最后输出num的值就是统计的单词个数。 程序运行结果是3。 3、此题是将上面的功能通过调用函数来完成的。 第1处就应该直接填写调用函数的函数名,即countStrs,调用者将数组名作为实参,数组名代表的是数组的首地址,所以这里是引用传递,函数countStrs的形参p是一个指针变量,它接收实参str数组的首地址,这样实参与形参都是指针变量。 在函数countStrs内部,定义两个局部变量num用于统计个数,WordMark用于标识空格,在for循环中,第2处应该设置终止条件,即*p,表示指针指向的内容不为空,第3处是推断当前的指向元素是否等于SPACE,即当前的*p是否是空格’‘,如果是那么将标识变量WordMark等于0,否那么变量num自增,最后函数应该返回num的值,所以4处应该填num。 答案是: 1)countStrs2)p[i]! ='\0'或者是p[i]3)p[i]4)num 试题三〔共15分〕 阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 下面的程序利用快速排序中划分的思想在整数序列中找出第k小的元素〔马上元素从小到大排序后,取第k个元素〕。 对一个整数序列进展快速排序的方法是: 在待排序的整数序列中取第一个数作为基准值,然后根据基准值进展划分,从而将待排序的序列划分为不大于基准值者〔称为左子序列〕和大于基准值者〔称为右子序列〕,然后再对左子序列和右子序列分别进展快速排序,最终得到非递减的有序序列。 例如,整数序列“19,12,30,11,7,53,78,25"的第3小元素为12。 整数序列“19,12,7,30,11,11,7,53.78,25,7"的第3小元素为7。 函数partition〔inta[],intlow,inthigh〕以a[low]的值为基准,对a[low]、a[low+l]、…、 a[high]进展划分,最后将该基准值放入a[i](low≤i≤high),并使得a[low]、a[low+l]、,..、 A[i-1]都小于或等于a[i],而a[i+l]、a[i+2]、..、a[high]都大于a[i]。 函教findkthElem(inta[],intstartIdx,intendIdx,inrk)在a[startIdx]、a[startIdx+1]、...、a[endIdx]中找出第k小的元素。 【代码】 #include #include Intpartition〔inta[],intlow,inthigh〕 {//对a[low..high]进展划分,使得a[low..i]中的元素都不大于a[i+1..high]中的元素。 intpivot=a[low];//pivot表示基准元素 Inti=low,j=high; while(〔1〕){ While(i a[i]=a[j] While(i a[j]=a[i] } 〔2〕;//基准元素定位 returni; } IntfindkthElem〔inta[],intstartIdx,intendIdx,intk〕 {//整数序列存储在a[startldx..endldx]中,查找并返回第k小的元素。 if(startldx<0||endIdx<0||startIdx>endIdx||k<1||k-l>endIdx||k-1 Return-1;//参数错误 if(startIdx intloc=partition(a,startIdx,endldx);∥进展划分,确定基准元素的位置 if(loc==k-1)∥找到第k小的元素 return〔3〕; if(k-l returnfindkthElem(a,〔4〕,k〕; else//继续在基准元素之后查找 returnfindkthElem(a,〔5〕,k); } returna[startIdx]; } intmain() { inti,k; intn; inta[]={19,12,7,30,11,11,7,53,78,25,7}; n=sizeof(a)/sizeof(int)//计算序列中的元素个数 for(k=1;k<n+1;k++){ for(i=0;i<n;i++){ printf(“%d/t〞,a[i]); } printf(“\n〞); printf(“elem%d=%d\n,k,findkthElem(a,0,n-1,k));//输出序列中第k小的元素 } return0; } 1、! i=j或者i 2、a[i]=pivot 3、a[loc] 4、startIdx,loc-1 5、loc+1,endIdx 此题考察排序算法的应用,快速排序的思想是: 通过一趟排序将待排序的记录划分为独立的两局部,其中一局部记录的关键字均比另一局部记录的关键字小,然后利用递归再分别对这两局部记录继续进展排序,以到达整个序列有序。 一趟排序的具体做法是: 设两个变量low和high,初值分别指向序列的第一个和最后一个,通常将第一个记录的关键字设为pivotkey,首先从high所指位置向前搜索,找到第一个关键字小于pivotkey的记录并互相交换,然后从low位置向后搜索,找到第一个大于pivotkey的记录并互相交换,重复这两步直到low=high为止。 此题是要找出第K个元素,要求将元素从小到大排序,然后取第K个元素。 如数组中的元素是19,12,7,30,11,11,7,53,78,25,7,那么第1,2,3个元素都是7,第4,5个元素是11,第6个元素是12,第11个元素是78,此题就是要找出前K个元素中第K个元素,K是不断变化的,K的取值范围是从1到数组长度,第K个元素也是不断变化的。 Partition函数是找到基准元素的位置,根据快速排序算法,循环推断的条件是最小值和最大值不相等,即1处应该填i!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 程序员 考试 答案 下午