工信版(中职)编程语言基础——C语言模块5教学课件.ppt
《工信版(中职)编程语言基础——C语言模块5教学课件.ppt》由会员分享,可在线阅读,更多相关《工信版(中职)编程语言基础——C语言模块5教学课件.ppt(86页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、YCF(中职)编程语言基础C语言模块5教学课件模块模块5函数函数任务任务1 函数概述函数概述任务任务2 函数的调用函数的调用任务任务3 函数的参数传递函数的参数传递任务任务4 函数的返回与返回值的传递函数的返回与返回值的传递任务任务5 用数组作为函数参数用数组作为函数参数任务任务6 字符串参数的传递字符串参数的传递任务任务7 变量的作用域和生存期变量的作用域和生存期任务任务1函数概述函数概述5.1.1 函数定义函数定义函数定义的一般形式为函数定义的一般形式为:(1)类型是函数的类型,也是该函数返回值的数据类型。类型是函数的类型,也是该函数返回值的数据类型。(2)函数名是标识符,可由用户指定。函
2、数名是标识符,可由用户指定。(3)参数表部分可有可无。参数表部分可有可无。(4)函数中由最外一层函数中由最外一层”括起的部分为函数体,包括变量括起的部分为函数体,包括变量说明和语句,其中变量说明可有可无,语句也可有可无。说明和语句,其中变量说明可有可无,语句也可有可无。下一页返回任务任务1函数概述函数概述【例例5-1】函数定义的一个实例。函数定义的一个实例。上一页返回下一页任务任务1函数概述函数概述5.1.2 函数的说明函数的说明在函数中调用某函数之前应对被调用函数进行说明,这与使在函数中调用某函数之前应对被调用函数进行说明,这与使用变量之前要先进行变量说明是一样的。在调用函数中对被用变量之前
3、要先进行变量说明是一样的。在调用函数中对被调用函数作说明的目的是使编译系统知道被调用函数返回值调用函数作说明的目的是使编译系统知道被调用函数返回值的类型,以便在调用函数中按此种类型对返回值作相应的处的类型,以便在调用函数中按此种类型对返回值作相应的处理。理。对被调用函数的说明也有两种格式,一种为传统方式,其一对被调用函数的说明也有两种格式,一种为传统方式,其一般格式为般格式为:类型说明符被调用函数名类型说明符被调用函数名();这种格式只给出函数返回值的类型,被调用函数名及一个空这种格式只给出函数返回值的类型,被调用函数名及一个空括号。由于在括号中没有任何参数信息,因此不便于编译系括号。由于在括
4、号中没有任何参数信息,因此不便于编译系统对错误进行检查,易发生错误。统对错误进行检查,易发生错误。上一页返回下一页任务任务1函数概述函数概述另一种为现代方式,其一般格式为另一种为现代方式,其一般格式为:类型说明符被调用函数名类型说明符被调用函数名(类型形参,类型形参类型形参,类型形参)或类型说或类型说明符被调用函数名明符被调用函数名(类型,类型类型,类型);现代格式的括号内给出了形参的类型和形参名,或只给出形现代格式的括号内给出了形参的类型和形参名,或只给出形参类型。这便于编译系统进行检错,以防止可能出现的错误。参类型。这便于编译系统进行检错,以防止可能出现的错误。C语言中规定在以下几种情况时
5、,可以省去调用函数中对被调语言中规定在以下几种情况时,可以省去调用函数中对被调用函数的说明。用函数的说明。(1)如果被调用函数的返回值是整型或字符型时,可以不对如果被调用函数的返回值是整型或字符型时,可以不对被调用函数作说明,而直接调用。这时系统将自动对被调用被调用函数作说明,而直接调用。这时系统将自动对被调用函数返回值按整型处理。函数返回值按整型处理。(2)当被调用函数的函数定义出现在调用函数之前时,在调当被调用函数的函数定义出现在调用函数之前时,在调用函数中也可以不对被调用函数作说明而直接调用。用函数中也可以不对被调用函数作说明而直接调用。上一页返回下一页任务任务1函数概述函数概述(3)如
6、在所有函数定义之前,在函数外预先说明了各个函数如在所有函数定义之前,在函数外预先说明了各个函数的类型,则在以后的各调用函数中,可不再对被调用函数作的类型,则在以后的各调用函数中,可不再对被调用函数作说明。例如说明。例如:上一页返回下一页任务任务1函数概述函数概述5.1.3 函数的介类函数的介类从用户的使用角度看,函数有两种从用户的使用角度看,函数有两种:标准函数标准函数(或库函数或库函数)和用和用户自定义函数。户自定义函数。1.标准函数标准函数(或库函数或库函数)库函数是系统已经编好的函数,一个库函数就能实现一个特库函数是系统已经编好的函数,一个库函数就能实现一个特定的功能。定的功能。C语言包
7、括了丰富的库函数,详细情况见附录。关语言包括了丰富的库函数,详细情况见附录。关于库函数有以下几点说明。于库函数有以下几点说明。调用标准库函数时要使用调用标准库函数时要使用include命令,例如命令,例如:#include 对于每一类库函数,附录中都列出了在调用该类库函数时,对于每一类库函数,附录中都列出了在调用该类库函数时,用户在源程序用户在源程序include命令中应该包含的头文件名。命令中应该包含的头文件名。上一页返回下一页任务任务1函数概述函数概述调用数学库函数时,要用到以下的命令调用数学库函数时,要用到以下的命令:调用字符调用字符(串串)函数时,要用到以下的命令函数时,要用到以下的命
8、令:2.用户自己定义的函数用户自己定义的函数这种函数由用户自己编写,主要用于执行特定的功能,缩写这种函数由用户自己编写,主要用于执行特定的功能,缩写用户自定义函数是使用用户自定义函数是使用C语言进行程序设计的重点。此外,从语言进行程序设计的重点。此外,从函数的形式来看,函数还可以分为无参函数和有参函数两种,函数的形式来看,函数还可以分为无参函数和有参函数两种,这两种函数的详细情况将在后面介绍。这两种函数的详细情况将在后面介绍。上一页返回任务任务2函数的调用函数的调用5.2.1 函数调用的方式函数调用的方式在在C语言中,可以用以下几种方式调用函数语言中,可以用以下几种方式调用函数:函数表达式函数
9、表达式:函数作为表达式中的一项出现在表达式中,以函函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值数返回值参与表达式的运算。这种方式要求函数是有返回值的。的。函数语句函数语句:函数调用的一般形式加上分号即构成函数语句。函数调用的一般形式加上分号即构成函数语句。函数实参函数实参:函数作为另一个函数调用的实际参数出现。这种情函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。必须是有返回值的。返回下一页任务任务2函数的调用函数的调用5.2.
10、2 函数的嵌套调用函数的嵌套调用C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是不存在上一级函数和下一级函数的问题。但是C语言允许在一语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其他函数。这与其他数的嵌套调用。即在被调函数中又调用其他函数。这与其他语言的子程序嵌套的情形是类似的。其关系可如语言的子程序嵌套的情形是类似的。其关系可如图图5-1所示。所示。图图5-1表示了两层嵌套的情形。其执行
11、过程是表示了两层嵌套的情形。其执行过程是:执行执行main函函数中调用数中调用a函数的语句时,即转去执行函数的语句时,即转去执行a函数,在函数,在a函数中调函数中调用用b函数时,又转去执行函数时,又转去执行b函数,函数,b函数执行完毕返回函数执行完毕返回a函数函数的断点继纯执行的断点继纯执行.a函数执行完毕返回函数执行完毕返回main函数的断点继纯函数的断点继纯执行。执行。上一页返回下一页任务任务2函数的调用函数的调用上一页返回下一页任务任务2函数的调用函数的调用用用图图5-2表示求函数值表示求函数值s的嵌套调用。的嵌套调用。上一页返回下一页任务任务2函数的调用函数的调用5.2.3 函数的递归
12、调用函数的递归调用一个函数在它的函数体内直接或间接调用它自身称为递归调一个函数在它的函数体内直接或间接调用它自身称为递归调用。这种函数称为递归函数。用。这种函数称为递归函数。c语言允许函数的递归调用。递语言允许函数的递归调用。递归调用有直接递归和间接递归两种。所谓直接递归是指函数归调用有直接递归和间接递归两种。所谓直接递归是指函数f直接调用自身,即主调函数也是被调函数。而间接递归是指直接调用自身,即主调函数也是被调函数。而间接递归是指函数函数f1通过另一个函数通过另一个函数f2去掉用去掉用f1。直接递归和间接递归调。直接递归和间接递归调用的示意图如用的示意图如图图5-3和和图图5-4所示。所示
13、。上一页返回下一页任务任务2函数的调用函数的调用例如,有函数例如,有函数f如下如下上一页返回下一页任务任务2函数的调用函数的调用【例例5-3】用递归法计算用递归法计算n!。用递归法计算用递归法计算n!可用下述公式表示可用下述公式表示:按公式可编程如下按公式可编程如下:上一页返回下一页任务任务2函数的调用函数的调用上述递归调用和回推赋值借助于堆栈形象地用上述递归调用和回推赋值借助于堆栈形象地用图图5-5表示。表示。上一页返回任务任务3函数的参数传递函数的参数传递5.1.3 参数的值传送方式参数的值传送方式上面已介绍,上面已介绍,c语言本身是采用传值方式传送参数的。在函数被调语言本身是采用传值方式
14、传送参数的。在函数被调用时,系统为每个形式参数变量分配存储单元,同时将对应的实用时,系统为每个形式参数变量分配存储单元,同时将对应的实际参数值存储在这些单元里。也就是说,这些单元中的初值就是际参数值存储在这些单元里。也就是说,这些单元中的初值就是对应实参的值,所以,被调用函数中的形参变量所接收的是实参对应实参的值,所以,被调用函数中的形参变量所接收的是实参的一个临时副本,而不是实参的地址。使用传值方式时,尽管函的一个临时副本,而不是实参的地址。使用传值方式时,尽管函数内形参变量的值在函数调用过程中发生变化,但它对应的实参数内形参变量的值在函数调用过程中发生变化,但它对应的实参变量的值却不受任何
15、影响,这是因为实参变量和形参变量所分配变量的值却不受任何影响,这是因为实参变量和形参变量所分配的存储单元是不同的。调用函数时,形参的值只是被复制到实参的存储单元是不同的。调用函数时,形参的值只是被复制到实参所占用的内存单元中,所以实参变量值的变化也就不会造成形参所占用的内存单元中,所以实参变量值的变化也就不会造成形参变量值的改变。所以,形参变量实际是一个局部变量,仅在定义变量值的改变。所以,形参变量实际是一个局部变量,仅在定义它的函数内有意义,一旦函数执行完毕,形参变量所占有存储单它的函数内有意义,一旦函数执行完毕,形参变量所占有存储单元中的值也不再保留。请看下面的例题。元中的值也不再保留。请
16、看下面的例题。上一页返回下一页任务任务3函数的参数传递函数的参数传递上一页返回下一页任务任务3函数的参数传递函数的参数传递5.3.2 参数的地址传送方式参数的地址传送方式经过上面的讨论可以知道,采用传值方式传送参数,不影响经过上面的讨论可以知道,采用传值方式传送参数,不影响实参变量的值,这对于某些问题来说是十分必要的。如果在实参变量的值,这对于某些问题来说是十分必要的。如果在调用函数时需要改变实参变量的值,则利用传值方式传送参调用函数时需要改变实参变量的值,则利用传值方式传送参数是难以达到改变实参变量的目的,请看下面的数据交换函数是难以达到改变实参变量的目的,请看下面的数据交换函数。数。上一页
17、返回下一页任务任务3函数的参数传递函数的参数传递【例例5-5】编写一个数据交换函数编写一个数据交换函数swap(a,b),并调用该,并调用该 函数将函数将x,y两个变量的值进行交换。两个变量的值进行交换。程序运行结果程序运行结果上一页返回下一页任务任务3函数的参数传递函数的参数传递从结果可知,变量从结果可知,变量x,y的值并没有被交换,还是与输入时相同。的值并没有被交换,还是与输入时相同。在调用函数在调用函数swap(x,y)时,只是将变量时,只是将变量x,y的值传给函数中的值传给函数中的参数变量的参数变量a,b,其实交换的只是形参变量,其实交换的只是形参变量a和和b,并没有将,并没有将x,y
18、的值进行交换。在这个例子中,语句的值进行交换。在这个例子中,语句”swap(x,Y)”;等价于下面的复合语句等价于下面的复合语句:上一页返回下一页任务任务3函数的参数传递函数的参数传递要达到要达到X,y值互换的目的,必须采取传址方式传送参数,此值互换的目的,必须采取传址方式传送参数,此种方式要求传送实际参数的地址而不是它的值。在这种情况种方式要求传送实际参数的地址而不是它的值。在这种情况下,形参必须是能接收地址的指针变量,实际参数为地址量,下,形参必须是能接收地址的指针变量,实际参数为地址量,因此,如果将上例中的函数因此,如果将上例中的函数swap()改写为改写为:上一页返回下一页任务任务3函
19、数的参数传递函数的参数传递而函数调用语句改写为而函数调用语句改写为运行程序,则结果成为运行程序,则结果成为:上一页返回下一页任务任务3函数的参数传递函数的参数传递由于由于Pa,Pb指针中分别存放了指针中分别存放了x,y的地址,所以的地址,所以*pa,*pb分分别代表别代表x,y,这就达到了,这就达到了x,y互换的目的,此时调用语句互换的目的,此时调用语句”swap(&x,&y)”;的执行等价于下面的复合语句的执行等价于下面的复合语句:上一页返回任务任务4函数的返回与返回值的传递函数的返回与返回值的传递5.4.1 无值返回无值返回为了明确函数不返回值,可用关键字为了明确函数不返回值,可用关键字v
20、oid定义函数。定义函数。例如例如在无返回值的函数定义中也可以使用在无返回值的函数定义中也可以使用return语句进行返回,语句进行返回,此时,此时,return语句中不带返回值。语句中不带返回值。返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递【例例5-6】定义一个函数,将三个不相等的整数按照它们的定义一个函数,将三个不相等的整数按照它们的值由大到小的顺序输出来。值由大到小的顺序输出来。上一页返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递上一页返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递上一页返回下一页任务任务4函数的返回与返
21、回值的传递函数的返回与返回值的传递5.4.2 使用使用return语句传递返回值语句传递返回值当实参将参数值传给形参后,即可执行该函数应的操作,函当实参将参数值传给形参后,即可执行该函数应的操作,函数的执行情况主要有以下两种。数的执行情况主要有以下两种。在函数中完成一些打印操作和信息显示输出等任务,不需要在函数中完成一些打印操作和信息显示输出等任务,不需要返回结果给主调函数,这类函数的类型为返回结果给主调函数,这类函数的类型为void。在执行相应的函数操作后,还要将函数运行结果返回给主调在执行相应的函数操作后,还要将函数运行结果返回给主调函数,主调函数使用返回值作进一步运算。这类函数带有返函数
22、,主调函数使用返回值作进一步运算。这类函数带有返回值。要使回值。要使1个函数返回个函数返回1个确定的值,就必须要用个确定的值,就必须要用return语句。语句。上一页返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递1.return语句的使用格式语句的使用格式在以前的例子中已经用到了在以前的例子中已经用到了return语句,语句,return语句的格语句的格式如下式如下:上一页返回下一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递2.使用说明使用说明对对return语句的用法作如下说明。语句的用法作如下说明。return语句中的语句中的“表达式表达式”的值就是函
23、数返回给主调函数的的值就是函数返回给主调函数的值。值。当程序执行到当程序执行到return语句时,立即退出函数的执行返回主调语句时,立即退出函数的执行返回主调函数。一个函数中可以函数。一个函数中可以 包含多个包含多个return语句,但是在语句,但是在1次次函数调用中只会有函数调用中只会有1个被执行。个被执行。return语句中也可以不包含表达式,其作用只是使流程返回语句中也可以不包含表达式,其作用只是使流程返回主调函数,这时并不返回确定的值。如果函数不需要返回值,主调函数,这时并不返回确定的值。如果函数不需要返回值,则可以在定义函数时使用则可以在定义函数时使用void类型。类型。上一页返回下
24、一页任务任务4函数的返回与返回值的传递函数的返回与返回值的传递函数要返回值必须具有函数要返回值必须具有1个确定的类型。例如个确定的类型。例如1个函数可以返个函数可以返回一个整型、实型或字符型的数值。这主要在函数定义时在回一个整型、实型或字符型的数值。这主要在函数定义时在通过类型标识符指定。通过类型标识符指定。函数的返回值必须与函数定义的函数的返回值必须与函数定义的“类型标识符类型标识符”一致或者兼一致或者兼容,若类型不一致,则以容,若类型不一致,则以函数的类型标识为准进行转换,返回函数的类型标识为准进行转换,返回1个与函数的类型标识符个与函数的类型标识符一致的值。建议尽量使其一致,避免系统的自
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工信版 编程 语言 基础 模块 教学 课件
限制150内