第7章 函数Word下载.docx
《第7章 函数Word下载.docx》由会员分享,可在线阅读,更多相关《第7章 函数Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
,a);
}
doublef(doublex)
{returnx*x+1;
程序运行后的输出结果是
A)500B)401C)503D)1404
【解析】本题重点考察函数的定义和调用,第一次循环,a=0,i=0;
返回值a=0*0+1=1;
第二次循环,a=1,i=10;
返回值a=10*10+1+1=102;
第三次循环,a=102,i=20;
返回值a=20*20+1+102=503;
第四次循环,a=503,i=30;
不符合i<
30,跳出循环,最后结果输出a=503。
5.以下叙述中正确的是
A)用户自己定义的函数只能调用库函数
B)实用的C语言源程序总是由一个或多个函数组成
C)不同函数的形式参数不能使用相同名称的标识符
D)在C语言的函数内部,可以定义局部嵌套函数
B
【解析】A选项中,"
用户自己定义的函数只能调用库函数"
描述是不正确的,也可以调用自定义函数;
C选项中,对于不同函数的形式参数可以使用相同名称的标识符;
D选项中,关于函数的定义不可以嵌套,但函数的调用可以嵌套。
因此B选项正确。
6.以下叙述中错误的是( )。
A)可以给指针变量赋一个整数作为地址值
B)函数可以返回地址值
C)改变函数形参的值,不会改变对应实参的值
D)当在程序的开头包含头文件stdio.h时,可以给指针变量赋NULL
【解析】不能将一个整数直接赋给指针变量作为地址,所以A)是错误的。
函数的返回值可以是地址,即指针。
函数调用中形参值的变化不会传递给实参。
7.有以下程序
inta=4;
intf(intn)
{intt=0;
staticinta=5;
if(n%2){inta=6;
t+=a++;
else{inta=7;
returnt+a++;
{ints=a,i=0;
for(;
2;
i++)s+=f(i);
printf("
%d\n"
s);
}
A)36B)24C)32D)28
D
【解析】在主函数main()中定义了两个变量s和i,同时给s赋初值。
a=4,i赋初值0。
当i=0时。
执行"
s+=f(i);
"
语句,调用f()并将i的初值0传递给形参n。
首先执行if语句中内条件:
n%2,若条件为假。
则执行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%2,条件为真,执行if下面的语句,t=0,a=6t=0+6=6,使用return返回t,t=6+6=12,返回主函数中,s=16+12=28。
最后输出的结果为28。
因此D选项正确。
8.有以下程序
{intt=0,a=5;
if(n/2){inta=6;
{ints=0,i=0;
A)28B)24C)32D)36
【解析】在主函数main()中定义了两个变量s和i,同时给s和i赋初值0。
n/2,条件为假。
返回主函数中,s=0+12=12。
n/2,条件为真,执行if下面的语句,t=0,a=6t=0+6=6,使用return返回t,t=6+6=12,返回主函数中,s=12+12=24。
最后输出的结果为24。
9.若有以下程序
inta=2;
intf(intm)
{staticintn;
n=0;
n++;
a++;
returnn+m+a;
{intk;
for(k=0;
k<
4;
k++)printf("
%d,"
f(k));
则程序的输出结果是
A)4,5,6,7,B)4,7,10,13,C)4,6,8,10,D)3,5,7,9,
【解析】主函数中变量k作为for语句的循环变量,取值0、1、2、3,同时也作为实参通过调用函数f传递给形参变量m。
由于变量a是全局变量,变量n是static静态变量,因此k=0时,f函数中,语句returnn+m+a;
即1+0+3=4;
k=1时,f函数中,语句returnn+m+a;
即2+1+3=6;
k=2时,f函数中,语句returnn+m+a;
即3+2+3=8;
k=3时,f函数中,语句returnn+m+a;
即4+3+3=10。
10.有以下程序
#include<
intfun(intn)
{if(n==1)
return1;
else
return(n+fun(n-1));
{intx;
scanf("
%d"
&
x);
x=fun(x);
x);
执行程序时,给变量x输入10,程序的输出结果是
A)55B)54C)65D)45
【解析】该程序考察的是函数的递归调用,在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用,执行结果为1+2+3+…+8+9+10=55。
因此A选项正确。
11.有以下程序
intf(intm)
{staticintn=0;
n+=m;
returnn;
{intn=0;
printf("
f(++n));
f(n++));
A)3,3B)1,1C)2,3D)1,2
【解析】该题目中首先区别++n和n++,第一次调用f函数时,将++n(n自增1后再参与运算)作为参数进行传递,此时变量m的值为1,执行n+=m;
后,n=1,将1返回主函数,并输出。
第二次调用f函数时,将n++(n参与运算后再自增1)作为参数进行传递,此时变量m的值为1,执行语句n+=m;
,由于n是静态存储变量,因此n=2,将2返回主函数并输出。
12.有以下程序
intfun(inta,intB)
{if(b==0)returna;
elsereturn(fun(--a,--b));
{printf("
fun(4,2));
程序的运行结果是
A)1B)2C)3D)4
【解析】本题重点考察函数的递归调用;
题目中给出的fun()函数直接调用了自身,所以是一个递归函数。
其功能是:
当参数b为0时,返回参数a的值,否则返回fun(--a,--b)的值。
从这里可以看出,当b不断递减时,a也不断递减,直到b为0时返回a的值。
那么a递减的总值就是b原来的值。
所以整个递归函数的作用就是返回a-b的值。
13.有以下程序
string.h>
typedefstruct{charname[9];
charsex;
floatscore[2];
}STU;
voidf(STUA)
{STUb={"
Zhao"
'
m'
85.0,90.0};
inti;
strcpy(a.name,b.name);
a.sex=b.sex;
for(i=0;
i++)
a.score[i]=b.score[i];
{STUc={"
Qian"
f'
95.0,92.0};
f(c);
%s,%c,%2.0f,%2.0f\n"
c.name,c.sex,c.score[0],c.score[1]);
A)Zhao,m,85,90B)Qian,m,85,90C)Zhao,f,95,92D)Qian,f,95,92
【解析】本题考查结构体的相关操作以及传值、传址的区别,该题中调用f函数后,会生成参数c的一个副本,而不会改变c的值,所以c值维持原值,选项D正确。
14.有以下程序
structA
{inta;
charb[10];
doublec;
};
voidf(structAt);
{structAa={1001,"
ZhangDa"
1098.0};
f(a);
%d,%s,%6.1f\n"
a.a,a.b,a.c);
voidf(structAt)
{t.a=1002;
strcpy(t.b,"
ChangRong"
);
t.c=1202.0;
A)1002,ZhangDa,1202.0B)1002,ChangRong,1202.0
C)1001,ChangRong,1098.0D)1001,ZhangDa,1098.0
【解析】本题考查结构体的相关操作以及传值、传址的区别,该题中调用f函数后,会生成参数a的一个副本,而不会改变a的值,所以a值维持原值,选项D正确。
15.有以下程序
charb[10];
doublec;
printf("
strcpy(t.b,"
t.c=1202.0;
A)1002,ZhangDa,1202.0B)1002,ChangRong,1202.0
C)1001,ChangRong,1098.0D)1001,ZhangDa,1098.0
16.有以下程序
STUf(STUA)
i++)a.score[i]=b.score[i];
returna;
95.0,92.0},d;
d=f(c);
d.name,d.sex,d.score[0],d.score[1]);
A)Zhao,m,85,90B)Qian,m,85,90C)Qian,f,95,92D)Zhao,f,95,92
【解析】本题考查结构体的相关操作以及传值、传址的区别,该题中调用f函数后,会返回记过计算的a值,选项A正确。
17.若有以下程序
typedefstructstu{
charname[10],gender;
intscore;
voidf(STUa,STUB)
{b=a;
printf("
%s,%c,%d,"
b.name,b.gender,b.score);
{STUa={"
290},b={"
350};
f(a,b);
%s,%c,%d\n"
b.name,b.gender,b.score);
A)Qian,f,350,Qian,f,350B)Zhao,m,290,Zhao,m,290
C)Zhao,m,290,Qian,f,350D)Zhao,m,290,Zhao,f,350
【解析】本题考查结构体的相关操作以及传值、传址的区别,该题中调用f函数后,会首先输出被重新复制的b值,且与a相同,而执行完f函数后,b值并不会改变,所以还是维持原值,选项C正确。
18.若有以下程序
typedefstructstu{charname[10],gender;
voidf(char*p)
{strcpy(p,"
);
290},b;
b=a;
f(b.name);
b.gender='
;
b.score=350;
a.name,a.gender,a.score);
A)Zhao,m,290,Qian,f,350B)Zhao,m,290,Zhao,m,290
C)Qian,f,350,Qian,f,350D)Zhao,m,290,Zhao,f,350
【解析】本题考查结构体的相关操作以及传值、传址的区别,该题中调用f函数后,b的name会重新赋值为Qian,选项A正确。
19.有以下程序
intf(intx)
{inty;
if(x==0||x==1)return(3);
y=x*x-f(x-2);
returny;
{intz;
z=f(3);
z);
A)0B)9C)6D)8
【解析】主函数中调用f函数,同时将数值3传递给变量x,执行条件与if(x==0||x==1);
此时条件不成立,跳过return(3);
,直接执行语句y=x*x-f(x-2);
这里f(x-2)为函数的递归调用,再次调用f函数,此时x=1,条件语句条件成立,返回3给f
(1),y=3*3-3=6,最后将6返回主函数,并进行输出。
20.有以下程序
intfun(intx)
{intp;
if(x==0||x==1)
return(3);
p=x-fun(x-2);
returnp;
fun(7));
执行后的输出结果是
A)2B)3C)7D)0
【解析】因为fun(intx)是一个递归函数,所以主函数中fun(7)经过3次递归调用,其过程可以描述为"
fun(7)=7-fun(5)=7-(5-fun(3))=7-(5-(3-fun
(1)))=7-(5-(3-3))=7-5=2"
,所以最后输出结果为2。
21.有以下程序
intfun()
{staticintx=1;
x*=2;
returnx;
{inti,s=1;
for(i=1;
i<
=2;
i++)s=fun();
s);
A)0B)1C)4D)8
【解析】fun函数中的x为静态局部变量,占用固定的内存单元,下一次调用时仍可保留上次调用时的值。
也就是说,如果多次调用fun函数,x的定义只在第一次调用时有效,从第二次调用开始,x的定义相当于不存在,直接使用x的值。
主函数中调用两次fun函数:
第一次调用:
x=1,x=x*2=2,s=2;
第二次调用:
(直接用上次x的值)x=x*2=4,s=4。
22.有以下程序
intfun(intx[],intn)
{staticintsum=0,i;
for(i=0;
n;
i++)sum+=x[i];
returnsum;
{inta[]={1,2,3,4,5},b[]={6,7,8,9},s=0;
s=fun(a,5)+fun(b,4);
程序执行后的输出结果是
A)55B)50C)45D)60
【解析】内部静态变量是始终存在的,当函数被调用退出后,内部静态变量会保存数据,再次调用该函数时,以前调用时的数值仍然保留着。
fun(a,5)的值是15,再次调用后sum=15,所以fun(b,4)=45,s=45+15=60。
23.若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是
A)函数的形参和实参分别占用不同的存储单元
B)形参只是形式上的存在,不占用具体存储单元
C)同名的实参和形参占同一存储单元
D)函数的实参和其对应的形参共占同一存储单元
【解析】本题重点考察的是函数的形参和实参。
在定义函数时函数名后面括弧中的变量名称为"
形式参数"
(简称形参),在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为"
实际参数"
(简称实参)。
C语言规定,实参变量对形参变量的数据传递是"
值传递"
,即单向传递,只由实参传给形参,而不能由形参传回来给实参。
在内存中,实参单元与形参单元是不同的单元。
24.以下叙述中错误的是
A)C程序必须由一个或一个以上的函数组成
B)函数调用可以作为一个独立的语句存在
C)若函数有返回值,必须通过return语句返回
D)函数形参的值也可以传回给对应的实参
【解析】形参是函数定义时由用户定义的形式上的变量,实参是函数调用时,主调函数为被调函数提供的原始数据。
在C语言中,实参向形参传送数据的方式是"
。
25.以下程序中函数f的功能是:
当flag为1时,进行由小到大排序;
当flag为0时,进行由大到小排序。
voidf(intb[],intn,intflag)
{inti,j,t;
n-1;
i++)
for(j=i+1;
j<
j++)
if(flag?
b[i]>
b[j]:
b[i]<
b[j])
{t=b[i];
b[i]=b[j];
b[j]=t;
{inta[10]={5,4,3,2,1,6,7,8,9,10},i;
f(&
a[2],5,0);
f(a,5,