1 外部函数是指________的函数,它可以在_________中被调用。
【分析】当存储类型选用“extern”时,所定义的函数称为外部函数。外部函数可以在其他编译单位中调用(需要对这个函数进行说明)。
【答案】存储类型是“extern”的函数
所有对该函数进行说明过的编译单位
2 假定在同一个编译单位中,函数a()调用了函数b(),则对函数b()不需要说明的情况有下列两种:_____________和________________。
【分析】教材中有明确答案(p116)。
【答案】b()函数的定义地点在a()函数定义地点之前
b()函数的数据类型是int或char
3 在函数间传递数据的四种方式中,不能把被调函数的数据带回到主调函数的是()
①值传递 ②地址传递 ③返回值传递 ④全局外部变量
【分析】值传递方式是利用形式参数和实际参数结合来进行数据传递的一种方式,它是在调用函数时,将实际参数的值传递给形式参数,函授调用结束后,并不将形式参数的当前值传回实际参数。
【答案】①
4 如果函数定义时,形式参数是整型变量,则调用该函数时,实际参数不可以是()
①整型常量 ②字符型变量
③指向整型变量的指针型变量 ④整型表达式
【分析】当形式参数是变量时,实际参数可以是数据类型相同的表达式(常量、变量是表达式的特例),因此,备选答案①④显然是正确的,即不符合题意。而字符型数据可以看成整型数据,所以字符型变量可以当作整型变量,因此备选答案②也是正确的,即不符合题意。只有备选答案③是错误的,因为指针型变量不是整型变量,本题答案应该选取③。
请读者注意,如果使用“*指针型变量”侧是正确的。
【答案】③
5 若函数a()调用了函数b(),而函数b()又调用了函数a(),这样的调用称为_________________调用。
【分析】一般来说,只要是函数调用了自己,则称这样的函数调用为递归调用。如果函数f()调用了函数f(),我们称这样的递归调用为“直接递归调用”;如果函数f()调用了函数g(),而函数g()又调用了函数f(),这样的递归调用称为“间接递归调用”。
【答案】递归(或间接递归)
6 下列表达式中,不能判断字符型变量ch中的字符是英文字母(是则表达式值为非0、否则表达式值为0)的表达式是()
①ch>='A'&&ch<='Z'::ch>='a'&&h<='z'
② toupper(ch)>='A'&&toupper(ch)<='Z'
③ isalpha( ch)
④ !(isdigit(ch))
【分析】备选答案①中的逻辑表达式的含义是:当ch中的字符是大写字母或者小写字母时,结果为1,否则结果为0,该答案不符合题意。备选答案②中使用了系统函数toupper(),该函数功能是将参数对应的字符换成大写字母(如果参数对应的字符不是英文字母则不改变),答案中的逻辑表达式含义是:转换成大写后如果落在'A'到‘Z'之间则值为1,否则值为0。该答案也不符合题意。备选答案③中使用了系统函数isalpha(),该函数功能是判断参数对应的字符是否是英文字母,是则返回非0;否则返回0。显然该答案也不符合题意。只有备选答案④是符合题意的。分析这个答案中的表达式,其中用到了系统函数isdigit(),该函数的功能是判断参数对应的字符是不是数字字符,是则返回非 0,否则返回 0,该答案中的表达式是“! isdigit(ch)”,即 ch中不是数字字符则返回1,否则返回0,因此,该表达式不能判断ch中是否英文字母,所以本题答案应选④。
【答案】④
7 函数调用malloc(sizeof(long)* 2)的功能是申请____________个字节的内存;这批内存的首地址是____________________。
【分析】 系统池数malloc(形参)的功能是申请“形参”个字节的内存,函数的返回值就是这批内存的首地址。题目中的参数是“snzeof(long)*2”,sizeof(long)是长整型数据的字节数,其值为 4。而函数malloc(sizeof(long)* 2)调用的参数是 sizeof(long)* 2,其值为 8。
【答案】 8
函数调用的返回值
8 下列函数定义中,正确的是()
①int f(int x,y) ② int *f(int x,int*y)
{return(y);} { return(y);}
③ int f( x,*y) ④ void f( int x;)
int x, int y; {return(x);}
{return;}
【分析】分析备选答案①:形式参数表不正确,两个整型变量应该写成 int x,int y。分析备选答案②:这是一个指针型函数,函数返回值是指向整型数据的指针值,形式参数表也是正确的,在函数体中有带返回值的返回语句,且返回值就是指向整型数据的指针变量值,该答案符合题意。分析备选答案③:形式参数表中的int *y是错误的,应该为int y;这样形式参数说明中的 int y也是错误的,应该写成 int *y;函数体中的返回语句也是错误的,因为这个函数是有返回值的函数。分析备选答案④:形式参数表中最后的“分号”不能有 ;函数体中的返回语句只能用“ return;”,因为该函数是无返回值的函数。
【答案】②
9 已知梯形法求积分y=|a f(x)dx的公式如下:
n-1
y=((f(a)+f(b))/2+∑f(a+ih)) )h
i=1
其中的n是积分区间等分的间隔数目(n是任选的,越大则结果精度越高);其中的h=(b-a)/n。
函数y()是计算并返回 |a(sin(x)+cos(x))dx积分值的,请填写函数中缺少的句。
# include"math.h"
double y(a,b,n)
double a, b;
int n;
{ double sum,h;
____________________
int i;
h=(b-a)/n;
sum=(f(a)+f(b))/2;
for(i=l;i<n;i++)
sum+= f(a+ i*h);
____________________
return( sum);
}
double f(x)
double x;
{ double y;
y=(sin(x)+cos(x));
return(y);
}
【分析】阅读程序清单可以看出函数 f()是求函数 f(X)= Sin()+ COS()值的,这个函数是完整的,没有要填写的语句。再看函数y(),这个函数是求积分的函数,其中有两个空白处。第1个空白处的前后都是数据定义语句,所以这个空白只能填写数据定义语句(包括数据、函数的说明语句)。再从函数体中使用的数据来看,凡是用到的变量要么是形式参数(a、b、n),要么是定义的局部变量(sum、h、i),不存在没有定义的变量,对于这种情况来说,需要考虑函数体中调用的函数是否需要说明。从函数体中看出,要调用的函数是f(),这个函数的定义在调用处之后出现,并且不是int或char型(是double型),所以这儿的空白要填写对函数f()的说明。第2个空白处是在循环语句之后。分析这段程序,循环前先计算出h=(b-a)/n,再计算y=(f(a)+f(b)/2)(程序中用的变量是sum)。接下来的次数
n-1
型循环显然是计算 ∑ f(a+ih),并且加到变量 sum中。
i=1
从题目给出的公式中可以看出,现在变量sum中的值还不是积分值,需要再乘以h,第 2个空白处就是完成这项工作的,所以应该填写的语句是 sum= sum* h;,或者 sum*=h;。
【答案】double f();
sum=sum*h; 或者 sum*=h;
10 求两个正整数的最大公约数的算法通常使用“辗转相除法”。设有两个正整数m、n,求它们的最大公约数的算法如下:
①若m<n,则交换m和n(保证m大于n)。
②计算m/n的余数r。
③若r不等于0,则令m=n、n=r,转第②步继续执行;
否则,算法结束,n就是最大公约数。
下面就是用“辗转相除法'才出并返回m、n最大公约数的函数fmn(),请填写清单中缺少的语句。
int fmn( m, n)
int m, n;
{ int r;
if(m<n )
{r=m;m=n;n=r;}
if(n==0)
return(m);
do{_________________
if(r!= 0)
{ m=n; n=r;}
}while(r!=0);
return(n);
}
【分析】由于算法步骤已经给出,按照算法来理解程序就比较简单。函数体开始的单分支
阅读(318)
(责任编辑:城市网)