1、国家二级 C语言机试(操作题)模拟试卷 266及答案解析(总分:6.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:2.00)1.给定程序中,函数 fun的功能是:计算 X所指数组中 N个数的平均值(规定所有数均为正数),平均值通过形参返回给主函数,将小于平均值且最接近平均值的数作为函数值返回,并在主函数中输出。 例如,有 10个正数:46、30、32、40、6、17、45、15、48、26,平均值为 30500000。 主函数中输出 m=30。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意:部分源程序在文件 BLANK1C 中。不得增行或删行,也
2、不得更改程序的结构! 试题程序: 1 #includeStdlibh 2 #includeStdioh 3 #define N 10 4 double fun(double X,double*av) 5 int i,j;double d,S ; 6 s=0; 7 for(i=0,iN,i+)s=s+xi; 8 *found* 9 【1】 =SN; 10 d=32767; 11 for(i=0;iN;i+) 12 if(xi*av*avxi=d) 13 *found* 14 d=*avxi; 15 j= 【2】 ; 16 17 *found* 18 return 【3】 ; 19 20 main
3、() 21 int i;double xN,av,m; 22 for(i=0;iN;i+) 23 xi=rand()50; 24 printf(“40 f“,xi); 25 printf(“n“); 26 m=fun(x,&av); 27 printf(“nThe average is:fn”,av); 28 printf(“m=51 f“,m); 29 printf(“n“); 30 (分数:2.00)_二、程序修改题(总题数:1,分数:2.00)2.下列给定程序中函数 fun的功能是:用递归算法计算斐波拉契数列中第 n项的值。从第 1项起,斐波拉契数列为:1,1,2,3,5,8,13,21
4、。例如,若给 n输入 7,则该项的斐波拉契数值为 13。请改正程序中的错误,使它能得出正确结果。注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构!试题程序:#includestctiohlong fun(int g)*found* switch(g); case 0:return 0;*found* case 1;case 2:return 1; return(fun(g1)+fun(g2);void main() long fib;int n; printf(“Input n:“); scanf(“d“,n); printf(“n=dn“,n); fib=fun(n); p
5、rintf(“fib=dnn“,fib);(分数:2.00)_三、程序设计题(总题数:1,分数:2.00)3.请编写函数 fun,该函数的功能是:统计各年龄段的人数。N 个年龄通过调用随机函数获得,并放入主函数的 age数组中。要求函数把 09 岁年龄段的人数放在 d0中,把 1019 岁年龄段的人数放在 d1中,把 2029 岁年龄段的人数放在 d2中,依此类推,把 100岁(含 100岁)以上年龄的人数都放在 d10中。结果在主函数中输出。注意:部分源程序在文件 PROG1C 中。请勿改动 mmn函数和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。试题程序:#inc
6、ludestdioh#define N 50#define M 11void fun(int*a,int;*b)double rnd() static t=29,c=217,m=1024,r=0; r=(r*t+c)m; return(doubZe)rm);void main() FILE*wf; int ageN,i,dM; int bN=32,45,15,12,86,49,97,3,44,52,17,95,63; for(i=0;iN;i+) agei=(int)(115*rnd();*产生一个随机的年龄数组* printf(“The original data:n“); for(i=0;
7、iN;i+) printf(i+1)10=0?“4dn“:“4d“,agei);*每行输出 10个数* printf(“nn“); fun(age,d); for(i=0;i10;i+) printf(“4d-4d:4dn“,i*10,i*10+9,di); printf(“Over 100:4dn“,d10);* wf=fopen(“outdat“,“w“); fun(b,d); for(i=0;i10;i+) fprintf(wf,“4d-4d:4dn“,i*10,i*10+9,di); fprintf(wf,“over 100:4d“,d10);fcloSe(wf);*(分数:2.00)
8、_国家二级 C语言机试(操作题)模拟试卷 266答案解析(总分:6.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:2.00)1.给定程序中,函数 fun的功能是:计算 X所指数组中 N个数的平均值(规定所有数均为正数),平均值通过形参返回给主函数,将小于平均值且最接近平均值的数作为函数值返回,并在主函数中输出。 例如,有 10个正数:46、30、32、40、6、17、45、15、48、26,平均值为 30500000。 主函数中输出 m=30。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意:部分源程序在文件 BLANK1C 中。不得增行或删行,也
9、不得更改程序的结构! 试题程序: 1 #includeStdlibh 2 #includeStdioh 3 #define N 10 4 double fun(double X,double*av) 5 int i,j;double d,S ; 6 s=0; 7 for(i=0,iN,i+)s=s+xi; 8 *found* 9 【1】 =SN; 10 d=32767; 11 for(i=0;iN;i+) 12 if(xi*av*avxi=d) 13 *found* 14 d=*avxi; 15 j= 【2】 ; 16 17 *found* 18 return 【3】 ; 19 20 main
10、() 21 int i;double xN,av,m; 22 for(i=0;iN;i+) 23 xi=rand()50; 24 printf(“40 f“,xi); 25 printf(“n“); 26 m=fun(x,&av); 27 printf(“nThe average is:fn”,av); 28 printf(“m=51 f“,m); 29 printf(“n“); 30 (分数:2.00)_正确答案:(正确答案:(1)*av (2)i (3)xj)解析:解析:填空 1:从原程序中可以看出*av 代表的是平均值,而 sN 表示的就是平均值,因此本空应该填*aV。 填空 2:if
11、语句来判断找最接近平均值的数,因而此空应该填 i。 填空 3:题目要求将小于平均值且最接近平均值的数作为函数返回,而 j表达的是最接近平均值的数在数组中的下标,因而本空应该填写 xj。二、程序修改题(总题数:1,分数:2.00)2.下列给定程序中函数 fun的功能是:用递归算法计算斐波拉契数列中第 n项的值。从第 1项起,斐波拉契数列为:1,1,2,3,5,8,13,21。例如,若给 n输入 7,则该项的斐波拉契数值为 13。请改正程序中的错误,使它能得出正确结果。注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构!试题程序:#includestctiohlong fun(in
12、t g)*found* switch(g); case 0:return 0;*found* case 1;case 2:return 1; return(fun(g1)+fun(g2);void main() long fib;int n; printf(“Input n:“); scanf(“d“,n); printf(“n=dn“,n); fib=fun(n); printf(“fib=dnn“,fib);(分数:2.00)_正确答案:(正确答案:(1)去掉分号 (2)case 1:case 2:retum 1;)解析:解析:本题考查:switch 语句。其一般形式如下: switch(
13、表达式) case 常量表达式 1:语句l; case 常量表达式 2:语句 2; case 常量表达式 n:语句 n; default:语句 n+1; 其中 switch(表达式)后不应该带有“;”,同时 case语句常量后应该是“:”。 C 语言中,switch 语句之后不能有分号,并且 case语句常量后应用的是冒号。三、程序设计题(总题数:1,分数:2.00)3.请编写函数 fun,该函数的功能是:统计各年龄段的人数。N 个年龄通过调用随机函数获得,并放入主函数的 age数组中。要求函数把 09 岁年龄段的人数放在 d0中,把 1019 岁年龄段的人数放在 d1中,把 2029 岁年龄
14、段的人数放在 d2中,依此类推,把 100岁(含 100岁)以上年龄的人数都放在 d10中。结果在主函数中输出。注意:部分源程序在文件 PROG1C 中。请勿改动 mmn函数和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。试题程序:#includestdioh#define N 50#define M 11void fun(int*a,int;*b)double rnd() static t=29,c=217,m=1024,r=0; r=(r*t+c)m; return(doubZe)rm);void main() FILE*wf; int ageN,i,dM; int
15、 bN=32,45,15,12,86,49,97,3,44,52,17,95,63; for(i=0;iN;i+) agei=(int)(115*rnd();*产生一个随机的年龄数组* printf(“The original data:n“); for(i=0;iN;i+) printf(i+1)10=0?“4dn“:“4d“,agei);*每行输出 10个数* printf(“nn“); fun(age,d); for(i=0;i10;i+) printf(“4d-4d:4dn“,i*10,i*10+9,di); printf(“Over 100:4dn“,d10);* wf=fopen(
16、“outdat“,“w“); fun(b,d); for(i=0;i10;i+) fprintf(wf,“4d-4d:4dn“,i*10,i*10+9,di); fprintf(wf,“over 100:4d“,d10);fcloSe(wf);*(分数:2.00)_正确答案:(正确答案:Void fun(int*a,int*b) int i,j; for(j=0;jM;j+) bj=0;*数组b初始化为 0* for(i=0;iN;i+) if(ai=100) b10+;*如果年龄大于等于 100,b10自增 1* else bai10+;*如果年龄小于 100,则将其分别统计到 bai10中
17、* )解析:解析:本题是一个分段函数的问题,用两个循环来完成。第 1个循环的作用是使 b中的所有元素值都为 0。这个循环不能省略,因为若未对 b中的元素赋初值,则它们的值是不可预测的。第 2个循环的作用是分别统计 a中各年龄段的人数。当 ai100 时,按题意要将其统计到 b10中。else 的作用是如果年龄小于 100,则将其分别统计到 bai10中。由运算优先级可知先进行 ai10 的运算,所得结果作为 b的下标。若 ai为 09 时,ai10 的值为 0,且 09 岁的人数正好要存入 b0中。若 ai为1019 时,ai10 的值为 1,且 1019 岁的人数正好要存入 b1中,依此类推。