0

重複の可能性:
2 つのモジュールを 1 つにマージする。1 つ目は方程式です。2番目はこの方程式の積分を取ります

#include <stdio.h>
#include <math.h>

double f(double x){
   return (x*x);
}

double integrateF(double (function)(double) ){
    double area;
    double x_width;

    int k; // Counter necessary for For-Loop
    int n; // # of bars

    double min; // Limit min
    double max; // Limit max

    printf("Please enter the limit minima, 'a'==>\n");
    scanf("%lf",&min);
    printf("Please enter the limit maxima, 'b'==>\n");
    scanf("%lf",&max);
    printf("Please enter # of bars needed to span [a,b]==>\n");
    scanf("%d",&n);

   x_width=(max-min)/n;

   for(k=1;k<=n;k++){
      area+=function(min+x_width*(k-0.5));
   }
   area*=x_width;

   return area;
}

int main(void){
   double resultant;
   resultant=integrateF(f);
   printf("The value of the integral is: %f \n",resultant);
   return 0;
}

すべての夕方、

私の最初のモジュールは、関数 (x^2) で構成されています。戻り値は、integrateF(f) に進み、2 番目のモジュールを初期化します。これは物事が混乱するときです...

この行は何をしますか?

double integrateF(double (関数)(double) ){

重要な注意: 私のプログラムはスムーズに実行されますが、この行が原因で理由がわかりません。

このコードを改造して最初のモジュールとこの奇妙な行を除外する方法はありますか (そして、必要なものは何でも同様に実行できます)、(x^2) 関数をネストする統合モジュールしかありません。

もちろん、私のメイン(無効)モジュールはそのままです。

4

2 に答える 2

1

積分メソッドはパラメーターとして関数ポインターを受け取ります。これは、受け取るパラメーターの定義に準拠する任意の関数である可能性があります。この場合、double 型の一意のパラメーターを受け取り、double を返す関数です。

これは、integrateF のパラメーターが指定するものです。

私の意見では、私はデザインをそのままにしておきます。このようにして、統合する関数を非常にクリーンな方法で変更できます。

オプションがない場合は、次を置き換えます。

      area+=function(min+x_width*(k-0.5));

代わりに次を追加します。

      value = min+x_width * (k - 0.5);
      value *= value; 
      area += value;

value が double の場合、次のように宣言します。

double value;

また、integrateF にはパラメーターは必要ありません。

double integrateF()
于 2012-10-12T23:28:21.200 に答える
0

別の意見にもメリットがあります。integrateF は、別のライブラリに展開して関数 f とは別にコンパイルできるように記述されています。もしそれが起こらないと思っていたら、integrateF を次のように書き直すことができます:

double integrateF(){

...

area+=f(min+x_width*(k-0.5));

...

関数 f は変更する必要はありません。別の関数 (x*x ではない) を統合する場合は、f() の本体を変更して、プログラム全体を再コンパイルします。

于 2012-10-12T23:36:11.470 に答える