计算机二级C语言操作题(填空、修改、设计题)——真题库(16)附解析答案
1.程序填空题
程序中,函数fun的功能是:在3×4的矩阵中找出在行上最大、在列上最小的那个元素,若没有符合条件的元素则输出相应信息。
例如,有下列矩阵:
1 2 13 4
7 8 10 6
3 5 9 7
程序执行结果为:find:a[2][2]=9
请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
#define M 3
#define N 4
void fun(int (*a)[N])
{ int i=0,j,find=0,rmax,c,k;while( (i<M) && (!find)){ rmax=a[i][0]; c=0;for(j=1; j<N; j++)if(rmax<a[i][j]) {
/**********found**********/rmax=a[i][j]; c= __1__ ; } find=1; k=0;while(k<M && find) {
/**********found**********/if (k!=i && a[k][c]<=rmax) find= __2__ ; k++;}if(find) printf("find: a[%d][%d]=%d\n",i,c,a[i][c]);
/**********found**********/__3__ ;return a[i][c]}if(!find) printf("not found!\n");
}
void main()
{ int x[M][N],i,j;printf("Enter number for array:\n");for(i=0; i<M; i++)for(j=0; j<N; j++) scanf("%d",&x[i][j]);printf("The array:\n");for(i=0; i<M; i++){ for(j=0; j<N; j++) printf("%3d",x[i][j]);printf("\n\n");}fun(x);
}
2.程序修改题
函数fun的功能是:根据整形参m的值,计算如下公式的值。
t=1-1/(2×2)-1/(3×3)-...-1/(m×m)
例如,若m中的值为5,则应输出0.536389.
请改正程序中的错误,使它能得出正确的结果。不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>double fun ( int m )
{ double y = 1.0 ;int i ;
/**************found**************/for(i = 2 ; i < m ; i++)
/**************found**************/y -= 1 /(i * i) ;return( y ) ;
}void main( )
{ int n = 5 ;printf( "\nThe result is %lf\n", fun ( n ) ) ;
}
3.程序设计题
在此函数中,m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在被low所指的数组中。例如,当score数组中的数据为10、20、30、40、50、60、70、80、90时,函数返回的人数应该是4,below中的数据应为10、20、30、40.
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号填入你编写的若干语句。
#include <stdio.h>
#include <string.h>
int fun(int score[], int m, int below[])
{}void main( )
{ int i, n, below[9] ;void NONO ();int score[9] = {10, 20, 30, 40, 50, 60, 70, 80, 90} ;n = fun(score, 9, below) ;printf( "\nBelow the average score are: " ) ;for (i = 0 ; i < n ; i++) printf("%d ", below[i]) ;NONO() ;
}void NONO ()
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/int i, j, n, below[10], score[10] ;FILE *rf, *wf ;rf = fopen("in.dat","r") ;wf = fopen("out.dat","w") ;for(i = 0 ; i < 10 ; i++) {for(j = 0 ; j < 10 ; j++) fscanf(rf, "%d", &score[j]) ;n = fun(score, 10, below) ;for(j = 0 ; j < n ; j++) fprintf(wf, "%d ", below[j]) ;fprintf(wf, "\n") ;}fclose(rf) ;fclose(wf) ;
}
附:参考答案
1.程序填空题
(1)j
(2)0
(3)i++
【解题思路】
(1)找出行上最大的数,并将该数的列数j保存到c中,故填j;
(2)使用while循环语句和控制变量find判断rmax是不是列中最小的元素,那么把find置0,故空2填0;
(3)变量 i 是最外层while的控制变量,所以每一次循环该数值都要加1,故空3填i++
2.程序修改题
(1)for(i=2;i<=m;i++)
(2)y-=1.0/(i*i)
【解题思路】
(1)使用for循环计算公式,必须计算到最后一项m,所以应改为for(i=2;i<=m;i++)
(2)在除法运算中如果除数和被除数都是整数,那么商也是整数,所以整数1改为浮点数1.0,应改为y-=1.0/(i*i)
3.程序设计题
int fun(int score[], int m, int below[])
{
int i,j=0;
double av=0.0;
for(i=; i<m; i++)
av=av+score[i]/m //求平均值
for(i=0; i<m; i++)
if(score[i] < av) //如果分数低于平均分,则将此分数放入below数组中
below[j++]=score[i];
return j; //返回低于平均分的人数
}
【解题思路】
要计算低于平均分的人数,首先是要求出平均分,然后通过for循环语句和if条件语句找出低于平均分的分数。该题第1个循环的作用是求出平均分av,第二个循环的作用是找出数组score低于平均分的成绩记录并存入below数组中。