みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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に下線がついて、コンパイルエラーしちゃいます。
すんごい初歩的なことなんだと思いますが、どこなのか気づけません。
どなたかよろしくお願いします。

投稿日時 - 2011-10-14 21:43:32

QNo.7071721

困ってます

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

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++は同名で引数の違う関数を定義できるので関数の引数が合わないと関数が存在しないことになってしまう。

投稿日時 - 2011-10-14 22:36:00

お礼

ありがとうございました。
無事解決できました

投稿日時 - 2011-11-06 00:35:18

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

C言語をやるなら、『型』の概念は完璧にしてください。

sqrt()の引数、戻り値は浮動小数型です。 おそらく「オーバーロードが見つからない」旨のエラーが出たのでしょう。 引数をdouble型にしてください。

投稿日時 - 2011-10-19 10:39:08

ANo.5

> 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の場合と同様になっているため、コンパイルエラーになりません。

投稿日時 - 2011-10-14 22:42:41

ANo.3

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と間違えないようにしてください。

投稿日時 - 2011-10-14 22:32:07

ANo.2

sqrtが整数の引数を受け付けない、って事かと思いますが。

投稿日時 - 2011-10-14 22:06:05

ANo.1

コンパイルしたときに出るエラーメッセージの全文を、そのまま貼り付けてください。

投稿日時 - 2011-10-14 21:49:03

補足

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の人が言っているところを張り付けました。
けど、よくわかりません。

投稿日時 - 2011-10-14 22:12:19