• ベストアンサー

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); }

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

  • ベストアンサー
  • V-bravo-U
  • ベストアンサー率51% (155/301)
回答No.5

#3です。 だいぶC言語らしくなりましたね。とりあえずコンパイルしてみました。 「int main」の上に次の2行を加えて下さい。 double integral (double,double,double); double formula (double);  この2行が私の言ってた「関数宣言は関数の外で行う」ということです。 この2行があることで、これ以降の関数でintegral関数とformula関数を 使うことができるようになります。 行8の「n=double integral (double,double,double);」は不必要です。 この部分はC言語的に合っていない書き方です。 行9の「s=double integral(left,right,n);」は次のように書き換えてみて下さい。 s=integral(left,right,512.0); /* 512.0は行27の分割数にならっています */ 行25に「;(セミコロン)」が出てきましたけど、これは取って下さい。 前述しましたけど、「double integral (double,double,double);」と書かれると 関数宣言と解釈してしまい、以降の{}の中に対してコンパイラが「なにこれ?」 と訳のわからないエラーを出す原因になってしまっています。 それから、行29の「double formula(double x);」も前述の関数宣言を外で 行った上でこの行29を削除して下さい。  と、これだけ修正すればコンパイルは通るはずです。実際問題として 好ましくない書き方が何カ所かありますがとりあえず割愛します。  で、実行してみたのですが、integral関数内のn=512.0って大きすぎでは ありませんか?(^^;

その他の回答 (4)

  • ret
  • ベストアンサー率40% (8/20)
回答No.4

あの~。 C言語の文法に関しては既に他の方がご指摘されていらっしゃいますので、 (関数宣言など…) ただ、一言助言を…。 コメントを入れませんか?(^^;。 /* */ か、C++なら // を…。 この程度の短いプログラムならいらないかな?と思いつつ、 C言語の勉強中ならコメントをつける癖をつけておいた方が、 よいかと思いまして老婆心からです。あしからず…。 (特に人に呼んでもらうプログラムなら、 コメントを打っておいたほうがいいですよ(^^;。)

hotpants
質問者

お礼

すみません。そこまでならっていないので・・・ ご指摘ありが問いございました

  • V-bravo-U
  • ベストアンサー率51% (155/301)
回答No.3

見たところコンパイラエラーがわんさか出てきて「へるぷ~ぅ」という感じに見受けられます。 エラーがわんさか出てきても慌てないで、最初に出てきたエラーだけをとりあえず対処して 再度コンパイルして何度も試してみることです。10個くらいになったら指摘されたところを 全部修正してコンパイルしましょう。根気のいる作業ですが、プログラミングはそもそも根気の いる作業なのです。エラーにめげずにがんばって下さい。 でも、これで完結してしまうと不親切極まりないので、私なりに気づいた点を書かせて頂きます。 長文ですが、ご了承下さい。 注:「#include <stdio.h>」を1行目とします。 まず、上から2行目 >#include<math.h> #includeと<math.h>は1つのスペースかタブを入れましょう 7行目と25行目にある関数宣言は通常、関数の外で行うのが一般的です。 関数内で別の関数宣言を行う場合は変数宣言の直前で行うのがいいでしょう。 今回の場合、関数宣言の前に代入操作が行われているため、C言語の書き方としては よろしくありません。 9行目のprintf内の文字列が全角の「”」になっていますが確認して頂けますか? 13行目で変数宣言が整数宣言になっています。arukamunさんの指摘による 修正でもここがdoubleにならない限り解決されないでしょう。試しにintのままで 実行してみて違いを見るのもおもしろいと思います。 補足:三角関数を使われる場合は、デグリ値ではなくラジアン値    (180度をπ/2として指定する)なので、その変換が必要かもしれません。 29行目のfor分はC言語勉強したての方はよく陥りやすい間違いです。 このままではfoumula関数は1度しか通りません。しかしながらxの値は しっかりr-h+0.000001を超えています。ループは実行されているのに なぜ関数は1度だけ?という質問になりますよね。 「関数の後ろには必ず「;(セミコロン)」を入れなければならない」と 教われていませんか?for文は関数ではないので「;」は必要ありません。 とりあえず簡単に書かせて頂きましたが、これだけですべて解決できるとは 思えません。最終的な確認は質問者が実行してみて確認してみて下さい。

hotpants
質問者

お礼

大変参考になりました。がんばって、修正し直します。また、いろいろ問題が出てきた時お願いします

hotpants
質問者

補足

修正をしてみましたが完成できません。修正版の指摘をお願いします。 #include <stdio.h> #include <math.h> int main(void) { #include <math.h> double left,right,n,s; left=0,right=10.0; /*下限,上限*/ n=double integral (double,double,double); s=double integral(left,right,n); printf("%14.10f\n",s); /*.10小数点10桁を表示*/ } /* 被積分計算*/ double formula (double x) { double a,b,c,d; a=pow((double)-19/20,x); b=exp((double)a); c=cos(x)*cos(x); d=b*c; return d; } /*シンプソンの公式*/ double integral(double l,double r,double n); { double x,s2,s4,h; n=512; /* n:分割数*/ double formula(double x); h=(r-l)/n; s2=0.0; s4=formula(l+h); for(x=l+2.0*h;x<=r-h+0.000001;x+=2.0*h) /* 誤差防止0.00000*/ { s2+=formula(x); /*偶数個目*/ s4+=formula(x+h); /*奇数個目*/ } return(h*(formula(l)+formula(r)+4.0*s4+2.0*s2)/3.0); }

回答No.2

とりあえず、 formula() integral() のプロトタイプ宣言をしましょう。 プロトタイプ宣言というのは、最初に使う関数を宣言しておくってコトです。 #include double integral(double l,double r,double n); double formula (double x); int main(void) { } って感じでインクルードとメインと間に書きます。 他に、メイン関数は値を返していないので void main() の方がいいです。 でもこれはエラーにはならないと思います。 どのようなエラーが出るのか書いてもらったほうが 分かりますけど?

hotpants
質問者

お礼

がんばって修正してみます。またのご指摘をよろしくお願いします。ありがとうございました

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

こんばんは ざっと見たところ、まずは、 double formula (double x) ですね。 C言語で^(ハット)は排他的論理和になりますので、べき乗の意味はありません。 a=(-19/20)^x; は a=pow((double)-19/20,x); ですね。 また、対数のeという値は無いと思います。 b=e~a; は b=exp((double)a); だと思われます。 c=cosx*cosx; は c=cos(x)*cos(x) だと思われます。 これらはC言語のmath.hに記述されていますので、確認してください。 場合によっては関数名が異なる場合があります。 return d=b*c; もちょっと変だと思います。 return d; で良いのでは。 次に double integral(double l,double r,double n) ですが、 for(x=1+2.0*h;x<=r-h+0.000001;x+=2.0*h); { s2+=formula(x); s4+=formula(x+h); } は、forの最後の;(セミコロン)はfor文ループする部分が空行という事になってしまいますので、その後の{}がおかしな事になります。 for(x=1+2.0*h;x<=r-h+0.000001;x+=2.0*h) { s2+=formula(x); s4+=formula(x+h); } ですね。 最後に int main(void) の s=integral(left,right,n); ですが、nに値が入っていない状態で呼び出されますので、コンパイル時にワーニングかエラーになっていませんか? とりあえず、目に付いたのはこんな所です。 がんばってください。

hotpants
質問者

お礼

ご指摘ありがとうございました。がんばって修正してみます。