#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),然后初始化第二个模块。事情变得混乱......
这条线做什么?
double integrateF(double(function)(double)){
重要提示:我的程序运行顺利但我不知道为什么因为这行。
有没有什么方法可以重新编写这个代码来排除我的第一个模块和这个奇数行(以及任何需要去的东西也可以去)所以我只有嵌套(x ^ 2)函数的集成模块。 / p>
我的主要(无效)模块当然可以留下来。
答案 0 :(得分: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()
答案 1 :(得分:0)
另一种观点也有价值。 integrationF现在以这样一种方式编写,它可以被提取到另一个库并与函数f分开编译。如果您从未预料到会发生这种情况,您可以像这样重写integrationF:
double integrateF(){
...
area+=f(min+x_width*(k-0.5));
...
函数f不需要更改。当你想要集成另一个函数(而不是x * x)时,只需修改f()的主体并重新编译整个程序。