【真题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]++; } |