0

可能重复:
将两个模块合并为一个。第一个是方程;第二个取这个方程的积分

#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),然后初始化第二个模块。这是事情变得混乱的时候......

这条线有什么作用?

双积分F(双(函数)(双)){

重要提示:我的程序运行顺利,但我不知道为什么因为这条线。

有什么办法可以改造这段代码以排除我的第一个模块和这条奇怪的线(以及任何需要去的东西都可以去)所以我只有嵌套 (x^2) 函数的集成模块。

当然,我的 main(void) 模块可以保留。

4

2 回答 2

1

您的 integrant 方法将函数指针作为参数,该指针可以是任何符合它所采用参数定义的函数,在这种情况下,任何接受 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 回答