收藏 分享(赏)

辅导5-函数.doc

上传人:kpmy5893 文档编号:5244248 上传时间:2019-02-13 格式:DOC 页数:15 大小:108KB
下载 相关 举报
辅导5-函数.doc_第1页
第1页 / 共15页
辅导5-函数.doc_第2页
第2页 / 共15页
辅导5-函数.doc_第3页
第3页 / 共15页
辅导5-函数.doc_第4页
第4页 / 共15页
辅导5-函数.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

1、函数函数、 函数的定函数的定 义义1、函数概念的引入函数概念的引入1) 举举 例: 计计 算算 圆圆 面面 积积 的的 c 程序程序# include void main( ) double r=5.0;double area=3.14159*r*r;printf(”圆圆 面面 积为积为 :%fn”,area);抽取抽取 计计 算算 圆圆 面面 积积 的算法作的算法作 为为 独立程序段,程序可改独立程序段,程序可改 为为 :1. # include 2. double CalArea( ) /26 行是行是 CalArea 函数功能的描述(定函数功能的描述(定 义义 )3. double r=

2、5.0; /这这 个函数只能个函数只能 计计 算半径算半径 为为 5 的的 圆圆 的面的面 积积4. double area=3.14159*r*r;5. return area;6. 7. void main( )8. double area= CalArea( ); /执执 行行 CalArea 函数函数9. printf(”圆圆 面面 积为积为 :%fn”,area);10.修改修改 CalArea( ) 函数,使半径的函数,使半径的 值值 由主函数决定由主函数决定 1. # include 2. double CalArea( double r ) / r 为为 函数函数 CalAre

3、a 的形式参数的形式参数3. double area=3.14159*r*r;4. return area;5. 6. void main( )7. double area= CalArea( 5 ); / 5 为为 函数函数 CalArea 的的 实实 在参数在参数8. printf(”圆圆 面面 积为积为 :%fn”,area);9. 修改主函数,使程序可以修改主函数,使程序可以 计计 算半径不同算半径不同 的的 圆圆 的面的面 积积1. # include 2. double CalArea( double r ) / r 为为 函数函数 CalArea 的形式参数的形式参数3. dou

4、ble area=3.14159*r*r;4. return area;5. 6. void main( )7. double radius;8. printf(”请输请输 入半径入半径 ”);9. scanf(“%f”,10. double area= CalArea( radius ); / radius 为为 函数的函数的 实实 在参数在参数11. printf(”圆圆 面面 积为积为 :%fn”,area);12.2) 函数的作用函数的作用 降低降低 难难 度及复度及复 杂杂 度, 实实 行分工合作,各尽其行分工合作,各尽其 职职 便于便于 进进 行分行分 级级 管理, 简简 化程序化

5、程序 设计设计3) 程序的 执执 行行总总 是从是从 main()开始,最后 总总 是在是在 main() 结结 束(不 论论 main()的位置)的位置) 程序开始程序开始程序结束main( )aaa( );aaa( ) bbb( );bbb( ) 2、函数的定函数的定 义义1) 定定 义义 格式格式返回返回 类类 型型 函数名函数名 (形参表) 函数体函数体 double Area (double r) return 3.1415*r*r ;2) 函数参数函数参数 含含 义义 :是函数完成功能所需要的:是函数完成功能所需要的 输输 入信息入信息 参数参数 类类 型:形式参数型:形式参数 实

6、实 在参数在参数 组组 成: 形式参数:形式参数: 类类 型型 参数参数 1,类类 型型 参数参数 2,类类 型型 参数参数 n 实实 在参数:在参数: 参数参数 1,参数参数 2,参数参数 n3) 返回返回 类类 型型 含含 义义 :函数运行:函数运行 结结 束返回一个束返回一个 结结 果果 值值 ,该值该值 的数据的数据 类类 型型 类类 型包括:除数型包括:除数 组组 外所有数据外所有数据 类类 型(默 认类认类 型型 为为 int)4) 函数体函数体 含含 义义 :是函数功能的:是函数功能的 实现实现 (描述) 组组 成: 语语 句句5) 函数的函数的 类类 型型 无参函数无参函数 /

7、有参函数有参函数 无参函数无参函数类类 型型 函数名() 函数体函数体 有参函数有参函数类类 型型 函数名(形参表)函数名(形参表) 函数体函数体 无返回无返回 值值 /有返回有返回 值值 无返回无返回 值值void 函数名(形参表)函数名(形参表) return ;或或 void 函数名(形参表)函数名(形参表) 有返回有返回 值值返回返回 值类值类 型型 函数名(形参表)函数名(形参表) return 表达式表达式 ;3、空函数空函数1) 含含 义义 :函数体:函数体 为为 空的函数空的函数2) 意意 义义 :增加程序的可:增加程序的可 读读 性,便于程序的性,便于程序的 扩扩 充充4、r

8、eturn 语语 句句1) 格式:return 表达式 ;表达式表达式 为为 可可 选项选项2) 作用: 终终 止当前函数的止当前函数的 执执 行,返回主 调调 函数函数 向主向主 调调 函数返回一个函数返回一个 值值5、函数原型函数原型1) 前提:所有前提:所有 标识标识 符都必符都必 须须 遵循遵循 “先先 说说 明,后使用 ”的原的原 则则 。2) 结论结论 :因此在函数的:因此在函数的 调调 用前,必 须须 有函数的有函数的 说说 明。3) 函数原型与函数定函数原型与函数定 义义 的区的区 别别 函数定函数定 义义 定定 义义 性性 说说 明明 “从无到有从无到有 ”提供函数的所有信息

9、提供函数的所有信息 函数原型函数原型 参考性参考性 说说 明明 “提供函数提供函数 调调 用所需的接口信息用所需的接口信息 ” 定定 义义 只能有一次,但声明可以多次出只能有一次,但声明可以多次出 现现4) 函数原型函数原型 语语 句的格式:返回句的格式:返回 类类 型型 函数名(形参表)函数名(形参表) ;5) 函数能正确函数能正确 调调 用的条件:用的条件:函数的定函数的定 义义 位于位于 调调 用之前用之前 或或 函数的原型位于函数的原型位于 调调 用之前用之前6) 必必 须须 使用函数原型的情况使用函数原型的情况 多文件程序多文件程序 函数函数 递归调递归调 用用 使用使用 库库 函数

10、函数、 函数函数 调调 用用1、函数的函数的 调调 用用1) 调调 用格式:用格式: 函数名(函数名( 实实 参表) ;实实 参参 出出 现现 在在 主主 调调 函数中函数中 形参形参 出出 现现 在在 被被 调调 函数中函数中 2) 注意: 实实 参与形参的个数要相同,参与形参的个数要相同, 类类 型要一致(兼容),且一一 对应对应 常量形参(常量形参( const):函数体中不能改函数体中不能改 变该变该 形参的形参的 值值 。3) 调调 用方式:用方式: 作作 为为 表达式表达式 (必必 须须 是有返回是有返回 值值 的函数的函数 )/ 作作 为语为语 句句 调调 用用2、调调 用用 过

11、过 程程1) 参数参数 传递传递2) 执执 行函数体行函数体3) 函数返回函数返回3、参数参数 传递传递 机制( 赋值赋值 )1) 传值调传值调 用用形式形式 对应对应 关系关系实实 参参 表达式表达式 (有确定有确定 值值 ) 值值形参形参 变变 量量 (存存 储单储单 元元 ) 变变 量量2) 传传 地址地址 调调 用用形式形式 对应对应 关系关系实实 参参 变变 量的地址量的地址 地址地址形参形参 变变 量量 指指 针针 数数 组组 名作名作 为实为实 参参 传递传递 的是数的是数 组组 的首地址。、 程序运行时的内存分布 程序运行时的内存分布 程序的源代码(系统支配的空间)全局变量和静

12、态变量(系统支配的空间)由程序控制,可在运行中由语句动态分配(malloc )及回收(free )被调用的函数信息,局部变量 (程序支配的空间)注:红色为数据区,在全局数据区的数据,若没初始化,自动取值为 0;堆、栈区的数据,若没初始化,其值为随机值。赋值赋值程序代码区全局数据区堆 区栈 区、 函数调用的实现机制1、函数调用时系统执行的操作: 建立被建立被 调调 用函数的用函数的 栈栈 空空 间间 保保 护护 断点(主断点(主 调调 函数的运行状函数的运行状 态态 、返回地址) 参数参数 传递传递 被被 调调 用函数取得程序的控制用函数取得程序的控制 权权2、函数执行结束后系统执行的操作: 若

13、有返回若有返回 值值 ,将它存到一个,将它存到一个 临时临时 的空的空 间间 恢复断点(主恢复断点(主 调调 函数的运行状函数的运行状 态态 、返回地址) 释释 放相放相 应应 (调调 用函数所占)的用函数所占)的 栈栈 空空 间间 继续执继续执 行主行主 调调 函数函数、 作用域作用域1、作用域:作用域: 标识标识 符在程序中起作用(能被使用)的范符在程序中起作用(能被使用)的范 围围全局作用域:全局作用域: 始于声明点,始于声明点, 终终 于程序(程序中一般都含有多个于程序(程序中一般都含有多个 .cpp)的 结结 束。文件作用域(文件作用域( static):始于声明点, 终终 于本文件

14、(于本文件( .cpp)结结 束束 处处局部( 块块 )作用域:始于声明点, 终终 于于 “块块 ”结结 束束 处处2、存储属性:1) 静静 态态: 全局全局 变变 量、 static 变变 量量2) 动态动态 :堆堆 变变 量、自 动变动变 量、函数的形参、寄存器量、函数的形参、寄存器 变变量3、变变 量的作用域量的作用域1) 全局全局 变变 量:在函数之外定量:在函数之外定 义义 无限制:可供程序中的所有函数使用无限制:可供程序中的所有函数使用 有限制:文件域有限制:文件域 变变 量量 -只供本文件中的所有函数使用只供本文件中的所有函数使用2) 局部局部 变变 量:在复合量:在复合 语语

15、句内定句内定 义义 ,仅仅 能在能在 该该 复合复合 语语 句内使用句内使用3) 覆盖覆盖 问题问题 : 内内 层层 的同名的同名 变变 量量 总总 是覆盖外是覆盖外 层层 的同名的同名 变变 量量 作用域小覆盖作用域大的作用域小覆盖作用域大的4) 归纳归纳全局全局 变变 量量无限制无限制 限制:文件域限制:文件域局部局部 变变 量量在函数外定在函数外定 义义 在函数内定在函数内定 义义非静非静 态态 存存 储类储类 型型(不 带带 static)静静 态态 存存 储类储类 型型(带带 static)非静非静 态态 存存 储类储类 型型(不不 带带 static)静静 态态 存存 储类储类 型

16、型(带带 static)其他文件用其他文件用 extern加以声明后可以使加以声明后可以使用用不不 让让 其他文件其他文件使用使用离开定离开定 义义 它的函数后其它的函数后其 值值不保留不保留(释释 放内存放内存 单单 元元 )离开定离开定 义义 它的函数它的函数后其后其 值值 仍保留仍保留(保留内存保留内存 单单 元元 )初初 值为值为 0 初初 值为值为 随机随机 值值 初初 值为值为 04、生命期(生存期): 标识标识 符存在(符存在( 创创 建到建到 删删 除之除之 间间 )的 时间时间 。 静静 态态 生命期:生命期: 全局全局 变变 量、静 态变态变 量量 、常量特点: 编译时编译

17、时 分配空分配空 间间 ,程序运行 结结 束才束才 释释 放空放空 间间 动态动态 生命期:非静生命期:非静 态态 的局部的局部 变变 量量 栈栈 区中的区中的 变变 量量特点:在函数特点:在函数 调调 用用 时时 分配存分配存 储单储单 元,函数 结结 束就束就 释释 放空放空 间间 动态动态 生命期:使用生命期:使用 malloc()等函数分配空等函数分配空 间间 的的 变变 量量特点:程序运行中随特点:程序运行中随 时时 根据需要申根据需要申 请请 分配空分配空 间间 、释释 放空放空 间间 (free)5、举举 例:例例 1:# include “stdio.h“void fun(in

18、t ,int );void main() int a,b; /这这 个个 a,b 是内部(局部) 变变 量,有效范 围围 (作用域)在此 处处 开始到开始到 main 结结 束( )a=5;b=8;fun(a,b);printf(“主函数中:主函数中: a=%d,b=%dn“,a,b);void fun(int a,int b) /这这 个个 a,b 是内部(局部) 变变 量,有效范 围围 (作用域)在此 处处 开始到开始到 fun 结结 束() int c; /c 是内部(局部) 变变 量,有效范 围围 (作用域)在此 处处 开始到开始到 fun 结结 束( )c=a;a=b;b=c;pri

19、ntf(“fun 函数中:函数中: a=%d,b=%dn“,a,b);fun 也可写成:也可写成:void fun(int x,int y) /这这 个个 x,y 是局部是局部 变变 量,有效范 围围 (作用域)在此 处处 开始到开始到 fun 结结 束( ) int c; /c 是局部是局部 变变 量,有效范 围围 (作用域)在此 处处 开始到开始到 fun 结结 束() c=x;x=y;y=c;printf(“fun 函数中:函数中: a=%d,b=%dn“,x,y);例例 2:test6_8_2.c:# include “stdio.h“void fun( );int a,b; /这这

20、个个 a,b 是外部(全局) 变变 量,有效范 围围 (作用域)在此 处处 开始到开始到 test6_8_2.c 文件的最后一行文件的最后一行void main() a=5;b=8;fun();printf(“主函数中:主函数中: a=%d,b=%dn“,a,b);void fun() int c; /c 是内部(局部) 变变 量,有效范 围围 (作用域)在此 处处 开始到开始到 fun 结结 束( )c=a;a=b;b=c;printf(“fun 函数中:函数中: a=%d,b=%dn“,a,b);例例 3:程序程序 1:a.c# include “stdio.h“void fun( );i

21、nt a,b; /这这 个个 a,b 是外部(全局) 变变 量,有效范 围围 (作用域)在此 处处 开始到程序开始到程序 结结 束束void main() a=5;b=8;fun();printf(“主函数中:主函数中: a=%d,b=%dn“,a,b);程序程序 2:b.cextern int a,b; /两个函数不在同一个程序中,要使用其他程序中定两个函数不在同一个程序中,要使用其他程序中定 义义 的外部(全局) 变变 量,需要做出声明量,需要做出声明void fun() int c; /c 是内部(局部) 变变 量,有效范 围围 (作用域)在此 处处 开始到开始到 fun 结结 束( )

22、c=a;a=b;b=c;printf(“fun 函数中:函数中: a=%d,b=%dn“,a,b);例例 4:程序程序 1:a.c# include “stdio.h“void fun( );static int a,b; /这这 个个 a,b 是静是静 态态 外部(全局) 变变 量,有效范 围围 (作用域)限制在(作用域)限制在 a.c 中中void main() a=5;b=8;fun();printf(“主函数中:主函数中: a=%d,b=%dn“,a,b);fun();printf(“主函数中:主函数中: a=%d,b=%dn“,a,b);程序程序 2:b.cextern int a,

23、b; /虽虽 然做出声明,但无法使用然做出声明,但无法使用 a.c 中定中定 义义 的静的静 态态 外部外部 变变 量量void fun() int c; /c 是内部(局部) 变变 量,有效范 围围 (作用域)在此 处处 开始到开始到 fun 结结 束( )c=a;a=b;b=c;printf(“fun 函数中:函数中: a=%d,b=%dn“,a,b);例例 5:# include “stdio.h“int a,b; /这这 个个 a,b 是外部(全局) 变变 量,初始 值为值为 0,它 们们 的作用范的作用范 围围 是整个程序是整个程序void fun( );void main() in

24、t a,b; /这这 个个 a,b 是内部(局部) 变变 量,初始 值为值为 随机随机 值值b=8; /当外部当外部 变变 量和内部量和内部 变变 量作用范量作用范 围围 重合重合 时时 ,内部起作用,内部起作用fun();printf(“主函数中:主函数中: a=%d,b=%dn“,a,b); /在在 main 范范 围围 中,局部 变变 量量 a,b 起作用起作用void fun() a+;b-;printf(“fun 函数中:函数中: a=%d,b=%dn“,a,b);例例 6:# include “stdio.h“void fun( );void main() int i;for (i

25、=1;i1)# include double factorial(int );void main() int x;printf(“求求 n!,请输请输 入入 n 值值 :“);scanf(“%d”, printf(“%d !=%f n“, x , factorial(x);double factorial(int n) if (n=0 | n=1 )return 1;else;return n*factorial(n-1);ret factorial(3) 6 n=30factorial (2)32 n=20factorial (1)21 n=1 6666例例 利用利用 递归递归 方法求一方法求一 维维 数数 组组 an中中 n 个元素之和。个元素之和。关关 键语键语 句:if (n = =1)return a0;else return an-1+sum(a,n-1); /返回第返回第 n 个元素的个元素的 值值 ,并 继续处继续处 理剩余的理剩余的 n-1 个元素个元素

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报