C++函數(shù)的嵌套調(diào)用
C++不允許對函數(shù)作嵌套定義,也就是說在一個函數(shù)中不能完整地包含另一個函數(shù)。在一個程序中每一個函數(shù)的定義都是互相平行和獨立的。
雖然C++不能嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù),也就是說,在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù)。
在程序中實現(xiàn)函數(shù)嵌套調(diào)用時,需要注意的是:在調(diào)用函數(shù)之前,需要對每一個被調(diào)用的函數(shù)作聲明(除非定義在前,調(diào)用在后)。
【例】用弦截法求方程f(x)=x3-5x2+16x-80=0的根。
這是一個數(shù)值求解問題,需要先分析用弦截法求根的算法。根據(jù)數(shù)學(xué)知識,可以列出以下的解題步驟:
1) 取兩個不同點x1,x2,如果f(x1)和f(x2)符號相反,則(x1,x2)區(qū)間內(nèi)必有一個根。如果f(x1)與f(x2)同符號,則應(yīng)改變x1,x2,直到f(x1), f(x2)異號為止。注意x1?x2的值不應(yīng)差太大,以保證(x1,x2)區(qū)間內(nèi)只有一個根。
2) 連接(x1, f(x1))和(x2, f(x2))兩點,此線(即弦)交x軸于x,見圖。

x點坐標可用下式求出:

再從x求出f(x)。
3) 若f(x)與f(x1)同符號,則根必在(x, x2)區(qū)間內(nèi),此時將x作為新的x1。如果f(x)與f(x2)同符號,則表示根在( x1,x)區(qū)間內(nèi),將x作為新的x2。
4) 重復(fù)步驟 (2) 和 (3), 直到 |f(x)|<ξ為止, ξ為一個很小的正數(shù), 例如10-6。此時認為 f(x)≈0。
這就是弦截法的算法,在程序中分別用以下幾個函數(shù)來實現(xiàn)以上有關(guān)部分功能:
1) 用函數(shù)f(x)代表x的函數(shù):x3-5x2+16x-80。
2) 用函數(shù)xpoint (x1,x2)來求(x1,f(x1))和(x2,f(x2))的連線與x軸的交點x的坐標。
3) 用函數(shù)root(x1,x2)來求(x1,x2)區(qū)間的那個實根。顯然,執(zhí)行root函數(shù)的過程中要用到xpoint函數(shù),而執(zhí)行xpoint函數(shù)的過程中要用到f函數(shù)。
根據(jù)以上算法,可以編寫出下面的程序:
#include <iostream>#include <iomanip>#include <cmath>using namespace std;double f(double); //函數(shù)聲明double xpoint(double, double); //函數(shù)聲明double root(double, double); //函數(shù)聲明int main( ){ double x1,x2,f1,f2,x; do { cout<<"input x1,x2:"; cin>>x1>>x2; f1=f(x1); f2=f(x2); } while(f1*f2>=0); x=root(x1,x2); cout<<setiosflags(ios::fixed)<<setprecision(7); //指定輸出7位小數(shù) cout<<"A root of equation is "<<x<<endl; return 0;}double f(double x) //定義f函數(shù),以實現(xiàn)f(x){ double y; y=x*x*x-5*x*x+16*x-80; return y;}double xpoint(double x1, double x2) //定義xpoint函數(shù),求出弦與x軸交點{ double y; y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1)); //在xpoint函數(shù)中調(diào)用f函數(shù) return y;}double root(double x1, double x2) //定義root函數(shù),求近似根{ double x,y,y1; y1=f(x1); do { x=xpoint(x1,x2); //在root函數(shù)中調(diào)用xpoint函數(shù) y=f(x); //在root函數(shù)中調(diào)用f函數(shù) if (y*y1>0) { y1=y; x1=x; } else x2=x; }while(fabs(y)>=0.00001); return x;}運行情況如下: