• ベストアンサー

三角形の判別

正三角形、二等辺三角形、直角三角形、直角二等辺三角形、不等辺三角形、三角形ではないを判別するプログラムを以下のように書きました。 #include<stdio.h> int main(void) { int a,b,c; printf("三角形の3辺の長さを入力して下さい:"); scanf("%d %d %d",&a,&b,&c); if(a+b<c||a+c<b||b+c<a) { printf("これは三角形ではありません。"); } else{ if((a==b==c)) printf("これは正三角形です。"); else if(((c*c==a*a+b*b)||(a*a==b*b+c*c)||(b*b==a*a+c*c))&&(a==b||a==c||b==c)) printf("これは直角二等辺三角形です。"); else if((c*c==a*a+b*b)||(a*a==b*b+c*c)||(b*b==a*a+c*c)) printf("これは直角三角形です。"); else if((a==b||a==c||b==c)) printf("これは二等辺三角形です。"); else printf("これは不等辺三角形です。"); } return 0; } しかし、これではなぜか入力1,1,1だと正三角形とでるのですが、2,2,2以降は二等辺三角形と出てしまいます。原因が分からないので教えてくださいお願いします。あとこうしたらいいところとか間違いがあればお願いします。

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

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

「if((a==b==c)) 」 この部分ですが、正しくは 「if((a==b)&&(b==c))」 でしょう。なぜなら、「2,2,2」の時は 「a==b」→2==2 を判断します。 その結果真ですから「true」(1)が返ってきます。 その結果と ((a==b)==c))→true==2 と判断しているので、「true」(1)と「c」(2)を比較して「false」になっているのです。

rinta0209
質問者

お礼

なるほどーそういう見方だったんですねー。大変参考になりました!ありがとうございます。

その他の回答 (5)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★三角形の特徴を整理してからアルゴリズムを組む。 ・三角形の判定のヒントとして  (1)正三角形の判定…すべての『辺』が同じ長さのとき成立  (2)不等辺三角形の判定…すべての『辺』の長さが異なるとき成立  (3)二等辺三角形の判定…2つの『辺』が同じ長さのとき成立  (4)直角三角形の判定…一番長い『辺』を c としたとき c^2=(a^2)+(b^2) となる。→ピタゴラスの定理より  をサブ関数として作ります。そしてこれを使って下のようにします。 擬似コード: if ( 正三角形の判定 ){  printf( "正三角形\n" ); } else if ( 二等辺三角形の判定 ){  if ( 直角三角形の判定 ){   printf( "直角二等辺三角形\n" );  }  else{   printf( "二等辺三角形\n" );  } } else if ( 直角三角形の判定 ){  printf( "直角三角形\n" ); } else if ( 不等辺三角形の判定 ){  printf( "不等辺三角形\n" ); } else{  printf( "三角形ではない\n" ); } 最後に: ・下の『参考URL』に三角形の資料を張っておきます。  これと上記の擬似コードを参考にすれば上手く判定できると思います。 ・なお、判定用の関数を4つ作成してから処理すれば分かりやすくなります。  main() 関数1つで処理させるのは見苦しいと思うよ。  つまり、上記の擬似コードを main() 関数に記述するのです。  判定用の関数名は分かりやすい名前を付けておこう。 ・以上。参考に!

参考URL:
http://ja.wikipedia.org/wiki/三角形
rinta0209
質問者

お礼

よく分かりましたありがとうございました!

  • colder
  • ベストアンサー率43% (30/69)
回答No.5

>int a,b,c; 三辺とも整数のとき、直角二等辺三角形になることはありません。

rinta0209
質問者

お礼

返信ありがとうございます。これは僕も思ってましたー整数値だとなりませんよねー。

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.4

> if(a+b<c||a+c<b||b+c<a) 三角形を構成しない場合には、二辺の和が他の一辺に等しい場合を含みます。 "<" ではなく、"<=" にしてください。 それから、直角三角形かどうかを二度同じロジックで判定しているのは冗長です。 直角三角形であることがわかったら、その中で、 直角二等辺三角形かどうかを判定すればよいでしょう。

rinta0209
質問者

お礼

確かにそうですね、ご指摘ありがとうございます!

回答No.2

× a == b == c ○ a == b && b == c

rinta0209
質問者

お礼

ありがとうございますー解決しました!

  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

> if((a==b==c)) printf("これは正三角形です。"); a==b==c は (a==b)==c と同じです。 a==bはaとbが等しいとき1等しくないとき0なので、 aとbが等しいときは、  (a==b)==c → 1==c となり、cが1でないと真になりません。 試しに、(a,b,c)=(2,2,1)などと入れてみると、 「これは正三角形です。」と出るのではないでしょうか。 修正は、  a==b && b==c で良いと思います。

rinta0209
質問者

お礼

その通りでした!ありがとうございます。

関連するQ&A