计算机二级C语言上机真题(63)【附详解】
【真题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;
}
}
功能是:利用折半查找算法查找整数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;
}
}