c语言第八章函数.ppt

上传人:牧羊曲112 文档编号:5426492 上传时间:2023-07-05 格式:PPT 页数:41 大小:1.08MB
返回 下载 相关 举报
c语言第八章函数.ppt_第1页
第1页 / 共41页
c语言第八章函数.ppt_第2页
第2页 / 共41页
c语言第八章函数.ppt_第3页
第3页 / 共41页
c语言第八章函数.ppt_第4页
第4页 / 共41页
c语言第八章函数.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《c语言第八章函数.ppt》由会员分享,可在线阅读,更多相关《c语言第八章函数.ppt(41页珍藏版)》请在三一办公上搜索。

1、我的程序有上百行,如何调试最方便?我想设计一个程序完成下面的计算:其中,m、n为正整数且mn 该如何设计程序最有效?,?,内容提要:概述 函数的定义 函数参数(变量、数组)和函数值 函数的调用函数的嵌套调用 局部变量和全局变量及变量的存储类别,第八章 函 数,8.1 概述,C程序的结构如图所示一个C程序可以分为若干个函数每个程序有且只能有一个主函数(main),其它函数都是“子函数”子函数可以互相调用,但主函数不能被调用一个C程序由一个或多个文件构成,一个源程序文件是一个编译单位,说明:C程序的执行从main函数开始,调用其它函数后仍回到main函数,程序在main函数结束时结束。所有子函数都

2、是平行的,任何子函数都不属于其它函数。从用户角度看,函数可分为:标准函数,即库函数自定义函数从函数形式看,可分为:无参数函数:如printstar()有参数函数:如printf(),例8-1#include“stdio.h”void printstar()printf(“*n”);void printmessage()printf(“Hello,world.n”);printstar();void main()printstar();printmessage();,*Hello,world.*,函数定义的一般形式:类型说明 函数名(形式参数说明)函数体形式参数说明方法:类型说明 变量名,类型说

3、明 变量名1、无参数的定义形式 类型说明 函数名()函数体2、有参数的定义形式 类型说明 函数名(形式参数说明)函数体3、空函数的定义形式 类型说明 函数名(形式参数说明),#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”,8.2 函数定义的一般形式,例如:int sum(int x,int y)int z;z=x+y;return(z);又如void printhello(char name)printf(“Hello,%sn”,name);,函数定义

4、的一般形式:类型说明 函数名(形式参数说明)函数体一般情况下,函数体由两部分组成:局部变量说明 语句 局部变量:函数体内定义的变量。其有效范围仅限于所在函数的内部,离开函数体则无意义。,例如:int sum(int x,int y)int z;z=x+y;return(z);又如void printhello(char name)printf(“Hello,%sn”,name);,8.3 函数参数和函数的值,一个C程序由若干个函数组成,各函数调用时经常需要传递一些数据。即调用函数把数据传递给被调用函数,经被调用函数处理后,得到一个确定的结果,在返回调用函数时,把这结果带回调用函数。,a,b,z

5、,各函数间的信息往来是由参数传递和返回语句实现的,主调函数,被调函数,一、形式参数和实际参数 函数参数:用于函数间数据的传递形式参数:定义函数时使用的参数实际参数:调用函数时使用的参数 函数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”,59 95Max is 95,一、形式参数和实际参数 说明:1、定义函数时,必须

6、说明形参的类型。形参只能是变量或数组2、函数被调用前,形参不占用内存;函数调用结束后,形参所占用的内存也将被收回。3、实参可以是常量、变量或表达式。4、实参也形参的类型必须一致。字符型和整型可以互相匹配。5、C语言中实参对形参的数据传递是“值传递”,即单向传递。它仅由参数的对应位置确定,与名字无关。,#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”,int max(int b,int a)int c;z=(ab)?a:b;return(c);,一、形式参

7、数和实际参数例8-3 读程序,写出运行结果,Sum of 1,3 is 4,一、形式参数和实际参数二、函数的返回值 1、返回函数值的方法 函数的返回值也就是函数值,是 一个确定的值。如果一个函数由返回值,就必 须使用return语句。一个函数中可以有 一个以上的 return语句,但不论执行到哪个 return都将结束函数的调用返回 主函数。return语句中的括号可以省略;return后面的值可以是一个表 达式。,#include“stdio”int max(int x,int y)int z;z=(xy)?x:y;return(z);void main()int a,b,c;scanf(“

8、%d%d”,if(xy)return x;return y;,return(xy?x:y);,二、函数的返回值1、返回函数值的方法2、函数值的类型 函数的类型即函数值的类型。例如,函数max是int型的也就是函数值是int型的。省略了类型说明的函数是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”,二、函数的

9、返回值1、返回函数值的方法2、函数值的类型3、不需要返回值的函数 如果函数中没有使用return语句,函数返回的是一个不确定的数值。(参见例8-1)如果一个函数不需要返回值(表示一个过程),可以用void做类型说明。如果一个函数被声明为void类型,就不允许再引用它的返回值(即只能用函数语句形式调用)。,例8-1#include“stdio.h”void printstar()printf(“*n”);void printmessage()printf(“Hello,world.n”);printstar();void main()printstar();printmessage();,8.4

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”,float max(float x,float y)float z;z=(xy)?x:y;re

11、turn(z);,一、函数调用的一般形式二、函数调用的方式 1、函数语句形式为:函数名(实参表列);例如:printmessage();printf(“%d”,p);说明:这种方式不要求函数带返回值,函数仅完成一定的操作。,2、函数表达式函数的返回值参与运算 例如:m=max(a,b);m=3*max(a,b);printf(“Max is%dn”,max(a,b);说明:这种调用方式不能用于void型函数。,一、函数调用的一般形式二、函数调用的方式三、函数调用的执行过程 按从右向左的顺序,计算实参中各表达式的值。按照位置,将实参的值一一对应的传给形参。执行被调用函数。当遇到return(表达

12、式)语句时,计算表达式的值,并返回主调函数。,例8-5 读程序,写出结果#include“stdio.h”float iabs(float x)return(x0?x;-x);void main()float x=-1.2,y;y=iabs(x)printf(“x=%f,iabs(x)=%fn”,x,y);,一、函数调用的一般形式二、函数调用的方式三、函数调用的执行过程四、函数的原形说明在程序中调用函数需满足以下条件:1、被调函数必须存在,且遵循“先定义后使用”的原则。2、如果被调函数的定义在主调函数之后(位置),可以先给出原形说明。原形说明的形式为:类型说明 函数名(参数类型,参数类型,);

13、,说明:库函数的原形说明存放在头文件(.h)中,通过使用include预处理命令将这些原形说明插入程序中。,8.5 函数的嵌套调用,嵌套调用是指在一个函数的函数体中又调用了其它函数。,例8-1#include“stdio.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,满足x1

14、x2且f(x1)和f(x2)的符号相反2、过f(x1)、f(x2)两点做直线(弦),交于x轴与x,其中3、求f(x);若f(x)与f(x1)同符号,则根必在(x1,x2)区间内,令x1=x;反之,根必在(x1,x)区间内,令x2=x4、重复2和3,直到|f(x)|(为一个很小的数,如10-6)为止。此时有f(x)0,例8-6 用弦截法求方程的根。x3-5x2+16x-80=0程序说明:1、函数f(x)=x3-5x2+16x-802、用函数xpoint(x1,x2)求弦截点 x的坐标3、用函数root(x1,x2)求区间(x1,x2)上的根,|y|,思考用函数编程的好处,例 编写程序求Cnm=分

15、析:重复三次求阶乘运算,只是每次的值不同。将求阶乘的过程编写一个函数fac,以不同的参数值k来调用函数,input m,n:5 88!/(5!(8-5)!)=56,8.6 函数的递归调用,许多数学函数都是递归形式定义的:递归调用是指在调用一个函数时又直接或间接的调用了函数本身。直接递归调用 间接递归调用注意:这两个递归都无法结束。因此应含某条件控制递归调用结束,例8-7 有5个人坐在一起,问第五个人 多少岁?答:比第四个大2岁。第四个人说他比第三个人大2岁,第三个人比第二个人大2岁,第 二个人比第一个人大2岁,问第 一个时回答是10岁。第五个人 到底多大,例8-8 用递归法求阶乘n!(n0)使

16、用函数做:,8.7 数组元素作为函数的参数,一、数组元素做函数实参 与变量做实参一样,数组元素做实参是“值传递”。例8-9:求十个任意整数中的 最大数。,Enter 10 integer:23 5 4 1 0 56 79 43 2 15Max is 79,一、数组元素做函数实参二、一维数组与函数参数 若函数的形参是数组,对应的实参必须是数组名。说明:1、实参数组也形参数组的类型必须一致。2、用数组名做参数时,传递的是数组的首地址,因此形参数组也可以不指定大小。但需另设一个参数,传递数组元素的个数。,一、数组元素做函数实参二、一维数组与函数参数3、数组做参数时,形参数组和实参数组共享同一内存单元

17、。如果形参数组的元素的值被修改,实参数组元素的值也就被改变了。例 8-10 用比较法排序(从大到小),一、数组元素做函数实参二、一维数组与函数参数三、多维数组与函数参数1、多维数组可以做为函数的参数。2、如果形参是多维数组,可以省略第一维大小,但不能省略其它维大小。例8-11 有一个3*4的矩阵,求最大元素值。,实参与形参的小结,8.8 局部变量与全局变量,一、局部变量 下列变量是局部变量 1、在一个函数内部定义的 变量 2、函数的形式参数 3、在某个复合语句中定义 的变量说明:1、局部变量只在自己的范围内有效。2、如果局部变量的有效范围有重叠,则有效范围小的优先。,一、局部变量二、全局变量

18、在函数之外定义的变量(外部变量)是全局变量全局变量的有效范围是:从定义变量的位置开始到源文件结束。在一个函数中,既可以使用本函数中的局部变量,也可以使用有效的全局变量。,一、局部变量二、全局变量说明:1、利用全局变量可以在函数间传递数据。例 8-12 有10个学生的学习成绩,求平均分,最高分和最低分。分析:用一个函数返回三个数据,除了用函数值外,可以借助于全局变量。可见,利用全局变量可以减少函数的参数,#include“stdio.h”float max=0,min=0;float average(float score,int n)int i;float sum=score0;max=min

19、=score0;for(i=1;iscorei)min=scorei;return sum/n;void main()float avg,score10;int I;for(i=0;i10;i+)scanf(“%f”,一、局部变量二、全局变量 1、利用全局变量可以在函数 间传递数据。2、尽量少使用全局变量。3、若全局变量与局部变量同 名,则局部变量优先。,8.9 变量的存储类别,一、变量的静态存储和动态存储 全局变量与局部变量:变量的作用域 静态存储变量和动态存储变量:变量的存储类别,即生存期 内存中供用户使用的存储空间包括:程序区 静态存储区:编译时分配空间 动态存储区:执行时分配空间,一、

20、变量的静态存储和动态存储二、局部变量的存储类别 1、自动变量 存储在动态存储区,用auto说明 如:int f(int a)auto int b,c=3;通常,将auto省略 如:形参a,变量b、c都是自动变量,调用该函数时,系统 给他们分配存 存储空间,函数调用结束是自动释放存储 空间,一、变量的静态存储和动态存储二、局部变量的存储类别 1、自动变量 2、局部静态变量 占用静态存储区 用static说明 说明:局部静态变量属于静态存储 类别。在整个程序运行期间 都不释放存储空间。局部静态变量在编译时赋初 值(仅赋一次值)。如果定义局部静态变量没有 赋初值,编译时会自动赋初 值 局部 静态变量

21、只能在定义它 的函数内被引用(它存在但不能被其它函数使用),1!=12!=23!=64!=245!=120,1、自动变量2、局部静态变量3、寄存器变量 计算机寄存器的个数有限。寄存器变量对寄存器的占用是动态的。有的系统将寄存器变量转换为自动变量来处理,而有的系统会自动设置寄存器变量。,一、变量的静态存储和动态存储二、局部变量的存储类别三、全局变量的存储类别 1、全局变量都是静态的 2、用extern说明一个在其它 源文件中定义的全局变量 3、用static说明一个不能在其 它源文件中引用的全局变量。应尽量少的使用全局变量,四、存储类别的小结1、变量的定义方法存储类别 数据类型 变量名2、变量的划分按作用域按生存期按变量的存放位置,程序举例,例8-16 编写一个函数swap用于交换两个整数的值,例如:设a=3,b=4,调用函数swap后,得a=4,b=3,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号