资源预览内容
第1页 / 共29页
第2页 / 共29页
第3页 / 共29页
第4页 / 共29页
第5页 / 共29页
第6页 / 共29页
第7页 / 共29页
第8页 / 共29页
第9页 / 共29页
第10页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,5,讲 使用函数封装代码,本讲学习内容:,函数及其组成,使用函数的结构化编程的优点,如何创建函数,如何在函数中声明局部变量,如何从函数将值返回给程序,如何给函数传递参数,5.1,函数是什么,函数的定义,函数是一个被命名的、独立的代码段,它执行特定的任务,并,可能,给调用它的程序返回一个值。,函数是什么,函数的用法,参见程序,ch5cube.c,。,5.2,自顶向下的方法,采用结构化编程时,可以选用自顶向下的方法。,程序的大多数实际工作是由位于树枝末梢的函数完成,位于“主干”附件的函数主要用于引导程序执行这些函数。,要求编写代码之前一定要进行规划,预先确定程序的结构可以节省编写和调试代码的时间。,5.3,函数的工作原理,仅当函数被程序的其他部分调用后,函数中的语句才会被执行。,调用函数时,程序可以通过一个或多个,参数,给它传递信息,然后执行函数中的语句,完成设计任务。,函数中的语句执行完毕后,,控制权,将返回给调用函数的地方。,函数能够以,返回值,的方式将信息返回给程序。,函数的工作原理,main(),call func1(),call func2(),call func3(),func1(),func2(),func3(),5.4,编写函数,函数头,函数的返回类型,函数名,参数列表,函数体,函数原型,5.4.1,函数头,每个函数的第一行都是函数头,函数头由三部分组成,其中每一部分完成特定的功能。,type,function-name,(,parm1,.,),函数的返回类型,函数名,参数列表,5.4.2,函数的返回类型,函数的返回类型指定了函数返回给调用程序的数据类型。,例如:,int,func1()/*Returns a type int.*/,float func2()/*Returns a type float.*/,void func3()/*Returns nothing.*/,5.4.3,函数名,遵循变量名规则,可以为函数命名为任何名称。,在一个具体的,C,程序中,函数名必须唯一。,建议给函数指定一个描述其功能的名称。,5.4.4,参数列表,函数通过参数来接受外界传入的值,其参数类型信息由函数头中的参数列表提供。,例如:,long,cube(long,x),void func1(int x,float y,char z),int,func2(void),形参与实参,形参(,parameter,)位于函数头,是实参的一个占位符。函数的形参是固定的,在程序执行期间不会变化。,实参(,argument,)是调用程序传递给函数的实际值。每次调用函数时,可以传递不同的参数。,关系:函数通过相应的形参名来访问实参。,形式参数与实际参数的关系,形式参数在函数中是变量名,在函数调用时,形参被分配相应的内存。,实际参数是表达式负责向对应的形参标识的内存单元传递数据。,实参与形参必须个数相同。,对应的形参和实参的类型必须一致。,形参和实参之间的关系是,:,单向的值的传递,主调函数中有如下语句,:,scanf(%d,%d,&a,&b,);,m=max(a,b+3);,如果输入,6,2,函数,int,max(int,a,int,b),形参,a,得到第一个实际参数,a,的值,6,形参,b,得到第二个实际参数,b+3,的值,5,例如,形参与实参的区别,参见程序,ch5list1.c,。,形参与实参,第一次调用,z=,half_of(,x,);,float,half_of(float,k,),3.5,实参,形参,第二次调用,z=,half_of(,y,);,float,half_of(float,k,),65.11,实参,形参,5.4.5,函数体,局部变量,函数的语句,返回值,1.,局部变量,在函数体中声明的变量,称之为,局部变量,,该变量是该函数私有的。,声明局部变量的方式和其他变量相同,可以声明任何类型的变量。,int,func1(int y),int,a,b=10;,float rate;,double cost=12.55;,/*function code goes here*/,演示局部变量,参见程序,ch5var.c,。,2.,函数的语句,函数几乎可以包含任何语句,在函数中唯一不能做的是定义另一个函数,但可以使用其他任何语句,包括调用函数。,3.,返回一个值,要从函数返回一个值,可以使用关键字,return,,并在后面加上一个表达式。,int,func1(int,var,),int,x;,/*Function code goes here*/,return x;,返回一个值,函数可以包含多条,return,语句,但只有一条被执行的,return,语句对程序有影响。,参见程序,ch5return.c,。,5.4.6,函数原型,使用用户定义的每个函数,程序都应包含一个原型。其功能是将有关函数的信息告知编译器。,函数原型和函数头相同,只是后面多了一个分号。,5.5,将参数传递给函数,要将参数传递给函数,可将它们放在函数名的后面,并用圆括号括起。,参数的数目与类型必须同函数头和函数原型中的形参匹配。,int,a,b,c,;,函数调用,func1(a,b,c);,函数头,void func1(int x,int,y,int,z),将参数传递给函数,每个参数都是可以任何合法的表达式:常量、变量、数学表达式,甚至可以是另一个函数(返回一个值的函数)。,例如:,half(),、,square(),和,third(),均为有返回值,的函数,则可以这样编写代码:,x,half(third(square(half(y,);,5.6,调用函数,调用函数的方式有两种:,对于任何函数,,都可以使用其名称和参数列表进行调用。,仅适用于有返回值的函数,,即为合法的表达式,可用于任何能使用表达式的地方。,wait(12);,printf(“Half,of%d is%d”,x,half_of(x,);,a=,half_of(x,);,if(,half_of(x,)10),递归,递归指的是函数直接或间接调用自己。,间接递归指的是一个函数调用另一个函数,而后者又调用前者。,使用递归函数计算阶乘,例如,,x,的阶乘表示为,x!,,计算方法如下:,x!=x*(x-1)*(x-2)*(x-3)*(2)*1,然而,也可以这样计算,x!:,x!=x*(x-1)!,然后,可以使用同样的方法计算,x-1,的阶乘:,(x-1)!=(x-1)*(x-2)!,可以不断地以递归的方式计算下去,直到,1,。,参见程序,ch5recurse.c,。,5.7,函数的位置,就目前水平而言,函数定义位于,main(),函数所在的源代码文件中,并位于,main(),函数的后面。,函数原型,void func1(int x,int,y,int,z),;,int,main,(,void,),int,a,b,c,;,函数调用,func1(a,b,c);,函数头,void func1(int x,int,y,int,z),5.8,总结,结构化编程(一种强调模块化、自顶向下的程序设计方法)离不开函数。,函数是执行特定任务的独立代码块,由函数头和函数体组成。,需要执行任务时,程序调用执行这种任务的函数。,
点击显示更多内容>>

最新DOC

最新PPT

最新RAR

收藏 下载该资源
网站客服QQ:3392350380
装配图网版权所有
苏ICP备12009002号-6