习题六 函数
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);}
程序运行后的输出结果是______。
A、24 B、28 C、32 D、36
解析:本题考查的是函数调用和变量的作用域。在主函数main()中定义了两个变量s和i,同时给s赋初值a=4,i赋初值0。当i=0时,执行"s+=f(i);"语句,调用f()函数并将i的初值0传递给形参n。首先执行if语句中的条件:n%3,条件为假,执行else下的语句,a=7,t=7+0=7,使用return返回t,t=7+(a++)=7+5=12,此时a运算完后自行加1为6;返回主函数中,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返回t,t=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);}
执行后的输出结果是______。
A、5,5 B、5,11 C、11,11 D、11,5
解析:本题考查的是局部变量在程序中的应用。将j和m的值带入函数fun中,第一次调用完fun()后, m和i的值分别为5和3且要保留,并在第二次调用时使用,这是因为两者都是局部静态变量。所以最后的结果是5和11。 故本题答案为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);}
执行后的输出结果是______。
A、6 B、7 C、8 D、9
解析:本题考查的是函数的正确调用。在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));}
执行后的输出结果是______。
A、7 B、3 C、2 D、0
解析:本题考查的是函数的递归调用。函数fun是一个递归调用函数,首先主函数将实参7传递给函数fun中的形参x,由于7≠0,7≠1,不满足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');}
程序的运行结果是______。
A、C D E F B、A B E F C、A B C D D、C 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中的值是______。
A、5.21 B、5 C、5.0 D、0.0
解析:本题考查的是数值类型的定义与强制转换。本题在进行调用函数fun2()时,又对函数fun1()进行了调用,由于函数fun1()定义为整型,所以第一次调用fun1()时返回的值为1,然后再将1赋值给a,此时由于a为double型,则系统自动类型转换,将1转换成了1.000000赋值给了变量a,以此类推,得b的值为4.000000,然后通过"return(int)(a+b);"将a+b的值强制转换为int型5返回给主函数,此时又由w的类型为double,所以返回的整型值5又被转换为double型。故输出结果为5.0。故本题答案为C。
7. 以下叙述中错误的是______。
A、C程序必须由一个或一个以上的函数组成
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,程序的输出结果是______。
A、55 B、54 C、65 D、45
解析:本题考查的是函数的递归调用。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语句返回一个函数值,以下选项中错误的程序是______。
A、main() 递归函数c语言规则 B、float fun(int a,int b){……}
{…… x=fun(2,10); ……} main()
float fun(int a,int b){ ……} {…… x=fun(i,j); ……}
C、float fun(int int); D、main()
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);
}
程序运行后的输出结果是______。
A、26 B、28 C、29 D、24
解析:本题考查的是变量的生存期。
解本题要弄清楚这样几点: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小时内删除。
发表评论