WL第7章-用函数实现模块化程序设计

上传人:少*** 文档编号:242973833 上传时间:2024-09-13 格式:PPT 页数:53 大小:604.50KB
返回 下载 相关 举报
WL第7章-用函数实现模块化程序设计_第1页
第1页 / 共53页
WL第7章-用函数实现模块化程序设计_第2页
第2页 / 共53页
WL第7章-用函数实现模块化程序设计_第3页
第3页 / 共53页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,WangLan,53,/53,第,7,章 用函数实现模块化程序设计,程序设计的艺术,结构化程序设计有两大最高级的艺术,算法设计艺术,结构设计艺术,函数,(,function,)是结构设计的最基本单位,“一个程序应该是轻灵自由的,它的,子过程,就象串在一根线上的珍珠。”,Geoffrey James,的,编程之道,模块化程序设计的核心: 函数设计。,重要概念:,把解决问题的方案设计成一个个独立的模块。,程序通过调用模块功能来解决问题。,这些模块通过函数来实现,又称为,函数模块,。,每一个函数具有独立的功能,程序通过各模块之间的协调工作完成复杂的程序功能。,数学函数,(1),自变量,因变量,函数名,参 数,函数返回值,数学函数,(2),一个自变量,一个因变量,两个,自变量,一个因变量,程序设计中的函数,程序设计中的函数不局限于计算,计算类,如打印阶乘表的程序,判断推理类,如排序、查找,用函数解决问题的要点,分而治之,函数把较大的任务分解成若干个较小的任务,并提炼出公用任务。,复用,程序员可以在其他函数的基础上构造程序,而不需要从头做起。,信息隐藏,设计得当的函数可以把具体操作细节对程序中不需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚。,说明,:,一个源程序文件由一个或多个函数组成。,一个,C,程序由一个或多个源程序文件组成。,C,程序的执行从,main,函数开始,调用其他函数后流程回到,main,函数,在,main,函数中结束整个程序运行。,所有函数都是平行的,,即函数定义时是互相独立的,一个函数并不从属于另一个函数。,一、,C,语言中的函数,一、,C,语言中的函数,1,、作用:函数是,C,程序的基本单位,2,、分类:,main,函数,其他函数,从,程序角度,库函数,自定义函数,从,用户角度,无参函数,有参函数,从表现形式,举例说明,二、函数的定义,1,、形式:,返回值类型 函数名(形式参数),声明部分,语句,说明,:,(,1,),返回值类型符,指的是函数体语句执行完成后,函数返回值的类型。,如,int,,,float,,,char,等。,若函数无返回值,则用空类型,void,来定义函数的返回值。,默认情况为,int,型(有些编译器不支持默认情况)。,(,2,),函数名,由任何合法的标识符构成。,建议函数名的命名与函数内容有一定关系。,程序举例,判断正误,例如,编写自定义函数,abs_sum,(),,求两个任意整数的绝对值的和。,int,abs_sum(int,m,int,n),if (m0),m=m;,if(n,0),n=n;,return (,m+n,);,或直接调用系统函数来实现:,int,abs_sum(int,m,int,n),return (,abs(m)+abs(n,),;,注意:,函数,abs(),的声明在头文件,math.h,。,三、函数参数和函数的值,1,、形参和实参:,a,、,生存期:被调函数,(,形参,),和主调函数,(,实参,),b,、,类型:一致或兼容,c,、,数据传递方式:,值传递,(,ByVal,),:,一般变量,(,形参、实参占不同内存单元,),地址传递,(,ByRef,):,数组名和指针,(,形参、实参共用内存单元,),实例说明,三、函数参数和函数的值,2,、函数的值:,a,、,确定的返回值:,return,语句,b,、不确定的返回值:无,return,语句,实例说明,四、函数的调用,1,、调用形式:函数名,(,实参表列,),2,、调用方式:函数语句、表达式,3,、对函数的声明:,a,、库函数:,#include,(,文件包含,),命令,b,、,自定义函数:有时需要在主调函数中,声明原型,函数声明(函数原型),函数声明语句的形式:,返回值类型符,函数名,(,形参说明表,);,如:,int,abs_sun(int,m,int,n);,举例说明,不需要声明的两种情况,例,1,:编写程序,通过调用函数,int,abs_sum(int,a,int,b),,求任意两个整数的绝对值的和。,/*example6_1.c */,#include ,int,abs_sum(int,m,int,n); /*,函数声明,*,/,main(),int,x,y,z,;,scanf(%d%d,&x,&y,);,z=,abs_sum(x,y,); /*,函数调用,*,/,printf(|%d|+|%d,|=%,dn,x,y,z,);,int,abs_sum(int,m,int,n) /*,函数定义,*,/,if(m,0),m=-m;,if(n,0),n=-n;,return,m+n,;,思考:,怎样求任意,3,个整数的绝对值之和?,int,x,y,z,sum,;,scanf(%d%d%d,&x,&y,&z,);,sum=,abs_sum(abs_sum(x,y),z,);,printf(|%d|+|%d|+|%d,|=%,dn,x,y,z,sum,);,五、函数中的变量,1,、,按作用域分,局部变量:在本函数内部有效。,全局变量:从定义位置到源程序结束均有效。,2,、按存储类型分,静态存储变量:程序运行时有固定的存储空间,,程序结束时释放内存单元。,动态存储变量:根据需要动态分配和释放内存单元。,局部变量:在函数内部或某个控制块的内部定义的变量。,局部变量的作用域:函数内部。,作用:,增强了函数模块的独立性。,全局变量:在函数外面定义的变量称为全局变量。,全局变量的作用域:从该变量定义的位置开始,直到源文件结束。,作用:,在同一文件中,所有函数都可以引用全局变量。增强了各函数间数据的联系。,局部变量和全局变量的作用域如图所示:,举例说明,变量的存储类型,变量的存储类型指的是变量的,存储属性,,它说明变量占用,存储空间的区域,。,在内存中,供用户使用的存储区由,程序区,、,静态存储区,和,动态存储区,3,部分组成。,变量的存储类型:,auto,、,register,、,static,和,extern,4,种。,auto,型变量存储在内存的,动态存储区,;,register,型变量保存在,寄存器,中;,static,型和,extern,变量存储在,静态存储器,。,变量的作用域和存储类型,局部变量,的存储类型默认值为,auto,型。,全局变量,的存储类型默认值为,extern,型。,注意:,一般情况下,常用,auto,型、,register,型定义局部变量。,static,型既可作为,局部变量,,又可作为,全局变量,。,作为局部变量时,,局部变量的值将被保留,,若定义时没有赋初值,则系统会自动为其赋,0,值;,作为全局变量时,其有效范围为它所在的源文件,其他源文件不能使用。,六、数组作为函数参数,1,、数组元素作函参,(值传递,),数组元素的作用等同于简单变量。,如果实参为数组元素,则形参必须是简单变量。,2,、数组名作函参,(地址传递),如果实参为数组名,则形参不允许为简单变量。,函数中形参值的改变会引起实参值的改变,。,数组元素作函参,void,add(int,x), x+=1;,main( ),int,a4=1,2,3,4,i;,for(i=0;i4;i+),add(,ai,);,for(i=0;i4;i+),printf(“%d,”,ai);,运,行结果:,1 2 3 4,值传递,2,3,4,a0,1,1,a1,a2,a3,x,a,数组名作函参,void,add(int,p4),int,i , t;,for(i,=0;i4;i+),pi,=pi+10; ,main( ),int,a4=1,2,3,4;,add(,a,);,for(i=0;ib?a:b;,return c; ,main( ),int,a,=8,;,printf(“%d,%d %dn”,a,b,max(a,b) ); ,例,3,:,设计一个函数:,long,fac(int,n),,用来计算正整数的阶乘,编写程序进行测试。,算法的核心思想:,对于任意正整数,n,,如果知道,(n1)!,,则,n!=n(n1)!,。,可在函数中定义一个,static,型变量,用来保存每一次阶乘的计算结果。,变量的作用范围(,2,),变量的作用范围(,2,),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,); ,函数的声明,main( ), float a=2.5,b=3.2,c;,float,add(int,x,int,y);,c=add(a,b);,printf(“c,=%f n”,c); ,float,add(int,x,int,y), return (x+y); ,不需声明的两种情况,(1),一、被调用函数的定义出现在使用之前,float,add(int,x,int,y) /*add,函数的定义部分*,/, return (x+y); ,main( ),int,a=25,b=32;,float c;,c=add(a,b);,printf(“c,=%f n”,c); ,不需声明的两种情况,(2),二、被调用函数的声明出现在所有函数之前,float,add(int,x,int,y);,/*add,函数的声明部分*,/,main( ),int,a=25,b=32;,float c;,c=add(a,b);,printf(“c,=%f n”,c); ,float,add(int,x,int,y),/*add,函数的定义部分*,/, return (x+y); ,1,按值传递,例,#include ,void,swap(int,int,);,/,函数声明,void main(),int,a=3,b=4;,printf(“a,=%,d,b,=%,dn”,a,b,);,swap(a,b);,printf(“a,=%,d,b,=%,dn”,a,b,);,void,swap(int,x,int,y),int,t=x;,x=y;,y=t;,此程序的运行结果为:,a=3,b=4,a=3,b=4,a b,x y,3,4,3,4,3,4,2,地址传递,例,#include ,void,swap(int,*,int,*);,/,函数声明,void main(),int,a=3,b=4;,printf(“a,=%,d,b,=%,dn”,a,b,); swap(,printf(“a,=%,d,b,=%,dn”,a,b,);,void,swap(int,*,x,int,*y),int,t=*x;,*x=*y;,*y=t;,此程序的运行结果为:,a=3,b=4,a=4,b=3,a b,x y,3,4,3,4,形参和实参,main( ),int,a=3,b=2;,printf(n,a=%,d,%x,b=%d,%,x,a,&a,b,&b,);,my(,a,b,); ,my(int,x,int,y,),printf(n,x=%,d,%x,y=%,d,%x,x,&x,y,&y,); ,a=3,ffdc,b=2,ffde,x=3,ffd8,y=2,ffda,值传递,3,2,3,2,x,y,a,b,ffd8,ffda,ffdc,ffde,函数的定义,1,、,无参函数,void print( ),printf(“I,am a student!”); ,2,、,有参函数,int,add(int,x,int,y),int,z;,z=x+y;,return z; ,对形参的声明:传统方式和现代方式,3,、空函数,void,qksort,( ), ,对形参的说明,传统方式,int,add(x, y),int,x, y ;,int,z;,z=x+y;,return z;,现代方式,int,add(int,x,int,y),int,z;,z=x+y;,return z;,函数定义,-,判断正误,1,、,double,fun(int,x ,int,y),2,、,double fun(x , y),int,x , y ;,3,、,double,fun(int,x ;,int,y),4,、,double,fun(int,x ,int,y) ;,5,、,double,fun(int,x , y),主函数和其他函数,main,( ),int,a,b,c,;,scanf(%d,%d,&a,&b,);,c=,max(a,b,);,printf,( max =%d ,c); ,int,max,(int,x,int,y),int,z;,if(x,y)z,=x;,else z=y;,return(z,); ,库函数和自定义函数,#include ,main( ),int,a,b,c,;,scanf,(%d,%d,&a,&b,);,c=,max,(a,b,);,printf,( max =%d ,c); ,int,max(int,x,int,y),int,z;,if(x,y)z,=x;,else z=y;,return(z,); ,有参函数和无参函数,main( ),int,a,b,c,;,scanf(%d,%d,&a,&b,);,c=max(a,b)+f1();,printf,( result =%d ,c); ,int,max(int,x,int,y),int,f1(),int,z; return 33; ,if(x,y)z,=x;,else z=y;,return(z,); ,函数的返回值(,1,),main( ),int,a=3,b=2,c;,c=,max(a,b,),;,printf,( max =%d ,c); ,int,max(int,x,int,y),int,z;,if(x,y)z,=x;,else z=y;,return(z,);,函数的返回值(,2,),main( ),int,max(int,int,);,int,a=3,b=2,c;,c=,max(a,b,),;,printf,( max =%d , c);,int,max(int,x,int,y),int,z;,if(x,y)z,=x;,else z=y;,error C4716: max : must return a value,函数嵌套的形式,main,函数 函数,A,函数,B,函数,A,函数,B,结束,递归调用的形式,(1),函数,1 f1(int,x,int,y), ,f1(m,n);,调用,函数,1,递归调用的形式,(2),函数,1,函数,2,f1(int,x,int,y), ,f2(m,n);, ,f2(int,a,int,b), ,f1(p,q);,. ,(,1,)具备递归出口。递归出口定义了,递归的终止条件,,当程序的执行使它得到满足时,递归执行过程便终止。有些问题的递归程序可能存在几个递归出口;(,2,)在不满足递归出口的情况下,根据所求解问题的性质,将原问题分解成若干子问题,,这些子问题的结构与原问题的结构相同,但规模较原问题小。,子问题的求解通过以一定的方式,修改参数,进行函数自身调用加以实现,然后将子问题的解组合成原问题的解。递归调用时,参数的修改最终必须保证递归出口得以满足。,递归程序设计具有以下两个特点:,算法为:,int,Fact (,int,n ) ,int,m; if (n= =0) return(1); else m=n*Fact(n-1); return(m); ,例,1,试编一个递归函数,求正整数,n,的阶乘值,n,!。,n!=n*(n-1)*(n-2)*.*2*1,n!=n*(n-1)!,用,fact(n),表示,n,的阶乘值,据阶乘的数学定义可知:,1 n=0 fact(n) = n*fact(n-1) n0,int,Fibona,(,int,n ) ,int,m; if (n= =1) return (1); else if (n= =2) return(1); else m=Fibona(n-1)+ Fibona(n-2); return (m); ,例,2,试编一个递归函数,求第,n,项,Fibonacci,级数的值。,假设使用,Fibona(n,),表示第,n,项,Fibonacci,级数的值, 根据,Fibonacci,级数的计算公式:,1 n=1,Fibona(n,)= 1 n=2 Fibona(n-1)+ Fibona(n-2) n2,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!