電子書籍の厳選無料作品が豊富!

c言語初心者です。
「f(t)=exp(t)の、0から1までの定積分を台形公式により計算せよ」
という問題に取り掛かっているのですが、うまくいきません。
以下に私の書いたものと、エラーメッセージを載せますので、添削をよろしくお願いします。

●プログラム
#include<stdio.h>
#include<math.h>

int main(void)
{
int N,n
double d,t[10000],f[10000],s=0,In=0;

printf("N=");
scanf("%d",&N);

d=1/N;

while(n=0;n<=N;n++)
{
t[n]=n*d;
f[n]=exp(t[n]);
}
while(n=1;n<=N-1;n++)
{
s=s+f[n];
}

In=d*((f[0]/2)+s+(f[N]/2));

printf("mennseki=%f",In);

return 0;
}

●エラーメッセージ(このプログラムのファイル名をz-2-2.cとしています。)
z-2-2.c
z-2-2.c(7) : error C2143: 構文エラー : ';' が '型' の前にありません。
z-2-2.c(14) : error C2143: 構文エラー : ')' が ';' の前にありません。
z-2-2.c(14) : warning C4552: '<=' : 演算子にプログラム上の作用がありません。作用
を伴う演算子を使用してください
z-2-2.c(14) : error C2059: 構文エラー : ')'
z-2-2.c(15) : error C2143: 構文エラー : ';' が '{' の前にありません。
z-2-2.c(19) : error C2143: 構文エラー : ')' が ';' の前にありません。
z-2-2.c(19) : warning C4552: '<=' : 演算子にプログラム上の作用がありません。作用
を伴う演算子を使用してください
z-2-2.c(19) : error C2059: 構文エラー : ')'
z-2-2.c(20) : error C2143: 構文エラー : ';' が '{' の前にありません。

A 回答 (6件)

まず、C言語の文法上のミスと誤りから。

エラーはこれが原因で出てます。

<<7行目のエラーの原因>>
int N,n ←この行の最後に ; が抜けています。

<<14,15行目のエラーの原因(19,20行目も同様)>>
while(n=0;n<=N;n++) ←whileの引数に取れるのは条件式1つだけです。(n=0;n<=N;n++)という書式の引数を取れるのはforです。

と、これで文法的なエラーは出なくなるはずですが、おそらく正しい結果は得られません。台形公式の解釈が間違っていると思いますので、それは公式の意味をもう一度よく考えてみてください。
    • good
    • 1

>z-2-2.c(16) : error C2198: 'exp' : 呼び出しに対する引数が少なすぎます。


>とあるのですが、これは何が原因なのでしょうか?

exp(t[n]) の中の t[n] がエラーになって値が定まらなくなったので、exp() となって、() の中にあるべき引数がないと言っているんでしょう。
    • good
    • 0
この回答へのお礼

わかりました!

2日にわたり、ご解答ありがとうございました。
おかげで、新たな知識を身につけることができました。

またご縁があったらよろしくお願いいたします。

お礼日時:2009/07/03 00:17

いやいや、宣言の時にdoubleにしてはいけません。

1/Nを計算する時に「キャスト」するんです。キャストってわかりませんか? 日本語で言うと「型変換」です。教科書調べてみてください。

ちなみに、簡易的な方法としては「1/N」を「1.0/N」とすれば、暗黙のキャストが実行されて問題は解決する…と思いますが、どうしてそうなるのかを理解するためにキャストとはどういうことかをきちんと調べてみてください。

この回答への補足

いきました!
ありがとうございます。

最後にひとつ質問したいのですが、
キャストする前に(#4補足)出てきたエラーの中に、

z-2-2.c(16) : error C2198: 'exp' : 呼び出しに対する引数が少なすぎます。

とあるのですが、これは何が原因なのでしょうか?

補足日時:2009/07/02 22:42
    • good
    • 0

なるほど。

わかりました。

d=1/N;

この計算の右辺は「1」も「N」もint型なので計算はintで行われます。すると、N>1の時、計算結果の小数点以下は切り捨てられるので、答えは「0」になります。その後、dへの代入のためにdoubleにキャストされるので、dの値は0.000000になってしまいます。

この状態を解消するには、割り算が実行される前の「1」と「N」を明示的にdouble型にキャストしてあげればいいということになります。

この回答への補足

連絡遅くなってしまって申し訳ありません。
n,Nをそれぞれ、doubleにしましたが、以下のようなエラーが出てきてしまいました。

z-2-2.c
z-2-2.c(15) : error C2108: 添字に整数でない型が使われました。
z-2-2.c(16) : error C2108: 添字に整数でない型が使われました。
z-2-2.c(16) : error C2108: 添字に整数でない型が使われました。
z-2-2.c(16) : error C2198: 'exp' : 呼び出しに対する引数が少なすぎます。
z-2-2.c(20) : error C2108: 添字に整数でない型が使われました。
z-2-2.c(23) : error C2108: 添字に整数でない型が使われました。
z-2-2.c(26) : error C2108: 添字に整数でない型が使われました。
z-2-2.c(27) : error C2108: 添字に整数でない型が使われました。

補足日時:2009/07/02 21:47
    • good
    • 0

えーと、ちょっとすぐにはどこがおかしいかピンと来ないのですが、このような場合、途中の計算結果を全て出力させてみてどこがおかしいのかを探るのが得策です。



計算で求めているd,t[n],f[n],sの値を全部出力させて、値を見て考えてみてください。

この回答への補足

N=1,2,3の場合について出力させてみたところ、このようになりました。dの値すら0.000000となっているのはなぜでしょうか?

N=1
d=1.000000
t[n]=1.000000
f[n]=2.718282
s=0.000000
mennseki=1.859141

N=2
d=0.000000
t[n]=0.000000
f[n]=1.000000
s=1.000000
mennseki=0.000000

N=3
d=0.000000
t[n]=0.000000
f[n]=1.000000
s=2.000000
mennseki=0.000000

補足日時:2009/07/02 02:07
    • good
    • 0

すみません。

訂正。

もう一度見直したところ、台形公式の実装はこれで正しそうです。

この回答への補足

早速解答をしていただき、ありがとうございます。
エラーメッセージは取れましたが、N=1では値がしっかり出るのですが、そうでないときには0.000000になってしまいます。
これはどう対処すればよいのでしょうか?

補足日時:2009/07/02 01:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!