Skip to main content

繰り返し

この章で得られるスキル:

  • ✅ 同じ処理を効率的に繰り返すプログラムが書ける
  • ✅ for文とwhile文を使い分けられる
  • ✅ ループの途中で抜ける・スキップする処理が実装できる
  • ✅ 実務でよく使うループのパターンを理解できる

Step 0: まず体験してみよう

説明の前に、まず 繰り返しがないと何が困るのか を体験しよう。

シナリオ:ゲームのスコアボードを作りたい

あなたはゲームアプリを作っている。プレイヤー10人のスコアを表示したい。

実行してみよう(繰り返しなし):

public class Main { public static void main(String[] args) { // プレイヤー10人のスコアを表示したい // でも、繰り返しがないと... System.out.println("プレイヤー1: 1200点"); System.out.println("プレイヤー2: 850点"); System.out.println("プレイヤー3: 1500点"); System.out.println("プレイヤー4: 920点"); System.out.println("プレイヤー5: 1100点"); // ... あと5人分書く必要がある // もし100人になったら?1000人になったら? // コードが膨大になってしまう... } }

問題点:

  • 10人分のコードを手作業で書く必要がある
  • 100人になったら100行書く必要がある
  • プレイヤー数が変わるたびに、コードを書き直す必要がある
  • 途中で表示形式を変えたくなったら、全行修正が必要

では、繰り返しを使うとどうなるか?

public class Main { public static void main(String[] args) { // 繰り返しを使うと、わずか3行で完成! for (int i = 1; i <= 10; i++) { System.out.println("プレイヤー" + i + ": " + (i * 100) + "点"); } // 100人に増えても、10を100に変えるだけ! } }

解決できたこと:

  • ✅ わずか3行で10人分の処理が完成
  • ✅ 人数が変わっても、数字を1つ変えるだけ
  • ✅ 表示形式を変えても、1箇所直せばOK

Step 1: for文の基本を理解する

for文 は、決まった回数だけ処理を繰り返す ための構文である。

書き方

for (初期化; 条件式; 更新) {
// 繰り返したい処理
}

3つの部分の役割

部分役割
初期化カウンタ変数の初期値を設定int i = 0
条件式繰り返しを続ける条件i < 10
更新カウンタ変数をどう変化させるかi++

処理の流れ

実行してみよう:

public class Main { public static void main(String[] args) { // 基本的なfor文 System.out.println("0から4まで表示:"); for (int i = 0; i < 5; i++) { System.out.println(i); } System.out.println("---"); // 1から5まで表示 System.out.println("1から5まで表示:"); for (int i = 1; i <= 5; i++) { System.out.println(i); } } }

やってみよう:

  • i < 5i < 10に変えて、0から9まで表示してみよう
  • i++i += 2に変えて、2ずつ増やしてみよう
ポイント

i++は「iを1増やす」という意味。i += 2は「iを2増やす」、i += 3は「iを3増やす」という意味である。


Step 2: for文のバリエーション

カウントダウンも簡単

public class Main { public static void main(String[] args) { // ロケット発射のカウントダウン System.out.println("ロケット発射まで:"); for (int i = 10; i >= 1; i--) { System.out.println(i); } System.out.println("発射!🚀"); System.out.println("---"); // 偶数だけ表示 System.out.println("0から10までの偶数:"); for (int i = 0; i <= 10; i += 2) { System.out.print(i + " "); } System.out.println(); } }

やってみよう:

  • i--を使ってカウントダウンの開始数を変えてみよう
  • i += 3に変えて、3の倍数を表示してみよう

Step 3: while文を理解する

while文 は、条件が成立する間、処理を繰り返す ための構文である。 繰り返し回数が事前に分からない場合に使う。

書き方

while (条件式) {
// 繰り返したい処理
}

処理の流れ

for文との使い分け

for文while文
繰り返し回数が 決まっている繰り返し回数が 不明
「10回繰り返す」「条件を満たすまで繰り返す」

実行してみよう:

public class Main { public static void main(String[] args) { // 基本的なwhile文 System.out.println("0から4まで表示:"); int i = 0; while (i < 5) { System.out.println(i); i++; // これを忘れると無限ループ! } System.out.println("---"); // 実用例:2倍ずつ増やして100を超えるまで System.out.println("2倍ずつ増やす:"); int num = 1; while (num <= 100) { System.out.println(num); num *= 2; // 2倍にする } } }

やってみよう:

  • i++の行をコメントアウト(//を前に付ける)して実行してみよう → 無限ループになる(ブラウザが重くなるので注意!)
  • num *= 3に変えて、3倍ずつ増やしてみよう
注意:無限ループ

while文では、条件式を更新する処理を忘れると、条件が永遠に成立してしまい、プログラムが止まらなくなる。 これを 無限ループ という。開発中は注意が必要である。


Step 4: while文の実践例

シナリオ:パスワード試行回数の制限

実務では、「3回まで試行可能」などの制限をかける場面がよくある。

public class Main { public static void main(String[] args) { // パスワード試行のシミュレーション String correctPassword = "java123"; String[] attempts = {"password", "12345", "java123"}; // 試行するパスワード(配列は後の章で学ぶ) int attemptCount = 0; int maxAttempts = 3; boolean isAuthenticated = false; System.out.println("パスワード認証システム(最大" + maxAttempts + "回まで)"); System.out.println("---"); while (attemptCount < maxAttempts && !isAuthenticated) { String inputPassword = attempts[attemptCount]; // 配列から取得 attemptCount++; System.out.println(attemptCount + "回目の試行: " + inputPassword); if (inputPassword.equals(correctPassword)) { isAuthenticated = true; System.out.println("✅ 認証成功!"); } else { System.out.println("❌ パスワードが違います"); int remaining = maxAttempts - attemptCount; if (remaining > 0) { System.out.println("残り試行回数: " + remaining); } } System.out.println(); } if (!isAuthenticated) { System.out.println("🚫 試行回数の上限に達しました。アカウントをロックします。"); } } }

このコードで学べること:

  • while文で「最大3回まで」の制限を実装
  • &&で複数の条件を組み合わせ
  • 実務でよくある「試行回数制限」のパターン

Step 5: do-while文を理解する

do-while文 は、最低1回は必ず実行される while文である。

書き方

do {
// 繰り返したい処理
} while (条件式);

while文との違い

while文do-while文
条件を 先に 判定条件を 後で 判定
条件が最初から偽なら、1回も実行されない条件が最初から偽でも、1回は実行される

実行してみよう:

public class Main { public static void main(String[] args) { // while文(条件が最初から偽) System.out.println("【while文】"); int i = 10; while (i < 5) { System.out.println("i = " + i); i++; } System.out.println("→ while文は1回も実行されませんでした"); System.out.println("---"); // do-while文(条件が最初から偽) System.out.println("【do-while文】"); int j = 10; do { System.out.println("j = " + j); j++; } while (j < 5); System.out.println("→ do-while文は1回実行されました"); System.out.println("---"); // 実用例:メニュー表示(最低1回は表示したい) System.out.println("【実用例:メニュー表示】"); int choice = 0; int count = 0; do { count++; System.out.println(count + "回目のメニュー表示"); System.out.println("1. 新規作成"); System.out.println("2. 開く"); System.out.println("3. 終了"); choice = (count == 2) ? 3 : 0; // 2回目で終了を選択 System.out.println("選択: " + choice); System.out.println(); } while (choice != 3); System.out.println("プログラムを終了します"); } }

やってみよう:

  • while文とdo-while文の出力の違いを確認してみよう
ポイント

do-while文は、「メニューを最低1回は表示したい」 などの場面で使われる。 実務ではwhile文の方がよく使われるが、do-while文の存在は知っておこう。


Step 6: break文とcontinue文

break文:ループを途中で抜ける

break文 は、ループを 途中で強制的に終了 する命令である。

for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // i が 5 になったらループを抜ける
}
System.out.println(i);
}
// 出力: 0, 1, 2, 3, 4(5以降は実行されない)

continue文:現在の繰り返しをスキップ

continue文 は、現在の繰り返しを スキップして次へ進む 命令である。

for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 偶数はスキップ
}
System.out.println(i);
}
// 出力: 1, 3, 5, 7, 9(奇数のみ)

違いを図で理解

breakcontinue
ループを 抜ける現在の繰り返しを スキップ
ループ自体が終了ループは続く(次の繰り返しへ)

実行してみよう:

public class Main { public static void main(String[] args) { // break文の例 System.out.println("【break文】"); for (int i = 0; i < 10; i++) { if (i == 5) { System.out.println("→ i が 5 になったのでループを終了"); break; } System.out.println(i); } System.out.println("---"); // continue文の例 System.out.println("【continue文】"); for (int i = 0; i < 10; i++) { if (i % 2 == 0) { continue; // 偶数はスキップ } System.out.println(i + " は奇数です"); } System.out.println("---"); // 実用例:条件に合う値を探す System.out.println("【実用例:条件に合う値を探す】"); System.out.println("1から100までで、最初に見つかる「7の倍数かつ偶数」:"); for (int i = 1; i <= 100; i++) { if (i % 7 != 0) { continue; // 7の倍数でなければスキップ } if (i % 2 != 0) { continue; // 奇数ならスキップ } System.out.println("見つかりました: " + i); break; // 最初の1つが見つかったら終了 } } }

やってみよう:

  • if (i == 5)if (i == 7)に変えて、breakの動作を確認してみよう
  • i % 2 == 0i % 3 == 0に変えて、3の倍数をスキップしてみよう

Step 7: ネストしたループ(二重ループ)

ネスト(入れ子)とは、ループの中にさらにループを書くことである。

基本的な二重ループ

for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
System.out.println("i=" + i + ", j=" + j);
}
}

動作:

  • 外側のループ(i)が1回実行されるごとに、内側のループ(j)が3回実行される
  • 合計で 3 × 3 = 9 回出力される

実用例

実行してみよう:

public class Main { public static void main(String[] args) { // 基本的な二重ループ System.out.println("【基本的な二重ループ】"); for (int i = 1; i <= 3; i++) { System.out.print("外側 i=" + i + " → 内側: "); for (int j = 1; j <= 3; j++) { System.out.print("j=" + j + " "); } System.out.println(); } System.out.println("---"); // 実用例1:九九の表 System.out.println("【九九の表】"); for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { System.out.print((i * j) + "\t"); } System.out.println(); } System.out.println("---"); // 実用例2:座席表の生成 System.out.println("【座席表(3行5列)】"); for (int row = 1; row <= 3; row++) { System.out.print(row + "行目: "); for (int col = 1; col <= 5; col++) { System.out.print("[" + row + "-" + col + "] "); } System.out.println(); } System.out.println("---"); // 実用例3:三角形を描く System.out.println("【三角形】"); for (int i = 1; i <= 5; i++) { for (int j = 1; j <= i; j++) { System.out.print("*"); } System.out.println(); } } }

やってみよう:

  • 九九の表を5×5に変えてみよう(i <= 5j <= 5
  • 三角形の大きさを変えてみよう(i <= 10
  • 逆三角形を作ってみよう(j <= 6 - i
ポイント

ネストしたループは、表やパターンを作成するときに便利である。 ただし、ループの階層が深くなりすぎると、処理が遅くなったり、コードが読みにくくなったりするので注意。


Step 8: 実践課題

これまで学んだことを組み合わせて、実践的なプログラムを作ってみよう。

課題1:FizzBuzz

仕様:

  • 1から100までの数を表示する
  • 3の倍数のときは「Fizz」
  • 5の倍数のときは「Buzz」
  • 15の倍数のときは「FizzBuzz」
public class Main { public static void main(String[] args) { System.out.println("FizzBuzz(1〜30):"); for (int i = 1; i <= 30; i++) { if (i % 15 == 0) { System.out.println("FizzBuzz"); } else if (i % 3 == 0) { System.out.println("Fizz"); } else if (i % 5 == 0) { System.out.println("Buzz"); } else { System.out.println(i); } } } }

やってみよう:

  • 100まで表示してみよう(i <= 100

課題2:合計と平均の計算

仕様:

  • 1から100までの合計を計算する
  • 平均を計算する
public class Main { public static void main(String[] args) { int sum = 0; int count = 0; for (int i = 1; i <= 100; i++) { sum += i; // sumにiを加算 count++; } double average = (double) sum / count; System.out.println("1から100までの合計: " + sum); System.out.println("平均: " + average); } }

やってみよう:

  • 1から1000までの合計を計算してみよう
  • 偶数だけの合計を計算してみよう(if (i % 2 == 0)を使う)

課題3:パターン描画

仕様:

  • 以下のようなパターンを描く
    *
***
*****
*******
*********
public class Main { public static void main(String[] args) { int height = 5; for (int i = 1; i <= height; i++) { // 空白を表示 for (int j = 1; j <= height - i; j++) { System.out.print(" "); } // アスタリスクを表示 for (int j = 1; j <= 2 * i - 1; j++) { System.out.print("*"); } System.out.println(); } } }

やってみよう:

  • heightを変えて、大きさを変えてみよう

まとめ

この章では、Javaの 繰り返し について学んだ。

🎯 達成できたこと

  • ✅ for文で決まった回数の処理を効率的に書けるようになった
  • ✅ while文で条件による繰り返しが実装できるようになった
  • ✅ break/continueでループを制御できるようになった
  • ✅ 二重ループで複雑なパターンが作れるようになった

📚 学んだ内容

構文使い方使い分け
for文決まった回数繰り返す繰り返し回数が明確なとき
while文条件を満たす間繰り返す繰り返し回数が不明なとき
do-while文最低1回は実行する最低1回の実行が必要なとき
breakループを途中で抜ける条件を満たしたら即終了
continue現在の繰り返しをスキップ特定の条件をスキップ

🚀 次のステップ

次の章では、配列 について学ぶ。 配列とループを組み合わせることで、大量のデータを効率的に処理できるようになる。


💡 よくある質問

Q1: for文とwhile文、どっちを使えばいい?

A: 繰り返し回数が 決まっている ならfor文、条件による ならwhile文を使う。

  • ✅ for文:「10回繰り返す」「1から100まで」
  • ✅ while文:「ユーザーが終了を選ぶまで」「条件を満たすまで」

Q2: 無限ループになったらどうすればいい?

A: ブラウザのタブを閉じるか、ページをリロードする。 開発中は、条件式が必ず偽になるかカウンタ変数を更新しているか を確認しよう。

Q3: i++と++i、どっちを使えばいい?

A: for文の更新部分では、どちらでも同じ結果になる。 慣習としてi++を使うことが多い。

for (int i = 0; i < 10; i++)   // ✅ よく使われる
for (int i = 0; i < 10; ++i) // ✅ これでも同じ

Q4: ネストしたループで、外側のループを抜けるには?

A: breakは最も内側のループしか抜けない。外側のループも抜けたい場合は、以下の方法がある:

  • 方法1: フラグ変数を使う
  • 方法2: ラベル付きbreakを使う(break outerLoop;
  • 方法3: メソッドに分割してreturnを使う(第7章で学ぶ)

Q5: for文の初期化で、なぜ int i = 0 から始めることが多いの?

A: プログラミングの世界では、0から数え始める 慣習がある。 配列(次の章)やリストのインデックスが0から始まるため、for文も0から始めることが多い。 ただし、「1から10まで」のように自然な数え方をする場合は、int i = 1から始めても問題ない。


演習

ループ(繰り返し)の目的として最も適切なものを選べ。

正解

C. 同じ処理や似た処理を何度も実行すること

解説

ループとは、同じ処理や似た処理を 繰り返し実行 する仕組みである。Javaではfor文、while文、do-while文を使ってループを実現する。条件による切り替えは条件分岐(if文)の役割である。

Javaのfor文の構文として正しいものを選べ。

正解

C. `for (初期化; 条件式; 更新処理) { 処理; }`

解説

for文の構文は for (初期化; 条件式; 更新処理) の順番で、各部分は セミコロン ; で区切る。カンマではない。また、丸括弧 () で囲む必要がある。

while文とdo-while文の違いについて、正しい説明を選べ。

正解

C. while文は条件を先に判定し、do-while文は処理を先に実行する

解説

while文は 条件を先に判定(前判定)するため、条件がfalseなら一度も実行されない。do-while文は 処理を先に実行(後判定)するため、条件に関わらず 最低1回は実行される。この違いは初回実行時に影響する。

ループ内でのbreakとcontinueの動作の違いについて、正しい説明を選べ。

正解

C. breakはループ全体を終了し、continueは現在の回をスキップして次の繰り返しに進む

解説

break はループを 完全に終了 してループの次の処理に進む。continue現在の繰り返しだけをスキップ して、次の繰り返しに進む。ループ自体は終了しない。

以下のコードのうち、無限ループになるものを選べ。

正解

C. `while (true) { System.out.println("Hello"); }`

解説

while (true) は条件が常に true であるため、ループが永遠に終わらない 無限ループ になる。無限ループは break 文と組み合わせて使うことがある。while (false) は条件が常にfalseなので一度も実行されない。

以下のコードの空欄を埋めて、「Hello」を5回表示するプログラムを完成させよ。

for (
;
;
) { System.out.println("Hello"); }

解答例
for (int i = 0; i < 5; i++)
解説

for文の3つの部分はそれぞれ以下の役割を持つ。

  • 初期化 int i = 0: カウンタ変数iを0で初期化
  • 条件式 i < 5: iが5未満の間、繰り返す(0,1,2,3,4の5回)
  • 更新処理 i++: 1回の繰り返しごとにiを1増やす

以下のコードの空欄を埋めて、1から10までの数字を表示するプログラムを完成させよ。

for (
;
; i++) { System.out.println(i); }

解答例
for (int i = 1; i <= 10; i++)
解説

1から10を表示するには、カウンタ変数を 1から開始 し、10以下 の間繰り返す。i <= 10i < 11 はどちらも同じ結果になる。

以下のプログラムを完成させよ。

要件

  • 変数 count を1から始めて、5以下の間「count: 1」「count: 2」...と表示する
  • while文を使用すること
public class Main { public static void main(String[] args) { int count = 1; // ここにwhile文を書いてください } }

解説

解答例

while (count <= 5) {
    System.out.println("count: " + count);
    count++;
}

while文では条件式 count <= 5 がtrueの間、ループ内の処理が繰り返される。カウンタ変数の更新(count++)を忘れると無限ループ になるため注意が必要である。

以下のプログラムを完成させよ。

要件

  • do-while文を使って、変数 num の値を表示し、num を1ずつ減らす
  • num が0より大きい間、繰り返す
public class Main { public static void main(String[] args) { int num = 3; // ここにdo-while文を書いてください } }

do-while文の構文は do { 処理; } while (条件式); である。while文と違い、条件の判定がループの最後 にある点に注目しよう。

解説

解答例

do {
    System.out.println(num);
    num--;
} while (num > 0);

do-while文は do { } 内の処理を 最低1回実行した後 に条件を判定する。仮に num が0以下で始まっても、1回は実行される点がwhile文との違いである。末尾の while (条件式); のセミコロンを忘れないこと。

以下のコードの空欄を埋めて、iが3のときにループを終了するプログラムを完成させよ。

for (int i = 0; i < 10; i++) { if (i == 3) {
; } System.out.println(i); }

解答例
break
解説

break 文はループを 即座に終了 する。このコードではiが0, 1, 2のときに出力が行われ、iが3になった時点でbreakが実行されてループを抜ける。iが3のときの System.out.println(i) はbreakの後にあるため実行されない。

以下のコードの空欄を埋めて、iが3のときだけスキップして他の値を表示するプログラムを完成させよ。

for (int i = 0; i < 5; i++) { if (i == 3) {
; } System.out.println(i); }

解答例
continue
解説

continue 文は 現在の繰り返しだけをスキップ して、次の繰り返しに進む。このコードでは0, 1, 2, 4が出力され、3はスキップされる。breakと異なり、ループ自体は継続する。

以下のプログラムを完成させよ。

要件

  • 二重ループを使って、九九の表(1×1から9×9まで)を表示する
  • 各行の値はタブ文字(\t)で区切る
  • 1行分を表示したら改行する
public class Main { public static void main(String[] args) { // ここに二重ループを書いてください } }

外側のループで段(1〜9)、内側のループで列(1〜9)を回す。i * j の結果をタブ文字 で区切って表示しよう。

解説

解答例

for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= 9; j++) {
        System.out.print(i * j + "	");
    }
    System.out.println();
}

外側のループ(i)が行を、内側のループ(j)が列を制御する。System.out.print() で改行せずにタブ区切りで出力し、内側のループが終わったら System.out.println() で改行する。

以下のJavaコードで、System.out.println(i) は何回実行されるか。

for (int i = 2; i <= 10; i += 3) {
System.out.println(i);
}

ループ変数 i の初期値、条件式、更新処理に注目しよう。iが条件を満たす値をすべて書き出してみよう。

正解

B. 3回

解説

ループ変数iの変化を追うと以下のようになる。

回数iの値i <= 10実行
1回目2true出力
2回目5true出力
3回目8true出力
4回目11false終了

iは2から始まり、3ずつ増える(2→5→8→11)。11で条件 i <= 10 がfalseになるため、3回 実行される。

for (int i = 0; i < 10; i++) において、i++ の役割として正しいものを選べ。

正解

C. 各繰り返しの後にループ変数を更新する

解説

for文の3つの部分はそれぞれ以下の役割を持つ。

  • int i = 0初期化 — ループ変数の初期値を設定(ループ開始前に1回だけ実行)
  • i < 10条件式 — 各繰り返しの前に評価し、trueならループを続ける
  • i++更新処理 — 各繰り返しの にループ変数を更新する

i++ はループ本体の処理が終わった後に実行される。

以下のJavaコードを実行した場合、何が出力されるか。

for (int i = 1; i <= 3; i++) {
System.out.println(i * 2);
}

正解

B. 2 4 6(各行に1つずつ)

解説

ループ変数iの変化と出力を追跡する。

繰り返しiの値i * 2出力
1回目122
2回目244
3回目366
4回目i=4, 4 <= 3 はfalse-終了

各繰り返しで i * 2 の結果が出力されるため、2, 4, 6 が順に表示される。

以下のJavaコードを実行した場合、何が出力されるか。

int n = 10;
while (n > 1) {
n = n / 2;
System.out.println(n);
}

変数 n の変化を1ステップずつ追跡してみよう。各ステップでnの値がどう変わり、条件 n > 1 がどうなるかを確認しよう。

正解

C. 5 2 1(各行に1つずつ)

解説

変数nの変化を追跡する。

ステップnの値(ループ開始時)n > 1n / 2出力
110true55
25true22
32true11
41false-終了

int型の除算は 小数点以下が切り捨て られる(5 / 2 = 2)。nが1になると条件 n > 1 がfalseになりループが終了する。

以下のコードの空欄を埋めて、10から1までのカウントダウンを表示するプログラムを完成させよ。

for (
;
;
) { System.out.println(i); }

解答例
for (int i = 10; i >= 1; i--)
解説

カウントダウンするfor文では、カウンタ変数を 大きい値から開始 し、条件式で下限を指定し、更新処理で デクリメント(i-- する。i >= 1i > 0 はどちらも同じ結果になる。

以下のプログラムを完成させよ。

要件

  • 1から30までの数字を順に処理する
  • 3の倍数かつ5の倍数のとき「FizzBuzz」と表示
  • 3の倍数のとき「Fizz」と表示
  • 5の倍数のとき「Buzz」と表示
  • それ以外のとき、数字をそのまま表示
public class Main { public static void main(String[] args) { // ここにFizzBuzzプログラムを書いてください } }

条件の順番に注意しよう。「3の倍数かつ5の倍数」の判定を 最初に 行う必要がある。% 演算子で余りが0かを判定する。

解説

解答例

for (int i = 1; i <= 30; i++) {
    if (i % 3 == 0 && i % 5 == 0) {
        System.out.println("FizzBuzz");
    } else if (i % 3 == 0) {
        System.out.println("Fizz");
    } else if (i % 5 == 0) {
        System.out.println("Buzz");
    } else {
        System.out.println(i);
    }
}

FizzBuzzでは 判定の順序 が重要である。「3の倍数かつ5の倍数」の判定を最初に行わないと、先に「3の倍数」に該当してしまい「FizzBuzz」が出力されない。15の倍数(15, 30)が「FizzBuzz」になることを確認しよう。