WL第7章-用函数实现模块化程序设计_第1页
WL第7章-用函数实现模块化程序设计_第2页
WL第7章-用函数实现模块化程序设计_第3页
WL第7章-用函数实现模块化程序设计_第4页
WL第7章-用函数实现模块化程序设计_第5页
已阅读5页,还剩48页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第7 7章章 用函数实现模块化程序设计用函数实现模块化程序设计WangLan2/53程序设计的艺术程序设计的艺术n结构化程序设计有两大最高级的艺术结构化程序设计有两大最高级的艺术n算法设计艺术算法设计艺术n结构设计艺术结构设计艺术n函数函数(function)是结构设计的最基本单位)是结构设计的最基本单位n“一个程序应该是轻灵自由的,它的一个程序应该是轻灵自由的,它的子过程子过程就象串在就象串在一根线上的珍珠。一根线上的珍珠。” nGeoffrey James的的编程之道编程之道 WangLan3/53模块化程序设计的核心:模块化程序设计的核心: 函数设计。函数设计。 重要概念:重要概念:

2、把解决问题的方案设计成一个个独立的模块。把解决问题的方案设计成一个个独立的模块。 程序通过调用模块功能来解决问题。程序通过调用模块功能来解决问题。 这些模块通过函数来实现,又称为这些模块通过函数来实现,又称为函数模块函数模块。 每一个函数具有独立的功能,程序通过各模块每一个函数具有独立的功能,程序通过各模块之间的协调工作完成复杂的程序功能。之间的协调工作完成复杂的程序功能。WangLan4/53数学函数数学函数(1)(1)()yfx自变量自变量因变量因变量函数名函数名参参 数数函数返回值函数返回值WangLan5/53数学函数数学函数(2)(2)2235yxxnmzaxbyc一个自变量,一个因

3、变量一个自变量,一个因变量两个自变量,一个因变量两个自变量,一个因变量WangLan6/53程序设计中的函数程序设计中的函数n程序设计中的函数不局限于计算程序设计中的函数不局限于计算n计算类,如打印阶乘表的程序计算类,如打印阶乘表的程序n判断推理类,如排序、查找判断推理类,如排序、查找WangLan7/53用函数解决问题的要点用函数解决问题的要点n分而治之分而治之n函数把较大的任务分解成若干个较小的任务,并提炼出公用任务。函数把较大的任务分解成若干个较小的任务,并提炼出公用任务。n复用复用n程序员可以在其他函数的基础上构造程序,而不需要从头做起。程序员可以在其他函数的基础上构造程序,而不需要从

4、头做起。n信息隐藏信息隐藏n设计得当的函数可以把具体操作细节对程序中不需要知道它们的那设计得当的函数可以把具体操作细节对程序中不需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚。些部分隐藏掉,从而使整个程序结构清楚。WangLan8/53n说明说明:一个源程序文件由一个或多个函数组成。一个源程序文件由一个或多个函数组成。一个一个C程序由一个或多个源程序文件组成。程序由一个或多个源程序文件组成。C程序的执行从程序的执行从main函数开始,调用其他函数后流程函数开始,调用其他函数后流程回到回到main函数,在函数,在main函数中结束整个程序运行。函数中结束整个程序运行。所有函数都是平行的所有

5、函数都是平行的,即函数定义时是互相独立的,即函数定义时是互相独立的,一个函数并不从属于另一个函数。一个函数并不从属于另一个函数。一、一、C C语言中的函数语言中的函数WangLan9/53一、一、C C语言中的函数语言中的函数1 1、作用:函数是、作用:函数是C C程序的基本单位程序的基本单位2 2、分类:、分类:mainmain函数函数其他函数其他函数从程序角度从程序角度库函数库函数自定义函数自定义函数从用户角度从用户角度无参函数无参函数有参函数有参函数从表现形式从表现形式举例说明举例说明WangLan10/53二、函数的定义二、函数的定义1 1、形式:、形式: 返回值类型返回值类型 函数名

6、(形式参数)函数名(形式参数) 声明部分声明部分 语句语句 说明说明:(1)返回值类型符返回值类型符指的是函数体语句执行完成后,指的是函数体语句执行完成后,函数返回值的类型。函数返回值的类型。 如如int,float,char等。等。若函数无返回值,则用空类型若函数无返回值,则用空类型void来定义函数的返回值。来定义函数的返回值。默认情况为默认情况为int型(有些编译器不支持默认情况)。型(有些编译器不支持默认情况)。 (2)函数名函数名由任何合法的标识符构成。由任何合法的标识符构成。 建议函数名的命名与函数内容有一定关系。建议函数名的命名与函数内容有一定关系。 程序举例程序举例 判断正误判

7、断正误WangLan11/53例如,编写自定义函数例如,编写自定义函数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。WangLan12/53三、函数参数和函数的值三、函数参数和函数的值1 1、形参和实参:、形参和实参:

8、a a、生存期:被调函数、生存期:被调函数( (形参形参) )和主调函数和主调函数( (实参实参) ) b b、类型:一致或兼容、类型:一致或兼容 c c、数据传递方式:、数据传递方式: 值传递值传递(ByVal(ByVal) ):一般变量:一般变量( (形参、实参占不同内存单元形参、实参占不同内存单元) ) 地址传递地址传递(ByRef(ByRef):):数组名和指针数组名和指针( (形参、实参共用内存单元形参、实参共用内存单元) ) 实例说明实例说明WangLan13/53三、函数参数和函数的值三、函数参数和函数的值2 2、函数的值:、函数的值: a a、确定的返回值:、确定的返回值:re

9、turnreturn语句语句 b b、不确定的返回值:无、不确定的返回值:无returnreturn语句语句 实例说明实例说明WangLan14/53四、函数的调用四、函数的调用1 1、调用形式:函数名、调用形式:函数名( (实参表列实参表列) ) 2 2、调用方式:函数语句、表达式、调用方式:函数语句、表达式 3 3、对函数的声明:、对函数的声明: a a、库函数:、库函数:#include#include( (文件包含文件包含) )命令命令 b b、自定义函数:有时需要在主调函数中、自定义函数:有时需要在主调函数中声明原型声明原型 WangLan15/53函数声明(函数原型)函数声明(函数

10、原型)函数声明语句的形式:函数声明语句的形式: 返回值类型符返回值类型符 函数名函数名(形参说明表形参说明表); 如:如:int abs_sun(int m, int n);举例说明举例说明 不需要声明的两种情况不需要声明的两种情况WangLan16/53例例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

11、,&x,&y); z=abs_sum(x,y); /*函数调用函数调用*/ printf(|%d|+|%d|=%dn,x,y,z);int abs_sum(int m,int n) /*函数定义函数定义*/ if(m0) m=-m; if(n0) n=-n; return m+n;思考:思考: 怎样求任意怎样求任意3 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,

12、sum);WangLan17/53五、函数中的变量五、函数中的变量1 1、按作用域分、按作用域分 局部变量:在本函数内部有效。局部变量:在本函数内部有效。 全局变量:从定义位置到源程序结束均有效。全局变量:从定义位置到源程序结束均有效。2 2、按存储类型分、按存储类型分 静态存储变量:程序运行时有固定的存储空间,静态存储变量:程序运行时有固定的存储空间, 程序结束时释放内存单元。程序结束时释放内存单元。 动态存储变量:根据需要动态分配和释放内存单元。动态存储变量:根据需要动态分配和释放内存单元。WangLan18/53局部变量:在函数内部或某个控制块的内部定义的变量。局部变量:在函数内部或某个

13、控制块的内部定义的变量。局部变量的作用域:函数内部。局部变量的作用域:函数内部。作用:作用:增强了函数模块的独立性。增强了函数模块的独立性。全局变量:在函数外面定义的变量称为全局变量。全局变量:在函数外面定义的变量称为全局变量。全局变量的作用域:从该变量定义的位置开始,直到源文全局变量的作用域:从该变量定义的位置开始,直到源文件结束。件结束。作用:作用:在同一文件中,所有函数都可以引用全局变量。增在同一文件中,所有函数都可以引用全局变量。增强了各函数间数据的联系。强了各函数间数据的联系。WangLan19/53局部变量和全局部变量和全局变量的作用局变量的作用域如图所示:域如图所示: int i

14、; main() float a, b; char s; function(); int k; void fuction(); int m; 局部变量 s 的作用域 局部变量 a, b 的作用域 全局变量 i 的作用域 全局变量 k 的作用域 局部变量 的作用域 举例说明举例说明WangLan20/53 变量的存储类型变量的存储类型变量的存储类型指的是变量的变量的存储类型指的是变量的存储属性存储属性,它说明变量占用,它说明变量占用存储空间的区域存储空间的区域。在内存中,供用户使用的存储区由在内存中,供用户使用的存储区由程序区程序区、静态存储区静态存储区和和动态存储区动态存储区3部分组成。部分组

15、成。变量的存储类型:变量的存储类型:auto、register、static和和extern4种。种。 auto型变量存储在内存的型变量存储在内存的动态存储区动态存储区; register型变量保存在型变量保存在寄存器寄存器中;中; static型和型和extern变量存储在变量存储在静态存储器静态存储器。 变量的作用域和存储类型变量的作用域和存储类型WangLan21/53局部变量局部变量的存储类型默认值为的存储类型默认值为auto型。型。全局变量全局变量的存储类型默认值为的存储类型默认值为extern型。型。注意:注意: 一般情况下,常用一般情况下,常用auto型、型、register型定

16、义局部变量。型定义局部变量。 static型既可作为型既可作为局部变量局部变量,又可作为,又可作为全局变量全局变量。n 作为局部变量时,作为局部变量时,局部变量的值将被保留局部变量的值将被保留,若定义时没,若定义时没有赋初值,则系统会自动为其赋有赋初值,则系统会自动为其赋0值;值;n 作为全局变量时,其有效范围为它所在的源文件,其他作为全局变量时,其有效范围为它所在的源文件,其他源文件不能使用。源文件不能使用。WangLan22/53六、数组作为函数参数六、数组作为函数参数1 1、数组元素作函参、数组元素作函参(值传递(值传递) )数组元素的作用等同于简单变量。数组元素的作用等同于简单变量。

17、如果实参为数组元素,则形参必须是简单变量。如果实参为数组元素,则形参必须是简单变量。2 2、数组名作函参、数组名作函参 (地址传递)(地址传递)如果实参为数组名,则形参不允许为简单变量。如果实参为数组名,则形参不允许为简单变量。函数中形参值的改变会引起实参值的改变函数中形参值的改变会引起实参值的改变。 WangLan23/53数组元素作函参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 4WangLan24/5

18、3值传递 234a011a1a2a3xaWangLan25/53数组名作函参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) ); WangLan31/53例例3 3:设计一个函数:设计一个函数:long fac(int n),用来计算正整数的,用来计算正整数的阶乘,编写程序进行测试。阶乘,编写程序进行测试。算法的核心思想:算法

19、的核心思想:对于任意正整数对于任意正整数n,如果知道,如果知道(n1)!,则则n!=n(n1)!。 可在函数中定义一个可在函数中定义一个static型变量,用来保存每一次阶乘型变量,用来保存每一次阶乘的计算结果。的计算结果。变量的作用范围(变量的作用范围(2)WangLan32/53变量的作用范围(变量的作用范围(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); WangLan33/53函数的声明函数的声明main( ) floa

20、t 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); WangLan34/53不需声明的两种情况不需声明的两种情况(1)(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); Wang

21、Lan35/53不需声明的两种情况不需声明的两种情况(2)(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); WangLan36/531按值传递按值传递例例#include void swap(int,int); /函数声明函数声明void main() int

22、 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=4a=3,b=4a bx y3434 34WangLan37/532地址传递地址传递例例#include void swap(int *,int *); /函数声明函数声明void main() int a=3,b=4; p r i n t f ( “ a = % d , b = % d n ” , a , b ) ;

23、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=4a=4,b=3a bx y34 34WangLan38/53形参和实参形参和实参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

24、,ffdc b=2,ffde x=3,ffd8 y=2,ffdaWangLan39/53值传递值传递 3232xyabffd8ffdaffdcffdeWangLan40/53函数的定义函数的定义1 1、无参函数、无参函数 void print( )void print( ) printf(“I printf(“I am a student!”); am a student!”); 2 2、有参函数、有参函数 int add(int x, intint add(int x, int y) y) int int z; z; z=x+y; z=x+y; return z; return z; 对形参

25、的声明:传统方式和现代方式对形参的声明:传统方式和现代方式3 3、空函数、空函数 void qksortvoid qksort( ) ( ) WangLan41/53对形参的说明对形参的说明 传统方式传统方式 intint add(x, y) add(x, y) int int x, y ; x, y ; int int z; z; z=x+y; z=x+y; return z; return z; 现代方式现代方式int add(int x, intint add(int x, int y) y) int int z; z; z=x+y; z=x+y; return z; return z;

26、 WangLan42/53函数定义函数定义-判断正误判断正误 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) WangLan43/53主函数和其他函数主函数和其他函数main( ) int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf( max =%d ,c); int max(int x,int

27、 y) int z; if(xy)z=x; else z=y; return(z); WangLan44/53库函数和自定义函数库函数和自定义函数#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(xy)z=x; else z=y; return(z); WangLan45/53有参函数和无参函数有参函数和无参函数main( ) int a,b,c; scanf(%d,%d,&a,&b); c

28、=max(a,b)+f1(); printf( result =%d ,c); int max(int x,int y) int f1() int z; return 33; if(xy)z=x; else z=y; return(z); WangLan46/53函数的返回值(函数的返回值(1 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(xy)z=x; else z=y; return(z); WangLan47/53函数的返回值(函数的返回值(2 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(xy)z=x; else z=y;error C4716: max : must return a valueWa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论