この回では、条件を整理し、同じ処理をメソッドへ切り出します。前提は第02回です。
入力と出力を先に書く
「送料を計算する」を実装するなら、購入額が入力、送料が出力です。購入額が5000円以上なら無料、それ未満なら500円、負の金額は不正と決めます。境界の5000円を含むのかが、記号選びより先に必要な情報です。
public class Main {
static int shipping(int amount) {
if (amount < 0) {
throw new IllegalArgumentException("購入額は0以上です");
}
if (amount >= 5000) {
return 0;
}
return 500;
}
public static void main(String[] args) {
int[] amounts = {0, 4999, 5000, 8000};
int totalShipping = 0;
for (int amount : amounts) {
int fee = shipping(amount);
totalShipping += fee;
System.out.println(amount + "円: 送料" + fee + "円");
}
System.out.println("送料合計: " + totalShipping);
}
}
Main.javaで実行すると、送料は500、500、0、0、合計は1000です。returnはそのメソッドの処理を終えて値を返します。throwによる例外は第08回で詳しく学びます。早めに不正な入力を退けると、正常処理の入れ子が浅くなります。
繰り返しを終える条件
要素を順番に処理するなら拡張for、回数や添字が必要なら通常のfor、終了するまでの回数が不明ならwhileが候補です。whileでは、条件に関係する値がどこで変わるか確認してください。変わらなければ無限ループの可能性があります。
&& は両方が真、|| は少なくとも一方が真を表します。どちらも必要なときだけ右側を評価します。amount >= 0 && amount < 5000 のように、範囲の両端を明示すると読みやすくなります。複雑な条件には isFreeShipping のような名前を付けて意味を表しましょう。
メソッド内で作る変数は、原則そのブロック内で使います。合計をループの中で毎回0に戻すと累積できません。変数が生きる範囲、つまりスコープが処理の意味を決めます。
練習と解答
練習:会員なら3000円以上、非会員なら5000円以上で送料無料にします。判定すべき境界を列挙してください。
解答例:引数にbooleanのmemberを追加し、int threshold = member ? 3000 : 5000; として比較します。会員の2999・3000、非会員の4999・5000、0、負の値を確認します。会員かどうかと金額を独立した入力として扱うのが要点です。
公式資料
Java言語の基礎から分岐と反復の資料へ進めます。
Java全20回の目次 | 前の回 | 次の回