今回やること
for文は、回数や対象の個数が分かっている繰り返しに向きます。1〜5の表示から始め、点数配列を順に読み、欠席を飛ばして合計が基準へ達したら止めます。
前提: Java入門 #7 - switch文までを終え、if文を使えること。
for (初期化; 条件式; 更新式) {
繰り返す処理
}
| 部分 | for (int i = 1; i <= 5; i++)での意味 |
|---|---|
| 初期化 | 最初だけi = 1 |
| 条件式 | 毎回i <= 5を確認 |
| 更新式 | 1回ごとにi++ |
1. 5回繰り返す
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}
iは1、2、3、4、5と変わります。5を表示した後にiが6となり、6 <= 5がfalseなので終了します。
終了条件を間違えると、1回多く実行したり、条件がずっとtrueで止まらなくなったりします。最初の値、最後に実行する値、更新方向を確認します。
2. 配列をindexで読む
int[] scores = {80, -1, 95, 100, 70};
for (int i = 0; i < scores.length; i++) {
System.out.println(scores[i]);
}
配列のindexは0から始まるため、初期値は0です。条件をi < scores.lengthにすると、最後のindexlength - 1まで安全に読みます。配列の詳細は#10で扱います。
3. continueで今回だけ飛ばす
この例では-1を欠席とします。
if (scores[i] < 0) {
continue;
}
continueは現在の1回だけ残りの処理を飛ばし、次の繰り返しへ進みます。欠席値を合計へ入れないために使います。
4. breakでループ全体を止める
if (total >= 250) {
break;
}
breakはfor文そのものを終了します。今回だけ飛ばすcontinueとの違いを確認してください。
完成コードを動かす
ForDemo.javaとして保存します。
public class ForDemo {
public static void main(String[] args) {
int[] scores = {80, -1, 95, 100, 70};
int total = 0;
for (int i = 0; i < scores.length; i++) {
if (scores[i] < 0) {
System.out.println("欠席を飛ばします");
continue;
}
total += scores[i];
System.out.println("追加: " + scores[i] + " / 合計: " + total);
if (total >= 250) {
System.out.println("合計が250以上になりました");
break;
}
}
}
}
javac ForDemo.java
java ForDemo
操作の流れは次のとおりです。
| 値 | 動作 | 合計 |
|---|---|---|
| 80 | 加算 | 80 |
| -1 | continue | 80 |
| 95 | 加算 | 175 |
| 100 | 加算後にbreak | 275 |
| 70 | 実行されない | — |
成功確認
最後に次が表示され、70は処理されなければ成功です。
合計が250以上になりました
欠席の-1が合計へ入らず、合計が275の時点でループが終了することを確認します。
よくあるつまずき
更新式を書き忘れる
条件が変わらず無限ループになる場合があります。i++と条件式を一緒に確認します。
配列ループをi <= scores.lengthにする
存在しないindexlengthへ進み、範囲外例外になります。i < scores.lengthです。
continueとbreakを逆にする
continueは次の1回へ、breakはループの外へ進みます。
練習
日ごとの歩数{3000, 0, 4500, 6000}をfor文で読みます。0はcontinueで飛ばし、合計が10,000以上になったらbreakしてください。
次のステップ
Java入門 #9 - while文で、終了回数が事前に決まらない繰り返しを学びます。