当前位置:首页 > 金融/证券 > 金融资料 > 函 数 的 调 用(1) - 九江学院
函数的嵌套调用(1)函数定义都是互相平行、独立的,不能嵌套定义.可以做嵌套调用函数,1、在调用一个函数的过程中,又调用另一个函数。2、在定义一个函数的过程中,调用另一个函数例s8_6_1.c求三个数中最大的一个,并将它输出:1、定义一个比较函数,intmax(inta,intb)2、定义一个输出函数print(inta,intb,intc)函数的嵌套调用(2)例8.6用弦截法求方程x3-5x2+16x-80=0的根xf(x)0yxx2f(x2)x1f(x1)x1f(x1)x2f(x2)(1)取两个不同点x1,x2,如果f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个根.如果f(x1)和f(x2)符号相同,则(x1,x2)区间内没有一个根.必须改变x1,x2的值直到f(x1)和f(x2)符号相反位置x1f(x1)x2f(x2)x1f(x1)x2f(x2)定义函数f(x)求函数的值x3-5x2+16x-80定义函数root(x1,x2)来求(x1,x2)区间的那个实根.函数的嵌套调用(3)xf(x)0yxx1f(x1)x2f(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)继续xf(x)0yxx1f(x1)x2f(x2)输入x1,x2,求f(x1),f(x2)直到f(x1)和f(x2)异号求f(x1)和f(x2)连线与x轴的交点xy=f(x),y1=f(x1)y与y1同号真x1=xy1=yx2=xy2=y直到|y|eroot=x,输出root函数的递归调用(1)在调用一个函数的过程中又调用该函数本身。C允许函数的递归调用。例如:intf(intx){inty,z,z=f(y);return(2*z);}递归调用分为:直接调用和间接调用函数的递归调用(2)f函数调用f函数直接调用intf(intx){inty,z,z=f(y);return(2*z);}f1函数f2函数调用f2函数调用f1函数intf1(intx){inty,z,z=f2(y);return(2*z);}intf2(intx){inty,z,z=f1(y);return(2*z);}间接调用程序中不应出现无终止的递归调用,而只应出现有限次数、有终止的递归调用。可以用条件语句(if)控制。函数的递归调用(3)例8.7有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2个大2岁。问第2个人,说比第1个人大2岁。最后问第1个人,他说他10岁。请问第5人多大?age(5)=age(4)+2;age(4)=age(3)+2;age(3)=age(2)+2;age(2)=age(1)+2;age(1)=10;age(n)=10;(n=1)age(n)=age(n-1)+2;(n1)age(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}函数的递归调用(4)age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18回推递推main(){intn,k;scanf(“%d”,&n);k=age(n);printf(“\n%d”,k);}floatfac(intn){floatf;/*递推法*/if(n0){printf(“n0,dataerror!”);f=-1;}elseif(n==0||n==1)f=1;elsefor(i=1,f=1;i=n;i++)f=f*i;return(f);}(1)用递推方法,即从1开始,乘2,再乘3……一直乘到n.递推法的特点是从一个已知的事实出发,按一定规律推出下一个事实,再从这个新的已知的事实,再向下推出一个新的事实……函数的递推调用求n!floatfac(intn){floatf;/*递归法*/if(n0){printf(“n0,dataerror!”);f=-1;}elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}(2)递归法5!=4!*5;4!=3!*4;3!=2!*3;2!=1!*2;1!=1;0!=1n!=1;(n=0,1)n!=n*(n-1)!(n1)main(){intn;floaty;printf(“inputaintegernumber:”);scanf(“%d”,&n);y=fac(n);printf(“%d!=%15.0f”,n,y);}函数的递归调用(5)例8.7Hanoi(汉诺)塔问题.有三根针A、B、C。A针上有64个盘子,盘子大小不等,大的在下面,小的在上。要求把这64个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘子,且在移动过程中在三根针上都保持大盘在下,下盘在上,要求编程打印出移动的步骤。ABC函数的递归调用(6)Aone1、将A上n-1个盘借助C针先移到B针上,2、把A上剩下一个盘移到C针上3、将n-1个盘从B针借助A移到C针上BtwoCthree函数的递归调用(7)分成两类步骤:1、一个盘子从一针上移到另一个针上move(getone,putone)2、将n-1个盘子从一个针上移到另一个针上(n1),这是一个递归的过程。hanoi(n,one,two,three)voidhanoi(intn,charone,chartwo,charthree){if(n==1)move(one,three);else{hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}}voidmove(chargetone,charputone){printf(“%c—%c\n”,getone,putone);}voidmain(){intm;scanf(“%d”,&m);hanoi(m,’A’,’B’,’C’);}数组作为函数参数(1)1、数组元素作函数实参与用变量作用一样,是单向传递,即“值传送”方式。例8.10有两个数组a、b,各人10个元素,将它们对应地逐个相比(即a[0]与b[0]比,a[1]与b[1]比……)。如果a数组中的元素大于b数组中的相应元素的数目多于b数组中相应的元素的数目(例如,a[i]b[i]6次,b[i]a[i]3次,其中i每次为不同的值),则认为a数组大于b数组,并分别统计出两个数组相应元素大于、等于、小于的次数。数组作为函数参数(1)intlarge(intx,inty){intflag;if(xy)flag=1;elseif(xy)flag=-1;elseflag=0;return(flag);}main(){inta[10],b[10],i,n=0,m=0,k=0;for(i=0;i10;i++){scanf(“%d”,&a[i]);scanf(“%d”,&b[i]);}for(i=0;i10;i++){switch(large(a[i],[b[i])){case1:n++;case-1:m++;case0:l++;}}if(nk)printf(“ab”);elseif(nk)printf(ab);elseprintf(“a=b”);}2、数组名可作函数参数,传递的是整个数组。此时实参与形参都应用数组名.数组作为函数参数(2)例8.11有一个一维数组score,内放10个学生成绩,求平均成绩。floataverge(floatarray[10]){inti;floataver,sum=array[0];for(i=1;i10;i++)sum=sum+array[i];aver=sum/10;return(aver);}main(){floatscore[10],aver;inti;for(i=0;i10;i++)scanf(“%d”,&a[i]);aver=averge(score);printf(“%5.2f”,aver);}数组作为函数参数(2)(2)实参数组与形参数组类型应一致(今都为float型,如不一致,结果将出错。(1)用数组名作函数实参,应该在主调函数和被调用函数分别定义相应的数组,例题中array是形参组名,score是实参数组数组名,分别在其所在函数中定义,不能只在一方定义。数组作为函数参数(3)(3)在被调用函数中声明了形参数组的大小为10,但在实际上,指定其大小是不起任何作用的,因为C编译对形参数组大小未做检查,运行时只是将实参数组的首地址传给形参数组。因此,score[n]和array[n]指的是同一单元。(4)形参数组也可以不指定大小,在定义数组时在数组名后面跟一个空的方括弧。有时为了在被调用函数中控制所处理数组元素个数的需要,可以另设一个整型参数,传递需要处理的数组元素的个数,例8.11形式。(5)最后应当说明一点:用数组名作函数实参时,不是把数组的值传递给形参,而是把实参数组的地址传给形参数组,这样两个数组就共占同一段内存单元。见图8.14。程序设计中可以有意识地利用这一特点改变实参数组元素的值(如排序)数组作为函数参数(4)例8.13用选择法对数组中10个整数按由小到大排序。选择法:先将10个数中最小的数与a[0]对换;再将a[1]到a[9]中最小的数与a[1]对换……每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。下面以5个数为例说明选择法的步骤。a[0]a[1]a[2]a[3]a[4]数组作为函数参数(5)36194未排序时的情况16394将5个数中最小的数1与a[0]对换13694将余下的4个数中最小的数3与a[1]对换13496将余下的3个数中最小的数4与a[2]对换13469将余下的2个数中最小的数6与a[3]对换,至此完成排序数组作为函数参数(6)3、用多维数组名作函数参数可以用多维数组名作为实参和形参,在被调用函数中对形参数组定义时可以省略第一维的大小说明。如intarray[3][10];或array[][10];从实参传送来的是数组起始地址,在内存中各元素是一行接一行地顺序存放的,而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列。不能只指定第一维而省略第二维,下面写法是错误的:intarray[3][];例8.14有一个3*4的矩阵,求所有元素中的最大值。
本文标题:函 数 的 调 用(1) - 九江学院
链接地址:https://www.777doc.com/doc-3920979 .html