C语言规定,一个函数可以调用另一个函数,而被调用函数的函数体中也可以出现对另一个函数调用。c语言对函数的调用深度是没有限制的,函数之间层层调用,最终实现复杂的程序功能。
在使用系统提供的库函数时也经常遇到函数嵌套的情况,例如:
sqrt(pow(b,2)-4*a*c)
要想求出sq「t()函数的值,必须先计算pow()函数的值。
【例题】编写函数计算
S=f(-n)+f(-n+1)+…f(-1)+f(0)+f(1)+…f(n-1)+f(n)
其中f(x)函数的定义为:
(x+1)/(x-2) 当x>0且x不等于2
f(x)= 0 当x=0且x等于2
(x-1)/(x-2) 当x<0
算法分析:
定义两个函数,一个函数f()实现f(x)的功能,另一个函数sum()实现f(-n)+f(-n+1)+…f(-1)+f(0)+f⑴+…f(n-1)+f(n)的累加和。main()函数中调用sum()函数,而为了实现sum()函数,必须在sum()函数的函数体内调用函数f()计算f(x)。这是一个函数嵌套调用的问题。
数f()的函数内部是一个多分支语句的形式,根据形参x的值决定函数返回值。
sum()函数的函数体主要是一个从-n到n的循环,循环体重调用f()函数,把循环变量作为实参传递给f()函数中的形参,并将函数返回值累加起来。
主函数中用来输入变量n的值,调用sum()函数,并输出结果。
程序如下:
#include<stdio.h>
double sum(int n);
double f(double x);
main()
{
int n;
printf ("input n:\n");
scanf ("%d",&n);
printf("%f\n",sum(n));
}
double sum(int n)
{
int i;
double s=0;
for(i=-n;i<=n;i++)
s+=f(1.0*i);
return s;
}
double f(double x)
{
if(x==0 ||x==2)
return 0;
else if(x>0 && x!=2)
return(x+1)/(x-2):
else
return(x-1)/(x-2);
程序执行时,屏幕显示提示信息:
input n:
输入:
3
输出结果为:
4.216667
从程序中可看出main()函数调用了sum()函数,sum()函数为了得到结果又调用了f()函数。程序的具体执行过程为:
①程序从main()函数开始执行,在main()函数体中执行到调用sum()函数的语句时,转去执行sum()函数。
②执行sum()函数的开头部分。
③在sum()函数体中执行到f()函数的调用语句,转去执行f()函数。
④执行f()函数的开头部分。
⑤当函数结束或遇到return语句时,返回sum()函数调用处。
⑥返回sum()函数继续执行。
⑦当遇到return语句后函数结束,返回main()函数调用处。
⑧继续执行main()函数,直到结束。
最终形成的嵌套调用关系如图所示。
从本程序中可以看出:
•程序中包含了三个函数main()、sum()和f()。这三个函数是互相独立的,并没有从属关系。
•因为sum()函数要调用f()函数,并对f()函数的返回值进行累加,所以sum()函数和f()函数均为double型。
•程序中main()函数在最前面,之后分别是sum()函数、f()函数,为了方便,统一在所有函数最前面进行函数声明。
关于函数嵌套程序设计时需要注意的问题:
©对于比较复杂的程序,可以使用嵌套的形式增加层次以降低复杂性。
©虽然理论上对嵌套层次没有要求,但嵌套层次太多,每层嵌套又都需要消耗内存空间,所以如果嵌套层数太多,一不利于代码易读性,二可能因内存问题造成程序崩溃。
已有 22658 名学员学习以下课程通过考试
最需教育客户端 软件问题一手掌握
去 App Store 免费下载 iOS 客户端
点击加载更多评论>>