第六章函数课件.ppt





《第六章函数课件.ppt》由会员分享,可在线阅读,更多相关《第六章函数课件.ppt(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C语言程序设计语言程序设计1第六章第六章-函数函数C语言程序设计语言程序设计2函数的分类函数的分类 1. 从从函数定义函数定义的角度看,可分为库函数和用户定义函数两种。的角度看,可分为库函数和用户定义函数两种。(1) 库函数库函数 由系统提供,用户无须定义,由系统提供,用户无须定义, 也不必在程序中作类型说明,只需在程也不必在程序中作类型说明,只需在程序前包含有该函数原型的序前包含有该函数原型的头文件头文件即可调用。即可调用。 在前面各章中用到在前面各章中用到printf 、 scanf 等函数均属此类。等函数均属此类。 (2) 用户定义函数用户定义函数 由用户按需要写的函数。不仅要在程序中定
2、义函数本身,由用户按需要写的函数。不仅要在程序中定义函数本身, 而且在主调函而且在主调函数模块中还必须对该被调函数进行类型说明。数模块中还必须对该被调函数进行类型说明。C语言程序设计语言程序设计32. 语言的函数兼有其它语言中的语言的函数兼有其它语言中的函数和过程函数和过程两种功能,从两种功能,从这个角度看,函数分为以下两种。这个角度看,函数分为以下两种。(1) 有返回值函数有返回值函数 此类函数被调用执行完后将向调用者返回一个执行结果,此类函数被调用执行完后将向调用者返回一个执行结果, 称为函数称为函数返回值。由用户定义的这种要返回函数值的函数,必须在函数定义和函数返回值。由用户定义的这种要
3、返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型。说明中明确返回值的类型。(2) 无返回值函数无返回值函数 此类函数用于完成某项特定的处理任务,此类函数用于完成某项特定的处理任务, 执行完成后不向调用者返执行完成后不向调用者返回函数值。由于函数无须返回值,用户在定义此类函数时可指定它的返回回函数值。由于函数无须返回值,用户在定义此类函数时可指定它的返回为为“空类型空类型”, 空类型的说明符为空类型的说明符为“void”。函数的分类函数的分类C语言程序设计语言程序设计4 3. 从主调函数和被调函数之间从主调函数和被调函数之间数据传送数据传送的角度看又可分为无的角度看又可分为无参函数和
4、有参函数两种。参函数和有参函数两种。(1). 无参函数无参函数 函数定义、函数说明及函数调用中均不带参数。函数定义、函数说明及函数调用中均不带参数。 主调函数和被调函数主调函数和被调函数之间不进行参数传送。之间不进行参数传送。(2). 有参函数有参函数在函数定义及函数说明时都有参数,称为形式参数在函数定义及函数说明时都有参数,称为形式参数(简称为形参简称为形参)。在函数调。在函数调用时也必须给出参数,称为实际参数用时也必须给出参数,称为实际参数(简称为实参简称为实参)。 进行函数调用时,主调进行函数调用时,主调函数将把实参的值传送给形参,供被调函数使用。函数将把实参的值传送给形参,供被调函数使
5、用。函数的分类函数的分类C语言程序设计语言程序设计5说明:说明: 1、在语言中,所有的函数定义,包括主函数在语言中,所有的函数定义,包括主函数main在内,都是平行在内,都是平行的。也就是说,在一个函数的函数体内,的。也就是说,在一个函数的函数体内, 不能再定义另一个函数,不能再定义另一个函数, 即不即不能嵌套定义。能嵌套定义。 2、但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。为主调函数。 函数还可以自己函数还可以自己调用自己,称为递归调用。调用自己,称为递归调用。 3、一个源程序有一个或多个函数组成,但是只能
6、有且仅有一个主一个源程序有一个或多个函数组成,但是只能有且仅有一个主函数函数main。 4、main 函数是主函数,它可以调用其它函数,而不允许被其它函数函数是主函数,它可以调用其它函数,而不允许被其它函数调用。调用。 因此,程序的执行总是从因此,程序的执行总是从main函数开始,函数开始, 完成对其它函数的调完成对其它函数的调用后再返回到用后再返回到main函数,最后由函数,最后由main函数结束整个程序。函数结束整个程序。函数的分类函数的分类C语言程序设计语言程序设计6函数定义函数定义1.无参函数的定义形式无参函数的定义形式 类型说明符类型说明符 函数名函数名() 声明部分声明部分 语句语
7、句 类型说明符和函数名称为类型说明符和函数名称为函数头函数头。 类型说明符指明了本函数的类型,类型说明符指明了本函数的类型,实际上就是函数返回值的类型。实际上就是函数返回值的类型。 中的内容称为中的内容称为函数体函数体。 在函数体中也有类型说明,在函数体中也有类型说明, 这是对函数体这是对函数体内部所用到的变量的类型说明。内部所用到的变量的类型说明。 C语言程序设计语言程序设计72.有参函数定义的一般形式有参函数定义的一般形式 类型说明符类型说明符 函数名函数名(形式参数类型说明形式参数类型说明 形式参数形式参数 .) 声明部分声明部分 语句语句 有参函数比无参函数多两点,其一是有参函数比无参
8、函数多两点,其一是形式参数类型说明形式参数类型说明,其二,其二是是形式参数形式参数, 它们可以是各种类型的变量,它们可以是各种类型的变量, 在进行函数调用时,在进行函数调用时,主调函数将赋予这些形式参数实际的值。主调函数将赋予这些形式参数实际的值。函数定义函数定义C语言程序设计语言程序设计83.空函数空函数 类型说明符类型说明符 函数名函数名( ) 调用此函数时,不执行任何工作。其作用是用于函数的扩充。调用此函数时,不执行任何工作。其作用是用于函数的扩充。4.对形参声明的传统方式对形参声明的传统方式 类型说明符类型说明符 函数名函数名(形式参数形式参数 .) 形式参数类型说明形式参数类型说明
9、声明部分声明部分 语句语句 函数定义函数定义C语言程序设计语言程序设计9函数的参数函数的参数 1. 形参出现在函数定义中形参出现在函数定义中,在整个函数体内都可以使用,函数未被调用,在整个函数体内都可以使用,函数未被调用时,系统不给它分配存储空间,当函数被调用时系统才给分配储存空间,时,系统不给它分配存储空间,当函数被调用时系统才给分配储存空间,用来接受从主调函数传递过来的数据,当该函数调用结束后,则立即释放用来接受从主调函数传递过来的数据,当该函数调用结束后,则立即释放其储存空间。其储存空间。 2. 实参出现在主调函数中实参出现在主调函数中,即调用时写入函数括号中的参数,要求有确,即调用时写
10、入函数括号中的参数,要求有确定的值。调用时将实参数据传递给对应的形参,进入被调函数后,实参变定的值。调用时将实参数据传递给对应的形参,进入被调函数后,实参变量不能使用。量不能使用。 3. 形参与实参的的关系:形参和实参的功能是作数据传递。发生函数调形参与实参的的关系:形参和实参的功能是作数据传递。发生函数调用时(形、实结合)用时(形、实结合), 主调函数把实参的值传送给被调函数的形参从而实主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。现主调函数向被调函数的数据传送。C语言程序设计语言程序设计10说明说明:函数的形参和实参具有以下特点函数的形参和实参具有以下特点 1
11、. 形参变量只有在被调用时才分配内存单元,调用结束时释放所形参变量只有在被调用时才分配内存单元,调用结束时释放所分配的内存单元。因此,形参只有在函数内部有效。分配的内存单元。因此,形参只有在函数内部有效。 2.实参可以是常量、变量、表达式、函数等。但是它们都必须是实参可以是常量、变量、表达式、函数等。但是它们都必须是有确定的值。有确定的值。 3. 实参和形参在数量上,类型上,顺序上应严格一致。实参和形参在数量上,类型上,顺序上应严格一致。 4. 函数调用中发生的数据传送是单向的。因此在函数调用过程中,函数调用中发生的数据传送是单向的。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化
12、。形参的值发生改变,而实参中的值不会变化。 C语言程序设计语言程序设计11函数的返回值函数的返回值函数的值是指通过函数调用使主调函数得到一个确定的值。函数的值是指通过函数调用使主调函数得到一个确定的值。 1. return语句返回函数的值。语句返回函数的值。 return 语句使用的一语句使用的一 般形式:般形式: return 表达式;表达式; 或或 return (表达式表达式); 在函数中允许有多个在函数中允许有多个return语句,但每次调用只能有一个语句,但每次调用只能有一个return 语句被执行,语句被执行, 因此只能返回一个函数值。因此只能返回一个函数值。C语言程序设计语言程序
13、设计12 2. 函数值的类型和函数定义中函数的类型应保持一致。函数值的类型和函数定义中函数的类型应保持一致。 如果两者不一致,则以函数类型为准,自动进行类型转换。如果两者不一致,则以函数类型为准,自动进行类型转换。3. 如函数值为整型,在函数定义时可以省去类型说明。如函数值为整型,在函数定义时可以省去类型说明。4. 不返回函数值的函数,可以明确定义为不返回函数值的函数,可以明确定义为“空类型空类型”, 类型说明符为类型说明符为“void”。函数的返回值函数的返回值C语言程序设计语言程序设计13函数的调用函数的调用函数调用的一般形式函数调用的一般形式 函数名函数名(实际参数表实际参数表) 实参的
14、类型,个数,顺序都应与形参一致。实参的类型,个数,顺序都应与形参一致。1. 函数表达式函数表达式 函数作为表达式中的一项出现在表达式中,以函数返回值函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。参与表达式的运算。这种方式要求函数是有返回值的。这种方式要求函数是有返回值的。 例如:例如: z=max(x,y) 是一个赋值表达式,把是一个赋值表达式,把max的返回值赋予变量的返回值赋予变量z。C语言程序设计语言程序设计142.函数语句函数语句 函数调用的一般形式加上分号即构成函数语句,即:函数调用的一般形式加上分号即构成函数语句,即: 函数名函数名(实际参数表实际参数表);例
15、如:例如: printf (%d,a); 3.函数实参函数实参 函数作为另一个函数调用的实际参数出现。函数作为另一个函数调用的实际参数出现。把该函数的把该函数的返回值作为实参进行传送,要求该函数必须是有返回值的。返回值作为实参进行传送,要求该函数必须是有返回值的。 例如:例如: printf(%d,max(x,y); 即是把即是把max调用的返回调用的返回值又作为值又作为printf函数的实参来使用的。函数的实参来使用的。函数的调用函数的调用C语言程序设计语言程序设计15函数的嵌套调用函数的嵌套调用 语言中不允许作嵌套的函数定义。但是语言允许在语言中不允许作嵌套的函数定义。但是语言允许在一个函
16、数的定义中出现对另一个函数的调用。一个函数的定义中出现对另一个函数的调用。 这样就出现了这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。函数的嵌套调用。即在被调函数中又调用其它函数。main()fa();.fb();fa().fb();.fb(); . C语言程序设计语言程序设计16函数的递归调用函数的递归调用一个函数在它的函数体内直接或间接调用它自身称为一个函数在它的函数体内直接或间接调用它自身称为递归调用递归调用一个问题的递归可以分为一个问题的递归可以分为“回推回推”和和“递推递推”两个阶段。两个阶段。构成递归的条件:构成递归的条件: 递归结束条件及结束时的值;递归结束条件及结束
17、时的值; 能用递归形式表示,并且递归向终止条件发展。能用递归形式表示,并且递归向终止条件发展。C语言程序设计语言程序设计17下面举例说明递归调用的执行过程。下面举例说明递归调用的执行过程。 例:用递归法计算例:用递归法计算n!用递归法计算用递归法计算n!可用下述公式表示:可用下述公式表示: n!=1 (n=0,1) n(n-1)! (n1) 按公式可编程如下:按公式可编程如下:long ff(int n) long f; if(n0) printf(n0,input error); else if(n=0|n=1) f=1; else f=ff(n-1)*n; return(f);main()
18、 int n; long y; printf(input n= :n); scanf(%d,&n); y=ff(n); printf(%d!=%ld,n,y); C语言程序设计语言程序设计18数组作为函数参数数组作为函数参数一、数组元素作函数实参数一、数组元素作函数实参数数组元素作为函数的实参与普通变量作实参数并无区别。数组元素作为函数的实参与普通变量作实参数并无区别。 在发生函数调用时,在发生函数调用时, 把作为实参的数组元素的值传送给把作为实参的数组元素的值传送给形参,实现单向的值传送。形参,实现单向的值传送。C语言程序设计语言程序设计19数组作为函数参数数组作为函数参数二、数组名作为函数
19、参数二、数组名作为函数参数 用数组名作函数参数时,用数组名作函数参数时, 则要求形参和相对应的实参都则要求形参和相对应的实参都必须是类型相同的数组(或指针变量)。必须是类型相同的数组(或指针变量)。 数组名代表数组的首地址。因此在数组名代表数组的首地址。因此在数组名作函数参数时所进行数组名作函数参数时所进行的传送只是地址的传送的传送只是地址的传送, 把实参数组的首地址赋予形参数组名。把实参数组的首地址赋予形参数组名。形参数组名取得该首地址,也就等于有了实在的数组。形参数组名取得该首地址,也就等于有了实在的数组。实际上实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。是形参数组和实参数
20、组为同一数组,共同拥有一段内存空间。 数据传递的双向的。数据传递的双向的。C语言程序设计语言程序设计20数组作为函数参数数组作为函数参数例例 写一用选择法排序的函数,写一用选择法排序的函数,调用该函数排序。调用该函数排序。/*选择法排序函数选择法排序函数*/void sort(int a ,int n) int i,j,s,p; for(i=0;in-1;i+) p=i; for(j=i+1;jn;j+) if(apaj) p=j; if(i!=p) s=ai; ai=ap; ap=s; /*主函数调用排序函数:主函数调用排序函数:*/void sort(int a ,int n); main
21、() int i,j,p,a10; for(i=0;i10;i+) scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d , ai); C语言程序设计语言程序设计21变量的作用域变量的作用域概念:概念:变量的有效性范围称变量的作用域。变量的有效性范围称变量的作用域。 语言中的变量,按作用域范围可分为语言中的变量,按作用域范围可分为局部变量局部变量和和全局变量全局变量。一、局部变量一、局部变量(也称为内部变量也称为内部变量) 局部变量是在函数内作定义说明的。局部变量是在函数内作定义说明的。包括一个函数的形参和内部定义的变量。其作用域仅限于函数内
22、。包括一个函数的形参和内部定义的变量。其作用域仅限于函数内。C语言程序设计语言程序设计22变量的作用域变量的作用域关于局部变量的作用域还要说明以下几点:关于局部变量的作用域还要说明以下几点: 1. 主函数中定义的变量也只能在主函数中使用,不能在其它函主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。因为主函数也是一个函数,它与其它函数是平行关系。数中使用。因为主函数也是一个函数,它与其它函数是平行关系。 2. 形参变量是属于被调函数的局部变量,实参变量是属于主调形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。函数的局部变量。 3. 允许在不同的函数中使用相同的变
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六 函数 课件

限制150内