位置:首頁(yè) > 軟件操作教程 > 編程開(kāi)發(fā) > C語(yǔ)言 > 問(wèn)題詳情

C語(yǔ)言 函數(shù)的嵌套調(diào)用

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-01

    C語(yǔ)言規(guī)定,一個(gè)函數(shù)可以調(diào)用另一個(gè)函數(shù),而被調(diào)用函數(shù)的函數(shù)體中也可以出現(xiàn)對(duì)另一個(gè)函數(shù)調(diào)用。c語(yǔ)言對(duì)函數(shù)的調(diào)用深度是沒(méi)有限制的,函數(shù)之間層層調(diào)用,最終實(shí)現(xiàn)復(fù)雜的程序功能。

    在使用系統(tǒng)提供的庫(kù)函數(shù)時(shí)也經(jīng)常遇到函數(shù)嵌套的情況,例如:

    sqrt(pow(b,2)-4*a*c)

    要想求出sq「t()函數(shù)的值,必須先計(jì)算pow()函數(shù)的值。

【例題】編寫(xiě)函數(shù)計(jì)算

S=f(-n)+f(-n+1)+…f(-1)+f(0)+f(1)+…f(n-1)+f(n)

其中f(x)函數(shù)的定義為:

      (x+1)/(x-2) 當(dāng)x>0且x不等于2

f(x)=   0         當(dāng)x=0且x等于2

      (x-1)/(x-2)   當(dāng)x<0

算法分析:

    定義兩個(gè)函數(shù),一個(gè)函數(shù)f()實(shí)現(xiàn)f(x)的功能,另一個(gè)函數(shù)sum()實(shí)現(xiàn)f(-n)+f(-n+1)+…f(-1)+f(0)+f⑴+…f(n-1)+f(n)的累加和。main()函數(shù)中調(diào)用sum()函數(shù),而為了實(shí)現(xiàn)sum()函數(shù),必須在sum()函數(shù)的函數(shù)體內(nèi)調(diào)用函數(shù)f()計(jì)算f(x)。這是一個(gè)函數(shù)嵌套調(diào)用的問(wèn)題。

    數(shù)f()的函數(shù)內(nèi)部是一個(gè)多分支語(yǔ)句的形式,根據(jù)形參x的值決定函數(shù)返回值。

    sum()函數(shù)的函數(shù)體主要是一個(gè)從-n到n的循環(huán),循環(huán)體重調(diào)用f()函數(shù),把循環(huán)變量作為實(shí)參傳遞給f()函數(shù)中的形參,并將函數(shù)返回值累加起來(lái)。

    主函數(shù)中用來(lái)輸入變量n的值,調(diào)用sum()函數(shù),并輸出結(jié)果。

    程序如下:

    #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);

程序執(zhí)行時(shí),屏幕顯示提示信息:

    input n:

輸入:

    3

輸出結(jié)果為:

    4.216667

從程序中可看出main()函數(shù)調(diào)用了sum()函數(shù),sum()函數(shù)為了得到結(jié)果又調(diào)用了f()函數(shù)。程序的具體執(zhí)行過(guò)程為:

①程序從main()函數(shù)開(kāi)始執(zhí)行,在main()函數(shù)體中執(zhí)行到調(diào)用sum()函數(shù)的語(yǔ)句時(shí),轉(zhuǎn)去執(zhí)行sum()函數(shù)。

②執(zhí)行sum()函數(shù)的開(kāi)頭部分。

③在sum()函數(shù)體中執(zhí)行到f()函數(shù)的調(diào)用語(yǔ)句,轉(zhuǎn)去執(zhí)行f()函數(shù)。

④執(zhí)行f()函數(shù)的開(kāi)頭部分。

⑤當(dāng)函數(shù)結(jié)束或遇到return語(yǔ)句時(shí),返回sum()函數(shù)調(diào)用處。

⑥返回sum()函數(shù)繼續(xù)執(zhí)行。

⑦當(dāng)遇到return語(yǔ)句后函數(shù)結(jié)束,返回main()函數(shù)調(diào)用處。

⑧繼續(xù)執(zhí)行main()函數(shù),直到結(jié)束。

最終形成的嵌套調(diào)用關(guān)系如圖所示。

從本程序中可以看出:

?程序中包含了三個(gè)函數(shù)main()、sum()和f()。這三個(gè)函數(shù)是互相獨(dú)立的,并沒(méi)有從屬關(guān)系。 

?因?yàn)閟um()函數(shù)要調(diào)用f()函數(shù),并對(duì)f()函數(shù)的返回值進(jìn)行累加,所以sum()函數(shù)和f()函數(shù)均為double型。

?程序中main()函數(shù)在最前面,之后分別是sum()函數(shù)、f()函數(shù),為了方便,統(tǒng)一在所有函數(shù)最前面進(jìn)行函數(shù)聲明。

image.png

關(guān)于函數(shù)嵌套程序設(shè)計(jì)時(shí)需要注意的問(wèn)題:

?對(duì)于比較復(fù)雜的程序,可以使用嵌套的形式增加層次以降低復(fù)雜性。

?雖然理論上對(duì)嵌套層次沒(méi)有要求,但嵌套層次太多,每層嵌套又都需要消耗內(nèi)存空間,所以如果嵌套層數(shù)太多,一不利于代碼易讀性,二可能因內(nèi)存問(wèn)題造成程序崩潰。


繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部