计算机二级C语言上机真题(55)【附详解】
【真题1】 给定程序的功能是:在x 数组中放入n 个采样值,计算并输出方差值。
N (XK-X')^2 N XK
S = Σ ─────,其中X' = Σ ─
K=1 N K=1 N
例如n=8,输入:193.199、195.673、195.757、196.051、196.092、
196.596、196.579、196.763 时,结果应为:1.135901。
#include < stdio.h >float fun(float x[], int n)
{ int j; float xa=0.0, s;
/************found************/
for (j=0; j< ___1___; j++ )
xa += x[j]/n;
/************found************/
s = ___2___;
for (j=0; j< n; j++ )
/************found************/
s += (x[j]-xa)*(x[j]-xa)/___3___;
return s;
}
main ( )
{ float x[100] = {193.199, 195.673, 195.757, 196.051, 196.092,
196.596, 196.579, 196.763};
printf("%f\n", fun (x, 8));
}
解析: 本题着重考察考生对C 语言中基本语法的掌握情况。
题中第一个空填"n":由程序可知,此处是设置循环的次数,其值是由主调函数
中的实参所确定。由于在主调函数中是以确定的值定义的,所以循环变量可以
由形参变量所确定也可以用主调函数中的确定值所确定。
题中第二个空填"0":由题意可知在此处为变量赋初值,根据题面公式设置
s=0。
题中第三个空填"n":此处是将题面中的公式转化为C 程序中的公式。由于本程
序用的是固定个数的采样值,所以也可以填入固定值。
答案:【1】n 【2】0 【3】n
【真题2】 给定程序modi.c 中,函数fun 的功能是:计算函数
F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的值。其中x 和y 的值不等,z 和y 的值不
等。
例如,当x 的值为9、y 的值为11、z 的值为15时,函数值为-3.50。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < stdio.h >#include < math.h >#define FU(m,n) (m/n)
float fun(float a,float b,float c)
{ float value;
/************found************/
value=FU(a+b,a-b)+FU(c+b,c-b);
/************found************/
Return(Value);
}
main()
{ float x,y,z,sum;
printf("Input x y z: ");
scanf("%f%f%f",&x,&y,&z);
printf("x=%f,y=%f,z=%f\n",x,y,z);
if (x==y||y==z) {printf("Data error!\n");exit(0);}
sum=fun(x,y,z);
printf("The result is : %5.2f\n",sum);
}
(2011年2月)
解析: 本题着重考察考生对C 语言中自定义语句以及基本语法的掌握情况。
本题中的第一个错误:如果按照原程序中的语句调用自定义语句,那么
value=a+b/a-b+c+b/c-b,/运算高于+运算,很显然不符合题意,a+b应
作为一个整体传递给m,需为其加括号,所以程序中语句"value=FU(a+b,ab)+
FU(c+b,c-b);"应改为"value=FU((a+b),(a-b))+FU((c+b),(c-b));"或
相同作用的语句。
本题中的第二个错误:C 语言中,命令单词应为小写,所以程序中语句
"Return(Value);"应改为"return(value);"或相同作用的语句。
【真题3】 请编一个函数 void fun(int tt[M][N],int pp[N]),tt 指向一个M 行N
列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。二
维数组中的数已在主函数中赋予。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < conio.h >#include < stdio.h >#define M 3
#define N 4
void fun(int tt[M][N],int pp[N])
{……}
main()
{ int t[M][N]={{22,45,56,30},
{19,33,45,38},
{20,22,66,40}};
int p[N],i,j,k;
clrscr();
printf("The original data is:\n");
for (i=0;i< M;i++) {
for (j=0;j< N;j++)
printf("%6d",t[i][j]);
printf("\n");
}
fun(t,p);
printf("\nThe result is:\n");
for(k=0;k< N;k++) printf("%4d",p[k]);
printf("\n");
}
(2011年2月)
解析: 编写的若干语句:
int i, j, min;
for(i = 0; i < N; i++)
{ min = tt[0][i];/*将每列的第一个数赋值给min*/
for(j = 0; j < M; j++)/*将min 与该列中的每个数进行比较,并把最大的那
个数赋值给min*/
if (min > tt[j][i])
min = tt[j][i];
pp[i] = min;
}
本题的考核点是C 语言中循环嵌套语句的使用。
提示思路:从题目的要求来看,我们应建立一个两重循环来按行、列寻找最小
元素。因为题目要求出每列中的最小元素,所以列循环应放在外面,行循环放
在里面。我们给出的参考函数中,定义了一个变量min 来保存最小元素,在行
循环中比较出最小元素,并在行循环结束时赋给数组pp的相应元素。
N (XK-X')^2 N XK
S = Σ ─────,其中X' = Σ ─
K=1 N K=1 N
例如n=8,输入:193.199、195.673、195.757、196.051、196.092、
196.596、196.579、196.763 时,结果应为:1.135901。
#include < stdio.h >float fun(float x[], int n)
{ int j; float xa=0.0, s;
/************found************/
for (j=0; j< ___1___; j++ )
xa += x[j]/n;
/************found************/
s = ___2___;
for (j=0; j< n; j++ )
/************found************/
s += (x[j]-xa)*(x[j]-xa)/___3___;
return s;
}
main ( )
{ float x[100] = {193.199, 195.673, 195.757, 196.051, 196.092,
196.596, 196.579, 196.763};
printf("%f\n", fun (x, 8));
}
解析: 本题着重考察考生对C 语言中基本语法的掌握情况。
题中第一个空填"n":由程序可知,此处是设置循环的次数,其值是由主调函数
中的实参所确定。由于在主调函数中是以确定的值定义的,所以循环变量可以
由形参变量所确定也可以用主调函数中的确定值所确定。
题中第二个空填"0":由题意可知在此处为变量赋初值,根据题面公式设置
s=0。
题中第三个空填"n":此处是将题面中的公式转化为C 程序中的公式。由于本程
序用的是固定个数的采样值,所以也可以填入固定值。
答案:【1】n 【2】0 【3】n
【真题2】 给定程序modi.c 中,函数fun 的功能是:计算函数
F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的值。其中x 和y 的值不等,z 和y 的值不
等。
例如,当x 的值为9、y 的值为11、z 的值为15时,函数值为-3.50。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < stdio.h >#include < math.h >#define FU(m,n) (m/n)
float fun(float a,float b,float c)
{ float value;
/************found************/
value=FU(a+b,a-b)+FU(c+b,c-b);
/************found************/
Return(Value);
}
main()
{ float x,y,z,sum;
printf("Input x y z: ");
scanf("%f%f%f",&x,&y,&z);
printf("x=%f,y=%f,z=%f\n",x,y,z);
if (x==y||y==z) {printf("Data error!\n");exit(0);}
sum=fun(x,y,z);
printf("The result is : %5.2f\n",sum);
}
(2011年2月)
解析: 本题着重考察考生对C 语言中自定义语句以及基本语法的掌握情况。
本题中的第一个错误:如果按照原程序中的语句调用自定义语句,那么
value=a+b/a-b+c+b/c-b,/运算高于+运算,很显然不符合题意,a+b应
作为一个整体传递给m,需为其加括号,所以程序中语句"value=FU(a+b,ab)+
FU(c+b,c-b);"应改为"value=FU((a+b),(a-b))+FU((c+b),(c-b));"或
相同作用的语句。
本题中的第二个错误:C 语言中,命令单词应为小写,所以程序中语句
"Return(Value);"应改为"return(value);"或相同作用的语句。
【真题3】 请编一个函数 void fun(int tt[M][N],int pp[N]),tt 指向一个M 行N
列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。二
维数组中的数已在主函数中赋予。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < conio.h >#include < stdio.h >#define M 3
#define N 4
void fun(int tt[M][N],int pp[N])
{……}
main()
{ int t[M][N]={{22,45,56,30},
{19,33,45,38},
{20,22,66,40}};
int p[N],i,j,k;
clrscr();
printf("The original data is:\n");
for (i=0;i< M;i++) {
for (j=0;j< N;j++)
printf("%6d",t[i][j]);
printf("\n");
}
fun(t,p);
printf("\nThe result is:\n");
for(k=0;k< N;k++) printf("%4d",p[k]);
printf("\n");
}
(2011年2月)
解析: 编写的若干语句:
int i, j, min;
for(i = 0; i < N; i++)
{ min = tt[0][i];/*将每列的第一个数赋值给min*/
for(j = 0; j < M; j++)/*将min 与该列中的每个数进行比较,并把最大的那
个数赋值给min*/
if (min > tt[j][i])
min = tt[j][i];
pp[i] = min;
}
本题的考核点是C 语言中循环嵌套语句的使用。
提示思路:从题目的要求来看,我们应建立一个两重循环来按行、列寻找最小
元素。因为题目要求出每列中的最小元素,所以列循环应放在外面,行循环放
在里面。我们给出的参考函数中,定义了一个变量min 来保存最小元素,在行
循环中比较出最小元素,并在行循环结束时赋给数组pp的相应元素。