习题六  函数
1. 有以下程序
int a=4;
int f(int n)
{ int t=0; static int a=5;
    if(n%2) {int a=6;  t+=a++;}
    else  {int a=7;  t+=a++;}
    return t+a++;}
main()
{ int s=a,i=0;
    for(;i<2;i++)  s+=f(i);
    printf("%d\n",s);}
程序运行后的输出结果是______
A24   B28   C32   D36
解析:本题考查的是函数调用和变量的作用域。在主函数main()中定义了两个变量si,同时给s赋初值a=4i赋初值0。当i=0时,执行"s+=f(i);"语句,调用f()函数并将i的初值0传递给形参n。首先执行if语句中的条件:n%3,条件为假,执行else下的语句,a=7,t=7+0=7,使用return返回tt=7+(a++)=7+5=12,此时a运算完后自行加16;返回主函数中,s=4+12=16。当i=1时,执行"s+=f(i);"语句,调用f()函数并将i的初值1传递给形参n。首先执行if语句中的条件: n%3,条件为真,执行if下的语句,t=0,a=6,t=0+6=6,使用return返回tt=6+6=12,返回主函数中,s=16+12=28。最后的输出结果为28。故本题答案选B
2. 有以下程序
fun (int  x, int  y)
{ static int m=0,i=2;
  i+=m+1;  m=i+x+y;  return m;}
main()
{  int j=1,m=1,k;
  k=fun(j,m);  printf("%d,",k);
  k=fun(j,m);  printf("%d\n",k);}
执行后的输出结果是______
A5,5   B5,11   C11,11   D11,5
解析:本题考查的是局部变量在程序中的应用。将jm的值带入函数fun中,第一次调用完fun()后, mi的值分别为53且要保留,并在第二次调用时使用,这是因为两者都是局部静态变量。所以最后的结果是511 故本题答案为B
3. 有以下程序
fun(int  x, int  y){return(x+y);}
main()
{ int  a=1,b=2,c=3,sum;
  sum=fun((a++,b++,a+b),c++);
  printf("%d\n",sum);}
执行后的输出结果是______
A6   B7   C8   D9
  解析:本题考查的是函数的正确调用。在fun((a++,b++,a+b),c++) 中,先算括号内的(a++,b++,a+b) 逗号运算,即先算出a++的值,a=2;再算出b++的值,b=3;最后算出a+b的值,a+b=2+3=5,整个逗号表达式的值为最后a+b的值即为5;接下来调用fun 函数,此时原语句变为:sum=fun(5,c++); c++表示在使用c以后再将c的值加1,结果为:5+3=8。故本题答案为C
4. 有以下程序
fun(int  x)
{ int  p;
  if(x==0||x==1)  return(3);
  p=x-fun(x-2);
  return  p;}
main()
{  printf("%d\n",fun(7));}
执行后的输出结果是______
A7  B3   C2   D0
  解析:本题考查的是函数的递归调用。函数fun是一个递归调用函数,首先主函数将实参7传递给函数fun中的形参x,由于7071,不满足if条件,所以执行下面的p=x-fun(x-2);语句,此语句继续调用它本身,直到当x=1时,返回函数值3代入到调用它的表达式中,依此类推……,最终p的值为2。故本题答案为C
5. 有以下程序
void  fun2 (char a, char b)  {printf ("%c %c", a,b);}
char  a='A',b='B';
void  fun1(){  a='C' ;  b='D';  }
main()
{  fun1();
      printf("%c %c ",a,b);
      fun2 ('E', 'F');}
程序的运行结果是______
AC D E F   BA B E F   CA B C D   DC D A B
  解析:本题考查的是全局变量和局部变量的区别。本题答案为A
6. 有以下程序
int fun1(double a){return a*=a;}
int fun2(double x,double y)
{ double a=0,b=0;
  a=fun1(x);b=fun1(y); return(int)(a+b);}
main()
{double w;w=fun2(1.1,2.0);……}
程序执行后变量w中的值是______
A5.21   B5   C5.0  D0.0
  解析:本题考查的是数值类型的定义与强制转换。本题在进行调用函数fun2()时,又对函数fun1()进行了调用,由于函数fun1()定义为整型,所以第一次调用fun1()时返回的值为1,然后再将1赋值给a,此时由于adouble型,则系统自动类型转换,将1转换成了1.000000赋值给了变量a,以此类推,得b的值为4.000000,然后通过"return(int)(a+b);"a+b的值强制转换为int5返回给主函数,此时又由w的类型为double,所以返回的整型值5又被转换为double型。故输出结果为5.0。故本题答案为C
7. 以下叙述中错误的是______
AC程序必须由一个或一个以上的函数组成
B、函数调用可以作为一个独立的语句存在
C、若函数有返回值,必须通过return语句返回 
D、函数形参的值也可以传回给对应的实参
    解析:本题考查的是函数的概念。在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数的实参的值,也就是说形参的值是不传回给对应的实参的。本题答案为D
8. 有以下程序
int fun(int n)
{ if(n==1) return 1;
  else
  return(n+fun(n-1));}
main()
{ int x;
  scanf("%d",&x);x=fun(x);printf("%d\n",x);}
执行程序时,给变量x输入10,程序的输出结果是______
A55   B54   C65   D45
解析:本题考查的是函数的递归调用。fun函数共被调用8次,即fun(9)fun(8)fun(7)fun(6)fun(5)fun(4) fun(3) fun(2)n=10+9+8+7+6+5+4+3+2+1=55 所以x=55。故本题答案为A
9. 若各选项中所有变量已正确定义,函数fun中通过return语句返回一个函数值,以下选项中错误的程序是______
Amain()        递归函数c语言规则                Bfloat fun(int a,int b){……}
{…… x=fun(2,10); ……}              main()
float fun(int  a,int  b){ ……}      {……  x=fun(i,j);  ……}
Cfloat fun(int int);            Dmain()
main()                                { float fun(int i, int j);
{…… x=fun(2,10); ……}              …… x=fun(i,j);  ……}
float fun(int  a,int  b){ ……}      float fun(int  a,int  b){ ……}
    解析:本题考查的是函数的调用。当程序中定义了多个函数时,通常情况下是先定义后调用,若被调函数定义在主调函数之后,则必须先声明后调用。故本题答案为A
10. 有以下程序
int  a=2;
int f(int  n)
{static int  a=3;
int  t=0;
if(n%2){ static int  a=4;  t+=a++;  }
else  { static int  a=5;  t+=a++;  }
return  t+a++;}
main()
{int  s=a,i;
for(i=0;i<3;i++)  s+=f(i);
printf("%d\n",s);
}
程序运行后的输出结果是______
A26  B28   C29   D24
    解析:本题考查的是变量的生存期。
    解本题要弄清楚这样几点:1、定义"int  a=2;"中的全局变量a,其作用范围是从定义此变量的位置开始到本源文件结束;2"static int  a=3;"中的静态局部变量a的作用范围是其所
在的函数f,并对其只赋一次初值,以后每次调用函数时不再重新赋初值,而只是保留上次函数调用结束时的值;3、复合语句"{ static int  a=4;  t+=a++;  }""{ static int  a=5;  t+=a++;  }"中定义的两个变量a属于复合语句中定义的变量,作用范围只在其本身所在的复合语句内。对于本程序来讲,第三行定义的静态局部变量并不会对四、五两行的复合语句产生作用,这是因为复合语句中也定义了与其同名的静态局部变量。故本题答案为C
11. 设函数fun的定义形式为
void  fun(char  ch,float  x)  { …… }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。