《c语言第八章函数》PPT课件.ppt

上传人:新** 文档编号:570197263 上传时间:2024-08-02 格式:PPT 页数:41 大小:1.13MB
返回 下载 相关 举报
《c语言第八章函数》PPT课件.ppt_第1页
第1页 / 共41页
《c语言第八章函数》PPT课件.ppt_第2页
第2页 / 共41页
《c语言第八章函数》PPT课件.ppt_第3页
第3页 / 共41页
《c语言第八章函数》PPT课件.ppt_第4页
第4页 / 共41页
《c语言第八章函数》PPT课件.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《《c语言第八章函数》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《c语言第八章函数》PPT课件.ppt(41页珍藏版)》请在金锄头文库上搜索。

1、1.我的程序有上百行,如何调试最方便?我的程序有上百行,如何调试最方便?2.我想设计一个程序完成下面的计算:我想设计一个程序完成下面的计算: 其中,其中,m、n为正整数且为正整数且mn 该如何设计程序最有效?该如何设计程序最有效?m!n!(m-n)!内容提要:内容提要: 概述概述 函数的定义函数的定义 函数参数函数参数(变量、数组变量、数组)和函数值和函数值 函数的调用函数的调用函数的嵌套调用函数的嵌套调用 局部变量和全局变量及变量的存储类别局部变量和全局变量及变量的存储类别8.1 概述概述C程序的结构如图所示程序的结构如图所示1.一个一个C程序可以分为若干个函数程序可以分为若干个函数2.每个

2、程序有且只能有一个主函数每个程序有且只能有一个主函数(main),其它函数都是,其它函数都是“子函数子函数”3.子函数可以互相调用,但主函数子函数可以互相调用,但主函数不能被调用不能被调用4.一个一个C程序由一个或多个文件构程序由一个或多个文件构成,一个源程序文件是一个编译成,一个源程序文件是一个编译单位单位说明:说明:1.C程序的执行从程序的执行从main函数开始函数开始,调用其它函数后仍回到调用其它函数后仍回到main函函数,程序在数,程序在main函数结束时结函数结束时结束。束。2.所有子函数都是平行的,任何所有子函数都是平行的,任何子函数都不属于其它函数。子函数都不属于其它函数。3.从

3、用户角度看,函数可分为:从用户角度看,函数可分为:u标准函数,即库函数标准函数,即库函数u自定义函数自定义函数4.从函数形式看,可分为:从函数形式看,可分为:u无参数函数无参数函数:如如printstar( )u有参数函数有参数函数:如如printf( )例例8-1#include “stdio.h”void printstar( ) printf(“*n”);void printmessage( )printf(“Hello,world.n”); printstar( );void main( )printstar( ); printmessage( );*Hello,world.*函数定义

4、的一般形式:函数定义的一般形式: 类型说明类型说明 函数名函数名 (形式参数说明形式参数说明) 函数体函数体形式参数说明方法:形式参数说明方法: 类型说明类型说明 变量名变量名 ,类型说明类型说明 变量名变量名1、无参数的定义形式、无参数的定义形式 类型说明类型说明 函数名函数名( ) 函数体函数体2、有参数的定义形式、有参数的定义形式 类型说明类型说明 函数名函数名 (形式参数说明形式参数说明) 函数体函数体3、空函数的定义形式、空函数的定义形式 类型说明类型说明 函数名函数名 (形式参数说明形式参数说明) #include “stdio”int max(int x,int y) int z

5、; z=(xy)?x:y; return(z);void main( ) int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b)printf(“Max is%dn”,c0);8.2 函数定义的一般形式函数定义的一般形式例如:例如:int sum(int x,int y) int z; z=x+y; return(z); 又如又如void printhello(char name) printf(“Hello,%sn”,name);函数定义的一般形式:函数定义的一般形式: 类型说明类型说明 函数名函数名 (形式参数说明形式参数说明) 函数体函数体n一般情况下,函数体

6、由两部分组成:一般情况下,函数体由两部分组成: 局部变量说明局部变量说明 语句语句 n局部变量:局部变量:函数体内定义的变量。其有效范围仅函数体内定义的变量。其有效范围仅限于所在函数的内部,离开函数体则无限于所在函数的内部,离开函数体则无意义。意义。例如:例如:int sum(int x,int y) int z; z=x+y; return(z);又如又如void printhello(char name) printf(“Hello,%sn”,name);8.3 函数参数和函数的值函数参数和函数的值 一个一个C程序由若干个函数组成,程序由若干个函数组成,各函数调用时经常需要传递一些各函数调

7、用时经常需要传递一些数据。即调用函数把数据传递给数据。即调用函数把数据传递给被调用函数,经被调用函数处理被调用函数,经被调用函数处理后,得到一个确定的结果,在返后,得到一个确定的结果,在返回调用函数时,把这结果带回调回调用函数时,把这结果带回调用函数。用函数。a,bz各函数间的信息往来是由各函数间的信息往来是由参数传递参数传递和和返回语句返回语句实现的实现的主调函数主调函数被调函数被调函数一、形式参数和实际参数一、形式参数和实际参数 函数参数函数参数:用于函数间数据的传递用于函数间数据的传递形式参数形式参数:定义定义函数时使用的参数函数时使用的参数实际参数实际参数:调用调用函数时使用的参数函数

8、时使用的参数 函数函数max有两个形式参数有两个形式参数x和和y形参形参x和和y只是在函数只是在函数max中使用中使用 a和和b是主函数中定义的变量是主函数中定义的变量 main调用函数调用函数max a和和b为函数为函数max的实参的实参#include “stdio”int max (int x,int y) int z; z=(xy)?x:y; return(z);void main( ) int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b)printf(“Max is%dn”,c0);59 95Max is 95一、形式参数和实际参数一、形式参数和实际参

9、数 说明:说明:1、定义函数时,必须说明形参的类型。、定义函数时,必须说明形参的类型。形参只能是形参只能是变量变量或或数组数组2、函数被调用前,形参不占用内存;、函数被调用前,形参不占用内存;函数调用结束后,形参所占用的内存函数调用结束后,形参所占用的内存也将被收回。也将被收回。3、实参可以是、实参可以是常量常量、变量变量或或表达式表达式。4、实参也形参的类型必须一致实参也形参的类型必须一致。字符。字符型和整型可以互相匹配。型和整型可以互相匹配。5、C语言中实参对形参的数据传递是语言中实参对形参的数据传递是“值传递值传递”,即单向传递。它仅由参,即单向传递。它仅由参数数的对应位置确定,与名字无

10、关。的对应位置确定,与名字无关。#include “stdio”int max (int x,int y) int z; z=(xy)?x:y; return(z);void main( ) int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b)printf(“Max is%dn”,c0);int max (int b,int a) int c; z=(ab)?a:b; return(c);一、形式参数和实际参数一、形式参数和实际参数例例8-3 读程序,写出运行结果读程序,写出运行结果Sum of 1,3 is 4Sum of 1,3 is 4一、形式参数和实际参

11、数一、形式参数和实际参数二、函数的返回值二、函数的返回值 1、返回函数值的方法、返回函数值的方法 函数的返回值也就是函数值,是函数的返回值也就是函数值,是 一个确定的值。一个确定的值。 如果一个函数由返回值,就必如果一个函数由返回值,就必 须使用须使用return语句。语句。 一个函数中可以有一个函数中可以有 一个以上的一个以上的 return语句,但不论执行到哪个语句,但不论执行到哪个 return都将结束函数的调用返回都将结束函数的调用返回 主函数。主函数。 return语句中的括号可以省略;语句中的括号可以省略; return后面的值可以是一个表后面的值可以是一个表 达式。达式。#inc

12、lude “stdio”int max (int x,int y) int z; z=(xy)?x:y; return(z);void main( ) int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b)printf(“Max is%dn”,c); if (xy) return x; return y; return (xy?x:y);二、函数的返回值二、函数的返回值1、返回函数值的方法、返回函数值的方法2、函数值的类型、函数值的类型 函数的类型即函数值的类型。例函数的类型即函数值的类型。例如,函数如,函数max是是int型的也就是函型的也就是函数值是数值是in

13、t型的。型的。省略了类型说明的函数是省略了类型说明的函数是int型的。型的。return语句中表达式的值一般应与语句中表达式的值一般应与函数类型一致。函数类型一致。如果不一致,则需要进行类型转换。如果不一致,则需要进行类型转换。只有数值型数据可以进行自动类型只有数值型数据可以进行自动类型转换,以函数类型为准。转换,以函数类型为准。#include “stdio”int max (int x,int y) int z; z=(xy)?x:y; return(z);void main( ) int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b)printf(“Max

14、is%dn”,c0);二、函数的返回值二、函数的返回值1、返回函数值的方法、返回函数值的方法2、函数值的类型、函数值的类型3、不需要返回值的函数、不需要返回值的函数 如果函数中没有使用如果函数中没有使用return语句,函数返回的是一个不语句,函数返回的是一个不确定的数值。确定的数值。(参见例参见例8-1) 如果一个函数不需要返回值如果一个函数不需要返回值(表示一个过程表示一个过程),可以用,可以用void做类型说明。做类型说明。 如果一个函数被声明为如果一个函数被声明为void类类型,就不允许再引用它的返回值型,就不允许再引用它的返回值(即只能用函数语句形式调用即只能用函数语句形式调用)。例

15、例8-1#include “stdio.h”void printstar( ) printf(“*n”);void printmessage( )printf(“Hello,world.n”); printstar( );void main( )printstar( ); printmessage( );8.4 函数的调用函数的调用一、函数调用的一般形式一、函数调用的一般形式 一般形式:一般形式: 函数名函数名(实参表列实参表列)说明:说明: 如果调用无参函数,实参表列如果调用无参函数,实参表列可以忽略,但括号不能省。可以忽略,但括号不能省。 实参的个数和形参一般相等。实参的个数和形参一般相等

16、。 实参与形参的类型应一一对应,实参与形参的类型应一一对应,必要时使用类型转换。必要时使用类型转换。注意:不同系统中,实参的计算注意:不同系统中,实参的计算顺序不同。微机上一般是从右顺序不同。微机上一般是从右到左。为避免由此引起的混乱,到左。为避免由此引起的混乱,一般应在调用函数前计算出实一般应在调用函数前计算出实参的值。参的值。#include “stdio”int max (int x,int y) int z; z=(xy)?x:y; return(z);void main( ) int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b)printf(“Max

17、is%dn”,c0);float max(float x,float y) float z; z=(x0?x;-x); void main( ) float x=-1.2,y; y=iabs(x) printf(“x=%f,iabs(x)=%fn”,x,y);一、函数调用的一般形式一、函数调用的一般形式二、函数调用的方式二、函数调用的方式三、函数调用的执行过程三、函数调用的执行过程四、函数的原形说明四、函数的原形说明在程序中调用函数需满足以下条件:在程序中调用函数需满足以下条件:1、被调函数必须存在,且遵循、被调函数必须存在,且遵循“先定先定义后使用义后使用”的原则。的原则。2、如果被调函数的

18、定义在主调函数、如果被调函数的定义在主调函数之后之后(位置位置),可以先给出,可以先给出原形说明原形说明。 原形说明的形式为:原形说明的形式为:类型说明类型说明 函数名函数名 (参数类型参数类型, 参数类型参数类型,);说明:库函数的原形说明存放在头文说明:库函数的原形说明存放在头文件件(.h)(.h)中,通过使用中,通过使用includeinclude预处理命预处理命令将这些原形说明插入程序中。令将这些原形说明插入程序中。8.5 函数的嵌套调用函数的嵌套调用嵌套调用是指在一个函数的嵌套调用是指在一个函数的函数体中又调用了其它函数。函数体中又调用了其它函数。例例8-1#include “std

19、io.h”void printstar( ) printf(“*n”);void printmessage( )printf(“Hello,world.n”); printstar( );void main( )printstar( ); printmessage( );例例8-6 用弦截法求方程的根。用弦截法求方程的根。 x3-5x2+16x-80=0算法分析:算法分析:对于任意的对于任意的f(x)=0,1、给定两个、给定两个x1,x2,满足,满足x1x2且且f(x1)和和f(x2)的符号相反的符号相反2、过、过f(x1)、f(x2)两点做直线两点做直线(弦弦),交于交于x轴与轴与x,其中,

20、其中3、求、求f(x);若若f(x)与与f(x1)同符号,则根同符号,则根必在必在(x1,x2)区间内,令区间内,令x1=x;反之,反之,根必在根必在(x1,x)区间内,令区间内,令x2=x4、重复、重复2和和3,直到,直到|f(x)| 思考用函数编程的好处思考用函数编程的好处例例 编写程序求编写程序求Cnm=分析:分析: 重复三次求阶乘运算,只是重复三次求阶乘运算,只是每次的值不同。每次的值不同。 将求阶乘的过程编写一个函将求阶乘的过程编写一个函数数fac,以不同的参数值,以不同的参数值k来调用来调用函数函数 n!m!(m-n)!input m,n:5 88!/(5!(8-5)!)=568.

21、6 函数的递归调用函数的递归调用许多数学函数都是递归形式定义的:许多数学函数都是递归形式定义的:递归调用是指在调用一个函数时又递归调用是指在调用一个函数时又直接或间接的调用了函数本身。直接或间接的调用了函数本身。 直接递归调用直接递归调用 间接递归调用间接递归调用注意:这两个递归都无法结束。注意:这两个递归都无法结束。因此应含某条件控制递归调用因此应含某条件控制递归调用结束结束例例8-7 有有5个人坐在一起,问第五个人个人坐在一起,问第五个人 多少岁?答多少岁?答:比第四个大比第四个大2岁。岁。 第四个人说他比第三个人大第四个人说他比第三个人大2岁,岁, 第三个人比第二个人大第三个人比第二个人

22、大2岁,第岁,第 二个人比第一个人大二个人比第一个人大2岁,问第岁,问第 一个时回答是一个时回答是10岁。第五个人岁。第五个人 到底多大到底多大例例8-8 用递归法求阶乘用递归法求阶乘n!(n0)使用函数做:使用函数做:8.7 数组元素作为函数的参数数组元素作为函数的参数一、数组元素做函数实参一、数组元素做函数实参 与变量做实参一样,数组元素与变量做实参一样,数组元素做实参是做实参是“值传递值传递”。例例8-9:求十个任意整数中的:求十个任意整数中的 最大数。最大数。Enter 10 integer :23 5 4 1 0 56 79 43 2 15Max is 79一、数组元素做函数实参一、

23、数组元素做函数实参二、一维数组与函数参数二、一维数组与函数参数 若函数的形参是数组,对应的若函数的形参是数组,对应的实参必须是数组名。实参必须是数组名。说明:说明:1、实参数组也形参数组的类型、实参数组也形参数组的类型必须一致。必须一致。2、用数组名做参数时,传递的是、用数组名做参数时,传递的是数组的首地址数组的首地址,因此形参数组也,因此形参数组也可以不指定大小。但需另设一个可以不指定大小。但需另设一个参数,传递数组元素的个数。参数,传递数组元素的个数。(int x,int n) n; i+)max(a,10); 一、数组元素做函数实参一、数组元素做函数实参二、一维数组与函数参数二、一维数组

24、与函数参数3、数组做参数时,形参数组、数组做参数时,形参数组和实参数组共享同一内存单和实参数组共享同一内存单元。元。如果形参数组的元素的值被修改,如果形参数组的元素的值被修改,实参数组元素的值也就被改变了。实参数组元素的值也就被改变了。例例 8-10 用比较法排序用比较法排序(从大到小从大到小)一、数组元素做函数实参一、数组元素做函数实参二、一维数组与函数参数二、一维数组与函数参数三、多维数组与函数参数三、多维数组与函数参数1、多维数组可以做为函数的、多维数组可以做为函数的参数。参数。2、如果形参是多维数组,可、如果形参是多维数组,可以省略第一维大小,但不能省以省略第一维大小,但不能省略其它维

25、大小。略其它维大小。例例8-11 有一个有一个3*4的矩阵,的矩阵, 求最大元素值。求最大元素值。 实参与形参的小结实参与形参的小结实参实参形参形参传递方式传递方式常量、变量、表达式常量、变量、表达式数组元素数组元素变量变量传值传值(单向单向)数组名数组名数组数组传数组首地址传数组首地址8.8 局部变量与全局变量局部变量与全局变量一、局部变量一、局部变量 下列变量是局部变量下列变量是局部变量 1、在一个函数内部定义的、在一个函数内部定义的 变量变量 2、函数的形式参数、函数的形式参数 3、在某个复合语句中定义、在某个复合语句中定义 的变量的变量说明:说明:1、局部变量只在自己的范围、局部变量只

26、在自己的范围内有效。内有效。2、如果局部变量的有效范围、如果局部变量的有效范围有重叠,则有效范围小的优先。有重叠,则有效范围小的优先。一、局部变量一、局部变量二、全局变量二、全局变量 在函数之外定义的变量在函数之外定义的变量(外部外部变量变量)是全局变量是全局变量全局变量的有效范围是:全局变量的有效范围是:从定义从定义变量的位置开始到源文件结束。变量的位置开始到源文件结束。在一个函数中,既可以使用本函数在一个函数中,既可以使用本函数中的局部变量,也可以使用有效的中的局部变量,也可以使用有效的全局变量。全局变量。一、局部变量一、局部变量二、全局变量二、全局变量说明:说明:1、利用全局变量可以在函

27、数、利用全局变量可以在函数间传递数据。间传递数据。例例 8-12 有有10个学生的学习成绩,个学生的学习成绩,求平均分,最高分和最低分。求平均分,最高分和最低分。分析:用一个函数返回三个数据,分析:用一个函数返回三个数据,除了用函数值外,可以借助于全除了用函数值外,可以借助于全局变量。局变量。可见,利用全局变量可以减少函数可见,利用全局变量可以减少函数的参数的参数#include “stdio.h”float max=0,min=0;float average (float score,int n) int i; float sum=score0; max=min=score0; for (i

28、=1;in;i+) sum=sum+scorei; if(maxscorei)min=scorei; return sum/n; void main( ) float avg,score10; int I; for(i=0;i10;i+)scanf(“%f”,&scorei); avg=average(score,10); printf(“Max:%f Min:%f Average:%6.2fn”, max,min,avg);一、局部变量一、局部变量二、全局变量二、全局变量 1、利用全局变量可以在函数、利用全局变量可以在函数 间传递数据。间传递数据。 2、尽量少使用全局变量。、尽量少使用全局变

29、量。 3、若全局变量与局部变量同、若全局变量与局部变量同 名,则局部变量优先。名,则局部变量优先。8.9 变量的存储类别变量的存储类别一、变量的静态存储和动态存储一、变量的静态存储和动态存储 全局变量与局部变量:全局变量与局部变量: 变量的变量的作用域作用域 静态存储变量和动态存储变量:静态存储变量和动态存储变量: 变量的存储类别,即变量的存储类别,即生存期生存期 内存中供用户使用的存储空间包括:内存中供用户使用的存储空间包括: 程序区程序区 静态存储区:编译时分配空间静态存储区:编译时分配空间 动态存储区:执行时分配空间动态存储区:执行时分配空间变量或函数的属性:变量或函数的属性:一、变量的

30、静态存储和动态存储一、变量的静态存储和动态存储二、局部变量的存储类别二、局部变量的存储类别 1、自动变量、自动变量 存储在动态存储区,用存储在动态存储区,用auto说明说明 如:如: int f (int a) auto int b,c=3; 通常,将通常,将auto省略省略 如:形参如:形参a,变量,变量b、c都是自动变量,调用该函数时,系统都是自动变量,调用该函数时,系统 给他们分配存给他们分配存 存储空间,函数调用结束是自动释放存储存储空间,函数调用结束是自动释放存储 空间空间一、变量的静态存储和动态存储一、变量的静态存储和动态存储二、局部变量的存储类别二、局部变量的存储类别 1、自动变

31、量、自动变量 2、局部静态变量、局部静态变量 占用静态存储区占用静态存储区 用用static说明说明 说明:说明: 局部静态变量属于静态存储局部静态变量属于静态存储 类别。在整个程序运行期间类别。在整个程序运行期间 都不释放存储空间。都不释放存储空间。 局部静态变量在编译时赋初局部静态变量在编译时赋初 值值(仅赋一次值仅赋一次值)。 如果定义局部静态变量没有如果定义局部静态变量没有 赋初值,编译时会自动赋初赋初值,编译时会自动赋初 值值 局部局部 静态变量只能在定义它静态变量只能在定义它 的函数内被引用的函数内被引用(它存在但不能被它存在但不能被其它函数使用其它函数使用)1!=12!=23!=

32、64!=245!=1201、自动变量、自动变量2、局部静态变量、局部静态变量3、寄存器变量、寄存器变量 计算机寄存器的个数有限。计算机寄存器的个数有限。 寄存器变量对寄存器的占用是动态的。寄存器变量对寄存器的占用是动态的。 有的系统将寄存器变量转换为自动变量来处理,有的系统将寄存器变量转换为自动变量来处理, 而有的系统会自动设置寄存器变量。而有的系统会自动设置寄存器变量。一、变量的静态存储和动态存储一、变量的静态存储和动态存储二、局部变量的存储类别二、局部变量的存储类别三、全局变量的存储类别三、全局变量的存储类别 1、全局变量都是静态的、全局变量都是静态的 2、用、用extern说明一个在其它

33、说明一个在其它 源文件中定义的全局变量源文件中定义的全局变量 3、用、用static说明一个不能在其说明一个不能在其 它源文件中引用的全局变量。它源文件中引用的全局变量。 应尽量少的使用全局变量应尽量少的使用全局变量四、存储类别的小结四、存储类别的小结1、变量的定义方法、变量的定义方法存储类别存储类别 数据类型数据类型 变量名变量名2、变量的划分、变量的划分按作用域按作用域按生存期按生存期按变量的存放位置按变量的存放位置 局部变量局部变量全局变量全局变量自动变量自动变量静态局部变量静态局部变量寄存器变量寄存器变量形式参数形式参数动态存储动态存储静态存储静态存储自动变量自动变量寄存器变量寄存器变量形式参数形式参数静态局部变量静态局部变量全局变量全局变量静态局部变量静态局部变量全局变量全局变量动态存储区动态存储区静态存储区静态存储区寄存器寄存器 自动变量自动变量形式参数形式参数寄存器变量寄存器变量程序举例程序举例例例8-16 编写一个函数编写一个函数swap用于交换两个整数的值,例如:设用于交换两个整数的值,例如:设a=3,b=4,调用函数,调用函数swap后,得后,得a=4,b=3

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号