第7章 函数.docx
- 文档编号:4946254
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:15
- 大小:23.26KB
第7章 函数.docx
《第7章 函数.docx》由会员分享,可在线阅读,更多相关《第7章 函数.docx(15页珍藏版)》请在冰豆网上搜索。
第7章函数
1.下列叙述中正确的是
A)C程序中所有函数之间都可以相互调用
B)在C程序中main函数的位置是固定的
C)在C程序的函数中不能定义另一个函数
D)每个C程序文件中都必须要有一个main函数
参考答案:
C
【解析】C程序中主函数不能被其他函数调用,所以A选项错误。main函数可以放在程序开始,也可以放在中间,也可以放在最后,位置不固定,但程序执行时必须从main函数开始,所以B选项错误。在C程序的函数中不能定义另一个函数,可以声明或调用另一个函数,所以C选项正确。每个C程序中必须包含一个main函数,但不一定是每个C程序文件中必须有,用户单独编写的某个函数也可以存储为一个C程序文件,所以D选项错误。
2.若有代数式
(其中e仅代表自然对数的底数,不是变量),则以下能够正确表示该代数式的C语言表达式是( )。
A)sqrt(fabs(pow(n,x)+exp(x)))B)sqrt(fabs(pow(n,x)+pow(x,e)))
C)sqrt(abs(n^x+e^x))D)sqrt(fabs(pow(x,n)+exp(x)))
参考答案:
A
【解析】B)选项中函数pow(x,e)错误应该直接使用exp(x)函数。
C)选项中函数abs(n^x+e^x)错误,应该使用fabs()返回浮点数的绝对值。
D)选项中pow(x,n)参数顺序错误。
3.以下叙述中正确的是
A)函数名允许用数字开头
B)函数调用时,不必区分函数名称的大小写
C)调用函数时,函数名必须与被调用的函数名完全一致
D)在函数体中只能出现一次return语句
参考答案:
C
【解析】B选项中,函数调用时,函数名称是需要区分大小写的;A选项中,函数名不允许以数字开头;D选项中,在函数中允许有多个return语句,但每次调用只能有一个return语句被执行。
因此C选项正确。
4.有以下程序
#include
doublef(doublex);
main()
{doublea=0;inti;
for(i=0;i<30;i+=10)a+=f((double)i);
printf("%3.0f\n",a);
}
doublef(doublex)
{returnx*x+1;}
程序运行后的输出结果是
A)500B)401C)503D)1404
参考答案:
C
【解析】本题重点考察函数的定义和调用,第一次循环,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
【解析】不能将一个整数直接赋给指针变量作为地址,所以A)是错误的。
函数的返回值可以是地址,即指针。
函数调用中形参值的变化不会传递给实参。
7.有以下程序
#include
inta=4;
intf(intn)
{intt=0;staticinta=5;
if(n%2){inta=6;t+=a++;}
else{inta=7;t+=a++;}
returnt+a++;
}
main()
{ints=a,i=0;
for(;i<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.有以下程序
#include
intf(intn)
{intt=0,a=5;
if(n/2){inta=6;t+=a++;}
else{inta=7;t+=a++;}
returnt+a++;
}
main()
{ints=0,i=0;
for(;i<2;i++)s+=f(i);
printf("%d\n",s);
}
程序运行后的输出结果是
A)28B)24C)32D)36
参考答案:
B
【解析】在主函数main()中定义了两个变量s和i,同时给s和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=0+12=12。
当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=12+12=24。
最后输出的结果为24。
因此B选项正确。
9.若有以下程序
#include
inta=2;
intf(intm)
{staticintn;
n=0;n++;a++;
returnn+m+a;
}
main()
{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,
参考答案:
C
【解析】主函数中变量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。
因此C选项正确。
10.有以下程序
#include
intfun(intn)
{if(n==1)
return1;
else
return(n+fun(n-1));
}
main()
{intx;
scanf("%d",&x);
x=fun(x);
printf("%d\n",x);
}
执行程序时,给变量x输入10,程序的输出结果是
A)55B)54C)65D)45
参考答案:
A
【解析】该程序考察的是函数的递归调用,在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用,执行结果为1+2+3+…+8+9+10=55。
因此A选项正确。
11.有以下程序
#include
intf(intm)
{staticintn=0;
n+=m;
returnn;
}
main()
{intn=0;
printf("%d,",f(++n));
printf("%d\n",f(n++));
}
程序运行后的输出结果是
A)3,3B)1,1C)2,3D)1,2
参考答案:
D
【解析】该题目中首先区别++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返回主函数并输出。
因此D选项正确。
12.有以下程序
#include
intfun(inta,intB)
{if(b==0)returna;
elsereturn(fun(--a,--b));
}
main()
{printf("%d\n",fun(4,2));}
程序的运行结果是
A)1B)2C)3D)4
参考答案:
B
【解析】本题重点考察函数的递归调用;题目中给出的fun()函数直接调用了自身,所以是一个递归函数。
其功能是:
当参数b为0时,返回参数a的值,否则返回fun(--a,--b)的值。
从这里可以看出,当b不断递减时,a也不断递减,直到b为0时返回a的值。
那么a递减的总值就是b原来的值。
所以整个递归函数的作用就是返回a-b的值。
因此B选项正确。
13.有以下程序
#include
#include
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<2;i++)
a.score[i]=b.score[i];
}
main()
{STUc={"Qian",'f',95.0,92.0};
f(c);
printf("%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
参考答案:
D
【解析】本题考查结构体的相关操作以及传值、传址的区别,该题中调用f函数后,会生成参数c的一个副本,而不会改变c的值,所以c值维持原值,选项D正确。
14.有以下程序
#include
#include
structA
{inta;
charb[10];
doublec;
};
voidf(structAt);
main()
{structAa={1001,"ZhangDa",1098.0};
f(a);
printf("%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
参考答案:
D
【解析】本题考查结构体的相关操作以及传值、传址的区别,该题中调用f函数后,会生成参数a的一个副本,而不会改变a的值,所以a值维持原值,选项D正确。
15.有以下程序
#include
#include
structA
{inta;charb[10];doublec;};
voidf(structAt);
main()
{structAa={1001,"ZhangDa",1098.0};
f(a);printf("%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
参考答案:
D
【解析】本题考查结构体的相关操作以及传值、传址的区别,该题中调用f函数后,会生成参数a的一个副本,而不会改变a的值,所以a值维持原值,选项D正确。
16.有以下程序
#include
#include
typedefstruct{charname[9];charsex;floatscore[2];}STU;
STUf(STUA)
{STUb={"Zhao",'m',85.0,90.0};inti;
strcpy(a.name,b.name);
a.sex=b.sex;
for(i=0;i<2;i++)a.score[i]=b.score[i];
returna;
}
main()
{STUc={"Qian",'f',95.0,92.0},d;
d=f(c);
printf("%s,%c,%2.0f,%2.0f\n",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
参考答案:
A
【解析】本题考查结构体的相关操作以及传值、传址的区别,该题中调用f函数后,会返回记过计算的a值,选项A正确。
17.若有以下程序
#include
typedefstructstu{
charname[10],gender;
intscore;
}STU;
voidf(STUa,STUB)
{b=a;
printf("%s,%c,%d,",b.name,b.gender,b.score);
}
main()
{STUa={"Zhao",'m',290},b={"Qian",'f',350};
f(a,b);
printf("%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
参考答案:
C
【解析】本题考查结构体的相关操作以及传值、传址的区别,该题中调用f函数后,会首先输出被重新复制的b值,且与a相同,而执行完f函数后,b值并不会改变,所以还是维持原值,选项C正确。
18.若有以下程序
#include
#include
typedefstructstu{charname[10],gender;
intscore;
}STU;
voidf(char*p)
{strcpy(p,"Qian");}
main()
{STUa={"Zhao",'m',290},b;
b=a;
f(b.name);
b.gender='f';b.score=350;
printf("%s,%c,%d,",a.name,a.gender,a.score);
printf("%s,%c,%d\n",b.name,b.gender,b.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
参考答案:
A
【解析】本题考查结构体的相关操作以及传值、传址的区别,该题中调用f函数后,b的name会重新赋值为Qian,选项A正确。
19.有以下程序
#include
intf(intx)
{inty;
if(x==0||x==1)return(3);
y=x*x-f(x-2);
returny;
}
main()
{intz;
z=f(3);
printf("%d\n",z);
}
程序的运行结果是
A)0B)9C)6D)8
参考答案:
C
【解析】主函数中调用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返回主函数,并进行输出。
因此C选项正确。
20.有以下程序
#include
intfun(intx)
{intp;
if(x==0||x==1)
return(3);
p=x-fun(x-2);
returnp;
}
main()
{printf("%d\n",fun(7));}
执行后的输出结果是
A)2B)3C)7D)0
参考答案:
A
【解析】因为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。
因此A选项正确。
21.有以下程序
#include
intfun()
{staticintx=1;
x*=2;returnx;
}
main()
{inti,s=1;
for(i=1;i<=2;i++)s=fun();
printf("%d\n",s);
}
程序运行后的输出结果是
A)0B)1C)4D)8
参考答案:
C
【解析】fun函数中的x为静态局部变量,占用固定的内存单元,下一次调用时仍可保留上次调用时的值。
也就是说,如果多次调用fun函数,x的定义只在第一次调用时有效,从第二次调用开始,x的定义相当于不存在,直接使用x的值。
主函数中调用两次fun函数:
第一次调用:
x=1,x=x*2=2,s=2;第二次调用:
(直接用上次x的值)x=x*2=4,s=4。
因此C选项正确。
22.有以下程序
#include
intfun(intx[],intn)
{staticintsum=0,i;
for(i=0;i returnsum; } main() {inta[]={1,2,3,4,5},b[]={6,7,8,9},s=0; s=fun(a,5)+fun(b,4); printf("%d\n",s); } 程序执行后的输出结果是 A)55B)50C)45D)60 参考答案: D 【解析】内部静态变量是始终存在的,当函数被调用退出后,内部静态变量会保存数据,再次调用该函数时,以前调用时的数值仍然保留着。 fun(a,5)的值是15,再次调用后sum=15,所以fun(b,4)=45,s=45+15=60。 因此D选项正确。 23.若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是 A)函数的形参和实参分别占用不同的存储单元 B)形参只是形式上的存在,不占用具体存储单元 C)同名的实参和形参占同一存储单元 D)函数的实参和其对应的形参共占同一存储单元 参考答案: A 【解析】本题重点考察的是函数的形参和实参。 在定义函数时函数名后面括弧中的变量名称为"形式参数"(简称形参),在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为"实际参数"(简称实参)。 C语言规定,实参变量对形参变量的数据传递是"值传递",即单向传递,只由实参传给形参,而不能由形参传回来给实参。 在内存中,实参单元与形参单元是不同的单元。 因此A选项正确。 24.以下叙述中错误的是 A)C程序必须由一个或一个以上的函数组成 B)函数调用可以作为一个独立的语句存在 C)若函数有返回值,必须通过return语句返回 D)函数形参的值也可以传回给对应的实参 参考答案: D 【解析】形参是函数定义时由用户定义的形式上的变量,实参是函数调用时,主调函数为被调函数提供的原始数据。 在C语言中,实参向形参传送数据的方式是"值传递"。 因此D选项正确。 25.以下程序中函数f的功能是: 当flag为1时,进行由小到大排序;当flag为0时,进行由大到小排序。 #include voidf(intb[],intn,intflag) {inti,j,t; for(i=0;i for(j=i+1;j if(flag? b[i]>b[j]: b[i] {t=b[i];b[i]=b[j];b[j]=t;} } main() {inta[10]={5,4,3,2,1,6,7,8,9,10},i; f(&a[2],5,0); f(a,5,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7章 函数