実力確認テスト02 条件判定の解答例です。なお、色を付けるエスケープシーケンスは、Define.h をインクルードして使っているため、説明は端折ってあります。


  • 問6.解答

// =============================================================== // 問題 No.6 条件判定「あなたは小学生?」 // =============================================================== #include <stdio.h> #include "Define.h" void main() { int nAge; // 年齢 // 年齢の入力 printf("あなたは何才ですか? : "); scanf_s("%d", &nAge); // 小学生か判断する if (nAge <= 12)
{ printf(FGREEN); printf("あなたは小学生ですね。\n"); } // 色を元に戻す printf(ATBCLEAR); }
年齢の入力までは問題ないと思う。 今回は12才以下という条件であるため、<= を条件判定に使っているかどうかが成否の分かれ目となります。あと、これは直接成否とは関係ありませんが、最終最後に、色変更した属性情報を初期化して戻しておくと良いかと思います。


  • 問7.解答例

// =============================================================== // 問題 No.7 条件判定「ピッチャーの防御率」 // =============================================================== #include <stdio.h> #include "Define.h" void main() { int nER; // 自責点  earned runs int nIP; // 投球回数 innings pitched float fERA; // 防御率  earned run average // 投球内容の入力 printf("何点取られたか? : "); scanf_s("%d", &nER); printf("何回投げたか?  : "); scanf_s("%d", &nIP); // 防御率の計算と表示 fERA = nER * 9.0f / nIP; printf("\nこの投手の防御率は %.2f です。\n", fERA); // 成績の評価 if (fERA < 0.4f)
{ printf(FYELLOW); printf("素晴らしい成績だ!\n"); } // 色を元に戻す printf(ATBCLEAR); }

自責点と投球回数は整数ですが、防御率は小数で扱います。整数置をそのまま計算してしまうと、小数点以下が失われてしまうので、投球回数で割る際に計算式を小数計算に変更する必要があります。投球回数を (float) とキャストしても良かったのですが、どのみち 9 という定数を掛け算しているのですから、この 9 を 9.0F と記述する事で、割り算の前に計算式全体を float に変換するという書き方を採用しています。

判定式ですが、0.4未満という指定がありますので、< の判定を使用していれば正解となります。


問8.解答例

// =============================================================== // 問題 No.8 条件判定「やせすぎ?太りすぎ?」 // =============================================================== #include <stdio.h> #include "Define.h" void main() { float fHeight; // 身長 float fWeight; // 体重 int nRohrer; // ローレル指数 // 体格の入力 printf("身長(cm)と体重(kg)を入力してください。\n"); scanf_s("%f %f", &fHeight, &fWeight); // ローレル指数の計算と表示(float型からint型に変換している) nRohrer = (int)(fWeight * 10000000 / fHeight / fHeight / fHeight); printf(FGREEN); printf("あなたのローレル指数は %d です。\n", nRohrer); // やせすぎ?太りすぎ?判定 if (nRohrer <= 100)
{ printf(FYELLOW); printf("あなたはやせすぎです。\n"); } else if (nRohrer >= 160)
{ printf(FRED); printf("あなたは太りすぎです。\n"); } // 色を元に戻す printf(ATBCLEAR); }

ローレル指数を整数で扱えという記述が、最初の提示で抜けていたので、そこで迷われてしまった人も多かったのではないでしょうか(申し訳ないです)。実際、ローレル指数は特に指定がなければ小数で扱うべき単位なので、今回はローレル指数を float として扱って 168.8 のような表示になっていても正解とします。

この問題は else if を適切に記述できるかどうかが大事な問題でした。else if を if だけにしても正常に動作しますが、処理速度の面で僅かに不利になります。折角やせすぎ判定で振り分け出来ているのですから、残った条件だけで再度判定する方が効率的です。そのため、ここでは是非 else if と記述するようにして欲しいと思っています。

※ 息子が使っていたモニタ下の台。キーボードを仕舞ったり、ノートPCを入れたりと用途は意外と多いです。