国家二级C语言机试(操作题)模拟试卷266
程序填空题
1.给定程序中,函数fun的功能是:计算X所指数组中N个数的平均值(规定所有数均为正数),平均值通过形参返回给主函数,将小于平均值且最接近平均值的数作为函数值返回,并在主函数中输出。
例如,有10个正数:46、30、32、40、6、17、45、15、48、26,平均值为30.500000。
主函数中输出m=30。
请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。
注意:部分源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!
试题程序:
1 #include<Stdlib.h>
2 #include<Stdio.h>
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,i<N,i++)s=s+x[i];
8 /*********found*********/
9 【1】=S/N;
10 d=32767;
11 for(i=0;i<N;i++)
12 if(x[i]<*av&&*av-x[i]<=d){
13 /*********found*********/
14 d=*av-x[i];
15 j=【2】;
16 }
17 /*********found*********/
18 return【3】;
19 }
20 main()
21 {int i;double x[N],av,m;
22 for(i=0;i<N;i++)
23 { x[i]=rand()%50;
24 printf(\\
(1)*av
(2)i
(3)x[j]
解析:填空1:从原程序中可以看出*av代表的是平均值,而s/N表示的就是平均值,因此本空应该填*aV。
填空2:if语句来判断找最接近平均值的数,因而此空应该填i。
填空3:题目要求将小于平均值且最接近平均值的数作为函数返回,而j表达的是最接近平均值的数在数组中的下标,因而本空应该填写x[j]。
程序修改题
2.下列给定程序中函数fun的功能是:用递归算法计算斐波拉契数列中第n项的值。从第1项起,斐波拉契数列为:1,1,2,3,5,8,13,21。…
例如,若给n输入7,则该项的斐波拉契数值为13。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include<stctio.h>
long fun(int g)
{
/*********found*********/
switch(g);
{
case 0:return 0;
/*********found*********/
case 1;case 2:return 1;
}
return(fun(g-1)+fun(g-2));
}
void main()
{
long fib;int n;
printf(\\
(1)去掉分号
(2)case 1:case 2:retum 1;
解析:本题考查:switch语句。其一般形式如下:
switch(表达式){
case常量表达式1:语句l;
case常量表达式2:语句2;
case常量表达式n:语句n;
default:语句n+1;
}
其中switch(表达式)后不应该带有“;”,同时case语句常量后应该是“:”。
C语言中,switch语句之后不能有分号,并且case语句常量后应用的是冒号。
程序设计题
3.请编写函数fun,该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放入主函数的age数组中。要求函数把0~9岁年龄段的人数放在d[0]中,把10~19岁年龄段的人数放在d[1]中,把20~29岁年龄段的人数放在d[2]中,依此类推,把100岁(含100岁)以上年龄的人数都放在d[10]中。结果在主函数中输出。
注意:部分源程序在文件PROG1.C中。
请勿改动mmn函数和其他函数中的任何内容,仅在函数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((doubZe)r/m);
}
void main()
{
FILE*wf;
int age[N],i,d[M];
int b[N]={32,45,15,12,86,49,97,3,44,52,17,95,63};
for(i=0;i<N;i++)
age[i]=(int)(115*rnd());
/*产生一个随机的年龄数组*/
printf(\\
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]中,依此类推。
本文档预览:3600字符,共3541字符,源文件无水印,下载后包含无答案版和有答案版,查看完整word版点下载