第6章要点与习题解答.docx
- 文档编号:9591619
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:42
- 大小:59.94KB
第6章要点与习题解答.docx
《第6章要点与习题解答.docx》由会员分享,可在线阅读,更多相关《第6章要点与习题解答.docx(42页珍藏版)》请在冰豆网上搜索。
第6章要点与习题解答
第6章函数-1-
一、函数定义和函数调用-1-
二、函数的嵌套调用-3-
三、函数的递归调用-4-
四、局部变量-5-
五、全局变量-6-
六、静态变量-6-
习题6-7-
习题6答案-9-
补充题-10-
补充题答案-20-
第6章函数
一、函数定义和函数调用
1.函数定义
一般形式:
类型标识符函数名(类型形参,类型形参,……)
{
定义部分
语句序列
}
2.函数调用
一般形式:
函数名(实参,实参,……)
请看下面的例子:
例6.1编写函数,求两个数的最大值。
在main函数中输入三个数,用函数调用方式求出最大值,并输出结果。
程序如下:
#include
floatmax(floatx,floaty)/*函数定义*/
{floatmaxvale;
maxvale=x>y?
x:
y;
return(maxvale);
}
voidmain()
{floata,b,c,m;
scanf("%f%f%f",&a,&b,&c);
m=max(a,b));/*函数调用*/
m=max(m,c);/*函数调用*/
printf("m=%f\n",m);/*输出三个数的最大值*/
}
3.函数声明
一般形式:
类型标识符函数名(类型形参名,类型形参名,……);
或
类型标识符函数名(类型,类型,……);
例如:
floatmax(floatx,floaty);
或
floatmax(float,float);
当函数定义在主调函数之前,即先定义后使用,这样在调用函数时,就已经有了被调函数的全部信息,函数声明可以省略。
如前面的例子。
例6.2对被调函数声明的例子。
程序如下:
/*求两数之和的程序*/
#include
voidmain()
{floatadd(floatx,floaty);/*函数声明*/
floata,b,c;
scanf("%f,%f",&a,&b);
c=add(a,b);/*函数调用*/
printf("sunis%f",c);
}
floatadd(floatx,floaty)/*函数定义*/
{floatz;
z=x+y;
return(z);
}
运行情况如下:
2.4,5.7↙
sumis8.100000
4.函数间的参数传递
函数调用的过程如图61所示。
图61函数调用的整个执行过程
从图61可知,函数调用的整个执行过程分成以下4个步骤:
(1)创建形参变量,为每个形参变量建立相应的存储空间。
(2)值传递,即将实参的值复制到对应的形参变量中。
(3)执行函数体,即执行函数体中的语句。
(4)返回(带回函数值、返回到调用处、释放形参所占内存空间)。
函数调用的整个执行过程按上述4个步骤依次完成。
二、函数的嵌套调用
在C语言程序中,被调用的函数还可以继续调用其它函数,称为函数的嵌套调用。
如图62所示。
图62函数嵌套调用示意图
图62表示的是两层嵌套(包括main函数共3层函数),其执行过程是:
(1)执行main函数的开头部分;
(2)遇到调用a函数的操作语句,程序控制转到a函数;
(3)执行a函数的开头部分;
(4)遇到调用b函数的操作语句,流程转到b函数;
(5)执行b函数,如果没有其它嵌套函数,则完成b函数的全部操作;
(6)返回a函数中调用b函数处;
(7)继续执行a函数中尚未执行的部分,直到a函数结束;
(8)返回main函数中调用a函数处;
(9)继续执行main函数的剩余部分,直到main函数结束。
注意:
函数可以嵌套调用,但不能嵌套定义,即C语言的各函数应当是分别独立定义的函数,互不从属,也就是说在定义函数时,该函数体内不能再定义另外的函数,但可以调用已定义的函数。
例6.3编写程序,输入m,n,求组合数
程序如下:
#include
voidmain()
{intn,m;
longcmn(int,int);/*函数声明*/
printf("Pleaseinputm&n:
\n");
scanf("%d%d",&m,&n);
printf("cmn=%ld\n",cmn(m,n));/*调用cmn函数*/
}
longjc(intn)/*定义求阶乘的函数jc*/
{inti;longt=1;
for(i=1;i<=n;i++)t*=i;
return(t);
}
longcmn(intm,intn)/*定义求组合数的函数cmn*/
{return(jc(m)/(jc(n)*jc(m-n)));
}
运行情况如下:
Pleaseinputm&n:
95↙
cmn=126
程序说明:
程序中分别定义了求阶乘的函数jc和计算组合数的函数cmn。
当main函数调用cmn函数后,由cmn函数调用jc函数。
三、函数的递归调用
当一个函数直接或间接的调用它自身时,称为函数的递归调用。
下面举例说明。
例6.4用递归计算n!
。
分析:
n!
的递归定义式:
程序如下:
#include
longjc(intn)/*定义jc函数求n!
*/
{longf;
if(n==1||n==0)f=1;
elsef=n*jc(n-1);/*递归调用,求(n-1)!
*/
returnf;
}
voidmain()
{longy;
intn;
scanf(“%d”,&n);
y=jc(n);/*调用jc函数,求n!
*/
printf("%d!
=%ld",n,y);
}
运行情况如下:
3↙
3!
=6
程序说明:
为了说明递归调用的执行过程,参照图63说明如下:
在main函数中,执行y=jc(3),引起第1次调用jc函数,进入jc函数后,形参n=3,应执行f=3*jc
(2)。
为了计算jc
(2),又引起第2次调用jc函数(递归调用),进入jc函数后,形参n=2,应执行f=2*jc
(1)。
为了计算jc
(1),又引起第3次调用jc函数(递归调用),进入jc函数后,形参n=1,应执行f=1,然后执行return1,完成第3次调用,返回到调用处(即返回到第2次调用层)。
计算2*jc
(1)=2*1=2,执行return2,完成第2次调用,返回到第1次调用层。
计算3*jc
(2)=3*2=6,执行return6,完成第1次调用,返回到main函数。
图63函数递归调用示意图
四、局部变量
在一个函数内部定义的变量是局部变量,也称为内部变量,其作用域是本函数,即它只在本函数范围内有效。
例如:
floatf1(floatx)/*x只在f1函数中有效*/
{inta,b;/*a、b只在f1函数中有效*/
......
}
voidmain()
{intm,n;/*m、n只在main函数中有效*/
......
}
五、全局变量
在函数内部定义的变量是局部变量,而在函数外部定义的变量称为全局变量,也称为外部变量。
它的有效范围为从定义变量的位置开始到本源文件结束。
例如:
inta1=1,a2=5;/*a1、a2是全局变量,可在f1、f2和main函数中引用*/
floatf1(floatx)
{inti,j;
......
}
charc1,c2;/*c1、c2是全局变量,可在f2和main函数中引用*/
charf2(inta,intb)
{intc,d;
......
}
voidmain()
{intm,n;
......
}
六、静态变量
主要掌握静态局部变量。
1.静态局部变量
例6.5考察静态局部变量的值。
程序如下:
#include
intfunc(inta)
{intb=0;
staticintc=1;/*定义静态局部变量*/
b=b+1;
c=c+1;
return(a+b+c);
}
voidmain()
{inta=2,i;
for(i=0;i<3;i++)printf("%d",func(a));
}
程序运行结果:
567
程序说明:
(1)在第1次调用func函数时,b的初值为0,c的初值为1,第1次调用结束时,b=1,c=2,a+b+c=5。
由于c是静态局部变量,在函数调用结束后,它并不释放,仍保留c=2。
(2)在第2次调用func函数时,b的初值为0,而c的初值为2(上次调用结束时的值),第2次调用结束时,b=1,c=3,a+b+c=6。
(3)在第3次调用func函数时,b的初值为0,而c的初值为3(上次调用结束时的值),第3次调用结束时,b=1,c=4,a+b+c=7。
习题6
一、选择题
1.以下说法中正确的是______。
A)C语言程序总是从第一个定义的函数开始执行
B)在C语言程序中,要调用的函数必须在main函数中定义
C)C语言程序总是从main函数开始执行
D)C语言程序中的main函数必须放在程序的开始部分
答案:
2.下列各叙述中,正确叙述项是______。
A)定义函数时,必须要有形参
B)函数中可以没有retum语句,也可以有多条retum语句
C)函数f可以用f(f(x))形式调用,这种调用形式是递归调用
D)函数必须有返回值
答案:
3.下列各叙述中,不正确叙述项是______。
A)函数调用时,形参只有在被调用时才被创建(分配存储单元)
B)函数调用时,实参可以是常量、变量或表达式
C)定义局部变量时,省略对变量的存储类别定义,则变量是自动型变量
D)语句return(a,b);则函数可以返回两个值
答案:
4.以下函数的类型是______。
fun(floatx)
{printf("%d\n",x*x);}
A)与参数x的类型相同B)void类型C)int类型D)无法确定
答案:
5.在max((a,b),max((c,d),e))函数调用中,含有几个实参______。
A)2B)3C)4D)5
答案:
6.如果在函数的复合语句中定义一个变量,有关该变量作用域正确的是______。
A)只在该复合语句中有效B)在该函数中有效
C)在本程序中有效D)为非法变量
答案:
二、填空题。
1.程序执行时是从_______开始执行。
答案:
2.当函数调用在前,函数定义在后时,必须在主调函数中______。
答案:
习题6答案
一、选择题
1.以下说法中正确的是______。
A)C语言程序总是从第一个定义的函数开始执行
B)在C语言程序中,要调用的函数必须在main函数中定义
C)C语言程序总是从main函数开始执行
D)C语言程序中的main函数必须放在程序的开始部分
答案:
C
分析:
C语言对main函数和其他函数的排放顺序没有要求,程序总是从main函数开始执行,选项A和D是错的;不能在一个函数的内部再定义一个函数,所以B是错的。
2.下列各叙述中,正确叙述项是______。
A)定义函数时,必须要有形参
B)函数中可以没有retum语句,也可以有多条retum语句
C)函数f可以用f(f(x))形式调用,这种调用形式是递归调用
D)函数必须有返回值
答案:
B
分析:
函数可以没有参数,所以选项A是错的。
选项C是错的,如果函数f有返回值,则可以用f(f(x))形式调用,但不是递归调用。
递归调用是指在定义一个函数时调用它自己。
函数可以没有返回值,选项D是错的。
3.下列各叙述中,不正确叙述项是______。
A)函数调用时,形参只有在被调用时才被创建(分配存储单元)
B)函数调用时,实参可以是常量、变量或表达式
C)定义局部变量时,省略对变量的存储类别定义,则变量是自动型变量
D)语句return(a,b);则函数可以返回两个值
答案:
D
分析:
语句return(a,b);只能返回一个值b,(a,b)是逗号表达式。
4.以下函数的类型是______。
fun(floatx)
{printf("%d\n",x*x);}
A)与参数x的类型相同B)void类型C)int类型D)无法确定
答案:
C
分析:
C语言规定,在定义函数时省略函数返回值类型说明符,默认为int类型。
5.在max((a,b),max((c,d),e))函数调用中,含有几个实参______。
A)2B)3C)4D)5
答案:
A
分析:
在max函数中只有两个实参:
一个是逗号表达式(a,b),另一个是函数max((c,d),e)。
6.如果在函数的复合语句中定义一个变量,有关该变量作用域正确的是______。
A)只在该复合语句中有效B)在该函数中有效
C)在本程序中有效D)为非法变量
答案:
A
分析:
可以在函数的复合语句中定义变量,这些变量只在本复合语句中有效。
二、填空题。
1.程序执行时是从_______开始执行。
答案:
主函数(或main函数)
2.当函数调用在前,函数定义在后时,必须在主调函数中______。
答案:
声明
补充题
一、选择题
081选择题34
有以下程序
#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
答案:
081选择题39
在C语言中,只有在使用时才占用内存单元的变量,其存储类型是
A)auto和registerB)extern和registerC)auto和staticD)static和register
答案:
082选择题22
下面的函数调用语句中func函数的实参个数是
func(f2(v1,v2),(v3,v4,v5),(v6,max(v7,v8)));
A)3B)4C)5D)8
答案:
082选择题25
以下叙述中错误的是
A)用户定义的函数中可以没有return语句
B)用户定义的函数中可以有多个return语句,以便可以调用一次返回多个函值
C)用户定义的函数中若没有return语句,则应当定义函数为void类型
D)函数的return语句中可以没有表达式
答案:
082选择题30
有以下程序
#include
intfun(inta,intb)
{if(b==0)returna;
elsereturn(fun(--a,--b));
}
main()
{printf("%d\n",fun(4,2));}
程序的运行结果是
A)1B)2C)3D)4
答案:
082选择题32
有以下程序
#include
voidfun(inta,intb)
{intt;
t=a;a=b;b=t;
}
main()
{intc[10]={1,2,3,4,5,6,7,8,9,0},i;
for(i=0;i<10;i+=2)fun(c[i],c[i+1]);
for(i=0;i<10;i++)printf("%d,",c[i]);
printf("\n");
}
程序的运行结果是
A)1,2,3,4,5,6,7,8,9,0B)2,1,4,3,6,5,8,7,0,9
C)0,9,8,7,6,5,4,3,2,1D)0,1,2,3,4,5,6,7,8,9
答案:
082选择题34
有以下程序
#include
voidfun(inta[],intn)
{inti,t;
for(i=0;i } main() {intk[10]={1,2,3,4,5,6,7,8,9,10},i; fun(k,5); for(i=2;i<8;i++)printf("%d",k[i]); printf("\n"); } 程序的运行结果是 A)345678B)876543C)1098765D)321678 答案: 082选择题35 有以下程序 #include #defineN4 voidfun(inta[][N],intb[]) {inti; for(i=0;i } main() {intx[][N]={{1,2,3},{4},{5,6,7,8},{9,10}},y[N],i; fun(x,y); for(i=0;i printf("\n"); } 程序的运行结果是 A)1,2,3,4,B)1,0,7,0,C)1,4,5,9,D)3,4,8,10, 答案: 091选择题24 有以下程序 #include intf(intx,inty) {return((y-x)*x);} main() {inta=3,b=4,c=5,d; d=f(f(a,b),f(a,c)); printf(“%d\n”,d); } 程序运行后的输出结果是 A)10B)9C)8D)7 答案: 091选择题33 有以下程序 #include intfun(intx,inty) {if(x==y)return(x); elsereturn((x+y)/2); } main() {inta=4,b=5,c=6; printf(“%d\n”,fun(2*a,fun(b,c))); } 程序运行后的输出结果是 A)3B)6C)8D)12 答案: 091选择题34 设函数中有整型变量n,为保证其在未赋初值的情况下初值为0,应选择的存储类别是 A)autoB)registerC)staticD)auto或register 答案: 092选择题24 有以下程序 #include voidfun{intp} {intd=2; p=d++;printf(“%d”,p);} main() {inta=1; fun(a);printf(“%d\n”,a); } 程序运行后的输出结果是 A)32B)12C)21D)22 答案: 092选择题25 以下函数findmax拟实现在数组中查找最大值并作为函数值返回,但程序中有错导致不能实现预定功能。 #defineMIN-2147483647 intfindmax{intx[],intn} {inti,max; for(i=0;i {max=MIN; if(max returnmax; } 造成错误的原因是 A)定义语句inti,max;max未赋初值 B)赋值语句max=MIN;中,不应给max赋MIN值 C)语句if(max D)赋值语句max=MIN;放错了位置 答案: 092选择题34 #include intf(intn); main() {inta=3,s; s=f(a);s=s+f(a);printf(“%d\n”,s); } intf(intn) {staticinta=1; n+=a++; returnn; } 程序运行后的输出结果是 A)7B)8C)9D)10 答案: 101选择题11 以下叙述正确的是 A)C语言程序是由过程和函数组成的 B)C语言函数可以嵌套调用,例如: fun(fun(x)) C)C语言函数不可以单独编译 D)C语言中除了main函数,其他函数不可作为单独文件形式存在 答案: 101选择题12 以下关于C语言的叙述中正确的是 A)C语言中的注释不可以夹在变量名或关键字的中间 B)C语言中的变量可以在使用之前的任何位置进行定义 C)在C语言算术表达式的书写中,运算符两侧的运算数类型必须一致 D)C语言的数值常量中夹带空格不影响常量值的正确表示 答案: 101选择题24 以下关于return语句的叙述中正确的是 A)一个自定义函数中必须有一条return语句 B)一个自定义函数中可以根据不同情况设置多条return语句 C)定义成void类型的函数中可以有带返回值的return语句 D)没有return语句的自定义函数在执行结束时不能返回到调用处 答案: 101选择题34 有以下程序 #include intfun() {staticintx=1; x*=2;returnx; } main() {inti,s=1, for(i=1;i<=2;i++)s=fun(); printf("%d\n",s); } 程序运行后的输出结果是 A)0 B)1 C)4 D)8 答案: 102选择题11 以下关于结构化程序设计的叙述中正确的是 A)一个结构化程序必须同时由顺序、分支、循环三种结构组成 B)结构化程序使用goto语句会很便捷 C)在C语言中,程序的模块化是利用函数实现的 D)由三种基本结构构成的程序只能解决小规模的问题 答案: 102选择题24 有以下程序 #include<stdio.h> intf(intx); main() {intn=1,m; m=f(f(f(n)));printf(”%d\n”,m); } intf(intx) {returnx*2;} 程序运行后的输出结果是 A)1 B)2 C)4 D)8 答案: 102选择题35 有以下程序 #include voidfun(intx) {if(x/2>1)fun(x/2); printf(”%d”,x); } main() {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 要点 习题 解答
![提示](https://static.bdocx.com/images/bang_tan.gif)