当前位置:文档之家› 第七章 函数习题答案

第七章 函数习题答案

第七章函数习题答案1. 单项选择题(1) 若定义的函数有返回值,则以下关于该函数调用的说法中错误的是____D____。

A. 函数调用可以作为独立的语句存在B. 函数调用可以作为一个函数的参数C. 函数调用可以出现在表达式中D. 函数可以作为一个函数的形式参数(2) 在函数的调用过程中,如果函数FUNA调用了函数FUNB,函数FUNB又调用了函数FUNA,则___B_____。

A. 称为函数的直接递归调用B. 称为函数的间接递归调用C. 称为函数的循环调用D. C语言不允许这样的递归调用(3) 在C语言中,函数的隐含存储类别是__A______。

A. autoB. staticC. externD. 无存储类别(4) 在下列对C语言函数的描述中,正确的是___A_____。

A. 在C语言中调用函数时,只能将实际参数的值传给形式参数,形式参数的值不能传给实际参数B. C函数既可以是嵌套定义,又可以是递归定义C. 函数必须有返回值D. C程序中有调用关系的所有函数必须放在同一个源程序文件中(5) 下面函数的类型是___B_____。

f(double x){printf("%6d\n",x);}A. 浮点型B. int型C. void型D. 都不是(6) 有以下程序:char fun(char x,char y){if(x<y)return y;}main(){int a='9',b='8',c='7';printf("%c\n",fun(fun(a,b),fun(b,c)));}程序的执行结果是____C____。

A. 函数调用出错B. 8C. 9D. 7(7) 有以下程序:void f(int x,int y){int t;if(x<y){t=x;x=y;y=t;}}main(){int a=4,b=3,c=5;f(a,b);f(a,c);f(b,c);printf("%d,%d,%d\n",a,b,c);}执行结果为____D____。

A. 3,4,5B. 5,4,3C. 5,3,4D. 4,3,5(8) 下面程序的输出为________。

#include<stdio.h>int x,y;f(){extern int x,y;int a=18,b=16;x+=a+b;y+=a-b;}main(){int a=9,b=8;x=a+b;y=a-b;f();printf("%d,%d\n",x,y);}执行结果为___A_____。

A. 51,3B. 34,2C. 17,1D. 前面的都不对(9) 以下程序的正确执行结果是____D____。

main(){int a=2,i;for(i=0;i<3;i++)printf("%4d",f(a));}f(int a){int b=0;static int c=3;b++;c++;return(a+b+c);}A. 7 7 7B. 7 10 13C. 7 9 11D. 7 8 9(10) 以下程序的执行结果为___A____。

long fun(int n){long s;if(n==1||n==2)s=2;elses=n-fun(n-1);return s;}main(){printf("%d\n",fun(3));}A. 1B. 2C. 3D. 4(11) 有如下程序:long fib(int n){if(n>2)return(fib(n-1)+fib(n-2));elsereturn(2);}main(){printf("%d\n",fib(3));}该程序的执行结果为___B_____。

A. 2B. 4C. 6D. 82. 填空题(1)unsigned func(unsigned num){unsigned k=1;do{k*=num%10; num/=10;}while(num);return k;}main(){unsigned n=26;printf("%d\n",func(n));}程序执行结果为__________12____________。

(2)double sub(double x,double y,double z){y-=1.0;z+=x;return z;}main(){double a=2.5,b=9.0;printf("%f\n",sub(b-a,a,a));}程序执行结果为_________9.000000________。

(3)main(){int a=3,b=2,c=1;c-=++b;b*=(a+c);{int b=5,c=12;c/=2;a-=c;printf("%d,%d,%d",a,b,c); -3,5,6a+=--c;}printf("%d%d%d\n",a,b,c); 2 3 -2}程序执行结果为_______________________________。

(4)void fun(){static int a;a+=2;printf("%d",a);}main(){int cc;for(cc=1;cc<=4;cc++)fun();printf("\n");}程序执行结果为_______2 4 6 8________________________。

3. 问答题假设源程序由张、陈、刘三人合作编写,源程序文件名分别为zhang.c,chen.c,liu.c,而且名字为flag的整型变量为大家所共有。

下面程序是否正确?如果有错误,请指出并改正。

/*zhang.c*/extern int flag; /*对外部变量flag做存储声明*/void title(){if(flag)printf("sum of even position elements:");elseprintf("sum of odd position elements:");}/*chen.c*/extern void title();extern int flag; /*对外部变量flag做存储声明*/void f(int a[],int n){int i,sum=0;i=flag==0?0:1;for(;i<n;i+=2)sum+=a[i];title();printf("%d\n",sum);}/*liu.c*/#define N 8extern void f(int a[],int n);int flag; /*定义全局变量flag,申请存储单元*/main(){int x[N]={1,2,3,4,5,6,7,8},k;printf("\nflag=?");scanf("%d",&flag);f(x,N);}4. 编程题(1)对数组中的数据进行由大到小的排序。

(2)写两个函数,分别求两个正整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个正整数在主函数中从键盘输入。

解:设两个整数为u和v,用辗转相除法求最大公约数的算法如下:if v>u将变量u和v的值互换(使大者u为被除数)while(u/v的余数r≠0){u=vv=r}输出最大公约数r最小公倍数l=u*v/最大公约数r。

程序如下:#include <stdio.h>int hcf(int u,int v) //最大公约数函数{int t,r;if(v>u){t=u;u=v;v=t;};while((r=u%v)!=0){u=v;v=r;}return(v);}int lcd(int u,int v,int h) //最小公倍数函数{return(u*v/h);}void main(){int u,v,h,l;;printf("\nInput u&v:");scanf("%d,%d",&u,&v);h=hcf(u,v);printf("H.C.F=%d\n",h);l=lcd(u,v,h);printf("L.C.D=%d\n",l);}运行结果:Input u&v:24,16H.C.F=8L.C.D=48(3)用递归方法求n阶勒让德的值,递归公式为1 n=0p n(x) = x n=1 ((2n-1)*xp n-1(x)-(n-1)*p n-2(x))/n n>1#include <stdio.h>float f(int n,int x){if(n==0)return 1;else if(n==1)return x;elsereturn((2*n-1)*x*f((n-1),x)-(n-1)*f((n-2),x))/n;}void main(){int x,n;printf("\n Input n and x:");scanf("%d,%d",&n,&x);printf("f%d(%d)=%6.2f\n",n,xf(n,x));}运行结果:Input n and x:1,2f1(2)=2.00。

相关主题