函数的调用及数组做参数函数_第1页
函数的调用及数组做参数函数_第2页
函数的调用及数组做参数函数_第3页
函数的调用及数组做参数函数_第4页
函数的调用及数组做参数函数_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、8.5 8.5 函数的嵌套调用函数的嵌套调用 c c中函数是平行的,不能嵌套定义,但能中函数是平行的,不能嵌套定义,但能嵌套调用,即在一个函数中调用另一函数。嵌套调用,即在一个函数中调用另一函数。 如:如: main( ) a a函数函数 b b函数函数 调用调用a a函数函数 调调b b函数函数 结束结束如求:如求:y=|x|2+|x-5|3-x4y=power(abs(x),2)+ power(abs(x-5),3)- power(x,4)y=power(abs(x),2)+ power(abs(x-5),3)- power(x,4)间接递归调用一般形式:间接递归调用一般形式: fun1(

2、x) fun2(t) : : fun2(y); fun1(z); : : 8.6 函数的递归调用函数的递归调用递归调用递归调用: :在调用一函数时在调用一函数时, ,直接或间接地调用直接或间接地调用本函数。本函数。直接递归调用一般形式:直接递归调用一般形式: fun(x) : fun(y); : 递归函数会无终止地调用本身递归函数会无终止地调用本身, 故在定义故在定义递归函数时要有条件递归函数时要有条件,使不满足条件时不调用。使不满足条件时不调用。 age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=10

3、 关键:用公式表示关键:用公式表示 age(n)= 10 (n=1) age(n-1) +2 (n1)例例1(1(例例8.7)8.7)。有五人有五人, ,第第5 5人比第人比第4 4人大人大2 2岁岁, ,第第4 4人比第人比第3 3人大人大2 2岁岁, ,第第3 3人比第人比第2 2人大人大2 2岁岁, ,第第2 2人比人比第第1 1人大人大2 2岁。第岁。第1 1人人1010岁岁, ,问第问第5 5人多少岁?人多少岁?分析分析:这是一递归问题这是一递归问题, ,要求第要求第5 5人年龄人年龄, ,必知第必知第4 4人年龄人年龄, ,要求第要求第4 4人年龄人年龄, ,必知第必知第3 3人年

4、龄人年龄.n=1 时,时,c=10 ,否则否则c=age(n-1)+2 int age(int n) 求求age(5)的过程:的过程:int c; age(5)=age(4)+2 age(3)+2 age(2)+2 return(c); age(1)+2 10 void main( )int nl,n; scanf(“%d”,&n);nl=age(n); printf(“第第%d%d人的年龄为人的年龄为:%d”,n,nl);if (n=1) c=10;else c=age(n-1)+2;运行运行:第第5 5人的年龄为:人的年龄为:1818回推回推递推递推age(n)= 10 (n=1)

5、 age(n-1) +2 (n1)例例2 2 用递归调用法求用递归调用法求n!.n!.分析分析:6!=6*5!, 5!=5*4! , 2!=2*1!,!,1!=1公式:公式:float fac(int n) float f; /*放放n!*/ if (n=0|n=1) f=1; else f=n*fac(n-1); return(f); void main( ) int n; float y; scanf(%d”,&n); y=fac(n); printf(“%d!=%f”,n,y); n!= 1 (n=0,1) n*(n-1)! (n1)若要编一将一组数排序的若要编一将一组数排序的函

6、数,传递的是什么?函数,传递的是什么?主函数主函数:(:(1 1)输入任一整数)输入任一整数n, ,(2) (2) fac(n)函数函数-y. (3) (3) 输出值输出值y 。8.7 数组作函数参数数组作函数参数 数组元素也是变量数组元素也是变量, ,可做函数参数。数组名可做函数参数。数组名既可作形参也可作实参既可作形参也可作实参, ,用数组名用数组名传递整个数组传递整个数组 8.7.1 8.7.1 数组元素作实参数组元素作实参 与变量做实参一样,数组元素可以作实参。与变量做实参一样,数组元素可以作实参。是单向传递是单向传递-即即“值传送值传送”方式。方式。例例3 3(8.10)8.10)将

7、两个各有将两个各有1010个元素的数组个元素的数组a a,b b 逐项对应比较,分别统计出相应元素,大于、逐项对应比较,分别统计出相应元素,大于、等于、小于的次数。若等于、小于的次数。若a a比比b b大于的元素多,大于的元素多,则认为则认为ab,ab,输出输出 a,ba,b的关系的关系。2. 主函数:输入两数组主函数:输入两数组. .循环判断循环判断ai与与bi的元素关系的元素关系. . 1, n+=1用用large (ai, bi) = 0, m+=1 -1, k+=1判断判断n n与与k k的关系,的关系,输出输出两数组关系两数组关系6分析分析:1.建立比较两元素大小的函数建立比较两元素

8、大小的函数,int large(int x,int y).若若xy标记标记f=1;若若x=y,f=0; xy) f=1;else if (x=y) f=0;else f=-1;void main( ) int large(int x,int y); int a10,b10, i, n=0,m=0,k=0; printf(“输入数组输入数组a:n”); for ( i=0;i10;i+) scanf(“%d”,&ai); printf(“n输入数组输入数组b:n”); for ( i=0;iy) f=1;else if (x=y) f=0;else f=-1; for ( i=0;ibi

9、有有%d个个, ai=bi有有%d个个, ai k) printf(“a数组数组b数组数组”);); else if (n=k) printf(“a数组数组=b数组数组”);); else printf(“a数组数组y) f=1; .return(f);8.7.2 用数组名作函数参数用数组名作函数参数 此时此时, ,实参与形参都用数组名,传递整个实参与形参都用数组名,传递整个数组数组。例例2 2(8.11).8.11).将将1010名学生成绩放数组名学生成绩放数组score中中, ,求求1010名学生的平均成绩。名学生的平均成绩。分析分析: 1.求平均值函数求平均值函数 average :形参

10、用形参用: array10.平均值放平均值放aver 中中, 和和 s=s+array i 循环加循环加,最后最后aver=s/10;2. 主函数主函数:定义数组和变量;定义数组和变量; 输入成绩;输入成绩; 调求平调求平均值函数送均值函数送v; 输出输出v的值的值.程序程序 float average ( float array10 ) int i; float aver, s=0; for (i=0; i10 ;i+) s=s+arrayi; aver=s/10; return(aver); void main( ) float score10, v ; int i; 循环循环输入成绩输入

11、成绩 v= v= ; ; 输出平均成绩输出平均成绩 array为为数组名数组名调用函数求平均值:调用函数求平均值:average ( (实参数组名实参数组名) )void main( )float score10, v ; int i; printf (“输入输入1010个学生成绩个学生成绩:n” ); 实参为数组名实参为数组名运行运行: : 输入输入1010个学生成绩个学生成绩: 85 76 100 57 82 93 68 75 90 88 平均成绩为:平均成绩为: 78.20 for (i=0; i10; i+) scanf (“%f”, &score i); printf(“n”

12、); v=average(score); printf (“ 平均成绩为平均成绩为:%5.2 fn“,v); 实参和形参,类型应一致实参和形参,类型应一致 为处理元素需要为处理元素需要, ,可另设一个参数可另设一个参数作为数组元素个数作为数组元素个数, ,如改上例如改上例: : float average ( float array , int n ),n为数组元素个数为数组元素个数 调用时调用时, , 用用aveage ( )调调用用。说明说明: : 实参实参( (score) )和形参和形参( (float float array10)10)用数组名。用数组名。可不写维数可不写维数scor

13、e,10起始地址起始地址 a0 a1 a2 1000 3 15 7 8 . b0 b1 b2用数组名作函数参数时用数组名作函数参数时, ,不是不是“值传值传送送”, ,而是而是“地址传送地址传送”。 即把实参起始地址传送给形参,即把实参起始地址传送给形参,这样两数组共占同一内存单元,形参值这样两数组共占同一内存单元,形参值变化,可改变实参值的变化。变化,可改变实参值的变化。例例3( 3( 例例8.13)8.13) 用选择法对数组中用选择法对数组中1010个个整数按由小到大排序。整数按由小到大排序。void sort(int a , int n) int i,j,t; for (i=0 ; in

14、-1; i+) t=ai; ai=aj;aj=t; for ( j=i+1; jaj)for ( j=0; jaj+1)主函数如何写?主函数如何写?用冒泡法如何作?用冒泡法如何作? void main( ) int b10,i ; printf(“Enter the arrayn”); printf(“n”) 一定要会一定要会。 for (i=0; i10;i+) scanf(“%d”,&bi); sort(b,10); printf(“the sorted array:n”); for (i=0; i10;i+) printf(“%d”,bi);由于由于a,ba,b两数组共占同一地址

15、两数组共占同一地址,故,故a a数组排序数组排序b b数组也排序。数组也排序。int b10=3,12,7,5,9,23,18,30,9,13定义时输入定义时输入b10b10数组?数组?注意:注意:无返回值不能用赋值语句无返回值不能用赋值语句8.7.3 多维数组作函数参数多维数组作函数参数1 1。多维数组中可用多维数组名作实参和多维数组中可用多维数组名作实参和形参形参。 作形参时,要指定每维的大小,或作形参时,要指定每维的大小,或省第一维的大小。省第一维的大小。如:如:int a310;int a 10; 实参数组若大于形参实参数组若大于形参, ,如:实参如:实参int s510,只取实参的一

16、部分,其余不,只取实参的一部分,其余不起作用。起作用。2 2。仍为仍为“地址地址”传递。传递。例例4(8.14).4(8.14). 调用函数求一调用函数求一3 3* *4 4矩阵的最大元素矩阵的最大元素。int max_v(int(int array3 4); /*也可也可int arry 4*/ int i, j, max =array00; for (i=0;i3;i+) for (j=0;j4;j+) 主函数?主函数?void main( ) int a34=5,8,10,15,1,7,35,6,12,8,3,6,; int m; m=max_v(a); printf (“max=%dn

17、”,m); if (max-数组名数组名8.88.8* * 局部变量和全局变量局部变量和全局变量 8.8.1 8.8.1 局部变量局部变量 在一个函数内部定义的变量在一个函数内部定义的变量, ,它只在本函它只在本函数范围内有效数范围内有效, ,在该函数外无效在该函数外无效( (不能使用不能使用) )。如如: float f1(int a) int b,c; : a,b,c有效有效 char f2(int x, int y) int i,j ; : x,y,i, j有效有效 void main ( ) int m,n; : m,n有效有效. 说明说明: :1.1.局部变量局部变量, ,在函数调用

18、时在函数调用时, ,分配分配空间空间产生值产生值, ,函数返回时取消值。函数返回时取消值。2.2.不同函数中可用相同名字的局部变不同函数中可用相同名字的局部变量量, ,互不干扰。互不干扰。3. 3. 形参也是局部变量。如上面的形参也是局部变量。如上面的 a,x,ya,x,y。8.1.2 8.1.2 外部变量外部变量( (全局变量全局变量) ) 如如: int p=2, q=10; /*p,q 为为外部变量外部变量*/ float f1(int a) /*a为为形参形参*/int b,c; 全局变量全局变量p,q 的作用范围的作用范围 char c1,c2; /*外部变量外部变量*/ char

19、f2(int x, int y) int i, j; 全局变量全局变量c1,c2 的作用范围的作用范围 void main( ) int m, n; 在函数之外定义在函数之外定义的变量为外部的变量为外部( (全局全局) )变量。变量。 *全局变量可全局变量可为本文件其它函数共用为本文件其它函数共用. .有效范围:有效范围:从定义变量的位置开始到源文件结从定义变量的位置开始到源文件结束束。说明:说明:* *1 1。外部变量可以代替返回值的作用外部变量可以代替返回值的作用。外部变量未赋值,自动赋外部变量未赋值,自动赋0 0。例例5( 8.15).5( 8.15).一个一维数组放入一个一维数组放入1 1名学生成名学生成绩,编程求平均分、最高分和最低分绩,编程求平均分、最高分和最低分. .Max=ai;Min=ai; 主函数:主函数:定义变量,定义变量, 输入数组;输入数组;调用函数,求平均值调用函数,求平均值, ,输出输出平均分平均分, ,最高最高, ,最低分最低分float Max=0,Min=0; / /* *习惯全局变量头一字母大写习惯全局变量头一字母大写* */ /float average(float a , int n

温馨提示

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

最新文档

评论

0/150

提交评论