関数の掛け算を返す関数
いま関数の積分を行おうとしています.
この積分を行う関数が
double integral(double (*func)(double), double a, double b )
{
double ans;
.....
return ans;
}
となっていて,aからbまでfuncが指す関数を積分して結果を返します.
積分をさせる関数は
double f1(double x)
{
return 3.0*x;
}
double f2(double x)
{
return x*x;
}
となっていて,同じようにg1, g2も用意します.(本当は関数が3つ4つあります.)
例えばf1を積分したいとき,
int main()
{
double ans = integral(f1, a, b);
printf("%f\n", ans);
}
ですよね.
自分で積分する関数を選ぶときは,ここに配列で場合分けをして
double (*func_f[])(double)={f1, f2};
scanf("%d", &flag); /* flagに0~1を代入 */
ans = integral(func_f[flag], a, b);
でいいと思います.
さて,そこで本題なのですが,
double (*func_f[])(double)={f1, f2};
double (*func_g[])(double)={g1, g2};
としておいて,
scanf("%d", flag1); scanf("%d", flag2);
func_f[flag1], func_g[flag2];
として関数を入力側から決定して,
(例えばflag1=1, flag2=1,であったとして
*func_f[1]=x*x *func_g[1]=5.0*x ならば)
h(x)=(x*x)*(5.0*x)=5.0*x*x*x
という関数を作って,
h(x)を指すポインタを double (*h_ptr)(double) とすれば
ans = integral(h_ptr, a, b);
としたいのです.
(f1*g2)を一つの関数としてh(x)=(f1*g2)(x)というように扱うことができればいいと思うのですが.
integralの引数で,関数のポインタを2個にすると,汎用性が失われてしまうと思うので,できればそこは変えたくないです.
どのようにすればよいのでしょうか?
また,「考え方を変えればよい」などの意見も頂きたいです.
皆様,どうぞよろしくお願いします.
お礼
大変丁寧にお教えいただき、ありがとうございます。 確かにそのとおりだと思いました。 他の方の発表を参考に、少しずつ上達できるように、していきたいと思います。