• ベストアンサー

三角形OABの面積を求めるプログラム

三角形OABの面積を求めるプログラムを作りました(課題ですがw)。が、うまく動かないんです。 どこが間違っているか教えてください。(VC++6.0) /*三角形OABの面積を求めるプログラム*/ #include <stdio.h> #include <math.h> void main(){ float ax,ay,bx,by,s; printf("点Aの座標を入力してください。\n"); scanf("%f%f",&ax,&ay); printf("点Bの座標を入力してください。\n"); scanf("%f%f",&bx,&by); s=(1/2)*abs(ax*by-ay*bx); printf("三角形OABの面積は%fです。\n",s); } ◇点A(ax,ay) 、点B(bx,by) 面積の公式s=(1/2)*|ax*by-bx*ay| と与えられています。 また、警告の意味もわからないんで、できればお願いします。

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

  • ベストアンサー
noname#5537
noname#5537
回答No.3

> abs→fabs ; (1.0/2.0)→(1/2.0f)に書き換えましたが、 > warning C4244: '=' : 'double' から 'float' に変換しました。データが失われているかもしれません。 > という警告が出るのはなんででしょう? fabs の仕様を調べて見ましょう。 http://www.bohyoh.com/CandCPP/C/Library/index.html fabs は double 型の引数をとって,double 型の戻り値を返します。 よって,  s=(1/2.0f)*fabs(ax*by-ay*bx); は,double 型から float 型への代入になります。 変数のサイズが減る方向の変換が起こるので,コンパイラが警告してくれているのです。 その辺の事情が分かっていれば,この警告は無視しても構いません。 もしくは, その辺の事情が分かっていることをコンパイラに伝えるために, 以下のように明示的にキャストしてやれば,警告は出なくなります。  s = (float)( (1.0/2.0)*fabs(ax*by-ay*bx) );

参考URL:
http://www.bohyoh.com/CandCPP/C/Library/index.html
Lone07
質問者

お礼

回答どうもありがとうございます。 無視してもOKなんですか。 まだ、はじめたばかりでよく分からないんで^^;w  またよろしくおねがいします。 引数、戻り値とか よく分からないw あと初心者用のHPとかあったらお願いします。。 ρ下に回答してくれたみなさんも どうもありがとうございました。

その他の回答 (2)

  • tekebon
  • ベストアンサー率62% (36/58)
回答No.2

ポイントは、 ・同じデータ型同士の演算はそのデータ型で結果が出る。 ・異なるデータ型同士の演算は、より取り扱い範囲のほう(int→float→double)のデータ型で 結果が出る ということに注意できるかどうかということになります。 abs()関数は整数(int型)の絶対を求める関数です。 ちなみにfloat型の絶対値はfabs()関数を使います。 abs()関数では引数はint型のです。プログラムではfloat型の変数で計算していますのでfloat型の値をint型の引数へ渡していることになります。 よって小数点以下のデータが失われることになります。これが1つ目の警告の原因です。 座標は整数値だと思いますのでint型で宣言するか、もしくはabs((int)(ax*by-ay*bx))としてください。 そして質問では(1/2)という計算を行っていますが、int型同士の演算はint型で出力されます (小数点以下切捨て0.5→0)。 よってこの計算結果は0になるのでそれに何をかけても0になってしまいます。 よって予め0.5をかけるか(1/2.0f)と計算してください。 #1さんのように(1.0/2.0)という計算をすると普通に書いた実数値はdouble型と認識されます。 そのためfloat型の変数aにdouble型の計算結果を格納しようとするため、精度が落ちるので 2つ目の警告が出ます。 2.0ではなく2.0fと記述することによってdouble型ではなくfloat型として計算させることが出来ます。 これなら結果がfloat型で出てきますので問題ないはずです。 長文になってしまいましたが、がんばってください(^^;

Lone07
質問者

補足

回答ありがとうございます。 とりあえず、課題の方で floatで宣言するようになっているので。 abs→fabs ; (1.0/2.0)→(1/2.0f)に書き換えましたが、 warning C4244: '=' : 'double' から 'float' に変換しました。データが失われているかもしれません。 という警告が出るのはなんででしょう? おねがいします。。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

s=(1/2)*abs(ax*by-ay*bx); を s=(1.0/2.0)*abs(ax*by-ay*bx); に変えてください。 これで正しい結果が得られます。 当方はVC++6.0を持っていませんので ワーニングがどのようなワーニングかが不明ですが void mainをint mainにしてみてください。 ワーニングがとれる可能性があります。

Lone07
質問者

補足

警告は・・・ warning C4244: 'argument' : 'float' から 'int' に変換しました。データが失われているかもしれません。 warning C4244: '=' : 'double' から 'float' に変換しました。データが失われているかもしれません。 の2つです。 とりあえず、実行できるようになりました。 どうもありがとうございました。

関連するQ&A