C语言程序设计课件第07章_第1页
C语言程序设计课件第07章_第2页
C语言程序设计课件第07章_第3页
C语言程序设计课件第07章_第4页
C语言程序设计课件第07章_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章函数本章学习目标重点掌握函数的定义与调用。理解函数参数的传递机制---传值调用和传址调用。理解变量存储类型的概念及各种存储类型变量的生存期和有效范围。了解函数的嵌套调用与递归调用。

重点理解、掌握数组作为函数参数。7.1函数的定义7.2函数的调用[Return]C语言程序是由函数组成的,函数是一个能独立完成一定功能的程序段。

C语言对函数的规定:(1)一个源程序文件由一个或多个函数组成。(2)一个c程序由一个或多个源程序文件组成。(3)c程序的执行从main函数开始到main()函数结束。(4)所有函数都是平行的,函数不能嵌套定义。(5)函数按使用角度分:标准函数、自定义函数,按形式分:无参函数、有参函数。7.1函数的定义1.函数调用的一般形式类型说明符函数名(形参类型形参名,形参类型形参名,…,形参类型形参名)

{声明部分

语句

return语句

}函数首部主要由三部分构成:

(1)

类型说明符为函数类型,取决于返回值的类型。

(2)

函数名的命名规则等同变量名的命名规则。

(3)

在函数定义中,小括弧中的参数称之为形参,定义时指明类型,形参与形参之间用逗号隔开。函数体主要由三部分构成:

(1)声明部分,定义一些变量,用以实现该函数的功能。

(2)若干语句,实现该函数的功能。

(3)return语句,带回一个返回值,返回值的类型与函数类型要一致。2.函数定义的一些表现形式

(1)无参函数的定义形式:

类型说明符函数名(){声明部分语句}

“类型说明符”为函数的类型,即函数返回值的类型,可以是整型、实型等类型;“函数名”的命名规则同变量名;“小括弧”是空的,没有任何参数;“大括弧”是函数体,实现该函数的功能。(2)有参函数的定义形式:

类型说明符函数名(形参列表)

{声明部分

语句

“小括弧”中是形参,可以有一个,也可以有多个。函数体中最后一个语句通常是return语句,其作用是带回一个返回值。(3)空函数:

类型说明符函数名()

{}

“小括弧”中是空的;“大括弧”中也是空的。此函数没有任何功能,只是占一个位置而已。这样做的好处是将来扩充新功能方便。[Return]1.函数调用的一般形式:函数名(实参列表);函数调用时,小括弧中的参数称之为实参。形式为:

实参1,实参2,……

7.2函数的调用7.2.1

函数调用的一般形式[Return]2.C程序的一般结构

形式一:函数类型函数名(形参列表)/*函数定义*/{函数体

return语句}main(){语句函数名(实参列表);/*函数调用*/

语句}形式二:

函数类型函数名(形参列表);/*函数说明*/main(){语句函数名(实参列表);/*函数调用*/

语句}函数类型函数名(形参列表)/*函数定义*/{函数体

return语句}函数声明语句的形式为:

函数类型函数名(形参列表);※注意:函数的书写位置可以是随意的,但是主调函数如果在被调函数前面出现,就像形式二,这时就要有函数声明语句。[Return]7.2.2

函数间的参数传递1.形式参数和实际参数函数的参数分为形参和实参两种,作用是实现数据传送。形参出现在函数定义中,只能在该函数体内使用。发生函数调用时,调用函数把实参的值复制1份,传送给被调用函数的形参,从而实现调用函数向被调用函数的数据传送。

函数间数据传递的过程:

(1)

函数调用时,主调函数中的实参,将值传递给被调函数的对应的形参。

(2)

被调函数对传入的值,按函数的设计要求对数据进行加工处理。

(3)

被调函数处理完成后,将处理结果通过return语句返回给主调函数。2.函数的返回值

(1)

函数的返回值是通过函数中的return语句获得的。return语句将被调用函数中的一个确定值带回主调函数中去。(2)

函数值的类型。既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。(3)

如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。(4)

如果被调函数中没有return语句,函数并不是不带回值,而是带回一个不确定的、用户可能不希望得到的函数值。(5)

为了明确表示“不带回值”,应该用“void”定义“无类型”(或称“空类型”)。

[Return]7.2.3

函数调用的方式

按函数在程序中出现的位置来分,可以有以下3种函数调用方式。(1)函数语句把函数调用作为一个语句。不要求函数带回值,只要求函数完成一定的操作。(2)函数表达式

函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。

例如:

z=5*max(x,y);

函数max是表达式的一部分,它的值乘5再赋给z。(3)函数参数函数调用作为一个函数的实参。例如:

m=max(x,max(y,z));

其中max(y,z)是一次函数调用,它的值作为max另一次调用的实参。m的值是x,y,z三者中最大者。又如:

printf(“%d”,max(x,y));

也是把max(x,y)作为printf函数的一个参数。[Return]7.2.4

函数的声明

如果使用用户自己定义的函数,而且该函数与调用它的函数在同一个文件中,一般应该在文件的开头或在主调函数中对被调函数的类型进行声明,这种类型声明的一般形式为:返回值的类型名函数名();C语言规定,在以下几种情况下可以不用在调用函数前对被调用函数作原型声明。(1)如果函数的值(函数的返回值)是整型或字符型,可以不必进行声明,系统对它们自动按整型声明。(2)如果被调用函数的定义出现在主调函数之前,可以不必加以声明,因为编译系统已经预先知道了已定义的函数,会自动处理的。(3)如果在所有函数定义之前,在文件的开头或在函数的外部已声明了函数原型,则在各个主调函数中不必对所调用的函数再作原型声明。[Return]7.2.5

函数的递归调用1.什么是递归调用

函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用它自身。C语言允许函数的递归调用。在递归调用中,调用函数又是被调用函数,执行递归函数将反复调用其自身。每调用一次就进入新的一层。为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。例如:

有函数f如下:

intf(intx);

{inty;

z=f(y);

returnz;

}

这个函数是一个递归调用。2.递归的方式

函数的递归调用有两种形式:直接递归调用和间接递归调用。如下图所示:

一个函数在它的函数体内调用它自身,称为直接递归调用。

若函数a的函数体内调用函数b,函数b的函数体内又调用函数a,这种递归调用称为间接递归调用。直接递归调用一般要满足以下两个条件:

(1)

有一已知项,即有初始值,它是递归结束的条件;

(2)

存在递归公式,即后一项能用前一项来表示,而且所有项的表示方法一致。

在C语言程序设计中提倡使用递归调用来实现复杂问题的求解。注意,递归不是“循环定义”,任何递归定义必须满足如下条件:(1)被定义项在定义中的应用具有更小的“尺度”,即需要求解的问题可以分解为一个相对简单的子问题。(2)被定义项在最小“尺度”上的定义不是递归的,即最终有一个子问题不是递归,必须有确定的值。[Return]7.2.6数组作为函数的参数

数组用作函数参数有两种形式:一种是把数组元素(又称下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。

[Return]1.数组元素作为函数参数

数组元素就是下标变量,它与普通变量并无区别。数组元素只能用作函数实参,其用法与普通变量完全相同:在发生函数调用时,把数组元素的值传送给形参,实现单向值传送。2.数组名作函数参数

数组名作函数参数时,既可以作形参,也可以作实参。

数组名

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论