Java / LESSON 05 / JV05

Java:繰り返し

1学習の目的

2基礎解説

種類書き方向いている場面
forfor (int i = 0; i < n; i++)回数が決まっている
whilewhile (条件)回数が不明
拡張forfor (String s : list)全要素を処理
do-whiledo { … } while (条件);最低1回は実行
✅ 覚えるべき重要ポイント
  1. for は「初期化・条件・更新」の3点セットfor (int i = 0; i < 3; i++) なら「0から始め、3未満の間、1ずつ増やす」——3回繰り返される。
  2. ⚠ while ではカウンタの更新を忘れないn++ を書き忘れると条件が永久に変わらず、無限ループでプログラムが止まらなくなる
  3. 拡張for(for-each)は全要素を順に処理する。添字を使わないので、範囲を超えるミスが起きない。全件処理ならこちらが安全
  4. break はループを抜け、continue はその回だけ飛ばす。「見つかったら終了」なら break、「条件に合わないものは無視」なら continue。
  5. ループの中で宣言した変数は、ループの外では使えない。合計を求めるなら、変数はループの前に宣言する

現場使用例:一覧の表示、合計・平均の集計、条件に合うデータの抽出、リトライ処理。

// 基本のfor(3回繰り返す)
for (int i = 1; i <= 3; i++) {
    System.out.println(i);       // 1, 2, 3
}

// 逆順・2つずつ
for (int i = 10; i >= 1; i -= 3) { … }   // 10, 7, 4, 1

// while(回数が決まっていないとき)
int n = 1;
while (n <= 3) {
    System.out.println(n);
    n++;                         // ⚠ これを忘れると無限ループ
}

// do-while(条件を満たさなくても1回は実行)
do {
    System.out.println("最低1回");
} while (false);

// ⭐ 拡張for(配列やリストの全要素)
String[] items = {"A", "B", "C"};
for (String s : items) {
    System.out.println(s);
}

// break と continue
for (int i = 1; i <= 5; i++) {
    if (i == 3) continue;        // 3だけ飛ばす
    if (i == 5) break;           // 5で終了
    System.out.print(i);         // 1, 2, 4
}

// 合計を求める(変数はループの外で宣言)
int[] nums = {10, 20, 30};
int sum = 0;                     // ← ループの前
for (int v : nums) {
    sum += v;
}
System.out.println(sum);         // 60

// 二重ループ
for (int i = 1; i <= 2; i++) {
    for (int j = 1; j <= 3; j++) { … }
}

3基本ドリル(10問)

JV05-D01 for文で1から3までを1行ずつ出力せよ。 コーディング★☆☆無料
期待される結果

出力3行。1 / 2 / 3

ヒント

for (int i = 1; i <= 3; i++) と書く。

模範解答
public class Main {
    public static void main(String[] args) {
        for (int i = 1; i <= 3; i++) {
            System.out.println(i);
        }
    }
}
解説

「初期化・条件・更新」の3点セットi = 1 から始め、i <= 3 の間、i++ で1ずつ増やす。

JV05-D02 while ループでカウンタの更新を忘れるとどうなるか。
A. 1回で終わる B. 無限ループになる C. エラーになる D. 何も起きない
選択★☆☆無料
期待される結果

解答 == B

ヒント

条件が永久に変わらない。

模範解答
B
解説

プログラムが止まらなくなる。for文なら更新部分が構文に含まれるので、忘れにくい——while を使うときは特に注意する。

JV05-D03 while文で1から3までを1行ずつ出力せよ(カウンタの更新を忘れないこと)。 コーディング★☆☆無料
期待される結果

出力3行。1 / 2 / 3

ヒント

変数を前に宣言し、ループの中で n++ する。

模範解答
public class Main {
    public static void main(String[] args) {
        int n = 1;

        while (n <= 3) {
            System.out.println(n);
            n++;
        }
    }
}
解説

for と同じ処理を while でも書ける。回数が決まっているなら for、条件次第で回数が変わるなら while が適している。

JV05-D04 配列の全要素を処理する拡張forを完成させよ。 穴埋め★☆☆無料
コード
public class Main {
    public static void main(String[] args) {
        String[] items = {"A", "B", "C"};

        for (String s ____ items) {
            System.out.print(s);
        }
        System.out.println();
    }
}
期待される結果

出力 == ABC

ヒント

拡張forで使う区切りの記号。1文字。

模範解答
:
解説

コロンで「〜の中から順に」を表す。添字を使わないので、範囲外アクセスのミスが起きない。

JV05-D05 continue の動作として正しいのはどれか。
A. ループを抜ける B. その回だけ飛ばして次へ進む C. 最初から やり直す D. 処理を止める
選択★☆☆無料
期待される結果

解答 == B

ヒント

break との違いを考える。

模範解答
B
解説

continue はその回をスキップするだけでループ自体は続く。完全に抜けたいなら break を使う。

JV05-D06 配列 {10, 20, 30}合計と平均を求めて出力せよ(2行、平均は小数)。 コーディング★★☆広告解放
期待される結果

出力2行。60 / 20.0

ヒント

合計用の変数はループの前に宣言する。平均は割るときに小数にする。

模範解答
public class Main {
    public static void main(String[] args) {
        int[] nums = {10, 20, 30};

        int sum = 0;
        for (int v : nums) {
            sum += v;
        }

        System.out.println(sum);
        System.out.println(sum / (double) nums.length);
    }
}
解説

合計用の変数はループの外で宣言する。中で宣言すると毎回0に戻り、正しく集計できない。

JV05-D07 ループを途中で抜けるキーワードを補ってコードを完成させよ。 穴埋め★★☆広告解放
コード
public class Main {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            if (i == 3) {
                ____;
            }
            System.out.print(i);
        }
        System.out.println();
    }
}
期待される結果

出力 == 12

ヒント

「壊す・中断する」を意味する5文字。

模範解答
break
解説

break でループを完全に抜ける。3の時点で終了するので、出力は12だけになる。

JV05-D08 for (int i = 0; i < 5; i++) は何回繰り返されるか。
A. 4回 B. 5回 C. 6回 D. 0回
選択★★☆広告解放
期待される結果

解答 == B

ヒント

0, 1, 2, 3, 4 の5回。

模範解答
B
解説

0から始めて「未満」で終わると、回数と一致する。配列の添字が0から始まるため、この書き方が定番になっている。

JV05-D09 1から5まで繰り返し、3だけ飛ばして出力せよ(continue を使うこと)。 コーディング★★☆広告解放
期待される結果

出力 == 1245

ヒント

if (i == 3) continue; と書く。print で改行なしに出力する。

模範解答
public class Main {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            if (i == 3) {
                continue;
            }
            System.out.print(i);
        }
        System.out.println();
    }
}
解説

continue の後の処理は実行されないが、ループ自体は続く。「条件に合わないものだけ除外」したいときに使う。

JV05-D10 二重ループで九九の2の段(2×1〜2×3)を「2×1=2」の形式で3行出力せよ(外側は段、内側は掛ける数)。 コーディング★★☆広告解放
期待される結果

出力3行

ヒント

外側は for (int i = 2; i <= 2; i++)、内側は 1〜3。

模範解答
public class Main {
    public static void main(String[] args) {
        for (int i = 2; i <= 2; i++) {
            for (int j = 1; j <= 3; j++) {
                System.out.println(i + "×" + j + "=" + (i * j));
            }
        }
    }
}
解説

内側のループが全部回ってから、外側が次に進む。表形式のデータやマス目の処理で使う基本パターン。

4実践シナリオ(5問)

JV05-S01 【商品一覧の表示】配列 {"ノートPC", "マウス", "キーボード"}番号付きで「1. ノートPC」の形式で3行出力せよ。 コーディング★★☆広告解放
期待される結果

出力3行

ヒント

添字を使う通常のforなら i+1 が番号になる。

模範解答
public class Main {
    public static void main(String[] args) {
        String[] items = {"ノートPC", "マウス", "キーボード"};

        for (int i = 0; i < items.length; i++) {
            System.out.println((i + 1) + ". " + items[i]);
        }
    }
}
解説

番号が必要なら通常のforを使う。添字は0から始まるので、表示用に i + 1 とする。

JV05-S02 【条件に合うものを数える】配列 {128000, 3200, 45000, 8500} のうち10000円以上の件数と合計を出力せよ(2行)。 コーディング★★☆広告解放
期待される結果

出力2行。2件 / 173000円

ヒント

if で条件を判定し、当てはまるものだけ数える。

模範解答
public class Main {
    public static void main(String[] args) {
        int[] prices = {128000, 3200, 45000, 8500};

        int count = 0;
        int sum = 0;

        for (int p : prices) {
            if (p >= 10000) {
                count++;
                sum += p;
            }
        }

        System.out.println(count + "件");
        System.out.println(sum + "円");
    }
}
解説

条件付きの集計はループ + if の組み合わせ。この形が集計処理の基本になる。

JV05-S03 【最大値を求める】配列 {128000, 3200, 45000, 8500}最大値を求めて出力せよ。 コーディング★★☆広告解放
期待される結果

出力 == 128000

ヒント

最初の要素を仮の最大値とし、より大きいものが見つかったら更新する。

模範解答
public class Main {
    public static void main(String[] args) {
        int[] prices = {128000, 3200, 45000, 8500};

        int max = prices[0];
        for (int p : prices) {
            if (p > max) {
                max = p;
            }
        }

        System.out.println(max);
    }
}
解説

最初の要素を初期値にするのが安全。もし0を初期値にすると、すべてが負の数の配列で正しく動かない。

JV05-S04 【検索と早期終了】配列 {"ノートPC", "マウス", "キーボード"} から「マウス」を探し、見つかった時点でループを抜けて「2番目に見つかりました」と出力せよ。 コーディング★★★広告解放
期待される結果

出力 == 2番目に見つかりました

ヒント

equals で比較し、見つかったら break する。

模範解答
public class Main {
    public static void main(String[] args) {
        String[] items = {"ノートPC", "マウス", "キーボード"};
        String target = "マウス";

        for (int i = 0; i < items.length; i++) {
            if (items[i].equals(target)) {
                System.out.println((i + 1) + "番目に見つかりました");
                break;
            }
        }
    }
}
解説

見つかった時点で break するのが効率的。1万件の配列でも、2件目で見つかれば残り9998件は調べずに済む。

JV05-S05 【偶数だけ処理】1から10までのうち偶数だけを合計して出力せよ(continue を使うこと)。 コーディング★★★広告解放
期待される結果

出力 == 30

ヒント

奇数のとき continue で飛ばす。2+4+6+8+10 = 30。

模範解答
public class Main {
    public static void main(String[] args) {
        int sum = 0;

        for (int i = 1; i <= 10; i++) {
            if (i % 2 != 0) {
                continue;
            }
            sum += i;
        }

        System.out.println(sum);
    }
}
解説

continue で条件外を除外する書き方。if (i % 2 == 0) sum += i; とも書けるが、除外条件が複雑なときは continue のほうが読みやすい。

5仕上げ課題

JV05-FINAL 【売上集計プログラム】繰り返しを使って、売上データを集計せよ。

データ(3つの配列)
String[] names = {"ノートPC", "マウス", "モニター", "キーボード"};
int[] prices = {128000, 3200, 45000, 8500};
int[] counts = {2, 15, 1, 3};

処理
① 各商品の売上(単価 × 数量)を「1. ノートPC:256,000円」の形式で出力
売上が5万円以上の商品だけ、末尾に を付ける
③ 全体の合計売上を計算
④ 最も売上の高い商品名を求める
⑤ 平均売上を小数第1位まで表示

期待される出力(7行)
1. ノートPC:256,000円 ★
2. マウス:48,000円
3. モニター:45,000円
4. キーボード:25,500円
---
合計:374,500円(最高:ノートPC)
平均:93,625.0円
総合★★★広告解放
期待される結果

出力7行が完全一致

ヒント

配列の添字を揃えて使う(names[i]、prices[i]、counts[i])。最大値を求めるには、最大の売上と商品名の両方を記録する変数が必要。平均は合計 ÷ 件数を小数で求め、String.format("%,.1f", 値) で整形する。

模範解答
public class Main {
    public static void main(String[] args) {
        String[] names = {"ノートPC", "マウス", "モニター", "キーボード"};
        int[] prices = {128000, 3200, 45000, 8500};
        int[] counts = {2, 15, 1, 3};

        int total = 0;
        int maxSales = 0;
        String maxName = "";

        for (int i = 0; i < names.length; i++) {
            int sales = prices[i] * counts[i];
            total += sales;

            if (sales > maxSales) {
                maxSales = sales;
                maxName = names[i];
            }

            String mark = (sales >= 50000) ? " ★" : "";
            System.out.println((i + 1) + ". " + names[i] + ":"
                    + String.format("%,d", sales) + "円" + mark);
        }

        double average = total / (double) names.length;

        System.out.println("---");
        System.out.println("合計:" + String.format("%,d", total)
                + "円(最高:" + maxName + ")");
        System.out.println("平均:" + String.format("%,.1f", average) + "円");
    }
}
解説

1回のループで4つの仕事を同時にこなしている。売上の計算、合計への加算、最大値の更新、そして出力——データを1周する間に必要な処理をまとめるのが効率的な書き方だ。もし合計用に1周、最大値用にもう1周…と分けていたら、4回もデータを読み直すことになる。

3つの配列を添字で対応させている点も重要だ。names[0]prices[0]counts[0] が同じ商品を指すという前提でループを回している。この方式は単純だが弱点もあり、配列の長さがずれると破綻する。JV08でクラスを学ぶと、1つの商品を1つのオブジェクトにまとめられるようになり、この危うさが解消される。

最大値の求め方にも注意点がある。maxSales を0で初期化しているが、売上が必ず正の数だと分かっているから成立する。もし損失(マイナス)がありうるデータなら、最初の要素で初期化するべきだ。

平均の計算では (double) のキャストが必須になる。total / names.length はどちらも int なので整数の割り算になり、93625.0 ではなく 93625 になってしまう——JV02で学んだ罠が、ここでも顔を出す。

次章では配列を本格的に学ぶ。今回は簡単に使っただけだが、宣言・初期化・操作を体系的に押さえていく。