收藏 分享(赏)

虎贲C语言第七章.ppt

上传人:fmgc7290 文档编号:8461694 上传时间:2019-06-28 格式:PPT 页数:46 大小:382.50KB
下载 相关 举报
虎贲C语言第七章.ppt_第1页
第1页 / 共46页
虎贲C语言第七章.ppt_第2页
第2页 / 共46页
虎贲C语言第七章.ppt_第3页
第3页 / 共46页
虎贲C语言第七章.ppt_第4页
第4页 / 共46页
虎贲C语言第七章.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

1、第7章 函数,_ 虎贲讲师:路谨铭,_,章节知识点:,7.1 函数概述及定义 7.2 函数的声明、调用及返回值 7.3 函数的嵌套调用 7.4 函数的递归调用 7.5 数组与函数 7.6 变量的作用域 7.7 变量与函数的存储分类 7.8 函数的参数传递,笔试考点分布,机试考点分布与分析,7.1 函数概述及定义,(1)一个程序是由预编译部分和一个main函数组成,函数是程序的基本单位。 (2)函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能。 (3)函数的分类 从函数的定义角度:库函数、自定义函数。 从返回值的角度划分:有返回值函数、无返回值函数。 从函数的参数传递角度划分:无参函

2、数、有参函数。,函数的定义,1.无参函数的定义形式:类型标识符 函数名( )声明部分执行部分,类型标识符指本函数的返回值类型,包括整型、浮点型、字符型以及指针类型等等。函数名是用户定义的标识符,函数名后有一对空括号,必不可少。我们发现我们自定义的函数和main函数结构非常相似,同样包括声明部分和执行部分。 说明:当我们不需要返回值类型时,函数类型即为空类型,我们在函数名前面添加void即可。 例如:我们可以改写一个函数定义:void huben()printf (“虎贲欢迎您 n”);,类型标识符 函数名(形式参数表列)声明部分执行部分 这里添加了一个形式参数表列,在形参表列中给出的参数称为形

3、式参数,简称形参,又叫虚参,它们由数据类型加变量名组成,各参数之间用逗号间隔。当函数被调用时,主调函数将赋予这些形式参数实际的值。,2.有参函数定义的一般形式,例如:假设我们定义一个绝对值函数:int jueduizhi(int n) /*定义了一个名叫jueduizhi的函数*/if (n=0) return n; /*判断n是否大于0,大于0返回n*/ else return n; /*否则返回-n*/,章节知识点:,7.1 函数概述及定义 7.2 函数的声明、调用及返回值 7.3 函数的嵌套调用 7.4 函数的递归调用 7.5 数组与函数 7.6 变量的作用域 7.7 变量与函数的存储分

4、类 7.8 函数的参数传递,7.2 函数的声明、调用及返回值,例7.1: int jueduizhi(int n) /*先定义了一个名叫jueduizhi的函数*/if (n=0) return n; /*如果n=0,则返回n的值*/else return n; /*否则,返回-n的值*/ main()int jueduizhi(int n); /*对jueduizhi函数的声明*/int x,y;scanf(“%d“,函数声明的一般形式为:类型说明符 被调函数名(类型 形参,类型 形参);在例7.1中主调 main函数就对被调jueduizhi函数进行了声明:int jueduizhi(in

5、t n);如果函数的返回值是整型,可以不对被调函数作说明,这时系统按整型处理。另外当被调函数定义出现在主调函数之前时,可以直接调用。在例7.1中,函数jueduizhi函数的定义放在main 函数之前,因此int jueduizhi(int n);这条声明语句是可以省略的。,7.2.1 函数的声明,函数调用的一般形式是:函数名(实际参数表) 在例7.1中: main()int jueduizhi(int n); int x,y;scanf(“%d“,7.2.2 函数调用,7.2.3 函数的返回值,(1)返回值必须通过return语句返回主调函数。即:return 表达式;或 return (表

6、达式);说明:对于一个函数,每次只能使用一个return 语 句,只能返回一个函数值。 (2)函数返回值的类型应和主调函数中的类型保持一致。 (3)大多数情况下不需要返回函数值,只需将类型说明符写为”void”,即空类型。,int jueduizhi(int n) /*先定义了一个名叫jueduizhi的函数*/if (n=0) return n; /*如果n=0,则返回n的值*/else return n; /*否则,返回-n的值*/,章节知识点:,7.1 函数概述及定义 7.2 函数的声明、调用及返回值 7.3 函数的嵌套调用 7.4 函数的递归调用 7.5 数组与函数 7.6 变量的作用

7、域 7.7 变量与函数的存储分类 7.8 函数的参数传递,7.3 函数的嵌套调用,语言不允许嵌套定义,但是允许函数的嵌套调用。即在被调函数中又调用了其它函数。如图所示:,#include“stdio.h“ void f2( ) printf(“进入被调函数2.n“); void f1( ) printf(“进入被调函数1.n“);f2( ); /*在f1函数中调用了f2函数*/printf(“回到被调函数1.n“); main() printf(“进入主函数.n“);f1( ); /*在main函数中调用了f1函数*/printf(“回到主函数.n“); ,例 7.2 函数嵌套,7.4 函数的

8、递归调用,一个函数在它的函数体内调用它自身称为递归调用, 这种函数称为递归函数。例如:,int f(int n)int sum;if(n=1)sum=1; else sum= f(n-1)*n;return sum; ,#include long jiecheng(int n) long sum;if(n=0|n=1)sum=1;else sum=jiecheng(n-1)*n; /*利用递归函数实现阶乘*/return(sum); main() int n;long y;printf(“n请输入一个数字:n“);scanf(“%d“, ,例7.3 用递归函数计算n!,章节知识点:,7.1 函

9、数概述及定义 7.2 函数的声明、调用及返回值 7.3 函数的嵌套调用 7.4 函数的递归调用 7.5 数组与函数 7.6 变量的作用域 7.7 变量与函数的存储分类 7.8 函数的参数传递,7.5 数组与函数,7. 5. 1 数组元素作函数实参,7. 5. 2 数组名作为函数参数,数组也是一种数据类型,所以数组也可以作为函数的参数来使用,进行数据传送。数组用作函数参数时有两种形式,一是把数组元素作为实参使用,相当于把数组元素当作了普通变量;一是把数组名作为函数的形参和实参使用,数组名是一个地址常量,所以数组名传递的数据是地址值。,7.5.1 数组元素作函数实参,例7.5:判别一个整数数组中各

10、元素的值,若大于0 则输出,若小于等于0则输出0值。void f(int n)if(n0) printf(“%d “,n); else printf(“%d “,0);main()int a10,i;printf(“请输入10个整数:n“);for(i=0;i10;i+)scanf(“%d“, /*调用f函数*/ ,数组元素做函数实参,相当于把数组元素当作了普通变量,实现的是单向的值传送,7.5.2 数组名作为函数参数,数组名是一个地址常量,它作为函数参数与数组元素作参数有几点不同如下差异:,(1)用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明。,

11、在用数组名作函数参数时,不是进行值的传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。,因为数组名就是数组的首地址,因此在数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。,例7.6:数组a中存放了一个学生5门课程的成绩,求平均成绩。 float aver(float a5) int i;float av,s=a0; for(i=1;i5;i+) s=s+ai;av=s/5;return av; void main() float

12、sco5,av;int i;printf(“ninput 5 scores:n“);for(i=0;i5;i+)scanf(“%f“, ,(3)在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。例如,可以写为:void nzp(int a)或写为void nzp(int a,int n) 其中形参数组a没有给出长度,而由n值动态地表示数组的长度。n的值由主调函数的实参进行传送。,(2)形参数组和实参数组的长度可以不相同,因为在调用时,只传送首地址而不检查形参数组的长度。当形参数组的长度与实参数组不一致时,虽不至于出现语法错误(编译能通过),但程序执行结果将与实际不符,

13、这是应予以注意的。,void nzp(int a,int n) int i;printf(“nvalues of array a are:n“);for(i=0;in;i+)if(ai0) ai=0;printf(“%d “,ai); ,main() int b5,i;printf(“ninput 5 numbers:n“);for(i=0;i5;i+)scanf(“%d“, ,例7.7:,章节知识点:,7.1 函数概述及定义 7.2 函数的声明、调用及返回值 7.3 函数的嵌套调用 7.4 函数的递归调用 7.5 数组与函数 7.6 变量的作用域 7.7 变量与函数的存储分类 7.8 函数的

14、参数传递,7.6 变量的作用域 7.7 变量与函数的存储分类 7.8 函数的参数传递,7.6 变量的作用域,对于各个变量,并不是所有变量到处都可以用的。每个变量都有着自己所能起作用范围,这样的范围我们称之为作用域。,变量按作用域范围可分为两种,即局部变量和全局变量。,7.6.1 局部变量局部变量又被称为内部变量。局部变量定义的位置是在函数内部,离开了它所在的定义函数后该变量就是一个非法变量。,#include int f(int a) /*定义了变量a,a的作用域从这里开始*/ int b; /*定义了变量a,a的作用域从这里开始*/b=a+1; return b; /*变量a、b的作用域结束

15、*/ main() int x=1,y; /*变量x、y的作用域就只能是main函数*/y=f(x);,例7.8:,全局变量的说明符为extern。全局变量也称为外部变量,它一旦定义,即可在相应的函数内直接使用,而不需要再去定义。 例如:int a,b; /*外部变量*/int f() main() /*主函数* 在本例中,a、b既是全局变量,那么在f函数、main函数中都可直接使用。,7.6.2 全局变量,例7.9:求两数之中最大的数字。 int a=1,b=2; /*a,b为外部变量*/ max(int a,int b) /*a,b为局部变量*/ int c;c=ab?a:b;return

16、(c); main() int a=3;printf(“%dn“,max(a,b); ,在一个源文件中如果外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,以局部变量为准。,7.7 变量与函数的存储分类,C语言中变量定义的完整形式是:存储类别 数据类型 变量名; 存储类别由“ ”括起,表示该项不是必须的,是可选部分。用于指定存储类别的关键字包括: static:静态的,表示所定义的变量是静态变量; auto:自动的,表示所定义的变量是自动(动态)变量; resgiter:寄存器的,表示该变量地址不在内存,而是分配到寄存器中。,7.7.1 变量的存储分类,变量的存储类别决定了

17、变量的生存期,即变量的值何时存在。从变量值存在的时间角度来看,可以将变量分为两大类:静态变量和动态变量。,1、静态变量 (关键字static)静态变量是在编译时分配存储空间,所占存储单元直到程序结束时才释放,它的值在程序运行过程中一直存在。且变量的初始化只进行一次。,静态变量包括:(1)全局变量:全局变量总是静态分配的,不能使用auto、resgister关键字定义全局变量;关键字static用于全局变量定义时,具有特定含义:将限制该变量只在当前文件有效,不能被其它文件访问。(2)局部变量: 省略变量存储类别时,局部变量默认情况下为auto类型,存储在动态存储区中。用static关键字可以定义

18、一种特殊的局部变量静态局部变量,指定将局部变量分配在静态存储区中。,例7.10 分析以下程序运行后的输出结果:,fun(int a) int b=0; static int c=3;b+;c+;return (a+b+c); main() int i,a=5;for(i=0;i3;i+)printf(“%d%d”,i,fun(a); ,通过对fun函数的分析可知:,当函数执行结束后,局部静态变量所占存储单元并不释放,并保留变量的值,当再次调用该函数时,不再执行初始化语句。,2.自动变量(动态变量) 指存储类别为auto的变量。自动变量的存储空间是当程序执行到定义它的函数或语句块时才分配的,当函

19、数执行结束后自动释放,变量的值也就不再存在。每次调用函数时系统自动分配存储空间,并重执行初始化语句。对于没指定初值的局部变量,编译程序不作任何处理。省略变量的存储类别说明时,局部变量的存储类别默认为auto,因此,auto关键字经常省略不写。自动变量包括:形式参数,函数内定义的变量(未使用static),语句块内定义的变量。,3.寄存器变量 采用resgister关键字定义的变量也是一种局部变量,只不过该变量的地址不在内存而是在寄存器中。由于寄存器的存取速度远大于内存的存取速度,一般将循环变量等访问频率较高的变量指定为寄存器类型,以提高程序执行速度。,1、用extern说明函数 我们可以在函数

20、的返回值类型前面加extern来说明函数,使用extern说明的函数称为外部函数。例如: extern int fun( ) extern可以缺省,我们以前定义的函数都属于外部函数。外部函数可以被其他编译单位内的函数调用。如果在其他编译单位需要调用该函数,必须在调用前使用extern对其所调用的函数进行说明。 2、用static说明函数 使用static进行说明的函数称为静态函数,也叫做内部函数。静态函数只能被本编译单位内的函数调用,不能被其他编译单位内的函数调用。,7.7.2 函数的存储分类,7.8 函数的参数传递,参数:形式参数和实际参数,形参出现在函数定义中,在整个函数体内都可以使用,离

21、开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。,函数的形参和实参具有以下特点:1、形参变量只有在被调用时才分配内存单元,在调用结束时,立刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。 2、实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。,3、实参和形参在数量上,

22、类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。4、函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。,main() int a,b;printf(“input numbern“);scanf(“%d,%d“, ,例7.11 分析以下程序运行后的输出结果:,函数历来是考试重点,函数可以结合数组,可以结合指针,大家都要注意。学完本章,我们应该熟悉:函数分为库函数、用户自定义函数、有返回值函数、无返回值函数、有参函数和无参函数;函数调用是可以是有参调用、无参调用,调用过程中参数的传递可以是传值调用,也可以是传地址调用,这是考试难点;数组与函数;函数在调用过程中变量的作用域,分清变量的存储方式和作用范围。,本章总结,

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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