• ベストアンサー

三角形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

  • ヘロンの公式を作ったプルグラムなのですが、プログラムの間違いを教えてください。

    プログラムの間違いを教えてください ヘロンの公式を作ったプログラムなんですが・・・ #include <stdio.h> #include <math.h> void main(void) { float a,b,c,s,x; printf("三角形の三辺の長さを入れてください\n"); printf("a="); scanf("%f",&a); printf("b="); scanf("%f",&b); printf("c="); scanf("%f",&c); s=(a+b+c)/2; x= sqrt(s*(s-a)*(s-b)*(s-c)); printf("\n%f",x); }

  • 座標の和に関する証明

    原点をo(0,0)とし、a(ax,ay),b(bx,by)という点を取ります。 このとき、cという点を四角形oacbが平行四辺形になるように取ると、cは、c(ax+bx,ay+by)という、座標を取りますが、cが必ず、このような座標を取ることは、どの様に証明したら良いのでしょうか? どなたか解答お願いします。

  • 三角形の面積

    三角形の面積を求めるためのプログラミングをmuleを使ってしていたのですが。何回やっても次のようなエラーが発生してしまいます。 エラー:′double"と′dobule"は誤った型の組み合わせです。整数型が必要です。:`,^,´演算子 このエラーの意味がいまいち分かりません。一応自分が作ったソースを貼り付けるんでおかしいところがあったら教えて下さい。 #include. <stdio.h> #include. <math.h> int main() { double a; dobule b; double c; double s; double S; printf("a="); scanf("a=%f", a); printf("b="); scanf("b=%f", b); printf("c="); scanf("c=%f", c); s=(a+b+c)*0.5; S=(s*(s-a)*(s-b)*(s-c))^0.5; ←エラーの箇所 printf("s=%f\n S=%f" , s, S); return 0; }

  • プログラムの中から別なプログラムを実行する

    現在、プログラムAを利用しています。プログラムAを何度も実行するようループ処理を加えたいのですが、インクルードファイルが行方不明になり、プログラムAのソースに手を加えてコンパイルすくことが出来なくなりました。 そこで、プログラムBを作り、その中からAを実行することでループさせたいのですが可能なのでしょうか?もし可能ならどのようにすればいいのか教えてください。よろしくお願いします。 プログラムAは次のようになっています。 #include <stdio.h> int avn; int nos; float fac; char fh[20]; void main(void){ printf(" input average number \n "); printf("0=>100,1=>200,2=>500,3=>1000 shots \n"); printf(" 10, 20, 50, 100 sec \n"); printf(" number = "); scanf("%d",&avn); printf(" number of records = "); scanf("%d",&nos); printf(" number / factor = "); scanf("%f",&fac); printf(" file head = "); scanf("%s",fh); printf("%d,%d,%f,%sが設定されました",avn,nos,fac,fh); } printf文の所には本来別の処理が入ります。

  • matlab初心者です。

    どなたかアドバイスよろしくお願いいたします。 2点の座標(ax1,ay1),(bx1,by1)が与えられた時、2点の座標を結ぶ線分とy軸とのなす角を求めたい場合、 atan2(by1-ay1,bx1-ax1)で良いのでしょうか。 また、この2点が時系列上で変化する{(axn,ayn),(bxn,byn)のように座標が多くある}場合、コードを簡略化することはできないでしょうか。 恐縮ですがどなたかよろしくお願いいたします。

  • C言語のプログラムについてですが、

    #include <stdio.h> int main(void) { double r; printf("半径を入力してください:"); scanf("%lf", &r); printf("円周=%f\n", 2.0 * r * 3.14159); printf("円面積=%f\n", r * r * 3.14159); return 0; } 上のC言語のプログラムを参考にして 正三角形一辺を double値でキーボード入力し、次のように高さと 面積を計算するプログラムを教えてください。 よろしくお願いしますl_ω_l 3の平方根は1.73205とします。 [実行結果] ======= 一辺の値を入力してください: 20 高さ=17.320500 面積=173.205000

  • cプログラム

    /*三角形の面積を求めるプログラム*/ #include<stdio.h> #include<math.h> main() { double a,b,c,menseki; printf("AC間の長さと角度と底辺ABを入力してください\n"); scanf("%f %f %f",&b,&a,&c); menseki=c*b*sin(a*3.1459/180.0)*0.5; printf("面積は%fです\n",menseki); return(0); } 三角形の面積を求めるプログラムなのですが以下のようなエラーが出てきてしまいます 未定義の 最初に参照している シンボル ファイル sin /var/tmp//ccSTvXNz.o ld: 重大なエラー: シンボル参照エラー。kadai9 に書き込まれる出力はありません。 collect2: ld はステータス 1 で終了しました どこを修正すればいいでしょうか?

  • 書いたプログラムの間違いを教えてください

    こんにちは。 C言語を学習し始めた者です。 「三角形の3辺を入力し、その面積を出す」という課題で、下のように書き、実行しました。 しかし、面積がいつも-0.00になってしまいます。 どの部分が間違っているか教えてください。 #include <stdio.h> #include <math.h> main() { double a,b,c,s,S; s=(a+b+c)/2; S=sqrt(s*(s-a)*(s-b)*(s-c)); printf("三角形の長さを入力:"); scanf("%lf %lf %lf",&a,&b,&c); if(s>0){ printf("面積は%.2lfです。\n",S); } else{ printf("これは三角形ではありません。\n"); } }

  • プログラムがうまくいきません。教えてください。

    プログラムがうまくいきません。教えてください。 #include <stdio.h> int main(void){ int a, b, c, d, f; printf("国語="); scanf("%d", &a); printf("算数="); scanf("%d", &b); printf("理科="); scanf("%d", &c); printf("社会="); scanf("%d", &d); f = ((a>90)?1:0)+((b>90)?1:0)+((c>90)?1:0)+((d>90)?1:0); printf("\n合計[%d],平均[%.2f]\n",(a+b+c+d),((double)(a+b+c+d)/4.0)); printf("国語[%d],[%.3f%%],[%d]\n",a,((double)a/1.5),((a>90)?1:0)); printf("算数[%d],[%.3f%%],[%d]\n",b,((double)b/1.5),((b>90)?1:0)); printf("理科[%d],[%.3f%%],[%d]\n",c,((double)c/1.5),((c>90)?1:0)); printf("社会[%d],[%.3f%%],[%d]\n",d,((double)d/1.5),((d>90)?1:0)); printf("総合判定[%d],\n", ((f>=3)?1:0)); return (0); } と入力したのですが、実行結果の国語から社会までの[]部分を上下揃えたいのですが揃いません。このプログラムにどのようなことを追加すれば揃えることができますか?教えてください!

  • 交差する2線分の交点座標の求め方

    2つの線分が交差する場に交点の座標を求めようと思っています。 アドバイスを頂けないでしょうか? 入力値:(aX1, aY1)(aX2, aY2)     (bX1, bY1)(bX2, bY2) 出力値:(X, Y) よろしくお願いします。