c语言中程序的模块化是利用函数实现的吗,c语言程序设计第07章用函数实现模块化程序设计.ppt...

《c语言程序设计第07章用函数实现模块化程序设计.ppt》由会员分享,可在线阅读,更多相关《c语言程序设计第07章用函数实现模块化程序设计.ppt(23页珍藏版)》请在人人文库网上搜索。

1、第7章 用函数实现模块化程序设计,7.1 函数是什么 7.2 函数的定义和调用 7.3 函数的嵌套调用和递归调用 7.4 数组作为函数参数 7.5 变量的作用域和生存期,7.1 函数是什么,1 函数就是功能 每一个函数都用来实现一个特定的功能,即程序模块(功能模块)。较大的程序都要化分成若干功能。 函数是C程序的基本单位 一个C程序是由一个或多个函数组成的,其中一定包含一个主函数(main函数),除了main函数外,还可以有若干个一般的函数。即模块化程序设计的思想。如: 例7.1(p169)包含三个函数; 例1.3(p4)包含两个函数;,函数的分类 从用户使用角度分:库函数和用户自定义函数。 。

2、从函数的形式分:无参函数和有参函数。 4 函数的定义及调用 函数的定义是分别进行的,是相互独立。一个函数并不从属于另一个函数,即函数的定义是平行的,不能嵌套。 一般函数只有被调用才能执行,函数间可以相互调用,但不能调用main函数,main函数是系统调用的。函数调用可以嵌套,还可以直接递归或间接递归。,7.2 函数的定义和调用,7.2.1 为什么要定义函数 C程序中的所有函数必须“先定义,后使用”。定义函 数可以将相关信息通知给编译系统。 定义函数包括以下内容: 1 指定函数名,以便以后按名调用。 2 指定函数的类型,即函数值的类型。 3 给出函数的形参表,其中包括形参的名字及类型。 (注:以。

3、上3部分组成函数的首部) 4 指定函数应完成的功能,即变量声明和相应操作的 实现语句。 (注:第4部分为函数体) 注意: 函数由函数首部及函数体组成。,7.2.2 定义函数 定义函数的一般形式: 类型名 函数名(形参表) 函数体 注:1 当无形参表时,为无参函数。 2 形参表中包含形参的类型和形参名(用“,”分隔) 例:int max(int x,int y) int z; z=(xy)?x:y; return(z); /*可简化为return z; */ 注:return语句的作用是将 z 的值作为函数值返回的主调函数中,即函数返回值。函数的类型即返回值的类型。,7.2.3 函数的调用 定义。

4、函数的目的是为了使用它,通过调用来完成。 1 调用的形式:函数名(实参表) 注意: (1)当无实参表时,为无参函数的调用。 (2)实参与形参可以同名,但占用内存单元不同。 例7.1:利用函数,求出2个数中大的。 int max(int x,int y) int z; z=(xy)?x:y; return(z); /*可简化为return z; */ void main( ) int a,b,c; scanf(“%d%d”, ,函数调用过程 (1) 实参与形参必须一一对应(个数、类型、意义) (2) 执行函数调用时,首先按照定义的类型给形参分配存储单元,并将实参的值传递给相应的形参,即“单向传值。

5、”。然后执行函数体。 (3) 在执行函数体中的语句时,只有形参参加各种操作即使形参的值发生改变,也不影响实参的值,即“单向传值” (4) 通过return语句将函数值带回到主调函数,亦称返回值。函数体中可以出现多个return语句,但只能执行其中一个当无返回值(无return语句)时,函数定义为void类型。 (5) 函数调用结束,形参单元被释放(值就不存在了),而实参单元仍保留并维持原值,即“单向传值”。 思考:“单向传值”的概念?,3 调用函数的方式 按函数出现在程序中的位置来分,有3种调用方式: (1) 函数语句 调用没有返回值的函数,函数可以单独作为一个语句。 例:scanf(“%d”。

6、,7.2.4 对被调函数的声明和函数原型 1 为什么要进行函数声明 函数的使用也必须满足“先定义,后使用”的原则。当被调函数的定义出现在主调函数之后时,必须对被调函数进行声明,以此通知编译系统,便于进行程序的正确性检查。 2 函数声明的形式 在主调函数的声明部分写上函数原型。 3 函数原型有两种形式 (1) 类型名 函数名(形参表); 即函数的首部后加一个“;” (常用此形式) (2) 类型名 函数名(参数类型1,参数类型2, ); 即将形参表中的参数名省略。,例7.2:(题同例7.1) void main( ) int max(int x,int y); /*函数原型*/ int a,b,c。

7、; scanf(“%d%d”, */ ,7.3 函数的嵌套调用和递归调用,7.3.1 函数的嵌套调用 在被调用的函数中,又调用另一个函数,称为嵌套调用。 例7.3 输入4个数,找出其中最大的。 设计算法: 1 定义函数max,求出2个数:a,b中大的(同例7.1)。 2 定义函数max_4,求4个数:a,b,c,d中大的,其中调用max 函数: m=max(a,b); /*把a、b中大的放到变量m中 */ m=max(m,c); /*把m、c中大的放到变量m中 */ m=max(m,d); /*把m、d中大的放到变量m中 */ 3 在main函数中输入a,b,c,d的值,调用max-4求出最大。

8、者。,编程序: #include void main( ) int max_4(int a,int b,int c,int d); /*函数原型*/ int a,b,c,d,max; scanf(“%d%d%d%d”, ,7.3.2 函数的递归调用 在调用一个函数的过程中,又出现直接或间接的调用该函数本身,称为递归调用。 例7.4 定义函数fac,求出n的阶乘(n!)值。 设计算法: 由数学知识可知:n!=n(n-1)! ,当n=0时,n!值为1。因此,求n的阶乘值的时,又用到求阶乘的过程:(n-1)!,数学中称为递归定义,n=0时为递归出口。可以用递归函数实现求阶乘值: int fac(in。

9、t n) int x; if (n=0) x=1; else x=n*fac(n-1); /*直接递归调用函数fac*/ return x; ,编程序: #include int fac(int n) int x; if (n=0) x=1; else x=n*fac(n-1); /*直接递归调用函数fac*/ return x; void main( ) int n,x; scanf(“%d”, 思考:如何定义函数用递推法(循环累乘)求n!,7.4 数组作为函数参数,数组元素可以作为函数的参数,其用法与变量相同;数组名也可以作为函数的参数,传递的是数组首元素的地址。 7.4.1 数组元素作函。

10、数参数 数组元素可以作为调用函数时的实参,传值给形参。数组元素不能作为函数的形参。 例如: int a10; x=max(a1,a2); /*求元素a1、a2中大的*/ int max(int x,int y) 不能写成: int max(int a1,int a2) 例7.6 (P185),7.4.2 数组名作函数参数 数组名也可以作为函数调用时的实参,传递的是数组首元素的地址(即数组的首地址),不是将数组中的所有元素传递给形参。此时,对应的形参应当是数组名或指针变量(见第8章)。 例7.7 (P186) 例7.8 (P188) #include void main( ) float ave。

11、rage(float array ); /*函数原型*/ float scroe10,aver); aver=average(score ); /*调用函数,数组名为实参*/ float average(float array ) /*数组名为形参*/ ,例7.9 (P189)用一个函数实现选择法对10个数排序。 #include void sort(int a ,int n) /*定义函数,数组名为形参*/ int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(ajak) k=j; t=ai;ai=ak;ak=t; void main(。

12、 ) int a10 =12,6,3,7,4,9,13,2,10,8; sort(a,10 ); /*调用函数,数组名为实参*/ ,7.5 变量的作用域和生存期,7.5.1 变量的作用域局部变量和全局变量 变量的作用域亦称有效范围。若程序中只包含一个main函数,则在函数中定义的变量在整个函数中都有效。当一个程序中包含多个函数时,在A函数中定义的变量在B函数中能否使用?这就是作用域问题。 1 局部变量 在函数中定义的变量,只在本函数中有效,成为局部变量或内部变量。作用域只为本函数内。 注:(1) 不同函数中的局部变量可以使用相同的名字,他们 有各自的有效范围,互不影响。 (2) main函数中。

13、定义的变量也是局部变量。 (3) 函数的形参也是局部变量,函数外不能引用。 (2) 复合语句中可以定义变量,只在本语句中有效。,2 全局变量 一个程序包含多个文件,一个文件可以包含多个函数。在函数外定义的变量是外部变量或全局变量。有效范围为从定义的位置开始,到文件的结束。 当一个文件中全局变量与局部变量重名时,在局部变量的有效范围内,全局变量被“屏蔽”起来,即不起作用。当局部变量出了有效范围后,全局变量继续有效。 例7.10 请看下列程序的输出结果。 int m=13; int fun2(int x ,int y) int m=3 ; return(x*y-m); void main() in。

14、t a=7 ,b=5; printf(%dn“,fun2(a,b)/m); ,7.5.2 变量的存储方式和生存期 除了作用域以外,变量还有一个重要的属性:生存期,即变量的存在时间。有些变量在程序运行的 整个过程中都存在,而有些变量只在调用函数时才临时分配存储单元,函数调用结束马上就释放了,变量不再存在。即变量分为:静态存储方式和动态存储方式两种,亦称存储类别。 由此可知,变量有两个属性:数据类型和存储类别。 C语言中有4种存储类别: 1 auto自动变量 前面用过的函数中,定义的形参和局部变量都是自动变量,存储类别定义的关键字auto省略,属于动态存储方式。有效范围和生存期均为本函数。 2 s。

15、tatic静态变量 函数中定义的局部变量静态变量,属于静态存储方式。有效范围为本函数,生存期为整个程序。,例7.12 分别求出15的阶乘值,并输出。(p196) #include int fac(int n) static int f=1 ; /*f为静态局部变量*/ f=f*n; return(f); void main() int i; for(i=1;i=5;i+) printf(“%d!=%dn”,i,fac(i); 注: 静态局部变量“f”的有效范围只限于函数fac,但是生 存期是整个程序,即在fac函数外,它的值仍然存在。再次调用函数时,继续在前一个值上累乘。 若静态局部变量在定义时未初始化,系统自动赋值为0。,3 registc寄存器变量 一般变量都存储在内存中,而寄存器变量存储在CPU的寄存器中,从而提高存取速度。 现代的计算机,系统可以自动完成此功能。 extern外部变量的作用域 扩展外部变量的作用域。,习 题,P208: 1、2、3、4、6、7、8、10。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值