Day 3: 制御構文
今日学ぶこと
- 条件分岐(if / else)
- switch文とswitch式
- for ループ
- while / do-while ループ
- break と continue
if文
int score = 85;
if (score >= 90) {
System.out.println("A");
} else if (score >= 80) {
System.out.println("B");
} else if (score >= 70) {
System.out.println("C");
} else {
System.out.println("D");
}
// 出力: B
flowchart TB
Start["score = 85"]
C1{"score >= 90?"}
C2{"score >= 80?"}
C3{"score >= 70?"}
A["A"]
B["B"]
C["C"]
D["D"]
Start --> C1
C1 -->|"Yes"| A
C1 -->|"No"| C2
C2 -->|"Yes"| B
C2 -->|"No"| C3
C3 -->|"Yes"| C
C3 -->|"No"| D
style B fill:#22c55e,color:#fff
三項演算子
int age = 20;
String status = (age >= 18) ? "成人" : "未成年";
System.out.println(status); // 成人
switch文
従来のswitch文
int day = 3;
switch (day) {
case 1:
System.out.println("月曜日");
break;
case 2:
System.out.println("火曜日");
break;
case 3:
System.out.println("水曜日");
break;
default:
System.out.println("その他");
break;
}
注意:
breakを忘れるとフォールスルー(次のケースも実行)が発生します。
switch式(Java 14+)
int day = 3;
String dayName = switch (day) {
case 1 -> "月曜日";
case 2 -> "火曜日";
case 3 -> "水曜日";
case 4 -> "木曜日";
case 5 -> "金曜日";
case 6 -> "土曜日";
case 7 -> "日曜日";
default -> "不明";
};
System.out.println(dayName); // 水曜日
推奨: Java 14以降ではアロー構文のswitch式を使いましょう。
breakの書き忘れがなく、値を返せます。
複数値のマッチング
String type = switch (day) {
case 1, 2, 3, 4, 5 -> "平日";
case 6, 7 -> "週末";
default -> "不明";
};
switchで使える型
| 型 | 例 |
|---|---|
int, byte, short, char |
case 1: |
String |
case "hello": |
enum |
case MONDAY: |
forループ
基本のforループ
for (int i = 0; i < 5; i++) {
System.out.println("i = " + i);
}
// i = 0, 1, 2, 3, 4
flowchart TB
Init["int i = 0<br>初期化"]
Cond{"i < 5?"}
Body["ループ本体<br>実行"]
Update["i++<br>更新"]
End["ループ終了"]
Init --> Cond
Cond -->|"true"| Body --> Update --> Cond
Cond -->|"false"| End
style Init fill:#3b82f6,color:#fff
style Cond fill:#f59e0b,color:#fff
style Body fill:#22c55e,color:#fff
style Update fill:#8b5cf6,color:#fff
カウントダウン
for (int i = 5; i > 0; i--) {
System.out.println(i);
}
// 5, 4, 3, 2, 1
ネストしたforループ
// 九九の表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
System.out.printf("%3d", i * j);
}
System.out.println();
}
拡張forループ(for-each)
配列やコレクションの全要素を順に処理します。
String[] fruits = {"りんご", "みかん", "ぶどう"};
for (String fruit : fruits) {
System.out.println(fruit);
}
推奨: 配列やリストの全要素を処理する場合は拡張forを使いましょう。インデックスが不要な場面で簡潔に書けます。
whileループ
while
int count = 0;
while (count < 5) {
System.out.println("count = " + count);
count++;
}
do-while
int count = 0;
do {
System.out.println("count = " + count);
count++;
} while (count < 5);
| ループ | 条件チェック | 最低実行回数 |
|---|---|---|
while |
ループの前 | 0回 |
do-while |
ループの後 | 1回 |
break と continue
break
ループを途中で抜けます。
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // i=5でループ終了
}
System.out.println(i);
}
// 0, 1, 2, 3, 4
continue
現在の繰り返しをスキップします。
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 偶数をスキップ
}
System.out.println(i);
}
// 1, 3, 5, 7, 9
ラベル付きbreak
ネストしたループを一気に抜けます。
outer:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) {
break outer; // 外側のループも抜ける
}
System.out.printf("(%d, %d) ", i, j);
}
}
// (0, 0) (0, 1) (0, 2) (1, 0)
実践: 数当てゲーム
import java.util.Random;
import java.util.Scanner;
public class NumberGuessing {
public static void main(String[] args) {
Random random = new Random();
int answer = random.nextInt(100) + 1; // 1〜100
Scanner scanner = new Scanner(System.in);
int attempts = 0;
System.out.println("=== 数当てゲーム ===");
System.out.println("1〜100の数を当ててください。");
while (true) {
System.out.print("予想: ");
int guess = scanner.nextInt();
attempts++;
if (guess == answer) {
System.out.printf("正解!%d回で当たりました!%n", attempts);
break;
} else if (guess < answer) {
System.out.println("もっと大きい数です。");
} else {
System.out.println("もっと小さい数です。");
}
}
scanner.close();
}
}
まとめ
| 概念 | 説明 |
|---|---|
if / else |
条件分岐 |
switch |
値による分岐(アロー構文推奨) |
for |
回数が決まったループ |
for-each |
コレクションの全要素を処理 |
while |
条件が真の間ループ |
do-while |
最低1回実行するループ |
break |
ループを抜ける |
continue |
現在の繰り返しをスキップ |
重要ポイント
- switch式(
->構文)を使ってbreak漏れを防ぐ - 全要素処理には拡張forを使う
while(true)+breakで終了条件が複雑なループを書ける- ラベル付きbreakでネストループを一気に抜けられる
練習問題
問題1: 基本
1〜100の数を表示し、3の倍数の時は「Fizz」、5の倍数の時は「Buzz」、両方の倍数の時は「FizzBuzz」と表示するプログラムを作成してください。
問題2: 応用
Scannerを使ってユーザーから数値を繰り返し入力させ、0が入力されたら合計と平均を表示して終了するプログラムを作成してください。
チャレンジ問題
ネストしたforループを使って、以下のような三角形パターンを表示するプログラムを作成してください。
*
**
***
****
*****
参考リンク
次回予告: Day 4では「配列と文字列」について学びます。複数のデータをまとめて扱う方法をマスターしましょう。