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

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

解決済みの質問

三角形の判別

正三角形、二等辺三角形、直角三角形、直角二等辺三角形、不等辺三角形、三角形ではないを判別するプログラムを以下のように書きました。
#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以降は二等辺三角形と出てしまいます。原因が分からないので教えてくださいお願いします。あとこうしたらいいところとか間違いがあればお願いします。

投稿日時 - 2007-05-02 12:23:04

QNo.2967326

困ってます

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

「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」になっているのです。

投稿日時 - 2007-05-02 12:35:59

お礼

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

投稿日時 - 2007-05-07 12:21:54

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

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

回答(6)

ANo.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/三角形

投稿日時 - 2007-05-02 17:27:15

お礼

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

投稿日時 - 2007-05-07 12:18:57

ANo.5

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

投稿日時 - 2007-05-02 14:43:31

お礼

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

投稿日時 - 2007-05-07 12:19:50

ANo.4

> if(a+b<c||a+c<b||b+c<a)

三角形を構成しない場合には、二辺の和が他の一辺に等しい場合を含みます。
"<" ではなく、"<=" にしてください。

それから、直角三角形かどうかを二度同じロジックで判定しているのは冗長です。
直角三角形であることがわかったら、その中で、
直角二等辺三角形かどうかを判定すればよいでしょう。

投稿日時 - 2007-05-02 13:21:23

お礼

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

投稿日時 - 2007-05-07 12:20:37

ANo.2

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

投稿日時 - 2007-05-02 12:34:13

お礼

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

投稿日時 - 2007-05-07 12:22:36

ANo.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
で良いと思います。

投稿日時 - 2007-05-02 12:33:54

お礼

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

投稿日時 - 2007-05-07 12:23:21

あなたにオススメの質問