成績判定プログラム
ゆるい条件を先に置くと、全員そこで止まる
if と else では 2 つにしか割れません。3 段階、5 段階と増やしたいときは else if をはさみます。ただしここで並べる順番を間違えると、どんな値を渡しても同じ答えが返るコードができあがります。
荷物の重さから大きさの区分を返す例で見てみます。
Java
public class Parcel {
public static String size(int gram) {
if (gram >= 1000) {
return "中型";
} else if (gram >= 3000) {
return "大型";
}
return "小型";
}
}size(5000) を呼ぶと "中型" が返ります。5 キロの荷物です。最初の gram >= 1000 がいきなり成立して return に届いてしまうので、下の gram >= 3000 は評価すらされません。
else if の連鎖は、上から順に見ていって 最初に当たった枝だけ を実行します。範囲が重なっているときは、当てはまる値が少ないほうを先に書きます。この例なら 2 つの枝を入れ替えるだけで直ります。
Java
if (gram >= 3000) {
return "大型";
} else if (gram >= 1000) {
return "中型";
}
return "小型";上から 3000 1000 と、しきい値が下がっていく並びになりました。>= で書くなら大きい順、<= で書くなら小さい順です。
「以上」と「より大きい」は 1 文字違う
もう 1 つの落とし穴は境界です。同じしきい値でも、記号が 1 文字違うだけで答えが変わります。
Java
gram >= 1000 // 1000 を含む
gram > 1000 // 1000 を含まない仕様に「1000 グラム以上」と書いてあれば >=、「1000 グラムより重い」なら > です。テストはこの境界をピンポイントで狙ってきます。日本語と記号を必ずペアで覚えてください。
会員ランク、送料区分、料金プラン。数値の範囲でラベルを決める処理は現場のあちこちに出てきます。並べ方と境界の話は、そのすべてで同じように効きます。
最後の受け皿が無いとコンパイルが通らない
戻り値のあるメソッドで else if を並べただけで終わると、どの枝にも当たらない道が残ります。この状態は missing return statement として弾かれます。
最後は else で受けるか、上の例のように条件を付けない return を 1 行置いて締めます。どちらでも構いませんが、通り抜ける道を残さないことだけは必ず守ります。
やってみよう
getGrade(int score) を完成させて、点数から "A" "B" "C" "D" "F" のどれかを返してください。
- 90 / 80 / 70 / 60 の 4 つのしきい値を、大きいほうから順に並べる
- 「以上」なので
>=を使う - どのしきい値にも届かなかったときの答えを最後に置く
- 実行して
9585756545の 5 件を通す
通ったら、getGrade(90) と getGrade(89)、getGrade(60) と getGrade(59) のように境界の両側を呼んでみてください。1 文字の書き間違いは、この 4 回の呼び出しで必ず表に出ます。
要件
- 90点以上: A
- 80点以上: B
- 70点以上: C
- 60点以上: D
- 60点未満: F
入出力例
getGrade(95) → "A"
getGrade(85) → "B"
getGrade(75) → "C"
getGrade(65) → "D"
getGrade(45) → "F"