计算机二级C语言上机真题(88)【附详解】
【真题1】 给定程序的功能是删除w 数组中下标为k 的元素中的值。程序中,调用
了getindex、arrout 和arrdel三个函数,getindex 用以输入所删元素的下标,函
数中对输入的下标进行检查,若越界,则要求重新输入,直到正确为止。arrout 用
以输出数组中的数据,arrdel进行所要求的删除操作。 请在程序的下划线处填入正
确的内容并把下划线删除,使程序得出正确结果。
#include < stdio.h >
#define NUM 10
arrout ( int *w, int m )
{ int k;
/************found************/
for (k = 0; k < ___1___; k++)
printf ("%d ", w[k]);
printf ("\n");
}
arrdel ( int *w, int n, int k )
{ int i;
for ( i = k; i < n-1; i++ ) w[i] = w[i+1];
n--;
/************found************/
return ___2___;
}
getindex( int n )
{ int i;
/************found************/
___3___
{ printf("\nEnter the index [ 0< = i< %d ]: ", n );
scanf ("%d",&i );
} while( i < 0 || i > n-1 );
return i;
}
main( )
{ int n, d, a[NUM]={21,22,23,24,25,26,27,28,29,30};
n = NUM;
printf ("Output primary data :\n"); arrout ( a,
n );
d = getindex( n ); n = arrdel ( a, n, d );
printf ("Output the data after delete :\n");
arrout( a, n );
}
(2011年2月)
解析: 本题的考核点是数组和循环语句是使用。
题中第一个空填"m":"k< m"用于控制循环的结束。
题中第二个空填"n":"return n "用于将n 返回给调用它的函数。
题中第三个空填"do":循环有两种,当型和直到型。While为当型循环,
do…while是直到型循环。
答案:【1】m 【2】n 【3】do
【真题2】 给定程序modi.c 中,函数fun 的功能是:根据整型形参n,计算如下公
式的值。 A1=1,A2=1/(1+A1),A3=1/(1+A2),……An=1/(1+An-1) 例如:若
n=10,则应输出: 0.617977。 请改正程序中的错误,使它能得出正确结果。 注
意:不要改动main 函数,
#include < conio.h >
#include < stdio.h >
/************found************/
int fun(int n)
{ float A=1;int i;
/************found************/
for (i=2;i< n;i++)
A=1.0/(1+A);
return A;
}
main()
{ int n;
clrscr();
printf("\nPlease enter n:");
scanf("%d",&n);
printf("A%d=%f\n",n,fun(n));
}
(2011年2月)
解析: 本题着重考察考生对C 语言中函数的定义、引用和参数传递的掌握情
况。
本题中的第一个错误:由主函数中可知,函数fun返回的应为float或double
型的值,所以程序中的语句"int fun(int n)"应改为"float fun(int n)"或
"double fun(int n)";
本题中的第二个错误:由题意可知,程序要求出An的值,循环的终止值应为
n,所以程序中的语句"for (i=2;i< n;i++)"应改为"for (i=2;i< =n;i++)"或
相同作用的语句。
【真题3】 请编写函数fun(),它的功能是:求出1 到1000 之内能被5 或13 整
除、但不能同时被5 和13 整除的所有整数并将它们放在a 所指的数组中,通过n返
回这些数的个数。 注意:部分源程序给出如下。 请勿改动主函数main 和其他函数
中的任何内容,仅在函数fun 的花括号中填入所编写的若干语句。 试题程序:
#include < conio.h >
#include < stdio.h >
void fun(int *a,int *n)
{……}
main()
{ int aa[1000], n, k;
clrscr();
fun(aa,&n);
for(k=0;k< n;k++)
if((k+1)%10==0)
{printf("%5d ",aa[k]);
printf("\n "); /*一行写10 个数*/
}
else
printf("%5d ",aa[k]);
}
(2011年2月)
解析:
void fun(int *a,int *n)
{ int i,j=0;
for(i=1;i< =1000;i++) /*求1 到1000 之内能被5 或13 整除、
但不能同时被5 和13 整除的所有整数,并放入数组a 中*/
if((i%5==0||i%13==0)&&i%65!=0)
a[j++]=i;
*n=j; /*传回满足条件的数的个数*/
}
注意本题题目是找出能被5 或13 整除但不能同时被5 和13 整除的所有整数。
能同时被5 和13 整除的整数一定能被65整除,且不能被65 整除的数不一定
就是能被5 或13 整除的数。所以可得出程序中的if()。按运算优先级可知
(i%5==0||i%13==0),注意,两边必须要有小括号。
了getindex、arrout 和arrdel三个函数,getindex 用以输入所删元素的下标,函
数中对输入的下标进行检查,若越界,则要求重新输入,直到正确为止。arrout 用
以输出数组中的数据,arrdel进行所要求的删除操作。 请在程序的下划线处填入正
确的内容并把下划线删除,使程序得出正确结果。
#include < stdio.h >
#define NUM 10
arrout ( int *w, int m )
{ int k;
/************found************/
for (k = 0; k < ___1___; k++)
printf ("%d ", w[k]);
printf ("\n");
}
arrdel ( int *w, int n, int k )
{ int i;
for ( i = k; i < n-1; i++ ) w[i] = w[i+1];
n--;
/************found************/
return ___2___;
}
getindex( int n )
{ int i;
/************found************/
___3___
{ printf("\nEnter the index [ 0< = i< %d ]: ", n );
scanf ("%d",&i );
} while( i < 0 || i > n-1 );
return i;
}
main( )
{ int n, d, a[NUM]={21,22,23,24,25,26,27,28,29,30};
n = NUM;
printf ("Output primary data :\n"); arrout ( a,
n );
d = getindex( n ); n = arrdel ( a, n, d );
printf ("Output the data after delete :\n");
arrout( a, n );
}
(2011年2月)
解析: 本题的考核点是数组和循环语句是使用。
题中第一个空填"m":"k< m"用于控制循环的结束。
题中第二个空填"n":"return n "用于将n 返回给调用它的函数。
题中第三个空填"do":循环有两种,当型和直到型。While为当型循环,
do…while是直到型循环。
答案:【1】m 【2】n 【3】do
【真题2】 给定程序modi.c 中,函数fun 的功能是:根据整型形参n,计算如下公
式的值。 A1=1,A2=1/(1+A1),A3=1/(1+A2),……An=1/(1+An-1) 例如:若
n=10,则应输出: 0.617977。 请改正程序中的错误,使它能得出正确结果。 注
意:不要改动main 函数,
#include < conio.h >
#include < stdio.h >
/************found************/
int fun(int n)
{ float A=1;int i;
/************found************/
for (i=2;i< n;i++)
A=1.0/(1+A);
return A;
}
main()
{ int n;
clrscr();
printf("\nPlease enter n:");
scanf("%d",&n);
printf("A%d=%f\n",n,fun(n));
}
(2011年2月)
解析: 本题着重考察考生对C 语言中函数的定义、引用和参数传递的掌握情
况。
本题中的第一个错误:由主函数中可知,函数fun返回的应为float或double
型的值,所以程序中的语句"int fun(int n)"应改为"float fun(int n)"或
"double fun(int n)";
本题中的第二个错误:由题意可知,程序要求出An的值,循环的终止值应为
n,所以程序中的语句"for (i=2;i< n;i++)"应改为"for (i=2;i< =n;i++)"或
相同作用的语句。
【真题3】 请编写函数fun(),它的功能是:求出1 到1000 之内能被5 或13 整
除、但不能同时被5 和13 整除的所有整数并将它们放在a 所指的数组中,通过n返
回这些数的个数。 注意:部分源程序给出如下。 请勿改动主函数main 和其他函数
中的任何内容,仅在函数fun 的花括号中填入所编写的若干语句。 试题程序:
#include < conio.h >
#include < stdio.h >
void fun(int *a,int *n)
{……}
main()
{ int aa[1000], n, k;
clrscr();
fun(aa,&n);
for(k=0;k< n;k++)
if((k+1)%10==0)
{printf("%5d ",aa[k]);
printf("\n "); /*一行写10 个数*/
}
else
printf("%5d ",aa[k]);
}
(2011年2月)
解析:
void fun(int *a,int *n)
{ int i,j=0;
for(i=1;i< =1000;i++) /*求1 到1000 之内能被5 或13 整除、
但不能同时被5 和13 整除的所有整数,并放入数组a 中*/
if((i%5==0||i%13==0)&&i%65!=0)
a[j++]=i;
*n=j; /*传回满足条件的数的个数*/
}
注意本题题目是找出能被5 或13 整除但不能同时被5 和13 整除的所有整数。
能同时被5 和13 整除的整数一定能被65整除,且不能被65 整除的数不一定
就是能被5 或13 整除的数。所以可得出程序中的if()。按运算优先级可知
(i%5==0||i%13==0),注意,两边必须要有小括号。