![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
∫(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);
}
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って大きすぎでは
ありませんか?(^^;
No.4
- 回答日時:
あの~。
C言語の文法に関しては既に他の方がご指摘されていらっしゃいますので、
(関数宣言など…)
ただ、一言助言を…。
コメントを入れませんか?(^^;。
/* */ か、C++なら // を…。
この程度の短いプログラムならいらないかな?と思いつつ、
C言語の勉強中ならコメントをつける癖をつけておいた方が、
よいかと思いまして老婆心からです。あしからず…。
(特に人に呼んでもらうプログラムなら、
コメントを打っておいたほうがいいですよ(^^;。)
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文は関数ではないので「;」は必要ありません。
とりあえず簡単に書かせて頂きましたが、これだけですべて解決できるとは
思えません。最終的な確認は質問者が実行してみて確認してみて下さい。
この回答への補足
修正をしてみましたが完成できません。修正版の指摘をお願いします。
#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()
の方がいいです。
でもこれはエラーにはならないと思います。
どのようなエラーが出るのか書いてもらったほうが
分かりますけど?
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に値が入っていない状態で呼び出されますので、コンパイル時にワーニングかエラーになっていませんか?
とりあえず、目に付いたのはこんな所です。
がんばってください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
C言語で-23乗を取り扱うには
-
浮動小数点の定数
-
EXE1→DLL→EXE2数値を受け渡す方法
-
関数におけるif文とreturn文に...
-
方程式を2分法を用いて解くプロ...
-
c言語の問題
-
mallocで動的確保後、値が変わる
-
(C,C++言語)関数の引数は自動キ...
-
difftime()について
-
至急です! マクロ定義で #defi...
-
C 開放してるのにエラー(doubl...
-
C言語でプログラミングしまし...
-
C言語のデバック 領域の二重解...
-
ボール同士の衝突
-
C#イベント中の戻り値の設定の...
-
3次方程式の求解プログラム(...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
C言語 関数プロトタイプ宣言の...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
関数におけるif文とreturn文に...
-
c言語のプログラミングについて...
-
2分法で方程式の複数の解を自...
-
-1.#IND00と出てしまうのですが...
-
doubleは常に%lfとするべきなのか
-
C言語のpow関数の不具合
-
C言語で-23乗を取り扱うには
-
C言語で台形公式を使った二重積...
-
Cで3乗根を求める方法
-
sin(x)の近似について
-
2次方程式の解を求めるプログ...
おすすめ情報