制御構造
1. 条件分岐
条件分岐は、特定の条件に基づいてプログラムの実行フローを制御する構造です。
if-else文
// 基本的なif文
if (条件式) {
// 条件式がtrueの場合に実行される処理
}
// if-else文
if (条件式) {
// 条件式がtrueの場合に実行される処理
} else {
// 条件式がfalseの場合に実行される処理
}
// if-else if-else文
if (条件式1) {
// 条件式1がtrueの場合に実行される処理
} else if (条件式2) {
// 条件式1がfalseで、条件式2がtrueの場合に実行される処理
} else {
// すべての条件式がfalseの場合に実行される処理
}
例: 成績判定
int score = 85;
if (score >= 90) {
System.out.println("優");
} else if (score >= 80) {
System.out.println("良");
} else if (score >= 70) {
System.out.println("可");
} else {
System.out.println("不可");
}
// 出力: 良
三項演算子
簡単な条件分岐は三項演算子を使って一行で書くことができます。
// 構文: 条件式 ? trueの場合の値 : falseの場合の値
String result = (score >= 60) ? "合格" : "不合格";
switch文
複数の値に対して分岐処理を行う場合はswitch文が便利です。
switch (式) {
case 値1:
// 式が値1と等しい場合に実行される処理
break;
case 値2:
// 式が値2と等しい場合に実行される処理
break;
// ...
default:
// どのcaseにも一致しない場合に実行される処理
}
例: 曜日の判定
int day = 3;
String dayName;
switch (day) {
case 1:
dayName = "月曜日";
break;
case 2:
dayName = "火曜日";
break;
case 3:
dayName = "水曜日";
break;
case 4:
dayName = "木曜日";
break;
case 5:
dayName = "金曜日";
break;
case 6:
dayName = "土曜日";
break;
case 7:
dayName = "日曜日";
break;
default:
dayName = "不正な値";
}
System.out.println(dayName); // 出力: 水曜日
注意点
switch文ではbreakを忘れると、次のcaseの処理も実行されてしまいます(フォールスルー)。
Java 12以降では、switch式という新しい構文も使えます。
2. 繰り返し処理
繰り返し処理は、同じ処理を複数回実行するための構造です。
for文
回数が決まっている繰り返し処理に適しています。
// 基本的なfor文
for (初期化; 条件式; 更新) {
// 繰り返し実行される処理
}
例: 1から10までの合計を計算
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
System.out.println("合計: " + sum); // 出力: 合計: 55
拡張for文(for-each)
配列やコレクションの要素を順番に処理するのに便利です。
// 拡張for文
for (要素の型 変数名 : 配列またはコレクション) {
// 各要素に対して実行される処理
}
例: 配列の要素を表示
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.println(num);
}
while文
条件が真である間、処理を繰り返します。
// while文
while (条件式) {
// 条件式がtrueの間、繰り返し実行される処理
}
例: カウントダウン
int count = 5;
while (count > 0) {
System.out.println(count);
count--;
}
System.out.println("発射!");
do-while文
最低1回は処理を実行し、その後条件が真である間、処理を繰り返します。
// do-while文
do {
// 最低1回は実行され、その後条件式がtrueの間、繰り返し実行される処理
} while (条件式);
例: メニュー選択
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
int choice;
do {
System.out.println("1: 新規作成");
System.out.println("2: 編集");
System.out.println("3: 削除");
System.out.println("0: 終了");
System.out.print("選択してください: ");
choice = scanner.nextInt();
// 選択された処理を実行
// ...
} while (choice != 0);
System.out.println("プログラムを終了します");
3. ジャンプ文
ジャンプ文は、プログラムの実行フローを変更するための文です。
break文
switch文や繰り返し処理を途中で終了します。
例: 特定の値が見つかったら繰り返しを終了
int[] numbers = {1, 3, 5, 7, 9, 11, 13};
int searchValue = 7;
boolean found = false;
for (int num : numbers) {
if (num == searchValue) {
System.out.println(searchValue + "が見つかりました");
found = true;
break; // 見つかったらループを終了
}
}
if (!found) {
System.out.println(searchValue + "は見つかりませんでした");
}
continue文
繰り返し処理の現在のイテレーションをスキップして、次のイテレーションに進みます。
例: 偶数のみを処理
for (int i = 1; i <= 10; i++) {
if (i % 2 != 0) {
continue; // 奇数の場合はスキップ
}
System.out.println("偶数: " + i);
}
return文
メソッドの実行を終了し、呼び出し元に制御を戻します。値を返すこともできます。
例: 条件に応じて早期リターン
public boolean isPrime(int n) {
if (n <= 1) {
return false; // 1以下は素数ではない
}
if (n <= 3) {
return true; // 2と3は素数
}
if (n % 2 == 0 || n % 3 == 0) {
return false; // 2または3で割り切れる場合は素数ではない
}
for (int i = 5; i * i <= n; i += 6) {
if (n % i == 0 || n % (i + 2) == 0) {
return false;
}
}
return true;
}
4. 練習問題
問題1: FizzBuzz
1から100までの数を出力するプログラムを作成してください。ただし、3の倍数のときは数の代わりに「Fizz」、5の倍数のときは「Buzz」、3と5の両方の倍数のときは「FizzBuzz」と出力してください。
問題2: 素数の判定
ユーザーが入力した数が素数かどうかを判定するプログラムを作成してください。
問題3: 九九の表
九九の表(1×1から9×9まで)を出力するプログラムを作成してください。