質問: int main(void) { int a,b,c; printf("三角形の3辺の長さを入力して下さい:"); scanf("%d %d %d",&a,&b,&c); if(a+bc||a+c>b||b+c>a)printf("これは三角形です。"); } return 0; } ### 補足情報(言語/FW/ツール等のバージョンなど) C言語
回答: > > 三角形ができるか否かの判定については、辺X,Y,Zを引数とした関数とせよ > > > よって、判定する関数を作ることが、この課題の最重要な要件だと思います。これができなければ及第点はもらえない。これについてはtacsheavenさんの回答が参考になります。 私からは、9nagisaさんのコードを拝見して気づいた点を指摘したいと思います。それは次の条件に関わることです。 > > X,Y,Zの辺のうちどれがいちばん長いかはわからないものとする > > > この条件があるため、例えばピタゴラスの定理を用いた判定が3回繰り返し使われています。 ``` if ((c*c==a*a+b*b)||(a*a==b*b+c*c)||(b*b==a*a+c*c)) { printf("これは直角三角形です。"); } ``` もし最初の条件`(c*c==a*a+b*b)`が成立したなら、残りの2条件(`(a*a==b*b+c*c)`と`(b*b==a*a+c*c)`)は計算せず、ただちに直角三角形だと判定を下します。それがC言語のやり方であることを覚えていますか? つまり、運がよければ乗算は3回で済むけれど、最悪ケースでは9回も乗算を計算しなければなりません。 乗算は(加減算・条件判定などに比べて)時間のかかる、やや重い(=時間がかかる)演算です、勿論もっと重い演算もありますが。乗算3回で済む場合と、乗算を9回実行しなければならない場合を比べたら、与えるパラメータによって判定に要する処理時間が大きく変動するだろう事が容易に想像されるのです。しかし処理時間が大きく変動することは、関数の性能として良い評価を得られないものなのです。要するに、できるだけ一定の処理時間で結果を返して欲しいものなのです。 さて、ピタゴラスの定理を用いた判定を3回繰り返さざるを得ないのは、どの値が最長なのかわからないからです。逆に言えば、最長の辺を特定できるなら・それ以外の2辺と区別できるなら、ピタゴラスの定理を用いた判定は常に一回で済み、結果として処理時間の変動を小さくできそうです。 同様に、「最長の辺は他の2辺の和より短い」という条件判定も一回で済みます。即ち、次の部分も改善できます。 ``` if (a+b