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

上传人:日度 文档编号:146259984 上传时间:2020-09-28 格式:PPT 页数:53 大小:343KB
返回 下载 相关 举报
WL第7章-用函数实现模块化程序设计PPT课件_第1页
第1页 / 共53页
WL第7章-用函数实现模块化程序设计PPT课件_第2页
第2页 / 共53页
WL第7章-用函数实现模块化程序设计PPT课件_第3页
第3页 / 共53页
WL第7章-用函数实现模块化程序设计PPT课件_第4页
第4页 / 共53页
WL第7章-用函数实现模块化程序设计PPT课件_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《WL第7章-用函数实现模块化程序设计PPT课件》由会员分享,可在线阅读,更多相关《WL第7章-用函数实现模块化程序设计PPT课件(53页珍藏版)》请在金锄头文库上搜索。

1、1,第7章 用函数实现模块化程序设计,2,程序设计的艺术,结构化程序设计有两大最高级的艺术 算法设计艺术 结构设计艺术 函数(function)是结构设计的最基本单位 “一个程序应该是轻灵自由的,它的子过程就象串在一根线上的珍珠。” Geoffrey James的编程之道,3,模块化程序设计的核心: 函数设计。 重要概念: 把解决问题的方案设计成一个个独立的模块。 程序通过调用模块功能来解决问题。 这些模块通过函数来实现,又称为函数模块。 每一个函数具有独立的功能,程序通过各模块之间的协调工作完成复杂的程序功能。,4,数学函数(1),自变量,因变量,函数名,参 数,函数返回值,5,数学函数(2

2、),一个自变量,一个因变量,两个自变量,一个因变量,6,程序设计中的函数,程序设计中的函数不局限于计算 计算类,如打印阶乘表的程序 判断推理类,如排序、查找,7,用函数解决问题的要点,分而治之 函数把较大的任务分解成若干个较小的任务,并提炼出公用任务。 复用 程序员可以在其他函数的基础上构造程序,而不需要从头做起。 信息隐藏 设计得当的函数可以把具体操作细节对程序中不需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚。,8,说明: 一个源程序文件由一个或多个函数组成。 一个C程序由一个或多个源程序文件组成。 C程序的执行从main函数开始,调用其他函数后流程回到main函数,在main函数中

3、结束整个程序运行。 所有函数都是平行的,即函数定义时是互相独立的,一个函数并不从属于另一个函数。,一、C语言中的函数,9,一、C语言中的函数,1、作用:函数是C程序的基本单位 2、分类:,main函数,其他函数,从程序角度,库函数,自定义函数,从用户角度,无参函数,有参函数,从表现形式,举例说明,10,二、函数的定义,1、形式: 返回值类型 函数名(形式参数) 声明部分 语句 说明:(1)返回值类型符指的是函数体语句执行完成后,函数返回值的类型。 如int,float,char等。 若函数无返回值,则用空类型void来定义函数的返回值。 默认情况为int型(有些编译器不支持默认情况)。 (2)

4、函数名由任何合法的标识符构成。 建议函数名的命名与函数内容有一定关系。 程序举例 判断正误,11,例如,编写自定义函数abs_sum(),求两个任意整数的绝对值的和。 int abs_sum(int m, int n) if (m0) m=m; if(n0) n=n; return (m+n); 或直接调用系统函数来实现: int abs_sum(int m, int n) return (abs(m)+abs(n); 注意:函数abs()的声明在头文件math.h。,12,三、函数参数和函数的值,1、形参和实参: a、生存期:被调函数(形参)和主调函数(实参) b、类型:一致或兼容 c、数据

5、传递方式: 值传递(ByVal):一般变量(形参、实参占不同内存单元) 地址传递(ByRef):数组名和指针(形参、实参共用内存单元) 实例说明,13,三、函数参数和函数的值,2、函数的值: a、确定的返回值:return语句 b、不确定的返回值:无return语句 实例说明,14,四、函数的调用,1、调用形式:函数名(实参表列) 2、调用方式:函数语句、表达式 3、对函数的声明: a、库函数:#include(文件包含)命令 b、自定义函数:有时需要在主调函数中声明原型,15,函数声明(函数原型) 函数声明语句的形式: 返回值类型符 函数名(形参说明表); 如:int abs_sun(int

6、 m, int n);,举例说明 不需要声明的两种情况,16,例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, ,思考: 怎样求任意3个整数的绝对值之和?,int x,y,z,sum; scanf(%d%d%d,17,五、函数中的变量,1、按作用域分 局部变量:在本函数内部有效。 全局变量:从定义位置到源程序结束均有效。 2、按存储类型分 静态存储变量:程

7、序运行时有固定的存储空间, 程序结束时释放内存单元。 动态存储变量:根据需要动态分配和释放内存单元。,18,局部变量:在函数内部或某个控制块的内部定义的变量。 局部变量的作用域:函数内部。 作用:增强了函数模块的独立性。 全局变量:在函数外面定义的变量称为全局变量。 全局变量的作用域:从该变量定义的位置开始,直到源文件结束。 作用:在同一文件中,所有函数都可以引用全局变量。增强了各函数间数据的联系。,19,局部变量和全局变量的作用域如图所示:,举例说明,20,变量的存储类型 变量的存储类型指的是变量的存储属性,它说明变量占用存储空间的区域。 在内存中,供用户使用的存储区由程序区、静态存储区和动

8、态存储区3部分组成。 变量的存储类型:auto、register、static和extern4种。 auto型变量存储在内存的动态存储区; register型变量保存在寄存器中; static型和extern变量存储在静态存储器。,变量的作用域和存储类型,21,局部变量的存储类型默认值为auto型。 全局变量的存储类型默认值为extern型。 注意: 一般情况下,常用auto型、register型定义局部变量。 static型既可作为局部变量,又可作为全局变量。 作为局部变量时,局部变量的值将被保留,若定义时没有赋初值,则系统会自动为其赋0值; 作为全局变量时,其有效范围为它所在的源文件,其他

9、源文件不能使用。,22,六、数组作为函数参数,1、数组元素作函参(值传递) 数组元素的作用等同于简单变量。 如果实参为数组元素,则形参必须是简单变量。 2、数组名作函参 (地址传递) 如果实参为数组名,则形参不允许为简单变量。 函数中形参值的改变会引起实参值的改变。,23,数组元素作函参,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,24,值传递,2,3,4,a0,1,1,a1,a2,a3,x,a,25,数

10、组名作函参,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;i4;i+) printf(“%d ”,ai); 运行结果:11 12 13 14,26,地址传递,2,3,4,a0,1,a1,a2,a3,p,p0,p1,p2,p3,a,27,七、函数的嵌套调用,1、嵌套的形式:ABC 2、程序举例: a 求最小公倍数:,28,八、函数的递归调用,1、递归的思想:AA 2、调用形式:直接或间接,直接递归:在一个函数的定义中出现了对自己本身的调用。间接递归:一个函数

11、p的定义中包含了对函数q的调用,而q的实现过程又调用了p,即函数调用形成了一个环状调用链。,29,求最小公倍数,main( ) int a,b; scanf(“%d,%d”, ,30,变量的作用范围(1),int a=3,b=5; max(int a,int b) int c; c=ab?a:b; return c; main( ) int a=8; printf(“%d %d %dn”,a,b,max(a,b) ); ,31,例3:设计一个函数:long fac(int n),用来计算正整数的阶乘,编写程序进行测试。 算法的核心思想:对于任意正整数n,如果知道(n1)!,则n!=n(n1)!

12、。 可在函数中定义一个static型变量,用来保存每一次阶乘的计算结果。,变量的作用范围(2),32,变量的作用范围(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); ,33,函数的声明,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);

13、,34,不需声明的两种情况(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); ,35,不需声明的两种情况(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

14、(int x,int y) /*add函数的定义部分*/ return (x+y); ,36,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,3,4,3,4,3,4,37,2地址传递,例 #include void swap(int *,int

15、*); /函数声明 void main() int a=3,b=4; printf(“a=%d,b=%dn”,a,b); swap( ,此程序的运行结果为: a=3,b=4 a=4,b=3,x y,3,4,3,4,38,形参和实参,main( ) int a=3,b=2; printf(n a=%d,%x b=%d, %x,a, a=3,ffdc b=2,ffde x=3,ffd8 y=2,ffda,39,值传递,3,2,3,2,x,y,a,b,ffd8,ffda,ffdc,ffde,40,函数的定义,1、无参函数 void print( ) printf(“I am a student!”)

16、; 2、有参函数 int add(int x, int y) int z; z=x+y; return z; 对形参的声明:传统方式和现代方式 3、空函数 void qksort( ) ,41,对形参的说明,传统方式 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; ,42,函数定义-判断正误,1、 double fun(int x , int y) 2、 double fun(x , y) int x , y ; 3、double fun(int x ; int y)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号