第7章 函数.docx

上传人:b****6 文档编号:4946254 上传时间:2022-12-12 格式:DOCX 页数:15 大小:23.26KB
下载 相关 举报
第7章 函数.docx_第1页
第1页 / 共15页
第7章 函数.docx_第2页
第2页 / 共15页
第7章 函数.docx_第3页
第3页 / 共15页
第7章 函数.docx_第4页
第4页 / 共15页
第7章 函数.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

第7章 函数.docx

《第7章 函数.docx》由会员分享,可在线阅读,更多相关《第7章 函数.docx(15页珍藏版)》请在冰豆网上搜索。

第7章 函数.docx

第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,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1