第6章要点与习题解答Word文档格式.docx
- 文档编号:22727645
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:42
- 大小:59.94KB
第6章要点与习题解答Word文档格式.docx
《第6章要点与习题解答Word文档格式.docx》由会员分享,可在线阅读,更多相关《第6章要点与习题解答Word文档格式.docx(42页珍藏版)》请在冰豆网上搜索。
/*函数调用*/
m=max(m,c);
printf("
m=%f\n"
m);
/*输出三个数的最大值*/
3.函数声明
类型标识符函数名(类型形参名,类型形参名,……);
或
类型标识符函数名(类型,类型,……);
例如:
floatmax(floatx,floaty);
或
floatmax(float,float);
当函数定义在主调函数之前,即先定义后使用,这样在调用函数时,就已经有了被调函数的全部信息,函数声明可以省略。
如前面的例子。
例6.2对被调函数声明的例子。
/*求两数之和的程序*/
#include<
{floatadd(floatx,floaty);
/*函数声明*/
floata,b,c;
%f,%f"
b);
c=add(a,b);
/*函数调用*/
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,求组合数
{intn,m;
longcmn(int,int);
Pleaseinputm&
n:
\n"
);
%d%d"
m,&
n);
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)));
95↙
cmn=126
程序说明:
程序中分别定义了求阶乘的函数jc和计算组合数的函数cmn。
当main函数调用cmn函数后,由cmn函数调用jc函数。
三、函数的递归调用
当一个函数直接或间接的调用它自身时,称为函数的递归调用。
下面举例说明。
例6.4用递归计算n!
。
分析:
n!
的递归定义式:
longjc(intn)/*定义jc函数求n!
*/
{longf;
if(n==1||n==0)f=1;
elsef=n*jc(n-1);
/*递归调用,求(n-1)!
returnf;
{longy;
intn;
scanf(“%d”,&
y=jc(n);
/*调用jc函数,求n!
%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函数中有效*/
......
{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;
{intm,n;
六、静态变量
主要掌握静态局部变量。
1.静态局部变量
例6.5考察静态局部变量的值。
intfunc(inta)
{intb=0;
staticintc=1;
/*定义静态局部变量*/
b=b+1;
c=c+1;
return(a+b+c);
{inta=2,i;
for(i=0;
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答案
C
C语言对main函数和其他函数的排放顺序没有要求,程序总是从main函数开始执行,选项A和D是错的;
不能在一个函数的内部再定义一个函数,所以B是错的。
B
函数可以没有参数,所以选项A是错的。
选项C是错的,如果函数f有返回值,则可以用f(f(x))形式调用,但不是递归调用。
递归调用是指在定义一个函数时调用它自己。
函数可以没有返回值,选项D是错的。
D
语句return(a,b);
只能返回一个值b,(a,b)是逗号表达式。
C语言规定,在定义函数时省略函数返回值类型说明符,默认为int类型。
A
在max函数中只有两个实参:
一个是逗号表达式(a,b),另一个是函数max((c,d),e)。
可以在函数的复合语句中定义变量,这些变量只在本复合语句中有效。
主函数(或main函数)
声明
补充题
081选择题34
有以下程序
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
intfun(inta,intb)
{if(b==0)returna;
elsereturn(fun(--a,--b));
{printf("
fun(4,2));
A)1B)2C)3D)4
082选择题32
voidfun(inta,intb)
{intt;
t=a;
a=b;
b=t;
{intc[10]={1,2,3,4,5,6,7,8,9,0},i;
10;
i+=2)fun(c[i],c[i+1]);
%d,"
c[i]);
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
voidfun(inta[],intn)
{inti,t;
n/2;
i++){t=a[i];
a[i]=a[n-1-i];
a[n-1-i]=t;
}
{intk[10]={1,2,3,4,5,6,7,8,9,10},i;
fun(k,5);
for(i=2;
8;
%d"
k[i]);
A)345678B)876543C)1098765D)321678
082选择题35
#defineN4
voidfun(inta[][N],intb[])
N;
i++)b[i]=a[i][i];
main()
{intx[][N]={{1,2,3},{4},{5,6,7,8},{9,10}},y[N],i;
fun(x,y);
y[i]);
A)1,2,3,4,B)1,0,7,0,C)1,4,5,9,D)3,4,8,10,
091选择题24
intf(intx,inty)
{return((y-x)*x);
{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
intfun(intx,inty)
{if(x==y)return(x);
elsereturn((x+y)/2);
{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
voidfun{intp}
{intd=2;
p=d++;
printf(“%d”,p);
{inta=1;
fun(a);
printf(“%d\n”,a);
A)32B)12C)21D)22
092选择题25
以下函数findmax拟实现在数组中查找最大值并作为函数值返回,但程序中有错导致不能实现预定功能。
#defineMIN-2147483647
intfindmax{intx[],intn}
{inti,max;
n;
i++)
{max=MIN;
if(max<
x)max=x;
returnmax;
造成错误的原因是
A)定义语句inti,max;
max未赋初值
B)赋值语句max=MIN;
中,不应给max赋MIN值
C)语句if(max<
x)max=x;
中判断条件设置错误
D)赋值语句max=MIN;
放错了位置
092选择题34
intf(intn);
{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;
=2;
i++)s=fun();
printf("
s);
}
程序运行后的输出结果是
A)0
B)1
C)4
D)8
102选择题11
以下关于结构化程序设计的叙述中正确的是
A)一个结构化程序必须同时由顺序、分支、循环三种结构组成
B)结构化程序使用goto语句会很便捷
C)在C语言中,程序的模块化是利用函数实现的
D)由三种基本结构构成的程序只能解决小规模的问题
102选择题24
#include<stdio.h>
intf(intx);
{intn=1,m;
m=f(f(f(n)));
printf(”%d\n”,m);
intf(intx)
{returnx*2;
}
A)1
B)2
D)8
102选择题35
#include<
voidfun(intx)
{if(x/2>1)fun(x/2);
printf(”%d”,x);
}
main()
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 要点 习题 解答