第13讲函数的调用和变量的作用域一、函数的调用1、函数的嵌套调用2、函数的递归调用二、变量的作用范围1、局部变量2、全局变量嵌套调用:在一个函数调用过程中又调用另一个函数。一、函数的调用1、函数的嵌套调用例嵌套调用:qian1(intx,inty){intc,s,t;s=x+y;t=x-y;c=qian2(s,t);return(c);printf(c=%d\n,c);}qian2(intx,inty){return(x+y);}main(){inta=1,b=2,c;c=2*qian1(a,b);printf(c=%d\n,c);}例统计字符个数#includestdio.hlongcountch();/*利用函数原型声明函数*/main(){longn;n=countch();printf(n=%ld\n,n);}longcountch(){longcn;for(cn=0;getchar()!=‘\n’;cn++);returncn;}例连接两个字符串#includestdio.hintchdu(charx[]);/*函数原型声明*/voidlianjie(charx[],chary[]);main(){chara[100],b[20];inti,k;gets(a);gets(b);lianjie(a,b);puts(a);}intchdu(charc[100])/*测试字符串长度*/{intk;for(k=0;c[k]!='\0';k++);returnk;}voidlianjie(charx[],chary[])/*连接字符串*/{intk,m;k=chdu(x);for(m=0;y[m]!='\0';m++)x[k+m]=y[m];x[k+m]=‘\0’;}例输入两个数,求它们的和、差、积、商。main(){floatx,y;floatadd(float,float),min(float,float),mul(float,float),div(float,float);printf(Pleaseinputtwonumbers:);scanf(%f,%f,&x,&y);printf(%f+%f=%f\n,x,y,add(x,y));printf(%f-%f=%f\n,x,y,min(x,y));printf(%f*%f=%f\n,x,y,mul(x,y));printf(%f/%f=%f\n,x,y,div(x,y));}floatadd(floatxx,floatyy){floatzz;zz=xx+yy;return(zz);}floatmin(floatxx,floatyy){floatzz;zz=xx-yy;return(zz);}2、函数的递归调用递归调用:在调用一个函数的过程中又出现直接或间接地调用该函数本身。这样的调用称为递归调用。递归调用必须可以满足一定条件时结束递归调用,否则无限地递归调用将导致程序无法结束。例计算Fibonacci(斐波拉契)数列longfib(intn){if(n>2)return(fib(n-1)+fib(n-2));elsereturn(1);}main(){printf(%ld\n,fib(6));}例使用递归算法编写计算n!的函数。longfac(intn){if(n==1)return1;elsereturnn*fac(n-1);}voidmain(){intm;scanf(%d,&m);printf(%2d!=%d\n,m,fac(m));}例使用递归算法求m和n的最大公约数gcd分析:求m和n的最大公约数等价于求n与(mmodn)的最大公约数。则有gcd(m,n)等价于gcd(n,(mmodn))例如:求24和16的最大公约数即求与gcd(16,(24mod16))的最大公约数为gcd(16,8)又等价于gcd(16,(16mod8))为gcd(8,0)此时n为零,m即为最大公约数#includestdio.h#includemath.hvoidmain(){floatgcd(),m,n,g;printf(“\nInputm,n:\n”);scanf(“%f,%f”,&m,&n);g=gcd(m,n);printf(“\ngcd(%2.0f,%2.0f)=%5.0f\n”,m,n,g);}程序如下:floatgcd(a,b)floata,b;{if(b==0)return(a);elsereturn(gcd(b,fmod(a,b)));}变量的作用范围也称变量的作用域,即变量可以存储或访问的范围。变量的作用域是指变量的可见性。二、变量的作用范围局部变量:在一个函数内部定义的变量。局部变量的作用范围仅限于本函数,即只有在本函数内才能使用它们,其他函数不能使用它们。说明:•不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。•形参也是局部变量。•可以在一个复合语句中定义变量,这些变量只在本复合语句中有效。1、局部变量局部变量举例main(){intx,y;floatf1,f2;···}hanshu(intx,floaty){inta,b,c;···}局部变量的使用:说出下列程序的运行结果#includestdio.hvoidf2(intx,inty){x++;y++;}voidf1(intx,inty){intn=0;f2(x,y);printf(n=%d,x=%d,y=%d\n,n,x,y);}voidmain(){intn=2,a=3,b=4;f1(a,b);printf(n=%d,a=%d,b=%d\n,n,a,b);}n=0,x=3,y=4n=2,a=3,b=4全局变量:在函数外定义的变量,也称外部变量。作用范围:从其定义的地方开始直至源程序文件的结束。全局变量通常放在源程序的开始处。全局变量命名时,首字母大写,其余字母小写。2、全局变量全局变量举例intAbc,D1;main(){floatf1,f2;···}floatKa,Hc;hanshu(intx,inty){doublec,e;···}全局变量Ka,Hc的作用域全局变量Abc,D1的作用域例intX=3;intfunc(){intc=0;c+=X;X+=10;return(c);}main(){intk=2;k=func();printf(1)%d\n,k);k=func();printf(2)%d\n,k);}运行结果:1)32)13全局变量的特点:优点:•利用全局变量可以从函数中得到一个以上的返回值。•利用全局变量可以减少函数中实参和形参的个数。缺点:•全局变量在程序运行过程中始终都占用存储单元,而不是在函数被调用时才临时分配存储单元。•函数的通用性降低。•在同一个源程序中,当全局变量与局部变量同名,在局部变量的作用域内,全局变量不起作用,即全局变量被屏蔽。例intM=5;intfun(intx,inty){intM=10;return(x*y-M);}main(){inta=7,b=5;printf(%d\n,fun(a,b)/M);}运行结果:5例已知一个一维数组,用一个函数求数组最大数、最小数和平均数。#includestdio.hintNum,Max,Min;intaverage(intarray[]){inti;intarray_aver=array[0];Max=Min=array[0];for(i=1;iNum;i++){if(array[i]Max)Max=array[i];if(array[i]Min)Min=array[i];array_aver+=array[i];}array_aver/=Num;returnarray_aver;}voidmain(){intaver,n[5]={23,2,4,5,6};Num=5;aver=average(n);printf(max=%d,min=%d,average=%d\n,Max,Min,aver);}