- ベストアンサー
C言語で直角三角形の斜辺を求めるプログラムについて
「二辺の長さが与えられているとき、斜辺の長さを求めよ」という問題です。 #include <stdio.h> #include <math.h> #define a 3 #define b 4 int main (void) { double c=0; c=sqrt(a*a+b*b); printf("%f",c); return 0; } visual2010c++で作ったんですが、sqrtに下線がついて、コンパイルエラーしちゃいます。 すんごい初歩的なことなんだと思いますが、どこなのか気づけません。 どなたかよろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
sqrt()の引数が合っていないということでしょう。 一般的に double sqrt( double ); ですが、引数が#defineされていて、3と4。 これは、整数なので、「a*a+b*b」の計算結果は整数。 よって、 #define a 3.0 とするか、 c=sqrt(0.0+a*a+b*b); // 「0.0+」を付けて実数計算にした。 c=sqrt(1.0*a*a+b*b); // 「1.0*」を付けて実数計算にした。 とすれば良いでしょう。 それと、C++モードでコンパイルされている様ですが、Cモードでコンパイルすれば、 c=sqrt(a*a+b*b); /* Cモードでコンパイルしよう。 */ のままでO.K.なはず。 C言語は同名の関数を定義できず、関数の引数に合わせてキャストしてくれますが、C++は同名で引数の違う関数を定義できるので関数の引数が合わないと関数が存在しないことになってしまう。
その他の回答 (5)
- F K(@ShikiKenta)
- ベストアンサー率30% (4/13)
C言語をやるなら、『型』の概念は完璧にしてください。 sqrt()の引数、戻り値は浮動小数型です。 おそらく「オーバーロードが見つからない」旨のエラーが出たのでしょう。 引数をdouble型にしてください。
- jacta
- ベストアンサー率26% (845/3158)
> C言語で直角三角形の斜辺を求めるプログラムについて ここに嘘があります。 「C言語」ではなく、C++ですね。 > sqrtに下線がついて、コンパイルエラーしちゃいます。 C++のmath.hでは、三種類のsqrt関数が多重定義されています。 float sqrt(float); doble sqrt(double); long double sqrt(long double); これに対して、aもbもint型ですので、それらを組み合わせた式 a*a+b*b もint型になり、どのsqrt関数を選べばよいのかコンパイラには判断が付かないのです。 一方、Cの場合、こうした多重定義はできませんから、 float sqrtf(float); doble sqrt(double); long double sqrtl(long double); のように関数名が異なります。 結果として、int型の実引数を渡しても、選ぶべきsqrt関数は一種類だけなのです。 ちなみに、Visual C++ 6.0のような標準準拠度の低い処理系では、上記のCの場合と同様になっているため、コンパイルエラーになりません。
- LHS07
- ベストアンサー率22% (510/2221)
Visual C++ 6.0ではエラーは起きないです。 実行結果は 5.000000 です。 1.コンパイル環境によって sqrt関数が違うのでしょう。 2. Visual C++では double sqrt( double x ); です。 #define a 3.0 #define b 4.0 double c=0.0 以上のようにしたらどうでしょうか。 3. math.hではないのか ところで でも通常cは char型の変数を用いることが多いようです。 プロになってからcを charと間違えないようにしてください。
- D-Matsu
- ベストアンサー率45% (1080/2394)
sqrtが整数の引数を受け付けない、って事かと思いますが。
- asuncion
- ベストアンサー率33% (2127/6289)
コンパイルしたときに出るエラーメッセージの全文を、そのまま貼り付けてください。
補足
error C2668: 'sqrt' : オーバーロード関数の呼び出しを解決することができません。 math.h(589): 'long double sqrt(long double)' の可能性があります。 math.h(541): または 'float sqrt(float)' math.h(127): または 'double sqrt(double)' 引数リスト '(int)' を一致させようとしているとき 全文は難しいので・・・ No2の人が言っているところを張り付けました。 けど、よくわかりません。
お礼
ありがとうございました。 無事解決できました