计算机二级C语言上机真题(61)【附详解】
【真题1】 下列给定程序中,函数fun()的功能是:按顺序给s 所指数组中的元素赋
予从2 开始的偶数,然后再按顺序对每5 个元素求一个平均值,并将这些值依次存
放在w 所指的数组中。若s 所指数组中元素的个数不是5 的倍数,多余部分忽略不
计。例如,s所指数组有14 个元素,则只对前10个元素进行处理,不对最后的4
个元素求平均值。
试题程序:
#include < stdio.h >#define SIZE 20
fun (double *s,double *w)
{ int k,i; double sum;
for(k=2,i=0;i< SIZE;i++)
{s[i]=k;k+=2;}
sum=0.0;
for(k=0,i=0;i< SIZE;i++)
{sum+=s[i];
if((i+1)___1__5==0)
{w[k]=sum/5; sum=0;k++;}
}
___2__ k;
}
main()
{ double a[SIZE],b[SIZE/5];
int i, k;
k=fun(a,b);
printf("The original data:\n");
for(i=0;i< SIZE;i++)
{
if(i%5==0) printf("\n");
printf("%4.0f",a[i]);
}
printf("\n\nThe result:\n");
for(i=0;i< k;i++) printf("%6.2f",___3___);
printf("\n\n");
}
(2011年2月)
解析: 填空1:根据题目的意思,这里是执行按顺序对每5 个元素求一个平均
值的操作,所以应该使用取余符号"%",如果是5 的倍数,则该式子的值为
零。
填空2:根据C 语言的规定,除了使用关键字void的任何一个子函数都应该有
返回值,所以应该使用关键字return把变量k 的值返回主函数。
填空3:由题目的意思可知这里是把存在数组b中的内容依次循环输出,所以
后面的变量名应该使用b[i] 。
答案:【1】% 【2】return 【3】b[i]
【真题2】 给定程序modi.c 中函数fun的功能是:为一个偶数寻找两个素数,这
两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。
请改正函数fun 中指定部位的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < stdio.h >#include < math.h >void fun(int a,int *b,int *c)
{ int i,j,d,y;
for(i=3;i< =a/2;i=i+2) {
/**************found**************/
y=0;
for(j=2;j< =sqrt((double)i);j++)
if(i%j==0) y=0;
if(y==1) {
/**************found**************/
d=i-a;
for(j=2;j< =sqrt((double)d);j++)
if(d%j==0) y=0;
if(y==1)
{ *b=i; *c=d; }
}
}
}
main()
{ int a,b,c;
do
{ printf("\nInput a: "); scanf("%d",&a); }
while(a%2);
fun(a,&b,&c);
printf("\n\n%d = %d + %d\n",a,b,c);
}
(2011年2月)
解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错
误的重要前提。
程序中的重要思想如下:
1、首先,要了解素数的意思,素数是指只能被1和它自身整除的数;
2、题目中要求为一个偶数寻找两个素数,这两个素数之和等于该偶数。
本题中的第一个错误:由下面的程序"if(i%j==0) y=0;"可知,如果不为素
数,y值为0,所以应当开始给y赋值为1,做找到标志;
本题中的第二个错误:根据上下文及题意思可知,a为偶数,*b与*c为所求的
两个素数,而*b与*c 由"{ *b=i; *c=d; }"得出,所以a=i+d,即"d=ai;"
。
【真题3】 程序定义了N×N 的二维数组,并在主函数中赋值。请编写函数fun,函
数的功能是:给数组周边元素置0 值。
例如:a数给中的值为
|0 11 12 7 9|
|1 9 7 4 5|
|20 13 18 3 1|
a= |14 5 6 8 2|
|15 9 17 4 1|
|0 0 0 0 0|
|0 4 7 9 0|
则返回主程序后a 数组中的值应为|0 3 18 18 0|
|0 8 6 5 0|
|0 0 0 0 0|
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < conio.h >#include < stdlib.h >#define N
5
fun( int w[][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()%10;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语言中的嵌套循环语句和条件判断语句的使用。
解题思路:二维数组的周边元素的特点是:它有一个下标为0 或为数组上界。
所以我们只须判断数组的下标是否为0或数组上界即可。按行、列进行循环可
以保证符合条件的元素只被运算一次。
本评析仅供参考。
fun ( int w[][N] )
{ int i, j;
for (i = 0; i < N; i++)/*以先行后列的顺序将数组的周边元素置0*/
for (j = 0; j < N; j++)
if ((i == 0)||(i == N- 1)||(j == 0)||(j == N - 1) )/*判断下标为i的元
素是否为二维数组中的周边元素*/
w[i][j]=0;
}
予从2 开始的偶数,然后再按顺序对每5 个元素求一个平均值,并将这些值依次存
放在w 所指的数组中。若s 所指数组中元素的个数不是5 的倍数,多余部分忽略不
计。例如,s所指数组有14 个元素,则只对前10个元素进行处理,不对最后的4
个元素求平均值。
试题程序:
#include < stdio.h >#define SIZE 20
fun (double *s,double *w)
{ int k,i; double sum;
for(k=2,i=0;i< SIZE;i++)
{s[i]=k;k+=2;}
sum=0.0;
for(k=0,i=0;i< SIZE;i++)
{sum+=s[i];
if((i+1)___1__5==0)
{w[k]=sum/5; sum=0;k++;}
}
___2__ k;
}
main()
{ double a[SIZE],b[SIZE/5];
int i, k;
k=fun(a,b);
printf("The original data:\n");
for(i=0;i< SIZE;i++)
{
if(i%5==0) printf("\n");
printf("%4.0f",a[i]);
}
printf("\n\nThe result:\n");
for(i=0;i< k;i++) printf("%6.2f",___3___);
printf("\n\n");
}
(2011年2月)
解析: 填空1:根据题目的意思,这里是执行按顺序对每5 个元素求一个平均
值的操作,所以应该使用取余符号"%",如果是5 的倍数,则该式子的值为
零。
填空2:根据C 语言的规定,除了使用关键字void的任何一个子函数都应该有
返回值,所以应该使用关键字return把变量k 的值返回主函数。
填空3:由题目的意思可知这里是把存在数组b中的内容依次循环输出,所以
后面的变量名应该使用b[i] 。
答案:【1】% 【2】return 【3】b[i]
【真题2】 给定程序modi.c 中函数fun的功能是:为一个偶数寻找两个素数,这
两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。
请改正函数fun 中指定部位的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < stdio.h >#include < math.h >void fun(int a,int *b,int *c)
{ int i,j,d,y;
for(i=3;i< =a/2;i=i+2) {
/**************found**************/
y=0;
for(j=2;j< =sqrt((double)i);j++)
if(i%j==0) y=0;
if(y==1) {
/**************found**************/
d=i-a;
for(j=2;j< =sqrt((double)d);j++)
if(d%j==0) y=0;
if(y==1)
{ *b=i; *c=d; }
}
}
}
main()
{ int a,b,c;
do
{ printf("\nInput a: "); scanf("%d",&a); }
while(a%2);
fun(a,&b,&c);
printf("\n\n%d = %d + %d\n",a,b,c);
}
(2011年2月)
解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错
误的重要前提。
程序中的重要思想如下:
1、首先,要了解素数的意思,素数是指只能被1和它自身整除的数;
2、题目中要求为一个偶数寻找两个素数,这两个素数之和等于该偶数。
本题中的第一个错误:由下面的程序"if(i%j==0) y=0;"可知,如果不为素
数,y值为0,所以应当开始给y赋值为1,做找到标志;
本题中的第二个错误:根据上下文及题意思可知,a为偶数,*b与*c为所求的
两个素数,而*b与*c 由"{ *b=i; *c=d; }"得出,所以a=i+d,即"d=ai;"
。
【真题3】 程序定义了N×N 的二维数组,并在主函数中赋值。请编写函数fun,函
数的功能是:给数组周边元素置0 值。
例如:a数给中的值为
|0 11 12 7 9|
|1 9 7 4 5|
|20 13 18 3 1|
a= |14 5 6 8 2|
|15 9 17 4 1|
|0 0 0 0 0|
|0 4 7 9 0|
则返回主程序后a 数组中的值应为|0 3 18 18 0|
|0 8 6 5 0|
|0 0 0 0 0|
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < conio.h >#include < stdlib.h >#define N
5
fun( int w[][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()%10;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语言中的嵌套循环语句和条件判断语句的使用。
解题思路:二维数组的周边元素的特点是:它有一个下标为0 或为数组上界。
所以我们只须判断数组的下标是否为0或数组上界即可。按行、列进行循环可
以保证符合条件的元素只被运算一次。
本评析仅供参考。
fun ( int w[][N] )
{ int i, j;
for (i = 0; i < N; i++)/*以先行后列的顺序将数组的周边元素置0*/
for (j = 0; j < N; j++)
if ((i == 0)||(i == N- 1)||(j == 0)||(j == N - 1) )/*判断下标为i的元
素是否为二维数组中的周边元素*/
w[i][j]=0;
}