【真题1】 N 个有序整数数列已放在一维数组中,给定下列程序中,函数fun() 的 功能是:利用折半查找算法查找整数m 在数组中的位置。若找到,则返回其下标 值;反之,则返回"Not be found!"。 折半查找的基本算法是:每次查找前先确定数组中待查的范围:low 和high(low< high),然后把m 与中间位置(mid)中元素的值进行比较。如果m的值大于中间位 置元素中的值,则下一次的查找范围放在中间位置之后的元素中;反之,下次查找范 围落在中间位置之前的元素中。直到low >high,查找结束。 试题程序: #include < stdio.h >#define N 10 int fun(int a[],int m) { int low=0,high=N-1,mid; while(low< =high) { mid=___1___; if(m< a[mid]) high=___2___; else if(m >a[mid]) low=mid+1; else return(mid); } __3___(-1); } main() { int i,a[N]={-3,4,7,9,13,24,67,89,100,180},k,m; printf("a 数组中的数据如下:"); for(i=0;i< N;i++) printf("%d",a[i]); printf("Enter m: "); scanf("%d",&m); k=fun(a,m); if (k >=0) printf("m=%d,index=%d\n",m,k); else printf("Not be found!\n"); } (2011年2月) 解析: 填空1:根据题目的意思,这里应该是确定折半查找的中间位置,所以 很明显应该填(low+high)/2,注意这个式子返回的是整型数据,即如果分子为 7 则结果为3。 填空2:根据题目的意思,中间的元素值大时应该选择前半段进行下次查找,所 以应该把mid前一位的下标赋值给high。 填空3:由算法可以看出,这里应该是所有循环完毕仍然没有找到满足条件的地 方,即应该返回-1,所以使用关键字"return" 。 答案:【1】 (low+high)/2 【2】mid-1 【3】return 【真题2】 下列给定程序中,函数fun()的功能是计算并输出high 以内的素数之 和。high 由主函数传给fun()函数。若high 的值为100,则函数的值为1060。 请改正程序中的错误,使它能得到正确结果。 注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include < conio.h >#include < stdio.h >#include < math.h >int fun(int high) { int sum=0,n=0, j, yes; while(high >=2) { yes = 1; for(j=2; j< =high/2; j++) /**********************found***********************/ ifhigh%j==0 { yes=0; break; } /**********************found***********************/ if(yes==0) { sum+=high; n++; } high--; } return sum; } main() { clrscr(); printf("%d\n",fun(100)); } (2011年2月) 解析: (1)错误:ifhigh%j==0 正确:if(high%j==0) (2)错误:if(yes==0) 正确:if(yes) 错误1:if语句的两侧要加括号。错误2:yes为1时,说明被判断的数为素 数,要加入总和。 【真题3】 程序定义了N×N 的二维数组,并在主函数中自动赋值。请编写函数 fun(int a[][N]),函数的功能是:使数组右上半三角元素中的值全部置成0。 例如:a数组中的值为 |1 9 7| a= |2 3 8|,则返回主程序后a数组中的值应为 |4 5 6| |0 0 0| |2 0 0| |4 5 0| 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编 写的若干语句。 #include < stdio.h >#include < conio.h >#include < stdlib.h >#define N 5 int fun(int a[][N]) {……} main() { int a[N][N],i,j; clrscr(); printf("***** The array *****\n"); for (i=0;i< N;i++) { for (j=0;j< N;j++) { a[i][j]=rand()%20;printf("%4d",a[i][j]);} printf("\n"); } fun(a); printf("THE RESULT\n"); for(i=0;i< N;i++) { for(j=0;j< N;j++) printf("%4d",a[i][j]); printf("\n"); } } (2011年2月) 解析: 本题的考核点是C语言中循环嵌套和 if 语句的使用。 解题思路:对于本题,我们给出的参考函数采取的算法是:使用嵌套循环,外 循环是行循环,内循环是列循环,这样可以对整个数组中的元素进行符合条件 的运算。本题要求是对数组右上半三角元素中的值全部置成0,所以首先要使用 if 语句判断出数组的右上半三角,再进行运算。观察二维数组可以看出,数组右 上半三角中的元素 ,行坐标值都小于等于列坐标值。 本评析仅供参考。 int fun ( int a[][N] ) { int i,j; for (i=0;i< N;i++) for (j=0;j< N;j++) { if (i< =j)/*判断当前数组元素是否为二维数组中右上半三角中的元素*/ a[i][ j] =0; } } |