收藏 分享(赏)

C语言函数篇讲解.ppt

上传人:weiwoduzun 文档编号:3170236 上传时间:2018-10-05 格式:PPT 页数:41 大小:433KB
下载 相关 举报
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页
点击查看更多>>
资源描述

1、第六章 函数,教学目标:掌握函数的定义; 理解并运用函数的调用; 理解函数的声明。 教学重点:函数的定义; 函数的调用。 教学难点:函数的定义。 教学时数:4学时,6.1 概述,printstar( ) printf(“*n”); main( ) printstar( );printmessage( );printstar( ); printmessage( ) printf(“ How do you do!n”);,例:,结果: *How do you do! *,说明:,1. 一个源程序文件由一个或多个函数组成,但必须有且仅有一个main函数。 2. C程序的执行从main函数开始,调用其

2、他函数后,流程回到main函数,main函数结束整个函数的运行。 3. 由主函数调用其他函数,其他函数也可互相调用,但不能调用main函数。同一个函数可以被一个或多个函数调用任意多次。 4. 从用户角度看,函数分为两种: 标准函数:即库函数,由系统提供。 用户自定义函数:用户自己定义的。 5. 从函数形式看,函数分为两种:无参函数。 有参函数。,6.2 函数定义的一般形式,一 函数定义的一般形式列表类型标识符 函数名(类型1 形参1,类型2 形参2,) 声明部分语句 二 说明: 1.所有函数在定义时都是互相独立的,即不能嵌套定义; 2.类型标识符:说明了函数返回值的类型,当返回值为int时,可

3、省略不写; 3.函数名:遵循标识符的命名规则;同一个函数中函数名必须唯一;,形式参数,4.形参:只能是变量,每个形参前要有类型名;当定义的 函数没有形参时叫作“无参函数” ;,形式:类型标识符 函数名() 声明部分语句 5.函数体:当声明部分和语句都没有时,称为“空函数”,空函数没有任何实际作用;形式:类型说明符 函数名( ) 例如:dummy( ) ,例如: int max ( int x, int y ) int z; z=xy?x:y;return(z);,函数名,返回值类 型,形参1,形参2,声明部分,语句(执行部分),函数体,6.3 函数参数和函数的值,一 形式参数和实际参数 实际参

4、数: 调用函数时,函数名后面括弧中的参数称为“实际参数”(简称实参)。 形式参数:定义函数时,函数名后面括弧中的参数称为“形式参数”(简称形参)。 例如:main( ) int a,b,c; scanf(“%d,%d”,二 关于形参与实参的说明:,1. 未出现函数调用时,形参变量不占内存中的存储单元。在发生函数调用时,形参才被分配内存单元。调用结束后,形参所占的内存单元被释放。 2. 实参可以是常量、变量或表达式,必须有确定的值。在调用时,将实参的值赋给形参变量。 3. 实参与形参的类型应相同或兼容。如果类型不一致,则将实参转换为和形参类型一致时再赋值。 例如:main( ) int c; c

5、=max(3.5,5+2); printf(“Max is %d”,c);max(int x, int y) int z; z=xy?x:y; return(z); ,4. 实参变量对形参变量是单向的“值传递” 。即只能实参传给形参,不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。 main( ) int a=10, b=20;alter(a, b);printf(“a=%d,b=%dn”,a,b); alter(int x, int y) int t;t=x; x=y; y=t; ,10,20,a,b,x,y,10,20,20,10,总结:形参的值发生改变,并不能影响实参。

6、,三 函数的返回值,1. 函数通过return语句返回函数的值,若不需要返回函数值,可以不要return语句。形式:return (表达式); return (变 量);return (常 量);例如:return z;或return 0;或return (a+b); 2. 定义函数时,函数的返回值类型应与return语句中的表达式类型一致。如果不一致,则以函数类型为准。,括号可省略,3. 若函数中没有return语句,函数也会带回一个不确定的值,为了明确表示“不带回值”,用关键字“void”定义“无类型” (或称“空类型”)。 例:void printstar( ) printf(“*n”)

7、; main( ) printstar( );printmessage( );printstar( );void printmessage( ) printf(“ How do you do!n”); 这样,系统就保证使函数不带回任何值。,6.4 函数的调用,一 函数调用的一般形式函数名(实参表列);或 函数名();说明:1.各实参间用逗号格开。2.实参与形参的个数应相同,类型应一致。3.被调用函数必须是已经存在的函数。,有参函数的调用形式,无参函数的调用形式,二 函数调用的方式,按出现的位置分,有如下三种函数调用方式: 1. 函数语句。函数不带回值,只完成一定的操作。 2. 函数表达式。要求

8、函数带回确定值,参加表达式运算。 3. 函数参数。要求函数带回确定值,作为一个参数。,例,main() int a=10,b=20,c=30,d,e;fun( ); d=max(a,b);printf(“max=%dn”, d);e=max(a,b)+c;printf(“max=%dn”, e);printf(“max=%dn”,max(a,c); int max(int x, int y) return (xy?x;y); fun() printf(“*”);,三 对被调用函数的声明,函数声明的一般形式:函数类型 函数名(参数类型1,参数类型2, );例: int max(int, int)

9、;或 int max(int x, int y); 说明: 1.使用用户定义函数时,要对函数进行声明。 2.如果函数的返回值类型为int,可以不用声明。,例:,main( ) float add(float x, float y); /*对被调函数声明*/float a,b,c;scanf(“%f,%f”, ,3. 若被调用函数定义出现在主调函数之前,可以不必声明。 例:float add(float x,float y)float z;z=x+y;return(z); /*返回z的值*/main()float a,b,c;scanf(“%f,%f”,4. 若在函数定义之前, 在函数的外部已做

10、了函数声明,则在各个主调函数中不必对所调用的函数再作声明。 例: char letter(char,char);float f(float,float);int i(float,float);main()char letter(char c1,char c2)float f(float x,float y)int i(float j,float k),四 程序举例,例1:用函数调用的方法求两个数的和。,float add(float x, float y) return (x+y); main() float a,b,sum;scanf(“%f%f”, ,例2:通过函数调用的方式,求三个整数的

11、最大值。,int maxnum(int x, int y, int z) int m;m=x;if(my) m=y;if(mz) m=z;return m; main() int a, b, c, max;scanf(“%d%d%d”, ,a 函数调用b函数a函数结束,main函数调用a函数结束,b 函数b函数结束,6.5 函数的嵌套调用,C语言不能嵌套定义函数,但可以嵌套调用函数,即允许在调用一个函数的过程中,又调用另一个函数。例如:,main( ) int x,y,sum;x=5; y=6;sum=add(x,y);printf(“%d”,sum); 运行结果: 41,fun( int t

12、) return t*t; ,add(int a ,int b) int z;z=a+fun(b);return z; ,汉诺塔问题 ( Hanoi),6.7 数组作为函数参数,数组元素作函数参数 数组名作函数参数 多维数组名作函数参数,一. 数组元素作函数实参,与变量作实参一样,是单向值传递,例1:输入一行字符,分别统计出其中大写字母和 小写字母的个数。,#include “stdio.h” main() char a30;int i, k=0, p=0;gets(a);for(i=0; ai!=0; i+) if(fun(ai)=1) k+;if(fun(ai)=2) p+; printf

13、(“大写字母个数:%d”, k);printf(“小写字母个数:%d”, p); ,int fun(char x ) if(x=A ,二. 数组名作函数实参,传递的是数组的首地址(此时形参和实参指的是同一内存单元),1. 用数组名作函数参数,应该在主调函数和被调函数分别定义数组。 2. 实参数组名 形参数组名或指针变量 3. 实参数组与形参数组类型应一致。4. 系统将实参数组的首地址传给形参数组5. 用数组名作函数参数时,形参数组的改变也可以使实参数组随之改变。,例,int fun(int b ) main() int a10;fun(a); ,形参还可以写成int b10或int b20,例

14、2:有一个一维数组score,内放10个学生成绩, 求平均成绩。,float fun(float a10); main() float s10,ave;int i;for(i=0;i10;i+)scanf(“%f ”, ,float fun(float a10 ) int i;float sum=0,aver;for(i=0;i10;i+)sum=sum+ai;aver=sum/10;return aver; ,函数声明,s0 s1 s2 s3 s4 s5 s6 s7 s8 s9,a0 a1 a2 a3 a4 a5 a6 a7 a8 a9,sn和an指的是同一单元。,例3:编写函数,用选择排序

15、对数组中的10个数按 由小到大排序。,main() int a10, i;for(i=0; i10; i+)scanf(“%d”, ,void fun(int b ) int i, j, k, t;for(i=0; iaj) k=j;if(k!=i) t=ai;ai=ak;ak=t; ,三. 用多维数组名做函数参数,int fun1(int b 4) int fun2(int c34) main() int a34;fun(a);fun(a); ,局部变量:在一个函数内部定义的变量。 有效范围:只在本函数范围内有效。全局变量:在函数外部定义的变量(又叫外部变量)。有效范围: 从定义变量的位置开

16、始到本源文件结束,可以为本文件其他函数所共用。,6.8 局部变量和全局变量,变量按其作用域分类可分为局部变量和全局变量。,局部变量: float f1(int a) /*函数f1 */ int b , c; char f2(int x , int y ) /* 函数f2 */ int i , j ; main( ) /*主函数 */ int m , n ; ,a,b,c 有效,x, y , i , j 有效,m , n 有效,有效范围:只在本函数范围内有效。,说明:,1. 函数内部定义的变量(局部变量) , 只在该函数范围内有效。(main主函数也不例外) 一个函数不能使用其他函数中定义的变量

17、. 2. 不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。 3. 形式参数也是局部变量。 4. 可以在复合语句中定义变量, 这些变量只在复合语句中有效。,例,main() int a,b;: int c;c=a+b;: ,局部变量c的作用范围,局部变量 a、 b 的 作用范围,全局变量: int p=1,q=5; float f1(int a) char c1,c2; char f2(int x , int y ) main( ) /*主函数*/ int m,n; ,全局变量 c1, c2 的 作用范围,全局变量p, q的作用范围,有效范围: 从定义变量的位置开始到本源文件结束

18、,可以为本文件其他函数所共用。,注意:,当局部变量和全局变量重名时,则在局部变量的作用范围内,全局变量不起作用。,int p=1,q=5; float fun(int a) int p; main( ) /*主函数*/ int m,n; ,全局变量 p 的作用 范围,全局 变量 q的 作用 范围,局部变量 p 的作用 范围,6.9 用static声明局部变量,有时希望函数中的局部变量的值,在调用结束后不消失,而保留原值。即其占用的存储单元不释放,下次调用该函数时,该变量已有值(上一次调用结束时的值)。这时应定义该局部变量为“局部静态变量”,用static加以声明。,f(int a)auto b

19、=0;static c=3;b=b+1;c=c+1;return(a+b+c);main( )int a=2, i ;for(i=0;i3;i+)printf(“%d”,f(a);运行结果为 7 8 9,例:,0,4,4,0,1,3,b c,第一次调用开始,第一次调用结束,第二次调用开始,第二次调用结束,5,1,对局部静态变量的4点说明:,1、局部静态变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(局部动态变量)属于动态存储类别,占动态存储区空间,函数调用结束就释放。2、对局部静态变量,只在编译时赋初值一次,以后每次调用函数时不再重新赋初值,而只是保留

20、上次函数调用结束时的值。而对自动变量赋初值,不是在编译时进行的, 而是在函数调用时进行。每调用一次函数,重新给自动变量赋一次初值。,3、若定义局部变量不赋初值的话,对静态变量来说,编译时自动赋初值0(数值型)或空字符(字符型)。而对自动变量来说,它的值是一个不确定的值。因为每次函数调用结束后存储单元已释放,下次调用又重新分配单元,而所分配的单元中的值是不确定的。4、虽然局部静态变量在函数调用结束后仍然存在,但其它函数不能引用它。,以下2种情况需要用局部静态变量:(1)需要保留函数上一次调用结束时的值。,例:打印1到5的阶乘值。 int fac(int n) static int f=1;f=f*n; return(f); main( ) int i;for(i=1; i=5; i+) printf(“%d!=%dn”, i, fac(i); ,运行结果为: 1!=1 2!=2 3!=6 4!=24 5!=120 每次调用fac(i) ,打印一个i!值,同时保留这个i!的值于f 中,以便下次再乘(i+1)。,(2)如果初始化后,变量只被引用而不改变其值,这时用局部静态变量比较方便,以免每次调用时重新赋值。用静态存储要多占内存,降低了程序的可读性,调用次数多时往往弄不清局部静态变量的当前值是什么。因此,要少用局部静态变量。,

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

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

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


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

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

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