资源描述
,函 数 的 嵌 套 调 用(1),函数定义都是互相平行、独立的,不能嵌套定义.,可以做嵌套调用函数,,1、在调用一个函数的过程中,又调用另一个函数。,2、在定义一个函数的过程中,调用另一个函数,例,s8_6_1.c,求三个数中最大的一个,并将它输出:,1、定义一个比较函数,int,max(,int,a,,int,b),2、,定义一个输出函数,print(,int,a,,int,b,,int,c),函 数 的 嵌 套 调 用(2),例8.6 用弦截法求方程,x,3,-5x,2,+16x-80=0,的根,x,f(x),0,y,x,x2,f(x2),x1,f(x1),x1,f(x1),x2,f(x2),(,1)取两个不同点,x1,x2,如果,f(x1),和,f(x2),符号相反,则,(,x1,x2),区间内必有一个根.,如果,f(x1),和,f(x2),符号相同,则,(,x1,x2),区间内没有一个根.,必须改变,x1,x2,的值,直到,f(x1),和,f(x2),符号相反位置,x1,f(x1),x2,f(x2),x1,f(x1),x2,f(x2),定义函数,f(x),求函数的值,x,3,-5x,2,+16x-80,定义函数,root(x1,x2),来,求,(,x1,x2),区间的那个实根.,函 数 的 嵌 套 调 用(3),x,f(x),0,y,x,x1,f(x1),x2,f(x2),(,2)连接,f(x1),f(x2),两点,此线(即弦)交,x,轴与,x,x,点的坐标可以用以下公式求出:,x=,x1*f(x2)-x2*f(x1),f(x2)-f(x1),再从,x,求出,f(x).,定义函数,xpoint,(x1,x2),来求,f(x1),和,f(x2),的连线与,x,轴的交点的坐标,函 数 的 嵌 套 调 用(4),(3)如果,f(x1),和,f(x),符号相反,则根的区间在(,x1,x),此时将,x,作为新的,x2,如果,f(x),和,f(x2),符号相反,则根的区间在(,x,x2),此时将,x,作为新的,x1,(,4)重复步骤(2)和(3),直到|,f(x)|,e,为止,e,为一个很小的数,例如10,-6,.此时认为,f(x)=0;,函 数 的 嵌 套 调 用(5),继续,x,f(x),0,y,x,x1,f(x1),x2,f(x2),输入,x1,x2,求,f(x1),f(x2),直到,f(x1),和,f(x2),异号,求,f(x1),和,f(x2),连线与,x,轴的交点,x,y=f(x),y1=f(x1),y,与,y1,同号,真,n,x1=x,y1=y,x2=x,y2=y,直到|,y|1),age(,int,n),int,c;,if(n=1)c=10;,else c=age(n-1)+2;,return(c);,函 数 的 递 归 调 用(4),age(5),=age(4)+2,age(4),=age(3)+2,age(3),=age(2)+2,age(2),=age(1)+2,age(1),=10,age(2),=12,age(3),=14,age(4),=16,age(5),=18,回推,递推,main(),int,n,k;,scanf,(“%d”,k=age(n);,printf,(“n%d”,k);,float,fac,(,int,n),float f;/*,递推法*/,if(n0),printf,(“n0,dataerror,!”);,f=-1;,else if(n=0|n=1)f=1;,else for(i=1,f=1;i=n;i+)f=f*i;,return(f);,(1),用,递推,方法,,即从1开始,乘2,再乘3一直乘到,n.,递推法,的特点是从一个已知的事实出发,按一定规律推出下一个事实,再从这个新的已知的事实,再向下推出一个新的事实,函 数 的 递 推 调 用,求n!,float,fac,(,int,n),float f;/*,递归法*/,if(n0),printf,(“n1),main(),int,n;,float y;,printf,(“input a integer number:”);,scanf,(“%d”,y=,fac,(n);,printf,(“%d!=%15.0f”,n,y);,有如下递归过程,void print(,int,w),int,i;,if(w!=0),print(w-1);,for(i=1;i1),这是一个递归的过程。,hanoi,(n,one,two,three),void,hanoi,(,int,n,char one,char two,char three),if(n=1)move(one,three);,else,hanoi,(n-1,one,three,two);,move(one,three);,hanoi,(n-1,two,one,three);,void move(char,getone,char,putone,),printf,(“%c%cn”,getone,putone,);,void main(),int,m;,scanf,(“%d”,hanoi,(m,A,B,C);,数 组 作 为 函 数 参 数(1),1、数组元素作函数实参,与用变量作用一样,是,单向传递,,即“,值传送,”方式。,例8.10 有两个数组,a、b,各人10个元素,将它们对应地逐个,相比(即,a0,与,b0,比,,a1,与,b1,比)。如果,a,数组中的,元素大于,b,数组中的相应元素的数目多于,b,数组中相应的元素的,数目(例如,,aibi6,次,,biai3,次,其中,i,每次为不同,的值),则认为,a,数组大于,b,数组,并分别统计出两个数组相应元,素大于、等于、小于的次数。,数 组 作 为 函 数 参 数(1),int,large(,int,x,int,y),int,flag;,if(xy)flag=1;,else if(xy),flag=-1;,else flag=0;,return(flag);,main(),int,a10,b10,i,n=0,m=0,k=0;,for(i=0;i10;i+),scanf,(“%d”,scanf,(“%d”,for(i=0;ik),printf,(“ab”);,else if(nk),printf,(ab);,else,printf,(“a=b”);,2,、数组名可作函数参数,传递的是整个数组。,此时实参与形参都应用数组名.,数 组 作 为 函 数 参 数(2),例8.11 有一个一维数组,score,内放10个学生成绩,,求平均成绩。,float,averge,(float array10),int,i;,float aver,sum=array0;,for(i=1;i10;i+),sum=sum+arrayi;,aver=sum/10;,return(aver);,main(),float score10,aver;,int,i;,for(i=0;i10;i+),scanf,(“%d”,aver=,averge,(score);,printf,(“%5.2f”,aver);,数 组 作 为 函 数 参 数(2),(,2),实参数组与形参数组类型应一致(今都 为,float,型,如,不一致,结果将出错。,(1),用数组名作函数实参,应该在主调函数和被调用函数,分别定义相应的数组,例题中,array,是形参组名,,score,是实参数组数组名,分别在其所在函数中定义,不能只在一方定义。,数 组 作 为 函 数 参 数(3),(3)在被调用函数中声明了形参数组的大小为10,但在实际上,,指定其大小是不起任何作用的,因为,C,编译对形参数组大小,未做检查,运行时只是将实参数组的首地址传给形参数组。,因此,,scoren,和,arrayn,指的是同一单元。,(4)形参数组也可以不指定大小,在定义数组时在数组名后面,跟一个空的方括弧。有时为了在被调用函数中控制所处理,数组元素个数的需要,可以另设一个整型参数,传递需要,处理的数组元素的个数,例8.11形式。,(5)最后应当说明 一点:用数组名作函数实参时,不是把,数组的值传递给形参,而是把实参数组的地址传给形参,数组,,,这样两个数组就共占同一段内存单元。见图8.14。,程序设计中可以有意识地利用这一特点改变实参数组元,素的值(如排序),数 组 作 为 函 数 参 数(4),例8.13 用选择法对数组中10个整数按由小到大排序。,选择法:先将10个数中最小的数与,a0,对换;,再将,a1,到,a9,中最小的数与,a1,对换,每比较一轮,找出一个未经排序的数中最小,的一个。共比较9轮。,下面以5个数为例说明选择法的步骤。,a0a1a2a3a4,数 组 作 为 函 数 参 数(5),3 6 1 9 4,未排序时的情况,1,6 3 9 4,将5个数中最小的数,1,与,a0,对换,1,3,6 9 4,将余下的4个数中最小的数,3,与,a1,对换,1 3,4,9 6,将余下的3个数中最小的数,4,与,a2,对换,1 3 4,6,9,将余下的2个数中最小的数,6,与,a3,对换,,至此完成排序,数 组 作 为 函 数 参 数(6),3、用多维数组名作函数参数,可以用多维数组名作为实参和形参,在被调用函数中,对形参数组定义时可以省略第一维的大小说明。,如,int,array310;,或,array10;,从实参传送来的是数组起始地址,在内存中各元素,是一行接一行地顺序存放的,而并不区分行和列,如果,在形参中不说明列数,则系统无法决定应为多少行多少,列。不能只指定第一维而省略第二维,下面写法是错误,的:,int,array3;,例814 有一个3*4的矩阵,求所有元素中的最大值。,
展开阅读全文