C语言函数以及函数的调用ppt课件.ppt

上传人:小飞机 文档编号:2052347 上传时间:2023-01-04 格式:PPT 页数:53 大小:1,017KB
返回 下载 相关 举报
C语言函数以及函数的调用ppt课件.ppt_第1页
第1页 / 共53页
C语言函数以及函数的调用ppt课件.ppt_第2页
第2页 / 共53页
C语言函数以及函数的调用ppt课件.ppt_第3页
第3页 / 共53页
C语言函数以及函数的调用ppt课件.ppt_第4页
第4页 / 共53页
C语言函数以及函数的调用ppt课件.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《C语言函数以及函数的调用ppt课件.ppt》由会员分享,可在线阅读,更多相关《C语言函数以及函数的调用ppt课件.ppt(53页珍藏版)》请在三一办公上搜索。

1、第6章 函数,教学目标,1.熟练掌握函数的定义和使用方法,灵活定义与使用函数,掌握函数的嵌套调用和递归调用;2.熟练掌握用数组名作函数的参数,6.1 概述模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块,每个程序模块的作用是由函数完成。特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法:自上向下,逐步分解,分而治之,main()sub1()sub1();sub2();sub2(),【例6.1】简单的函数调用main()printstar();print_message();prints

2、tar();,printstar()printf(*n);print_message()/*print_message函数*/printf(“This is a C function!n”);,运行结果如下:*This is a C function!*,C是模块化程序设计语言,C程序结构,C是函数式语言必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束函数不能嵌套定义,可以嵌套调用,函数分类从用户角度标准函数(库函数):由系统提供用户自定义函数从函数形式无参函数有参函数,使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数

3、返回值意义和类型4、需要使用的包含文件,6.2 函数的定义一般格式,合法标识符,函数返回值类型缺省int型无返回值void,函数体,例 有参函数(现代风格)int max(int x,int y)int z;z=xy?x:y;return(z);,例 无参函数 printstar()printf(“*n”);或 printstar(void)printf(“*n”);,Void或形参,形参与实参形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式,例 比较两个数并输出大者,main()int a,b,c;scanf(%d,%d,说明:实参可以是常量、变量或表

4、达式,它们都必须有确定的值形参必须指定类型形参与实参类型顺序一致,个数相同形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放,函数的返回值形式:return(表达式);或 return 表达式;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数说明:函数中可有多个return语句,执行到哪个return语句哪个语句就起作用。若无return语句,遇时,自动返回调用函数若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换不返回函数值的函数,可明确定义为“空类型”,即void型函数,例 无返回值函数 void swap(in

5、t x,int y)int temp;temp=x;x=y;y=temp;,printstar()printf(*);main()int a;a=printstar();printf(%d,a);,例 函数带回不确定值,输出:10,void printstar()printf(*);main()int a;a=printstar();printf(%d,a);,编译错误!,例 函数返回值类型转换,main()float a,b;int c;scanf(%f,%f,输入:1.5,2.5,输出:Max is 2,6.3 函数的调用调用形式有参函数调用的一般形式:函数名(实参表);有参函数调用的一般

6、形式:函数名();说明:实参与形参个数相等,类型一致,按顺序一一对应。实参表列中的多个实参,各参数间用逗号隔开。实参表求值顺序,因系统而定(Turbo C 自右向左),main()int i=2,p;p=f(i,+i);printf(%d,p);int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);,例 参数求值顺序,main()int i=2,p;p=f(i,i+);printf(%d,p);int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-

7、1;return(c);,运行结果:0,运行结果:1,调用方式函数语句:把函数调用作为一个语句。例 printstar();printf(“Hello,World!n”);说明:不要求函数带回值,只要求函数完成一定的操作。函数表达式:函数出现在一个表达式中。例 m=max(a,b)*2;说明:要求函数带回一个确定的值以参加表达式运算。函数参数:函数调用作为一个函数的实参。例 printf(“%d”,max(a,b);m=max(a,max(b,c);,对被调用函数的声明和函数原型对被调用函数要求:必须是已存在的函数(库函数或用户自定义函数)库函数:#include 用户自定义函数:在同一文件中

8、,并且主调在被调之前,一般在主调函数中对被调用的函数原型声明。函数原型声明一般形式:函数类型 函数名(参数类型 参数名,.);作用:告诉编译系统函数类型、参数个数及类型,以便检验。此时的参数名可有可无,编译系统不检查参数名,参数名是什么都无所谓。函数定义与函数说明不同函数说明位置:程序的数据说明部分(函数内或外)下列情况下,可不作函数说明若函数返值是char或int型,系统自动按int型处理被调用函数定义出现在主调函数之前在函数定义之前且在函数外部作了声明,例 函数说明举例,6.4 函数的嵌套与递归调用嵌套调用C规定:函数定义不可嵌套,但可以嵌套调用函数在被调函数中又调用了其他函数,例 求三个

9、数中最大数和最小数的差值,#include int dif(int x,int y,int z);int max(int x,int y,int z);int min(int x,int y,int z);void main()int a,b,c,d;scanf(%d%d%d,int dif(int x,int y,int z)return max(x,y,z)-min(x,y,z);int max(int x,int y,int z)int r;r=xy?x:y;return(rz?r:z);int min(int x,int y,int z)int r;r=xy?x:y;return(rz

10、?r:z);,递归调用定义:函数直接或间接的调用自身叫函数的递归调用,int f(int x)int y,z;z=f(y);.return(2*z);,例 求n的阶乘,#include int fac(int n)int f;if(n0)printf(n0,data error!);else if(n=0|n=1)f=1;else f=fac(n-1)*n;return(f);main()int n,y;printf(Input a integer number:);scanf(%d,请问是否会进入死循环?,6.5 数组作为函数参数数组元素作函数实参值传递,例,#include swap(in

11、t x,int y)int t;t=x;x=y;y=t;main()int a2=2,4 printf(na0=%d,a1=%dn“,a0,a1);swap(a0,a1);printf(na0=%d,a1=%dn“,a0,a1);,运行结果a0=2,a1=4a0=2,a1=4,例 两个数组大小比较,n=0m=0k=0,a和b为有10个元素的整型数组比较两数组对应元素变量n,m,k记录aibi,ai=bi,aik,认为数组ab 若nk,认为数组ab 若n=k,认为数组a=b,数组名作函数参数地址传递在主调函数与被调函数分别定义数组,且类型应一致形参数组大小(多维数组第一维)可不指定,定义数组时在

12、数组名后面跟一个空的方括弧。形参数组名是地址变量,例 求学生的平均成绩,#include float average(int stu10,int n);void main()int score10,i;float av;printf(Input 10 scores:n);for(i=0;i10;i+)scanf(%d,float average(int stu10,int n)int i;float av,total=0;for(i=0;in;i+)total+=stui;av=total/n;return av;,实参用数组名,形参用数组定义,int stu,值传递方式方式:函数调用时,为形

13、参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递,例 交换两个数,#include main()int x=7,y=11;printf(x=%d,ty=%dn,x,y);printf(swapped:n);swap(x,y);printf(x=%d,ty=%dn,x,y);swap(int a,int b)int temp;temp=a;a=b;b=temp;,地址传递方式:函数调用时,将数据的存储地址作为参数传递给形参特点:形参与实参占用同样的存储单元“双向”传递实参和形参必须是地址常量或变量,局部变量-内部变

14、量定义:在函数内定义,只在本函数内有效说明:main中定义的变量只在main中有效不同函数中同名变量,占不同内存单元形参属于局部变量可定义在复合语句中有效的变量局部变量可用存储类型:auto register static(默认为auto),6.6 变量的作用域,全局变量-外部变量定义:在函数外定义,可为本文件所有函数共用有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件,应尽量少使用全局变量,因为:全局变量在程序全部执行过程中占用存储单元降低了函数的通用性、可靠性,可移植性降低程序清晰性,容易出错,定义 说明次数:只能1次 可说明多次位置:所有函数之外 函数内或函

15、数外分配内存:分配内存,可初始化 不分配内存,不可初始化,外部变量说明:extern 数据类型 变量表;,外部变量定义与外部变量说明不同,若外部变量与局部变量同名,则外部变量被屏蔽,外部变量可用存储类型:缺省 或 static,float max,min;float average(float array,int n)int i;float sum=array0;max=min=array0;for(i=1;imax)max=arrayi;else if(arrayimin)min=arrayi;sum+=arrayi;return(sum/n);main()int i;float ave,s

16、core10;/*Input*/ave=average(score,10);printf(max=%6.2fnmin=%6.2fn average=%6.2fn,max,min,ave);,extern char c1,c2;,extern char c1,c2;,例 外部变量定义与说明,int max(int x,int y)int z;z=xy?x:y;return(z);main()extern int a,b;printf(max=%d,max(a,b);int a=13,b=-8;,运行结果:max=13,extern int a,b;int max()int z;z=ab?a:b;

17、return(z);main()printf(max=%d,max();int a=13,b=-8;,运行结果:max=8,int i;main()void prt();for(i=0;i5;i+)prt();void prt()for(i=0;i5;i+)printf(“%c”,*);printf(“n”);,例 外部变量副作用,运行结果:*,变量的属性数据类型:变量所持有的数据的性质(操作属性)存储属性存储器类型:寄存器、静态存储区、动态存储区生存期:变量在某一时刻存在-静态变量与动态变量作用域:变量在某区域内有效-局部变量与全局变量变量的存储类型auto-自动型register-寄存器型

18、static-静态型extern-外部型变量定义格式:存储类型 数据类型 变量表;,6.7 变量的存储方式动态存储方式与静态存储方式变量是对程序中数据的存储空间的抽象,如:int sum;auto int a,b,c;register int i;static float x,y;,动态变量与静态变量存储方式静态存储:程序运行期间分配固定存储空间,变量定义时就分配存储单元并一直保持不变,直至程序结束。动态存储:程序运行期间根据需要动态分配存储空间内存用户区,生存期静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数开始执行至函数执行结束,自动变量是C语言程序中使用最广泛的,用au

19、to作存储类别的声明,可省略特点作用域仅限于定义该变量的结构中属于动态存储方式不同的结构中允许使用同名的变量而不会混淆,例 auto 变量的作用域,main()int x=1;void prt(void);int x=3;prt();printf(“2nd x=%dn”,x);printf(“1st x=%dn”,x);void prt(void)int x=5;printf(“3th x=%dn”,x);,运行结果:3th x=52nd x=31st x=1,静态局部变量可使函数中局部变量的值在函数调用结束后保留下来(即占用的内存单元不释放),在下一次调用该函数时使用。用static进行声明

20、特点在函数内定义,属于静态存储类别,在静态存储区分配存储单元;作用域与自动变量相同只赋初值一次,以后每次调用函数时不再重新赋初值,保留上次调用结束时的值。静态局部变量,编译时自动赋初值0(数值变量)或空字符(字符变量);自动变量不赋初值,其值不确定静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它,但再次调用定义它的函数时,又可继续使用。,main()void increment(void);increment();increment();increment();void increment(void)int x=0;x+;printf(“%dn”,x);,例 局部静态变量值具有可继承

21、性,运行结果:1 1 1,main()void increment(void);increment();increment();increment();void increment(void)static int x=0;x+;printf(“%dn”,x);,运行结果:1 2 3,寄存器变量使用CPU中的寄存器存放的数据,用register作存储类别的声明特点只有局部自动变量和形式参数可以作为寄存器变量数量以2个为宜局部静态变量不能定义为寄存器变量对一个变量只能声明为一种存储类别,外部变量:外部变量是在函数的外部定义的,作用域为从变量的定义处开始到本程序文件的结束,在此区域内,全局变量可以为

22、程序中各个函数所引用,编译时将外部变量分配在静态存储区。用extern声明外部变量在一个文件内声明外部变量,int max(int x,int y)/*定义max函数*/int z;return(z);z=xy?x:y;main()extern int A,B;/*外部变量声明*printf(%d,max(A,B);int A=13,B=-8/*定义外部变量*/运行结果如下:13,用extern声明外部变量在多文件的程序中声明外部变量,文件filel.c中的内容为:int A;/*定义外部变量*/Main()int power(int);/*对调用函数作说明*/int b=3,c,d,m;pr

23、intf(enter the number a and its power m:n);scanf(%d,%d,printf(%d*%d=%d,A,m,d);,本程序的作用是给定b的值,输入A和m,求Ab和Am的值。,文件file2.c中的内容为:extern A;/*声明A为一个定义的外部变量*/power(int n)int i,y=1;for(i=1;i=n;i+)y*=A;return(y);,例 引用其它文件中的外部变量,main()void gx(),gy();extern int x,y;printf(“1:x=%dty=%dn”,x,y);y=246;gx();gy();void

24、 gx()extern int x,y;x=135;printf(“2:x=%dty=%dn”,x,y);int x,y;void gy()printf(“3:x=%dty=%dn”,x,y);,例 用extern扩展外部变量作用域,运行结果:1:x=0 y=02:x=135 y=2463:x=135 y=246,用static声明外部变量 外部变量只限于被本文件引用,而不能被其他文件引用,file1.c file2.cstatic int A;extern int A;main()main()A=A*n;,关于变量的声明与定义 建立存储空间的声明称定义,把不需要建立存储空间的声明称为声明。例

25、:main()extern A;:int A;下列用法是否正确?int a;static a;,变量存储类型,局部变量默认为auto型register型变量个数受限,且不能为long,double,float型局部static变量具有全局寿命和局部可见性局部static变量具有可继承性extern不是变量定义,可扩展外部变量作用域,例 文件file1.cint a;main().f2;.f1;.f1()auto int b;f2;.f2()static int c;,例 变量的寿命与可见性,#include int i=1;main()static int a;register int b=-

26、10;int c=0;printf(-MAIN-n);printf(i:%d a:%d b:%d c:%dn,i,a,b,c);c=c+8;other();printf(-MAIN-n);printf(i:%d a:%d b:%d c:%dn,i,a,b,c);i=i+10;other();,other()static int a=2;static int b;int c=10;a=a+2;i=i+32;c=c+5;printf(-OTHER-n);printf(i:%d a:%d b:%d c:%dn,i,a,b,c);b=a;,-Main-i:1 a:0 b:-10 c:0,-Other-

27、i:33 a:4 b:0 c:15,-Main-i:33 a:0 b:-10 c:8,-Other-i:75 a:6 b:4 c:15,8,4,33,15,4,43,6,75,15,6,内部函数(又称静态函数)定义:在函数名和函数类型的前面加static标识符static int fun(int a,intb)说明:函数只能被本文件中的其他函数所调用,而不能被其他源文件中的函数调用,6.8 内部函数和外部函数(根据函数能否被其它源程序文 件调用划分),外部函数定义:在函数名和函数类型的前面加extern标识符,也可省略;声明时在原型前加extern标识符,也可省略extern int fun(int a,intb)说明:函数可以被其他源文件中的函数调用,函数默认的都是外部的,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号