第8章函数1.以下程序的输出结果是( )A、6 9 9B、6 6 9C、6 15 15D、6 6 15int d=1;fun(int p){ static int d=5;d+=p;printf("%d ",d);return(d);}main( ){ int a=3;printf("%d \n",fun(a+fun(d)));}答案:C注解:函数fun调用两次,第一次调用的实参是全局变量d的值1,在函数调用执行过程中,输出的是局部静态变量d;第二次调用的实参是第一次调用的返回值和变量a的和,输出的仍是局部静态变量d的值。
注意静态变量的定义和初始化是在第一次使用时进行的,在以后的使用过程中,保留上一次的值,不再初始化。
2.若有以下调用语句,则不正确的fun函数的首部是()A、void fun(int m,int x[])B、void fun(int s,int h[41])C、void fun(int p,int *s)D、void fun(int n,int a)main( ){ …int a[50],n;…fun(n,&a[9]);…}答案:D注解:从主函数中fun函数的调用格式可以看出,fun函数的两个形参的类型,第一个形参是整型变量,第二个形参是变量的地址,则必须是数组名或者是指针。
3.有如下函数调用语句func(rec1,rec2+rec3,(rec4,rec5));该函数调用语句中,含有的实参个数是()A、3B、4C、5D、有语法错答案:A注解:该函数调用语句中,含有的实参分别是rec1,rec2+rec3表达式计算后的值和(rec4,rec5)逗号表达式计算后值。
4.有如下程序int runc(int a,int b){ return(a+b);}main( ){ int x=2,y=5,z=8,r;r=func(func(x,y),z);printf("%d\n",r);}该程序的输出的结果是()A、12B、13C、14D、15答案:D注解:函数func第一次调用的返回值作为第二次调用的实参,第一次调用func(x,y)即func(2,5)的返回值是7,第二次调用func(7,z)即func(7,8)的返回值是15,所以r的值为15。
5.有如下程序long fib(int n){ if(n>2)return(fib(n-1)+fib(n-2));else return(2);}main( ){printf("%d\n",fib(3));该程序的输出结果是()A、2B、4C、6D、8答案:B注解:函数fib是递归函数,递归终止条件是n<=2。
则fib(3)的调用过程是:条件n>2成立,则再次调用fib(2)和fib(1),而fib(1)和fib(2)在函数调用时,不再递归调用,均返回2到它的上一级调用,即到调用fib(3)的执行过程,所以fib(3)调用返回值为4。
6.在C语言中,函数的隐含存储类别是()A、autoB、staticC、externD、无存储类别答案:C7.以下所列的各函数首部中,正确的是()A、void play(var:Integer,var b:Integer)B、void play(int a,b)C、void play(int a,int b)D、Sub play(a as integer,b as integer)答案:C注解:选项A、D不是C语言的函数定义格式,C语言在函数定义的函数头部,形参的定义是每一个形参都要有自己的关键字。
8.以下程序的输出结果是()A、0B、29C、31D、无定值fun(int x,int y,int z){ z=x*x+y*y;}main( ){ int a=31;fun(5,2,a);printf("%d",a);}答案:C注解:函数fun的调用时,参数传递是传值方式,所以形参值的变化并不会影响实参值的变化,故变量a的值保留原值。
9.当调用函数时,实参是一个数组名,则向函数传送的是()A、数组的长度B、数组的首地址C、数组每一个元素的地址D、数组每个元素中的值答案:B注解:函数调用时,参数是数组名或指针时,参数传递是传地址方式。
10.以下只有在使用时才为该类型变量分配内存的存储类说明是()A、auto和staticB、auto和registerC、register和staticD、extern和register答案:B11.以下程序的输出结果是()A、1B、2C、3D、4long fun( int n){ long s;if(n= =1 || n= =2)s=2;else s=n-fun(n-1)return s;}main( ){ printf("%ld\n",fun(3));}答案:A注解:fun函数调用是递归调用,主函数中fun(3)调用的执行过程是:初始n=3,if语句的条件n= =1 || n= =2不成立,执行else子句,再次调用fun函数,s=3-fun(2),则此次执行过程中,if语句的条件n= =1 || n= =2成立,执行if后的子句s=2;,然后再返回到调用它的上一级函数fun(3),fun(3)调用再返回到主函数,返回值为1。
12.以下程序的输出结果是()main( ){ int num= 0;while(num<=2){ num++;printf("%d\n",num);}A、1B、1C、1D、l2 2 23 34答案:B注解:循环的执行过程是:(1)变量num的初值为0,则条件num<=2满足,执行循环体,输出num自增后的值1;(2)变量num的值变为1,条件满足,输出num自增后的值2;(3)变量num的值变为2,条件满足,输出num自增后的值3;(4)变量num的值变为3,条件不满足,则退出循环的执行。
13.以下程序的输出结果是()int f( ){static int i=0;int s=1;s+=i;i++;return s;}main( ){int i,a=0;for(i=0;i<5;i++)a+=f();printf("%d\n",a);}A、20B、24C、25D、15答案:D注解:在主函数中,函数f( )被调用5次,第一次调用时定义静态变量i,并给i赋初值0,s累加和为1,变量i的值自增为1,将s值返回给a,则a的值为1,第二次调用时,静态变量i保留第一次调用时的值1,s 累加和为2,变量i的值自增为2,将s值返回到a+=f( ),则a的值为1+2=3,第三、四、五次调用类似执行。
14.以下程序的输出结果是()f(int b[ ],int m,int n){int i,s=0;for(i=m;i<n;i=i+2) s=s+b[i];return s;}main( ){int x,a[ ]={1,2,3,4,5,6,7,8,9};x=f(a,3,7);printf("%d\n",x);}A、10B、18C、8D、15答案:A注解:函数f(a,3,7)调用时,a是传数组地址,形参数组b与a使用同一片存储空间。
f函数的执行是循环控制变量I的初值是3,变量s中累加上b[3]的值4,s的值为4,然后变量I增为5,条件I<7成立,s中累加上b[5]的值6,s的值为10,变量I的值增为7,条件不成立,则退出循环,返回值给x,则最后输出的值为10。
填空题1.以下程序的输出结果是____________________main( ){int x=0;sub(&x,8,1);printf("%d\n",x);}sub(int *a,int n,int k){if(k<=n) sub(a,n/2,2*k);*a+=k;}答案:注解:函数调用sub(&x,8,1),将变量x的地址传给指针变量a,数值8传给n,数值1传给k,在函数体的执行中,条件k<=n成立,再次调用sub(a,4,2)函数,执行函数体,条件k<=n成立,第三次调用sub(a,2,4)函数,数值2传给n,数值4传给k,执行循环体,条件不成立,执行语句*a+=k;,指针a所指单元内的值为4,返回上一级调用,执行语句*a+=k;,指针a所指单元内的值为6,再一次返回到第一次函数调用,执行语句*a=k;,指针a所指单元内的值为7,则变量x的值为7。
2.以下程序输出的最后一个值是_____________int ff(int n){ static int f=l;f=f*n;return f;}main( ){ int i;for(i=1;i<=5;i++ ) printf("%d\n",ff(i));}答案:120注解:函数ff在循环中调用5次,第一次调用ff(1),函数体执行,静态变量f的值为1,执行1*n,返回值为1,第二次调用ff(2),静态变量f的值保留第一次调用的值1,执行1*n,返回值为2,依次类推,第五次调用ff(5),f保留第四次调用的值24,执行24*n=24*5=120,返回值为120。
3.以下函数的功能是:求x的y次方,请填空。
double fun( double x,int y){ int i;double z;for(i=1,z=x;i<y;i++) z=z*_______;return z;}答案:x注解:求x的y次方,即是x*x*…*x,一共有y个x相乘,在for循环中,变量z用为存放累乘的积,所以z=z*x,变量z的初值为x,所以只要循环y-1即可。
4.若已定义:int a[10],i;,以下fun函数的功能是:在第一个循环中给前10个数组元素依次赋1、2、3、4、5、6、7、8、9、10;在第二个循环中使a数组前10个元素中的值对称折叠,变成1、2、3、4、5、5、4、3、2、1。
请填空。
fun( int a[ ]){ int i;for(i=0;i<10;i++) (1) =i;for(i=0;i<5;i++) (2) =a[i];}答案:(1)a[i] (2)a[9-i]注解:根据要求,第二个循环将数组前10个元素中值对称折叠,即将数组的a[5]中存放a[4]的值,a[6]中存放a[3]的值,依次类推,a[9]中存放a[0]的值,由此可知(2)中应填入的是a[9-i]。
5.若变量n中的值为24,则prnt函数共输出(1) 行,最后一行有(2) 个数。