位置:首页 > 软件操作教程 > 编程开发 > C语言 > 问题详情

C语言 函数的嵌套调用

提问人:刘团圆发布时间:2020-12-01

    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()函数,为了方便,统一在所有函数最前面进行函数声明。

image.png

关于函数嵌套程序设计时需要注意的问题:

©对于比较复杂的程序,可以使用嵌套的形式增加层次以降低复杂性。

©虽然理论上对嵌套层次没有要求,但嵌套层次太多,每层嵌套又都需要消耗内存空间,所以如果嵌套层数太多,一不利于代码易读性,二可能因内存问题造成程序崩溃。


继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部