c语言第5章函数.ppt
《c语言第5章函数.ppt》由会员分享,可在线阅读,更多相关《c语言第5章函数.ppt(95页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第5 5章章 函数与程序结构函数与程序结构5.1程序设计的艺术性程序设计的艺术性5.2函数的定义与使用函数的定义与使用5.3函数的作用域和存储类型函数的作用域和存储类型5.5预处理命令预处理命令本章要点本章要点 函数的定义方法及函数的类型和返回值。函数的定义方法及函数的类型和返回值。函数实参与形参,参数传递的方式。函数实参与形参,参数传递的方式。函数的正确调用,嵌套与递归调用。函数的正确调用,嵌套与递归调用。局部变量和全局变量的概念和使用方法。局部变量和全局变量的概念和使用方法。本章难点本章难点 函数参数的传递函数参数的传递与返回值与返回值。函数递归调用的执行过程。函数递归调用的执行过程。变
2、量的作用域和变量的作用域和存储类型存储类型。5.1 程序设计的艺术性程序设计的艺术性结构化程序设计有两大最高级的艺术结构化程序设计有两大最高级的艺术算法设计艺术算法设计艺术结构设计艺术结构设计艺术C语言为程序的结构提供了两样武器语言为程序的结构提供了两样武器函数和模块函数和模块函数函数(function)是结构设计的最基本单位是结构设计的最基本单位一个一个C程序由程序由一个主函数和若干个函数组成一个主函数和若干个函数组成,由主函数调,由主函数调用其他函数,其他函数之间也可以相互调用。同一个函数用其他函数,其他函数之间也可以相互调用。同一个函数可以被一个或多个函数调用任意多次。可以被一个或多个函
3、数调用任意多次。5.1 程序设计的艺术性程序设计的艺术性C程序结构C是模块化程序设计语言是模块化程序设计语言特点:特点:(1)一个源程序文件由一个源程序文件由一个或多个函数一个或多个函数组成。一个源程序文件组成。一个源程序文件是一个编译单位,即以源程序为单位进行编译,而不是以函数是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。为单位进行编译。(2)一个一个程序由一个或多个源程序文件程序由一个或多个源程序文件组成。组成。一个源文件可一个源文件可以为多个以为多个C程序公用。程序公用。(3)程序的执行程序的执行从从main函数开始函数开始,调用其他函数后流程回到,调用其他函数后
4、流程回到main函数,在函数,在main函数中结束整个程序的运行函数中结束整个程序的运行。main函数是函数是系统定义的。系统定义的。(4)所有函数都是平行的,即在定义函数时是互相独立的,所有函数都是平行的,即在定义函数时是互相独立的,一一个函数并不从属于另一函数,即个函数并不从属于另一函数,即函数不能嵌套定义函数不能嵌套定义,函数间可函数间可以互相调用,但不能调用以互相调用,但不能调用main函数函数。main函数是系统调用的函数是系统调用的.5.1 程序设计的艺术性程序设计的艺术性5.2 函数的定义与使用函数的定义与使用5.2.1 函数的分类函数的分类5.2.2 函数的定义函数的定义5.2
5、.3 函数的调用函数的调用、参数和返回值参数和返回值5.2.4 函数原型函数原型5.2.5 函数函数main()()的特殊性的特殊性从用户使用的角度看,从用户使用的角度看,函数有两种:函数有两种:标准函数标准函数,即库函数。这是由系统提供的,用户不必自己定,即库函数。这是由系统提供的,用户不必自己定义这些函数,可以直接使用它们。应该说明,不同的义这些函数,可以直接使用它们。应该说明,不同的C系统提系统提供的库函数的数量和功能不同,当然有一些基本的函数是共同供的库函数的数量和功能不同,当然有一些基本的函数是共同的。的。用户自己定义的函数用户自己定义的函数。用以解决用户的专门需要。用以解决用户的专
6、门需要。从函数的形式看从函数的形式看,函数分两类:,函数分两类:无参函数无参函数。在调用无参函数时,主调函数并。在调用无参函数时,主调函数并不将数据传送不将数据传送给被调用函数给被调用函数,一般用来,一般用来执行指定的一组操作执行指定的一组操作,无参函数可以,无参函数可以带回或不带回函数值,但一般以不带回函数值的居多。带回或不带回函数值,但一般以不带回函数值的居多。5.2.1 函数的分类函数的分类有参函数有参函数。在调用函数时,在。在调用函数时,在主调函数和被调用函数之间主调函数和被调用函数之间有数据传递有数据传递。也就是说,主调函数可以将数据传给被调用函数。也就是说,主调函数可以将数据传给被
7、调用函数使用,被调用函数中的数据也可以带回来供主调函数使用。使用,被调用函数中的数据也可以带回来供主调函数使用。例例5.1#include”stdio.h”void main()()void p_star()();void p_message()();p_star()();*调用调用p_star函数函数*p_message();/*调用调用p_message */p_star();();*调用调用p_star函数函数*5.2.1 函数的分类函数的分类void p_star()()*定义定义p_star函数函数*printf(*n););void p_message()()*定义定义p_mess
8、age函数函数*printf(How do you do!n););运行情况如下:运行情况如下:*How do you do!*5.2.1 函数的分类函数的分类5.2.2 函数的定义函数的定义函数应该先定义后使用。函数应该先定义后使用。任何函数(包括主函数任何函数(包括主函数main())都是由都是由函数头函数头和和函数体函数体两两部分组成。函数头给出函数相关信息(类似部分组成。函数头给出函数相关信息(类似“黑匣子黑匣子”中的入口中的入口和出口),而函数体具体实现函数的功能。和出口),而函数体具体实现函数的功能。函数定义的一般形式函数定义的一般形式(1)无参函数的定义无参函数的定义 类型标识符
9、函数名()类型标识符函数名()声明部分声明部分 语句语句 用用“类型标识符类型标识符”指定函数值的类型,即函数带回来的值的类型。指定函数值的类型,即函数带回来的值的类型。无参函数一般不需要带回函数值,因此可以无参函数一般不需要带回函数值,因此可以不写类型标识符不写类型标识符。合法标识合法标识符符函数返回值类型函数返回值类型缺省缺省int型型无返回值无返回值void函数体函数体类型标识符类型标识符 函数名函数名(形式参数说明形式参数说明 形式参数表形式参数表)说明部分说明部分 语句部分语句部分 例例 无参函数无参函数 p_star()printf(“*n”);或或 p_star(void)pri
10、ntf(“*n”);(2)有参函数定义的一般形式)有参函数定义的一般形式5.2.2 函数的定义函数的定义例如:例如:int max(int x,int y)int z;*函数体中的声明部分函数体中的声明部分 zxy?x:y;return(z);在函数体的语句中求出的值(为在函数体的语句中求出的值(为x与与y中大者),中大者),return(z)的的作用是将作用是将z的值作为函数值带回到主调函数中的值作为函数值带回到主调函数中。return后面的括后面的括弧中的值弧中的值(z)作为函数带回的值(或称作为函数带回的值(或称函数返回值函数返回值)。在函数定)。在函数定义时已指定义时已指定max函数为
11、整型,在函数体中定义为整型,二者函数为整型,在函数体中定义为整型,二者是一致的,将作为函数是一致的,将作为函数max的值带回调用函数。如果在定义的值带回调用函数。如果在定义函数时函数时不指定函数类型,系统会不指定函数类型,系统会隐含指定隐含指定函数类型为函数类型为int型。因型。因此上面定义的此上面定义的max函数左端的函数左端的int可以可以省写省写。5.2.2 函数的定义函数的定义(3)可以有)可以有“空函数空函数”它的形式为它的形式为类型说明符类型说明符 函数名()函数名()例如:例如:dummy()()调用此函数时,什么工作也不做,没有任何实际作调用此函数时,什么工作也不做,没有任何实
12、际作用。在主调函数中写上用。在主调函数中写上“dummy();();”表明表明“这里这里要调用一个函数要调用一个函数”,而现在这个函数没有起作用,而现在这个函数没有起作用,等以后扩充函数功能时补充上。等以后扩充函数功能时补充上。5.2.2 函数的定义函数的定义5.2.3 函数的调用、参数和返回值函数的调用、参数和返回值 一、函数的调用一、函数的调用函数调用的一般形式为:函数调用的一般形式为:函数函数名名(实参表列实参表列);说明:说明:(1)调用函数时,)调用函数时,函数名称必须与具有该功能的自定义函数函数名称必须与具有该功能的自定义函数名称完全一致名称完全一致。如果是调用无参函数则实参表列可
13、以没有,但。如果是调用无参函数则实参表列可以没有,但括弧括弧不能省略。不能省略。(2)实际参数表中的参数(简称实参),可以是常数、变量)实际参数表中的参数(简称实参),可以是常数、变量或表达式。如果实参不止或表达式。如果实参不止1个,则相邻实参之间用个,则相邻实参之间用逗号逗号分隔。分隔。(3)实参的个数、类型和顺序,应该与被调用函数所要求的)实参的个数、类型和顺序,应该与被调用函数所要求的参数个数、类型和顺序一致参数个数、类型和顺序一致(4)对实参表求值的顺序并不是确定的。)对实参表求值的顺序并不是确定的。Turbo C规定是规定是自自右至左右至左顺序求值。顺序求值。【例例5.2】#incl
14、ude void main()int i=2,s;s=f(i,+i);/*函数调用函数调用*/printf(%d,s);int f(int x,int y)/*函数定义函数定义*/int z;if(xy)z=1;else if(x=y)z=0;else z=-1;return(z);5.2.3 函数的调用、参数和返回值函数的调用、参数和返回值 在在Turbo C系统上运行的结果为:系统上运行的结果为:0如果按如果按自左至右自左至右顺序求实参的值,则函数调用相当于顺序求实参的值,则函数调用相当于f(2,3),),程序运行应得结果为程序运行应得结果为“1”。若按。若按自右至左自右至左顺序求实参顺序
15、求实参的值,则它相当于的值,则它相当于f(3,3),),程序运行结果为程序运行结果为“0”。由于存。由于存在上述情况,使程序通用性受到影响。因此应当避免这种容易在上述情况,使程序通用性受到影响。因此应当避免这种容易引起不同理解的情况。引起不同理解的情况。如果本意是按如果本意是按自左而右自左而右顺序求实参的值,可以改写为顺序求实参的值,可以改写为i;ki;pf(,k););如果本意是如果本意是自右而左自右而左求实参的值,可改写为求实参的值,可改写为ji;pf(j,j););这种情况在这种情况在printf函数中也同样存在,如函数中也同样存在,如printf(d,d,i,i););也发生上述同样的
16、问题,若也发生上述同样的问题,若i的原值为的原值为3,在,在Turbo C上运行结上运行结果为果为4,3。5.2.3 函数的调用、参数和返回值函数的调用、参数和返回值 例例5.3a 计算两个整数的平均数计算两个整数的平均数/*函数功能:函数功能:计算平均数计算平均数 函数入口参数:函数入口参数:整型整型x,存储第一个运算数,存储第一个运算数 整型整型y,存储第二个运算数,存储第二个运算数 函数返回值:函数返回值:平均数平均数*/int Average(int x,int y)int result;result=(x+y)/2;return result;例例5.3b 使用了使用了Average
17、函数的函数的main()main()int a=12;int b=24;int ave;ave=Average(a,b);printf(Average of%d and%d is%d.n,a,b,ave);int Average(int x,int y)int result;result=(x+y)/2;return result;main()int a=12;int b=24;int ave;ave=Average(a,b);printf();数据传递数据传递执行顺序执行顺序函数调用的方式函数调用的方式按函数在程序中出现的位置来分按函数在程序中出现的位置来分,可以有以下三种函数可以有以下三种
18、函数调用方式调用方式:1)函数语句函数语句把函数调用作为一个语句。如把函数调用作为一个语句。如例例5.1中的中的p_star()();这时这时不要求函数带回值,只要求函数完成一定的操作不要求函数带回值,只要求函数完成一定的操作.2)函数表达式函数表达式函数出现在一个表达式中,这种表达式称为函数表达函数出现在一个表达式中,这种表达式称为函数表达式。这时要求式。这时要求函数带回一个确定的值以参加表达式的函数带回一个确定的值以参加表达式的运算运算。例如。例如:c2*max(a,b););函数函数max是表达式的一部分,是表达式的一部分,它的值乘它的值乘2再赋给再赋给c。5.2.3 函数的调用、参数和
19、返回值函数的调用、参数和返回值 3)函数参数函数参数函数调用作为一个函数的实参函数调用作为一个函数的实参。例如例如:mmax(a,max(b,c););其中其中max(b,c)是一次函数调用,它的值作为是一次函数调用,它的值作为max另一次调用的实参。另一次调用的实参。m的值是的值是a、b、c三者最大三者最大的。的。又又如如:printf(“%d”,max(a,b);也是把也是把max(a,b)作为作为printf函数的一个参数。函数的一个参数。函数调用作为函数的参数,实质上也是函数表达式形函数调用作为函数的参数,实质上也是函数表达式形式调用的一种,因为函数的参数本来就要求是表达式式调用的一种
20、,因为函数的参数本来就要求是表达式形式。形式。5.2.3 函数的调用、参数和返回值函数的调用、参数和返回值 二、参数二、参数在定义函数时函数名后面括弧中的变量名称为(在定义函数时函数名后面括弧中的变量名称为(“形参形参”),),在调用函数时,函数名后面括弧中的表达式称为在调用函数时,函数名后面括弧中的表达式称为“实际参数实际参数”(简称(简称“实参实参”)。)。5.2.3 函数的调用、参数和返回值函数的调用、参数和返回值 c=max(a,b);(main 函数)函数)(max 函数)函数)max(int x,int y)int z;z=xy?x:y;return(z);例例 比较两个数并输出大
21、者比较两个数并输出大者main()int a,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Max is%d,c);max(int x,int y)int z;z=xy?x:y;return(z);形参形参实参实参形参和实参的功能是作形参和实参的功能是作数据传送数据传送。发生函数调用时,主调函。发生函数调用时,主调函数把数把实参的值实参的值传送给被调函数的传送给被调函数的形参形参从而实现主调函数向被调从而实现主调函数向被调函数的数据传送。函数的数据传送。说明:说明:实参必须有确定的值实参必须有确定的值形参必须指定类型形参必须指定类型形参与实参形参与实参类型一
22、致,个数相同类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换若形参与实参类型不一致,自动按形参类型转换函数调用转换函数调用转换形参在函数被调用前不占内存形参在函数被调用前不占内存;函数调用时为形参分函数调用时为形参分 配内存;调用结束,内存释放配内存;调用结束,内存释放5.2.3 函数的调用、参数和返回值函数的调用、参数和返回值 例例 计算计算x的立方的立方#include float cube(float x)return(x*x*x);main()float a,product;printf(Please input value of a:);scanf(%f,&a);prod
23、uct=cube(a);printf(”Cube of%.4f is%.4fn,a,product);xaproduct1.21.21.7285.2.3 函数的调用、参数和返回值函数的调用、参数和返回值 参数传递方式参数传递方式值传递值传递方式方式方式:函数调用时方式:函数调用时,为形参分配单元为形参分配单元,并将并将实实参的值参的值复制复制到形参中;调用结束,形参单元到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值被释放,实参单元仍保留并维持原值特点:特点:形参与实参占用形参与实参占用不同不同的内存单元的内存单元单向单向传递传递5.2.3 函数的调用、参数和返回值函数的调用、参数
24、和返回值 711x:y:调用前:调用前:调用结束:调用结束:711x:y:例例 交换两个数交换两个数#include void 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;调用:调用:711a:b:711x:y:swap:711x:y:117a:b:temp5.2.3 函数的调用、参数和返回值函数的调用、参数和返回值 地址传递地址传递方式:函数调用时,将数据的存储
25、地址作方式:函数调用时,将数据的存储地址作 为参数传递给形参为参数传递给形参特点:特点:形参与实参占用同样的存储单元形参与实参占用同样的存储单元“双向双向”传递传递实参和形参必须是地址常量或变量实参和形参必须是地址常量或变量5.2.3 函数的调用、参数和返回值函数的调用、参数和返回值 swap(p1,p2)int*p1,*p2;int p;p=*p1;*p1=*p2;*p2=p;#include void main()int a,b;scanf(%d,%d,&a,&b);printf(“a=%d,b=%dn”,a,b);printf(“swapped:n”);swap(&a,&b);print
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c语言第5章 函数 语言
限制150内