• ベストアンサー

main関数の中でパラメータを宣言

c言語で積分をしています。 a~bまで積分する関数を dobule integral(double (*f)(double), double a, double b) { ・・・・・・ return s; /*sが計算結果*/ } としています。 fx=x*x を積分するときは double fx(double x) { return x*x; } を用意して、 main() { double ans = integral(fx, 0.0, 1.0); } という具合で現在やっています。 本題なのですが、 main関数の中でxを宣言して、そのxで同じように積分をしたいのです。 どうすればよいのでしょうか? 良い方法があれば教えて頂きたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

No2の方が既に書いてますように、gxを定義して、gxを呼び出す形になると思います。mainの中で、x1=x/3を定義するのは、無理があります。ここでxは、本来、integral関数の中で、a~bまでxを変化させる時の用途で用いられます。従って、integral関数の中でのみ、意味があります。 従って double gx(double x) { double x1; x1 = x/3.0; return fx(x); } の関数を定義します。 main関数で ans = integral(gx,0.0,1.0); とすれば、integral関数の中からgxを呼び出すはずですので、このようにするのが最も素直な方法かと思います。

yassan_yassan
質問者

お礼

ありがとうございました。 いろいろ考慮しているところです。

その他の回答 (2)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

「main関数の中で」というのは、何をなさりたいのかよく分かりませんが、 (x/3)*(x/3)を積分したいのであれば、手っ取り早いのは double gx(x){ return fx(x/3.0); } として、integralの引数にgxを渡すことですよね。 それではだめなのでしょうか。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

すいません。質問の意味がよくわかりません。 >main関数の中でxを宣言して、そのxで同じように積分をしたいのです。 xとは、変数名のことですか。それとも関数名のことですか。 もし、fx=xを積分したいのなら、 double fx(double x) { return x; } とすれば、良いと思いますが。 なにをなさりたいのか、もうすこし具体的に説明していただけませんでしょうか。

yassan_yassan
質問者

お礼

たびたびすいません。 要するに、 double fx(double x) { return x*x; } として、(x/3)*(x/3) を積分するには?ってことです。 mainの中で double x, x1; double (*func)(double); x1 = x/3; func=fx; (*func)(x_dash); integral(…, func) としてもうまくいかないんです。

yassan_yassan
質問者

補足

すいませんでした。 具体的に説明させてもらいます。 いまfxは double fx(double x) {    x*x; } として、変えないとします。 で、(x/n)^2 や、(x-m)^2 を積分したいときに、 main関数の中で double x1 を宣言して x1 = x1/n; とします。 このx1をfxのxとして積分したいのです。 このとき、各関数をどのように呼び出して受け渡せばいいのかが分かりません。 どうも説明がしにくいのですが、伝わるでしょうか?

関連するQ&A

  • 関数の掛け算を返す関数

    いま関数の積分を行おうとしています. この積分を行う関数が 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個にすると,汎用性が失われてしまうと思うので,できればそこは変えたくないです. どのようにすればよいのでしょうか? また,「考え方を変えればよい」などの意見も頂きたいです. 皆様,どうぞよろしくお願いします.

  • 使い回しの効く関数の作り方

    ある関数をaからbまで積分する関数integralがあります. integral(double (*func)(double, void*), void* t, double a, double b) 例えば次の関数 fx=5x double fx(double x, void* y0) { double y =*(double*)y0; return y*x; } を積分するときには double y=5.0; integral(fx, &y, 1.0, 5.0); としています. さらに gx=5x+5 のようなときは, 構造体を宣言して double gx(double x, void* y0) { parameter p =*(parameter*)y0; return p.y*x + p.z; } としています. これはいい方法なのでしょうか? 関数funcの引数の数を変えてしまうと, integralの使い回しができなくなると思い, このような方法にしていますが, これも被積分関数ごとに構造体を用意しなければならず, あまり良くないんじゃないかな~って思っています. もっといい方法があれば教えていただきたいです. よろしくお願いします.

  • 引数の個数を変えないで変数(定数)を扱う

    別に積分に限らないと思うのですが、積分を例にして質問させていただきます。 次のようなルーチンがあります。 integral( double (*func)(double), double a, double b ); /* a~bまで関数funcを積分する。 */ そこで、簡単に被積分関数を fx=3*x とすれば、 double fx(double x) { return 3*x; } というようにすれば良いですよね。 でも、例えば fx = exp(x-X) とか fx = x*X のような関数を積分したいときはどうすればよいのでしょうか? Xは変数ですが、xにはよらないので積分の中では定数とみなせます。 ループで X=0 のときにfxを積分 X=1 のときにfxを積分 X=2 のときにfxを積分… というようにしたいのですが、 fxの引数をfx(double x, double X) とすると、プロトタイプ宣言もルーチンの中も書き換えなければならなくなりますよね。 さらに fx = x-X + x' などとなったりすると、さらに書き換えなければならなくなり、せっかくの積分のルーチンをうまく使えません。 Xをグローバルで宣言する方法と、 プログラミングの前に、x-X を x' などと置きかえた式を実際に手計算で作る方法を思いついたのですが、 グローバル変数を使うのはあまりよくないし、手計算では簡単な場合しか置換を思いつかなかったりします。 fxの中で X を宣言して、 double fx(double x) { static double X; double y; y = x-X; X++; return y; } という方法も考えたのですが、どうもイマイチ良くないような… こういう場合に、良い方法はありますか? ここには簡単な関数を書きましたが、少し複雑な関数を積分するので。 質問の意図がうまく伝わらなかったらすいません。 書きにくかったです。

  • 二分法で関数の最小値を求める

    題名通りのプログラムを組んだのですが、どうしてもうまくいきません。どこが間違っているのでしょうか?教えてください。 以下プログラム #include< stdio.h > #include< stdlib.h > double minfx( double (*func)(double x), double a, double b ) { if( b-a < 0.0001 ) { if(func(a)>func(b)) { return func(b); } else { return func(a); } } else { if(func(a)>func(b)) { a = (a+b)/2; } else { b = (a+b)/2; } minfx(func,a,b); } } double f1(double x) { return (x-1.0)*(x-1.0); } double f2(double x) { return 3.0*x*x*x*x-4.0*x*x*x-12.0*x*x+10.0; } void main() { double ans1,ans2; ans1 = minfx( f1, 0.0, 5.0 ); ans2 = minfx( f2, 0.0, 5.0 ); printf("関数f1の最小値:%lf \n", ans1); printf("関数f2の最小値:%lf \n", ans2); system("PAUSE"); } これを実行するとf1とf2の値が0.000000といった感じで値が代入できていないと返されます。流れ的には合っていると思うのですが…なお、プログラムの形はできるだけそのままで、関数minfx内のみ変更する形でお願いします。自分としてはそこ以外に原因が考え付かないので…。

  • 関数原型宣言について

    関数原型宣言について 下記のプログラムのfunc関数は、関数原型宣言 <func(int a, long b, char *c);>が述されていないのにfunc関数の仮引数の型longは、関数原型宣言が与えられるといると本に書かれていたのですが、何故でしょうか教えて頂きたい。 ******************************************** #include <stdio.h> /*--- 三つの引数を受け取る関数 ---*/ void func(int a, long b, char *c) { int x; long y; /* … */ } int main(int argc, char *argv[]) { int a = 1; char s[] = "abc"; func(a + 3, 2, s); return (0); } *************************************************************

  • C言語 プロトタイプ宣言のスコープ

    現在、C言語の勉強中です。 プロトタイプ宣言は関数内で宣言をすることは可能でしょうか。 その際、宣言が有効なのはその関数内ということになりますか? OS:windows7 VS2010 express で次のプログラムを記述してもコンパイルエラーにはなりませんでした。 もし、プロトタイプ宣言もスコープを持つとしたら、関数plus()の中でminus() を呼び出したところでwarningかエラーをはくと考えましたが、出ませんでした。 どなたか、教えてください。 #include <stdio.h> int main(void){ char* plus(void); //プロトタイプ宣言 char* minus(void); // char *ans; ans = plus(); printf("mainFunc = %s", ans); ans = minus(); printf("mainFunc = %s", ans); } char* plus(){ char *answer; //関数の戻り値はポインタ answer = minus(); //プロトタイプ宣言なしで関数を使用 printf("plusFunc = %s",answer); return "plus success\n"; } char* minus(){ return "minus success\n"; }

  • 関数の引数と実引数の取り扱いについて

    C言語初心者です. 関数の引数と実引数の取り扱いについて,教えていただきたいことがあります. 例えば,2変数の和を求める関数を考えると,以下のようになると思います. #include <stdio.h> double sum(double x, double y); int main(void) { double a, b, wa; a=2.0; b=3.0; wa=sum(a,b); return 0; } double sum(double x, double y) { double total; total=x+y; return total; } このとき,mainプログラムでは,a,bふたつの変数を定義しておいて,関数sumに入れて計算させているわけですが,mainプログラムで変数x,yを定義しておいて,以下のようなプログラムにするのはありでしょうか? 参考書などをみると,前者のように取り扱っているようなのですが,試しに後者で実行させてみても同じ結果となりました. #include <stdio.h> double sum(double x, double y); int main(void) { double a, b, wa; a=2.0; b=3.0; wa=sum(a,b); return 0; } double sum(double x, double y) { double total; total=x+y; return total; }

  • mainの外に変数 vs ポインタ渡し

    C++についての質問です。プログラミング初心者ですが、よろしくお願いします。 最近、関数の外側でも変数を宣言できることを知りました。関数の外側で変数を宣言すると、全ての関数でその変数にアクセスすることができ大変便利なように思います。 「わざわざポインタ渡しなどする必要はないのでは?」と思ってしまいました。 これは何か問題があるのでしょうか? 初心者の言葉で説明しても理解しにくいかと思いますので、例として「足し算するプログラム」を以下に記載します。 ポインタ渡しで書くと、以下のような感じになるかと思います。 //●ポインタ渡し #include "stdafx.h" #include <iostream> void func(int x,int y,int *pans){ *pans = x+y; } void main(){ int a=10, b=20, ans; func(a,b,&ans); std::cout << ans << std::endl; } しかし、mainの外に変数を宣言すれば //●mainの外に変数 #include "stdafx.h" #include <iostream> int a,b,ans; void func(int x,int y){ ans = x+y; } void main(){ a=10; b=20; func(a,b); std::cout << ans << std::endl; } ansをポインタ渡しする必要なく、funcの計算結果をansに代入できました。 「●mainの外に変数」のプログラムはどのような問題や危険性を孕んでいるのでしょうか? 以上になります。長文お読みいただきありがとうございました。 よろしくお願いいたします。

  • main関数の戻り値について

    c言語において、main関数の戻り値は何を意味しているのですか。 また、void型にすれば、main関数の戻り値を書かなくても問題無いでしょうか。 また、関数はreturn文を書かなくても、最後まで処理を実行すると終了するらしいですが、void型にすれば、main関数でreturn文を書かなくても問題無いでしょうか。

  • C言語でプログラミングしました。違うとこを指摘してくれませんか?

    ∫(e^(-n)^x)cosx*cosxdx n=19/20 積分範囲は0~10です #include <stdio.h> #include<math.h> int main(void) { double left,right,n,s; left=0,right=10.0; double integral(double,double,double); s=integral(left,right,n); printf(“%14.10f\n”,s); } double formula (double x) { int a,b,c,d; a=(-19/20)^x; b=e^a; c=cosx*cosx; d=b*c; return d=b*c; } double integral(double l,double r,double n) { double x,s2,s4,h; n=352; double formula(double); h=(r-1)/h: s2=0.0; s4=formula(1+h); for(x=1+2.0*h;x<=r-h+0.000001;x+=2.0*h); { s2+=formula(x); s4+=formula(x+h); } return(h*(formula(l)+formula(r)+4.0*s4+2.0:s2)/3.0); }

専門家に質問してみよう