计算机二级C语言上机真题(44)【附详解】
【真题1】 给定程序的功能是计算并输出下列级数的前N 项之和SN,直到SN+1
大于q 为止,q 的值通过形参传入。
2 3 4 N+1
SN =─ + ─ + ─ + … + ──
1 2 3 N
例如,若q 的值为50.0,则函数值为50.416687。
#include < stdio.h >double fun( double q )
{ int n; double s;
n = 2;
s = 2.0;
/************found************/
while (s ___1___ q)
{s=s+(double)(n+1)/n;
/************found************/
___2___ ;
}
printf("n=%d\n",n);
/************found************/
___3___ ;
}
main ( )
{
printf("%f\n", fun(50));
}
(2011年2月)
解析: 本题考查的是C 语言中简单算法的应用以及函数的调用。
题中第一个空填"< =":根据题意,设置循环的结束条件。
题中第二个空填"n++":根据题意,将变量n 的值自加1,以适应公式的变
化。
题中第三个空填"return s":通过return 语句将被调用函数中一个确定值带回
主调函数中去。
本评析仅作参考。
答案:【1】< = 【2】n++ 【3】return s
【真题2】 给定程序modi.c 中函数 fun 的功能是:从 m 个学生的成绩中统计高于
平均分的学生人数,此人数由函数值返回,aver返回平均分。
请改正函数 fun 中的错误,使它能统计出正确的结果。
注意:不要改动 main 函数,
#include < conio.h >#include < stdio.h >#define N 20
int fun ( float *s, int n, float *aver )
{ float ave, t = 0.0 ;
int count = 0, k, i ;
for ( k = 0 ; k < n ; k++ )
/**************found**************/
t = s[k] ;
ave = t / n ;
for ( i = 0 ; i < n ; i++ )
if ( s[ i ] > ave ) count++ ;
/**************found**************/
*aver = &ave ;
return count ;
}
main()
{ float s[30], aver ;
int m, i ;
clrscr() ;
printf ( "\nPlease enter m: " ) ; scanf ("%d", &m ) ;
printf ( "\nPlease enter %d mark :\n ", m ) ;
for( i = 0 ; i < m ; i++ ) scanf ( "%f", s + i ) ;
printf( "\nThe number of students : %d \n" , fun ( s, m, &aver ) );
printf( "Ave = %f\n", aver ) ;
}
(2011年2月)
解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错
误的重要前提。
程序中的重要思想如下:
1、要注意存放学生分数的数组是一个float型的数组,故总分和平均分都应当
是float型的;
2、函数fun()中的第三个形参是一个指针,这表示在未来赋值时的方法是特殊
的。
本题的第一个错误:在函数fun()第一个for 循环体中,语句"t = s[k] ;"只是
将t的值不断用不同学生的分数替代,这与计算总分的初衷相逆,这条语句应当
书写为"t=t+s[k];",实现学生分数的不断累加;
本题的第二个错误:语句"*aver = &ave ;"是不正确的,*aver 代表的是一个
float型的变量,而&aver 则是函数中存放平均数的那个变量的内存地址,两者
不匹配,应当改为"*aver = ave;",这样才可以实现通过aver 返回平均分的
目的。
【真题3】 请编写函数fun,函数的功能是:统计各年龄段的人数。N个年龄通过调
用随机函数获得,并放在主函数的age数组中;要求函数把0 至9 岁年龄段的人数
放在d[0]中,把10 至19 岁年龄段的人数放在d[1]中,把20 至29 岁年龄段的人
数放在d[2]中,其余依此类推,把100 岁(含100)以上年龄的人数都放在d[10]
中。结果在主函数中输出。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#define N 50
#define M 11
void fun( int *a, int *b)
{……}
double rnd()
{ static t=29,c=217,m=1024,r=0;
r=(r*t+c)%m; return((double)r/m);
}
main()
{ int age[N], i, d[M];
for(i=0; i< N;i++)age[i]=(int)(115*rnd());
printf("The original data :\n");
for(i=0;i< N;i++) printf((i+1)%10==0?"%4d\n":"%4d",age[i]);
printf("\n\n");
fun( age, d);
for(i=0;i< 10;i++)printf("%4d---%4d : %4d\n",i*10,i*10+9,d[i]);
printf(" Over 100 : %4d\n",d[10]);
}
(2011年2月)
解析: 本题的考核点是统计各年龄段人数的算法。
解题思路:本题提供的参考程序,先对数组初始化,再通过for 循环和逗号表达
式*(a+i)/10 >10?10:*(a+i)/10,将年龄整除10 后存放到数组d中,具体
执行过程是:判断年龄整除10后的值是否大于10,若大于10,则该逗号表达
式的值等于10,即实现了将100 岁(含100)以上年龄的人数存放在d[10]
中; 若不大于10,则该逗号表达式的值等于*(a+i)/10 的值,即实现了各个
年龄段的人数的统计。
void fun( int *a,int *b)
{int i;
for(i=0;i< M;i++) /*初始化数组b中的每一个元素*/
b[i]=0;
for(i=0;i< N;i++) /*判断年龄整除10 后的值是否大于10,若大于10,则
该逗号表达式的值等于10,否则等于*(a+i)/10 的值*/
b[*(a+i)/10 >10?10:*(a+i)/10]++;
}
大于q 为止,q 的值通过形参传入。
2 3 4 N+1
SN =─ + ─ + ─ + … + ──
1 2 3 N
例如,若q 的值为50.0,则函数值为50.416687。
#include < stdio.h >double fun( double q )
{ int n; double s;
n = 2;
s = 2.0;
/************found************/
while (s ___1___ q)
{s=s+(double)(n+1)/n;
/************found************/
___2___ ;
}
printf("n=%d\n",n);
/************found************/
___3___ ;
}
main ( )
{
printf("%f\n", fun(50));
}
(2011年2月)
解析: 本题考查的是C 语言中简单算法的应用以及函数的调用。
题中第一个空填"< =":根据题意,设置循环的结束条件。
题中第二个空填"n++":根据题意,将变量n 的值自加1,以适应公式的变
化。
题中第三个空填"return s":通过return 语句将被调用函数中一个确定值带回
主调函数中去。
本评析仅作参考。
答案:【1】< = 【2】n++ 【3】return s
【真题2】 给定程序modi.c 中函数 fun 的功能是:从 m 个学生的成绩中统计高于
平均分的学生人数,此人数由函数值返回,aver返回平均分。
请改正函数 fun 中的错误,使它能统计出正确的结果。
注意:不要改动 main 函数,
#include < conio.h >#include < stdio.h >#define N 20
int fun ( float *s, int n, float *aver )
{ float ave, t = 0.0 ;
int count = 0, k, i ;
for ( k = 0 ; k < n ; k++ )
/**************found**************/
t = s[k] ;
ave = t / n ;
for ( i = 0 ; i < n ; i++ )
if ( s[ i ] > ave ) count++ ;
/**************found**************/
*aver = &ave ;
return count ;
}
main()
{ float s[30], aver ;
int m, i ;
clrscr() ;
printf ( "\nPlease enter m: " ) ; scanf ("%d", &m ) ;
printf ( "\nPlease enter %d mark :\n ", m ) ;
for( i = 0 ; i < m ; i++ ) scanf ( "%f", s + i ) ;
printf( "\nThe number of students : %d \n" , fun ( s, m, &aver ) );
printf( "Ave = %f\n", aver ) ;
}
(2011年2月)
解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错
误的重要前提。
程序中的重要思想如下:
1、要注意存放学生分数的数组是一个float型的数组,故总分和平均分都应当
是float型的;
2、函数fun()中的第三个形参是一个指针,这表示在未来赋值时的方法是特殊
的。
本题的第一个错误:在函数fun()第一个for 循环体中,语句"t = s[k] ;"只是
将t的值不断用不同学生的分数替代,这与计算总分的初衷相逆,这条语句应当
书写为"t=t+s[k];",实现学生分数的不断累加;
本题的第二个错误:语句"*aver = &ave ;"是不正确的,*aver 代表的是一个
float型的变量,而&aver 则是函数中存放平均数的那个变量的内存地址,两者
不匹配,应当改为"*aver = ave;",这样才可以实现通过aver 返回平均分的
目的。
【真题3】 请编写函数fun,函数的功能是:统计各年龄段的人数。N个年龄通过调
用随机函数获得,并放在主函数的age数组中;要求函数把0 至9 岁年龄段的人数
放在d[0]中,把10 至19 岁年龄段的人数放在d[1]中,把20 至29 岁年龄段的人
数放在d[2]中,其余依此类推,把100 岁(含100)以上年龄的人数都放在d[10]
中。结果在主函数中输出。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#define N 50
#define M 11
void fun( int *a, int *b)
{……}
double rnd()
{ static t=29,c=217,m=1024,r=0;
r=(r*t+c)%m; return((double)r/m);
}
main()
{ int age[N], i, d[M];
for(i=0; i< N;i++)age[i]=(int)(115*rnd());
printf("The original data :\n");
for(i=0;i< N;i++) printf((i+1)%10==0?"%4d\n":"%4d",age[i]);
printf("\n\n");
fun( age, d);
for(i=0;i< 10;i++)printf("%4d---%4d : %4d\n",i*10,i*10+9,d[i]);
printf(" Over 100 : %4d\n",d[10]);
}
(2011年2月)
解析: 本题的考核点是统计各年龄段人数的算法。
解题思路:本题提供的参考程序,先对数组初始化,再通过for 循环和逗号表达
式*(a+i)/10 >10?10:*(a+i)/10,将年龄整除10 后存放到数组d中,具体
执行过程是:判断年龄整除10后的值是否大于10,若大于10,则该逗号表达
式的值等于10,即实现了将100 岁(含100)以上年龄的人数存放在d[10]
中; 若不大于10,则该逗号表达式的值等于*(a+i)/10 的值,即实现了各个
年龄段的人数的统计。
void fun( int *a,int *b)
{int i;
for(i=0;i< M;i++) /*初始化数组b中的每一个元素*/
b[i]=0;
for(i=0;i< N;i++) /*判断年龄整除10 后的值是否大于10,若大于10,则
该逗号表达式的值等于10,否则等于*(a+i)/10 的值*/
b[*(a+i)/10 >10?10:*(a+i)/10]++;
}