《c语言程序设计教学资料》第7章-函数.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《《c语言程序设计教学资料》第7章-函数.ppt》由会员分享,可在线阅读,更多相关《《c语言程序设计教学资料》第7章-函数.ppt(120页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第7 7章章 函数函数主要内容主要内容 模块化程序设计模块化程序设计 函数的定义函数的定义 向函数传递值和从函数返回值向函数传递值和从函数返回值 函数的调用函数的调用 函数的作用域和存储类别函数的作用域和存储类别 为什么要用函数为什么要用函数?问题:问题:p 如如果果程程序序的的功功能能比比较较多多,规规模模比比较较大大,把把所所有有代代码码都都写写在在main函函数数中中,就就会会使使主主函函数数变变得得庞庞杂杂、头头绪绪不不清清,阅阅读读和和维护变得困难维护变得困难p 有有时时程程序序中中要要多多次次实实现现某某一一功功能能,就就需需要要多多次次重重复复编编写写实现此功能的程序代码实现此
2、功能的程序代码,这使程序冗长,不精炼这使程序冗长,不精炼p 在设计一个较大的程序时,往往把它分为若干个程序模块,在设计一个较大的程序时,往往把它分为若干个程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定的每一个模块包括一个或多个函数,每个函数实现一个特定的功能功能p 采用采用“分而治之分而治之”的办法简化程序设计的过程的办法简化程序设计的过程p C程序可由一个主函数和若干个其他函数构成程序可由一个主函数和若干个其他函数构成p 事先编好一批实现各种不同功能的函数事先编好一批实现各种不同功能的函数p 主函数调用其主函数调用其它它函数,其函数,其它它函数也可以互相调用函数也可以互相调用p
3、 同一个函数可以被一个或多个函数调用任意多次同一个函数可以被一个或多个函数调用任意多次用用模块化程序设计模块化程序设计mainabcfghdeie 功能分解功能分解-自顶而下、逐步求精的过程自顶而下、逐步求精的过程 模块化分解原则模块化分解原则-保证模块的相对独立性保证模块的相对独立性 高聚合高聚合(模块的功能独立、单一模块的功能独立、单一)、低耦合、低耦合(模块对外接口简单模块对外接口简单)设计好模块接口设计好模块接口-接口是指罗列出一个模块的所有与外部打交道的变量接口是指罗列出一个模块的所有与外部打交道的变量 -定义好后不要轻易改动定义好后不要轻易改动-在模块开头(文件的开头)进行函数声明
4、在模块开头(文件的开头)进行函数声明模块化程序设计方法模块化程序设计方法*How do you do!How do you do!*例例:输出以下的结果,用函数调用实现。输出以下的结果,用函数调用实现。在在输输出出的的文文字字上上下下分分别别有有一一行行“*”号号,显显然然不不必必重重复复写写这这段段代代码码,用用一一个个函函数数printstar来来实实现现输输出一行出一行“*”号的功能号的功能 再再写写一一个个print_message函函数数来来输输出出中中间间一一行行文文字信息字信息 用主函数分别调用这两个函数用主函数分别调用这两个函数解题思路:解题思路:例:例:函数调用的简单例子函数
5、调用的简单例子#include void main()void printstar();/*对对printstar函数声明函数声明*/void print_message();/*对对print_message函数声明函数声明*/printstar();/*调用调用printstar函数函数*/print_message();/*调用调用print_message函数函数*/printstar();/*调用调用printstar函数函数*/void printstar()/*定义定义printstar函数函数*/printf(*n);void print_message()/*定义定义prin
6、t_message函数函数*/printf(How do you do!n);运行情况如下:运行情况如下:*How do you do!How do you do!*(1)(1)一一个个C程程序序由由一一个个或或多多个个程程序序模模块块组组成成,每每一一个个程程序序模模块块作作为为一一个个源源程程序序文文件件。对对较较大大的的程程序序,一一般般不不希希望望把把所所有有内内容容全全放放在在一一个个文文件件中中,而而是是将将它它们们分分别别放放在在若若干干个个源源文文件件中中,由由若若干干个个源源程程序序文文件件组组成成一一个个C程程序序。这这样样便便于于分分别别编编写写、分分别别编编译译,提提高
7、高调调试试效率。一个源程序文件可以为多个效率。一个源程序文件可以为多个C程序共用。程序共用。说明:说明:(2)(2)一一个个源源程程序序文文件件由由一一个个或或多多个个函函数数以以及及其其他他有有关关内内容容(如如命命令令行行、数数据据定定义义等等)组组成成。一一个个源源程程序序文文件件是是一一个个编编译译单单位位,在在程程序序编编译译时时是是以以源源程程序序文文件件为为单单位位进进行行编编译译的的,而而不不是是以以函函数数为为单单位位进进行行编编译的。译的。(3)(3)C程程序序的的执执行行是是从从main函函数数开开始始的的,如如果果在在main函函数数中中调调用用其其他他函函数数,在在调
8、调用用后后流流程程返返回回到到main函数,在函数,在main函数中结束整个程序的运行。函数中结束整个程序的运行。(4)(4)所所有有函函数数都都是是平平行行的的,即即在在定定义义函函数数时时是是分分别别进进行行的的,是是互互相相独独立立的的。一一个个函函数数并并不不从从属属于于另另一一函函数数,即即函函数数不不能能嵌嵌套套定定义义。函函数数间间可可以以互互相相调调用用,但不能调用但不能调用main函数。函数。main函数是系统调用的。函数是系统调用的。(5)(5)从用户使用的角度看,函数有两种:从用户使用的角度看,函数有两种:标标准准函函数数,即即库库函函数数。这这是是由由系系统统提提供供的
9、的,用用户户不不必必自自己己定定义义这这些些函函数数,可可以以直直接接使使用用它它们们。不不同同的的C C系系统统提提供供的的库库函函数数的的数数量量和和功功能能会会有有一一些些不不同同,但但许许多多基本的函数是共同的。基本的函数是共同的。用户自己定义的函数用户自己定义的函数。用以解决用户的专门需要。用以解决用户的专门需要。(6)(6)从函数的形式看,函数分两类:从函数的形式看,函数分两类:无无参参函函数数。无无参参函函数数一一般般用用来来执执行行指指定定的的一一组组操操作作。在在调调用用无无参参函函数数时时,主主调调函函数数不不向向被被调调用用函函数数传传递递数据。数据。有有参参函函数数。主
10、主调调函函数数在在调调用用被被调调用用函函数数时时,通通过过参参数向被调用函数传递数据。数向被调用函数传递数据。怎样定义函数怎样定义函数?为什么要定义函数为什么要定义函数定义函数的方法定义函数的方法p C语言要求,在程序中用到的所有函数,必须语言要求,在程序中用到的所有函数,必须“先定义,后使用先定义,后使用”p 指定指定函数函数名字名字、函数、函数返回值类型返回值类型、函数实现的、函数实现的功能功能以及以及参数的个数与类型参数的个数与类型,将这些信息通知编,将这些信息通知编译系统。译系统。p 指定函数的名字,以便以后按名调用指定函数的名字,以便以后按名调用p 指定函数类型,即函数返回值的类型
11、指定函数类型,即函数返回值的类型p 指定函数参数的名字和类型,以便在调用函数时向它指定函数参数的名字和类型,以便在调用函数时向它们传递数据们传递数据p 指定函数的功能。这是最重要的,这是在函数体中解指定函数的功能。这是最重要的,这是在函数体中解决的决的p 对对于于库库函函数数,程程序序设设计计者者只只需需用用#include指指令令把把有关的头文件包含到本文件模块中即可有关的头文件包含到本文件模块中即可p 程程序序设设计计者者需需要要在在程程序序中中自自己己定定义义想想用用的的而而库库函函数并没有提供的函数数并没有提供的函数 函数定义的一般形式函数定义的一般形式 (1 1)无参函数的定义一般形
12、式)无参函数的定义一般形式(2 2)有参函数定义的一般形式)有参函数定义的一般形式(3 3)空函数)空函数 函数定义的一般形式函数定义的一般形式 (1 1)无参函数的定义一般形式)无参函数的定义一般形式 类型类型函数名函数名()()声明部分声明部分 语句部分语句部分 类类型型标标识识符符指指明明函函数数类类型型,函函数数的的类类型型实实际际上上是是函函数数返返回回值值的的类类型型。函函数数名名后后面面有有一一个个空空括括号号,其其中中无无参参数,但是括号不能少。数,但是括号不能少。类型类型函数名函数名(voidvoid)声明部分声明部分 语句部分语句部分 例如:例如:void hello()p
13、rintf(“hello world!n”);(2 2)有参函数定义的一般形式)有参函数定义的一般形式 类型类型函数名函数名(类型类型 形式参数形式参数1 1,类型,类型 形式参数形式参数2 2,)声明部分声明部分 语句部分语句部分 有有参参函函数数比比无无参参函函数数多多了了形形式式参参数数列列表表,它它们们可可以以是是各各种种类类型型的的变变量量,个个参参数数之之间间用用逗逗号号间间隔隔。进进行行函函数数调调用用时时,主主调调函函数数将将赋赋予予这这些些形形式式参参数数实实际际的的值值,形形参是变量,参是变量,必须在形参表中给出形参的类型说明必须在形参表中给出形参的类型说明例如:例如:in
14、t max(int x,int y)int z;/*函数体中的声明部分函数体中的声明部分*/z=xy?x:y;return(z);(3)(3)空函数空函数 类型类型函数名函数名(形参列表)(形参列表)例如:例如:Dummy(形参列表形参列表)先用空函数占一个位置,以后先用空函数占一个位置,以后逐步逐步扩充扩充 好好处处:程程序序结结构构清清楚楚,可可读读性性好好,以以后后扩扩充充新新功功能方便,对程序结构影响不大能方便,对程序结构影响不大调用函数调用函数函数的调用形式函数的调用形式函数调用时的数据传递函数调用时的数据传递函数调用的过程函数调用的过程函数的返回值函数的返回值函数调用的形式函数调用
15、的形式p 函数调用的一般形式为:函数调用的一般形式为:函数名(实参表列)函数名(实参表列)p 如果是调用无参函数,则如果是调用无参函数,则“实参表列实参表列”可以没有,可以没有,但括号不能省略但括号不能省略p 如果实参表列包含多个实参,则各参数间用逗号如果实参表列包含多个实参,则各参数间用逗号隔开隔开。按按函函数数调调用用在在程程序序中中出出现现的的形形式式来来分分,可可以以有有以以下下3 3种函数调用方式种函数调用方式:(1 1)函数调用语句函数调用语句 把函数调用单独作为一个语句把函数调用单独作为一个语句 如如:printfstar()();这这时时不不要要求求函函数数带带回回值值,只只要
16、要求求函函数数完完成成一一定定的的操操作作(2 2)函数表达式函数表达式 函数调用出现在另一个表达式中函数调用出现在另一个表达式中 如如:c=2*max(a,b);这时要求函数带回一个确定的值以参加表达式的运算这时要求函数带回一个确定的值以参加表达式的运算(3 3)函数参数函数参数 函数调用作为另一函数调用时的实参函数调用作为另一函数调用时的实参 如如:mmax(a,max(b,c);其其中中max(b,c)是是一一次次函函数数调调用用,它它的的值值作作为为max另另一一次调用的实参次调用的实参p 函数参数:用于函数间数据的传递函数参数:用于函数间数据的传递 形式参数(形参):定义函数时给出的
17、参数形式参数(形参):定义函数时给出的参数 实际参数(实参):调用函数时给出的参数实际参数(实参):调用函数时给出的参数p 实参与形参的个数应相等,类型应匹配。实参与实参与形参的个数应相等,类型应匹配。实参与形参按顺序对应,一一传递数据。形参按顺序对应,一一传递数据。p 如果实参列表包括多个实参,对实参求值的顺序如果实参列表包括多个实参,对实参求值的顺序并不是确定的,有的系统按自左至右顺序求实参的并不是确定的,有的系统按自左至右顺序求实参的值,有的系统则按自右至左顺序。值,有的系统则按自右至左顺序。说明:说明:例例 :实参求值的顺序实参求值的顺序如果按自左至右顺序求实如果按自左至右顺序求实参的
18、值,则函数调用相当参的值,则函数调用相当于于f f(2,32,3)如果按自右至左顺序求实如果按自右至左顺序求实参的值,则函数调用相当参的值,则函数调用相当于于f f(3,33,3)函数调用时的数据传递函数调用时的数据传递p 形式参数:形式参数:函数名后面括号中的变量名称为函数名后面括号中的变量名称为“形形式参数式参数”(简称(简称“形参形参”)。)。p 实际参数:实际参数:主调函数中调用一个函数时,函数名主调函数中调用一个函数时,函数名后面括号中的参数后面括号中的参数(可以是一个表达式可以是一个表达式)称为称为“实际实际参数参数”(简称(简称“实参实参”)。)。p 实参和形参间的数据传递实参和
19、形参间的数据传递p 在调用函数过程中,系统会把实参的值传递给被在调用函数过程中,系统会把实参的值传递给被调用函数的形参调用函数的形参p 该值在函数调用期间有效,可以参加该值在函数调用期间有效,可以参加被调被调函数中函数中的运算的运算p用用return语句返回计算结果语句返回计算结果,通过函数调用使主调通过函数调用使主调函数得到的确定值。函数得到的确定值。例例:调用函数时的数据传递调用函数时的数据传递运行情况如下:运行情况如下:,max is 通过函数调用,可使两个函数中的数据发生联系。通过函数调用,可使两个函数中的数据发生联系。函数调用的过程函数调用的过程p 在定义函数中指定的形参,在未出现函
20、数调用时,在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。在发生函数调用时,它们并不占内存中的存储单元。在发生函数调用时,函数函数maxmax的形参被临时分配内存单元。的形参被临时分配内存单元。p 调用结束,形参单元被释放调用结束,形参单元被释放p 实参单元仍保留并维持原值,没有改变实参单元仍保留并维持原值,没有改变p 如果在执行一个被调用函数时,形参的值发生改如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值变,不会改变主调函数的实参的值关于形参与实参的说明:关于形参与实参的说明:(1 1)在定义函数中指定的形参,在未出现函数调用在定义函数中指定
21、的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数时,它们并不占内存中的存储单元。只有在发生函数调用时,函数调用时,函数max中的形参才被分配内存单元。在调中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。用结束后,形参所占的内存单元也被释放。(2 2)实参可以是常量、变量或表达式,实参可以是常量、变量或表达式,例如:例如:max(3,a+b);但要求它们有确定的值。在调用时将实参的值赋给但要求它们有确定的值。在调用时将实参的值赋给形参。形参。(3 3)在被定义的函数中,必须指定形参的类型。)在被定义的函数中,必须指定形参的类型。(4 4)实参与形参的类型
22、应相同或赋值兼容。)实参与形参的类型应相同或赋值兼容。(5 5)值传递)值传递:实参向形参的数据传递是单向实参向形参的数据传递是单向“值传递值传递”,只能由实参传给形参,而不能由形参传回来给实,只能由实参传给形参,而不能由形参传回来给实参。参。在调用函数时,给形参分配存储单元,并将实参对在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。实参单元仍保留并维持原值。函数的返回值说明:函数的返回值说明:(1 1)函数的)函数的返回值是通过函数中的返回值是通过函数中的return语句获得的语
23、句获得的。一个函数中可以有一个以上的一个函数中可以有一个以上的return语句,执行到哪语句,执行到哪一个一个return语句,哪一个语句起作用。语句,哪一个语句起作用。return语句后面的括弧也可以不要语句后面的括弧也可以不要 例如:例如:“return z;”等价于等价于“return(z);”return后面的值可以是一个表达式。后面的值可以是一个表达式。例如例如:max(int x,int y)return(?:););(2 2)函数的)函数的返回值应当属于某一个确定的类型返回值应当属于某一个确定的类型,在定,在定义函数时指定函数返回值的类型。义函数时指定函数返回值的类型。例如例如:
24、下面是下面是3个函数的首行:个函数的首行:int max(float x,float y)/*函数值为整型*/char letter(char c1,char c2)/*函数值为字符型*/double min(int x,int y)/*函数值为双精度型*/注意注意:凡不加类型说明的函数,自动按整型处理。凡不加类型说明的函数,自动按整型处理。(3 3)在定义函数时指定的函数类型一般应该和)在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。语句中的表达式类型一致。如果函数值的类型和如果函数值的类型和return语句中表达式的值不语句中表达式的值不一致,则以函数类型为准。一致
25、,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。类型决定返回值的类型。(4 4)对于不带回值的函数,应当用)对于不带回值的函数,应当用“void”定义函数定义函数为为“无类型无类型”(或称(或称“空类型空类型”)。此时在函数体中)。此时在函数体中不得出现不得出现return语句。语句。例例:返回值类型与函数类型不同返回值类型与函数类型不同运行情况如下:运行情况如下:1.5,2.5max is 2 1.52.62.62变为变为2main()函数函数p main()函数是由系统调用的,使得函数是由系统调用的,使得C C程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c语言程序设计教学资料 语言程序设计 教学 资料 函数
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内