国家二级(C语言)机试模拟试卷77 (题后含答案及解析)
题型有:1. 程序填空题 2. 程序修改题 3. 程序设计题
程序填空题(30分)
1. 请补充main函数,该函数的功能是:求1+21+3!+…+N!的和。 例如, 1+2!+3!+...+5!+6!的和为873。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在 main函数的横线上填入所编写的若干表达式或语句。 试题程序: #include <stdio.h> main ( ) { int i, n; long s=0, t=l; clrscr ( ); printf (“\\nInput n: \\n”); scanf (“%d”【, 】); for (i=l; i<=n; i++) { t=【 】; s=【 】; } printf (“1 ! +2 ! +3 !... +%d! =%ld\\n”, n, s); }
正确答案:&nt*Is+t
解析:第一空:标准输入函数scanf( )的地址表列中,变量n前要加上取址运算符——“&”。第二空:变量t用来保存每个数的阶乘,因为i!=(i-1)!*i,所以此空应为t*i。第三空:变量s用来保存从1到n的阶乘的总和。
程序修改题(30分)
2. 下列给定程序中,函数fun( )的功能是:应用递归算法求某数a的平方根。求平方根的迭代公式如下: 例如,2的平方根为1.414214。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include <math. h> #include <stdio. h> /*************found**************/ fun(double a,double x0) { double xl,y; xl= (x0+a/x0)/2.0; /*************found**************/ if (fabs (xl-x0) >0.00001)y=fun (a, xl); else y=x1; return y; } main ( ) { double x; printf(“Enter x: “); scanf(“%1f”,&x); printf (“The square root of %1f is %1f\\n”, x, fun(x,l.O)); }
正确答案:(1)错误:fun(double a,double x0) 正确:double fun(double a,double x0)(2)错误:if(fabs(x1-x0)>0.00001) 正确:if(fabs(x1-x0)>=0.00001)
解析:用C语言求平方根的方法一般有两种经典的算法,它们分别是迭代法和递归法,本题要求用递归法。该程序采用了if语句,错误在于if语句的判断条件,程序的含义是当迭代结果差小于误差时进行循环,故正确的应该是 if(fabs(x1-x0)>=0.00001)。
程序设计题(40分)
3. 请编写函数fun( ),该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中。要求函数把0至9岁年
龄段的人数在d[0]中,把10至19岁年龄段的人数放在d[1]中,把20至29岁年龄段的人数放在 d[2]中,依次类推,把100岁(含100)以上年龄的人数都放在d[10]中。结果在主函数中输出。 注意:部分源程序给出如下。 请勿改动主函数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) (i15*rnd ( ));/*产生一个随机的年龄数组*/ printf (“The original data : \\n”); for(i=0; i<N; i++)printf((i+l)%10= =07 “%4d\\n”:”%4d”, age[i]); /*每行输出10个数* / printf (“\\n\\n”); fun (age, d); for(i=0; i<l0; i++)printf(“%4d---%4d :%4d\\n”, i*l0, i*10+9, d[i] ); printf(“Over 100 : %4dkn”,d[10]).; }
正确答案:void fun(int *a, int *b) { int i,j; for (j=0; j<M; j++)b [j]=0; /*数组b初始化为0*/ for (i=0; i<N; i++) if (a [i]>=100) b[10]++; /*如果年龄大于等于100,b[10]自增1*/ else b[a[i]/10]++; /*如果年龄小于100,则将其分别统计到b[a[i]/10]中*/ }
解析:本题又是一个分段函数的问题,还是用两个循环来完成。第1个循环的作用是使b的所有元素值都为0。这个循环不能省略,因为若未对b元素赋初值,则它们的值是不可预测的。第2个循环的作用是分别统计a中各年龄段的人数。当a[i]大于等于100时,按题意要将其统计到b[10]中,else的作用是如果年龄小于100,则将其分别统计到b[a[i]/10]中。由运算优先级可知先进行a[i]/10的运算?所得结果作为b的下标。若a[i]为0至9时,a[i]/10的值为0,且0至9岁的人数正好要存入b[0]中。若a[i]为10至19岁时a[i]/10的值为1,且10至19岁的人数正好要存入b[1]中,依次类推。
因篇幅问题不能全部显示,请点此查看更多更全内容