第8章函数3.ppt_第1页
第8章函数3.ppt_第2页
第8章函数3.ppt_第3页
第8章函数3.ppt_第4页
第8章函数3.ppt_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、8.5 函数的嵌套与递归调用P167 嵌套调用,C规定:函数定义不可嵌套,但可以嵌套调用函数,习题集六单元 一、6,例 求三个数中最大数和最小数的差值,#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z); void main() int a,b,c,d; scanf(%d%d%d, ,int max(int x,int y,int z) int r; r=xy?x:y; return(rz ? r : z); int min(int x,int y,int z)

2、int r; r=xy?x:y; return(rz?r:z); int dif(int x,int y,int z) int m,n; m=max(x,y,z); n=min(x,y,x); return m-n; ,递归调用 定义:函数直接或间接的调用自身叫函数的递归调用,int f(int x) int y,z; z=f(y); . return(2*z); ,递归调用,递归问题的特点 : 1. 递归问题的出口,即终止递归的条件。 2. 问题的转化:把一个问题转化为一个新的问题,新的问题与原来的问题相同,只不过所处理的对象有规律的递增或递减。,例8.8 求n的阶乘,递推法:n!= 1 2

3、(n-2)(n-1) n 其特点是从一个已知的事实出发,按一定规律推出下一个事实,再从这个新的已知事实出发,再向下推出一个新的事实 递归法: n!= (n-1)! n, (n-1)!= (n-2)! (n-1), . , 3!= (3-1)! 3, 2!= (2-1)! 2, 1!= (1-1)! 1,#include int fac(int n) int f; if(n= =0|n= =1) f=1; else f = n * fac(n-1); return( f ); void main() int n, y; printf(Input a integer number:); scanf

4、(%d, ,返回值1,返回值2,返回值6,返回值24, 是回推过程,一直回推到某个终止条件 是递推过程,int fac(int n) int f; if(n= =0|n= =1) f=1; else f = n * fac(n-1); return (f); ,以n=4为例,执行过程如下:,void main( ) int x,n; scanf (%d%d, ,例: 求 xn (n=0),float f(int x,int n) float z; if (n=0) z=1; else if (n=1) z=x; else z=x*f(x,n-1); return z; ,float f(int

5、 x, int n) float z; if (n=0) z=1; else if (n=1) z=x; else z=x*f(x,n-1); return z; ,float f(int x, int n) float z; if (n=0) z=1; else if (n=1) z=x; else z=x*f(x,n-1); return z; ,float f(int x, int n) float z; if (n=0) z=1; else if (n=1) z=x; else z=x*f(x,n-1); return z; ,float f(int x, int n) float z

6、; if (n=0) z=1; else if (n=1) z=x; else z=x*f(x,n-1); return z; ,f(5,4),5,3,5,2,5,1,z=5;,习题集六单元 一、9 二、3,11 三、3,8.8 局部变量和全局变量P184,一、局部变量(内部变量):在一个函数内部定义的变量,只在本函数内部有效。即只能在本函数内部使用. 或者说局部变量的作用域是定义它的函数,int max(int x,int y) int z; z = xy ? x : y; return z; void main() int a,b,c; scanf(“%d%d”, ,z=20;,x,y,z

7、是局部变量 作用域是max函数,a,b,c是局部变量 作用域是main函数,说明:(4点) 1. main中定义的变量,只在main中有效。 2. 函数形参是函数的局部变量。 3. 不同函数中可以定义同名的变量,它们互不干扰。,void test() int c=10; printf(“test c=%dn”,c); void main() int c=20; test(); printf(“main c=%dn”,c); ,结果: test c=10 main c=20,说明:(4点),4. 函数内部的复合语句中也可定义局部变量,有效范围在该复合语句中。建议:不宜用。,习题集六单元 一、3,

8、main ( ) int a,b; . int c; c=a+b; . . ,c 的有效范围,a , b 的有效范围,二、全局变量(外部变量):在函数之外定义的变量。有效范围:从定义点到文件结束,f1(int a) int b, c; ,f2(float x, float y) int i, j; ,main() int i, j, x, m; ,p, q 有效 在f1,f2,main 中均可使用,c1,c2 有效 在f2,main 中可以使用,int p, q;,char c1, c2;,说明: 全局变量没有赋初值时,系统自动赋为0 同一个.c文件中,全局与局部变量同名时,外部变量被屏蔽,即

9、局部优先。,int a; void test() int a=20; printf(“test a=%dn”,a); void main() a+; test(); printf(“main a=%dn”,a); ,结果: test a=20 main a=1,int a=3,b=5; void main() int max(int a,int b); int a=10; printf(“max=%dn”,max(a,b); int max(int a,int b) int c; c= ab?a:b; return c; ,结果: max=10,例8.16 写出程序结果,全局变量,局部变量,作

10、用域为main函数,a、b为形参,局部变量,作用域为max函数,习题集六单元 二、8,例8.15 :在一维数组中存放10个学生的成绩,写一个函数,求出平均分,最高分和最低分。,分析: 1. 平均分由函数值带回 2. 设max,min为全局变量,ave score 10 max min,aver array n max min,main( ),average( ),全局变量增加了函数间的数据联系。,void main() int i; float aver,score10; for(i=0;i10;i+) scanf(“%f”, ,#include float Max=0,Min=0; floa

11、t average( float array ,int n) int i; float aver,sum = array0; Max=Min=array0; for(i=1;iMax) Max=arrayi; if(arrayiMin) Min=arrayi; sum +=arrayi; aver = sum / n; return aver; ,8.9 变量的存储类型P188,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。 从变量值存在的时间角度来分,又可以分为静态存储方式和动态存储方式。 静态存储方式:指在程序运行期间由系统分配固定的存储空间的方式。 动态存储方式:则是在

12、程序运行期间根据需要进行动态的分配存储空间的方式,变量和函数有两个属性:数据类型和数据的存储类别。存储类别指的是数据在内存中存储的方式。 存储方式分为两大类:静态存储类和动态存储类。包含: 自动的(auto); 静态的(static); 寄存器的(register); 外部的(extern)。 根据变量的存储类别,可以知道变量的作用域和生存期。,auto变量,自动变量auto:不专门声明为static存储类别的局部变量都是动态分配存储空间,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。因此这类局部变量称为自动变量。 函数中的形参和在函数中定义的变量(包括在复合

13、语句中定义的变量),都属此类。 自动变量用关键字auto作存储类别的声明。,例如: int (int ) *定义f函数,为形参 * auto int ,;/*定义、为自动变量 * /* auto可省略,隐含确定为自动存储类别 *,#include int max (int x,int y) int n; n=xy?x:y; return n; void main() int a,b,c; scanf(“%d%d”, ,a,b,x,y,n,3,4,3,4,4,main函数,max函数,静态变量:全局变量和静态局部变量。 特点: 程序在开始执行时,分配存储空间; 程序执行完毕时,释放存储空间; 在

14、程序执行的全部过程中,占据固定的存储单元。,静态局部变量(static) 定义方式: static 类型 变量名; 例如:static int a,b; 特点: 静态局部变量属于静态存储变量; 静态局部变量只赋初值一次,每次调用都保留上次调用结束时的值; 静态局部变量在函数调用后仍然存在,但其它函数不能引用。 若局部静态变量定义时不赋初值,则系统自动赋初值(数值型为0,字符型为空字符); 应用:需要保留函数上一次调用结束时的值。,int f(int a) int b=0; static int c=3; b=b+1;c=c+1 return(a+b+c); main( ) int a=2,i;

15、 for (i=0;i3;i+) printf(“%d”,f(a); ,a,b是自动局部变量,是动态存储变量 c是静态局部变量 作用域是f函数,a是自动局部变量,是动态存储变量 作用域是main函数,例8.17:,void fun() static int a; a+; printf(“a=%dn”,a); main( ) int a=2,i; for (i=0;i3;i+) fun(); printf(“main a=%d”,a); ,程序运行结果: a=1 a=2 a=3 main a=2,静态局部变量举例:,对静态局部变量的说明: (1) 静态局部变量属于静态存储类别,在静态存储区内分配

16、存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释放。 (2)对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。,(3)如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。 (4)虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。,习题集六单元 一、7、8 二、4,5,9,register变

17、量,变量的值是存放在内存中的。当程序中用到那一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中。 经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放。,如果有一些变量使用频繁,则为存取变量的值要花费不少时间。为提高执行效率,语言允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。由于对寄存器的存取速度远高于对内存的存取速度,因此这样做可以提高执行效率。这种变量叫做寄存器变量,用关键字register作声明。,例819使用寄存器变量 #include void main ( ) long fac(long); long i,n; scanf(%ld, ,用extern声明外部变量,外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。编译时将外部变量分配在静态存储区。 用extern来声明外部变量,以扩展外部变量的作用域。,1. 在一个文件内声明外部变量,例820 用extern声明外部变量,扩展它在程序文件中的作用域 #include void main() int max(int,int

温馨提示

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

评论

0/150

提交评论