はじめに
Java研修コーディング問題集の第2回は 条件分岐(if / switch) です。
プログラムの基本は「条件によって処理を変える」こと。if文とswitch文を使いこなせるようにしましょう。
難易度の見方
| マーク | 難易度 | 目安 |
|---|---|---|
| ⭐ | 基本 | 研修1週目レベル |
| ⭐⭐ | 応用 | 少し考える必要あり |
| ⭐⭐⭐ | チャレンジ | 複数の知識を組み合わせる |
問題1:偶数・奇数の判定 ⭐
問題
変数 num = 7 が偶数か奇数かを判定して出力してください。
期待する出力
7は奇数です
模範解答
public class Exercise01 {
public static void main(String[] args) {
int num = 7;
if (num % 2 == 0) {
System.out.println(num + "は偶数です");
} else {
System.out.println(num + "は奇数です");
}
}
}
ポイント: %(剰余演算子)で2で割った余りを確認します。余りが0なら偶数、それ以外は奇数です。
問題2:成績判定 ⭐
問題
テストの点数(score = 75)に応じて以下の評価を出力してください。
| 点数 | 評価 |
|---|---|
| 90点以上 | A(優秀) |
| 70点以上90点未満 | B(良好) |
| 50点以上70点未満 | C(普通) |
| 50点未満 | D(要努力) |
期待する出力
点数: 75
評価: B(良好)
模範解答
public class Exercise02 {
public static void main(String[] args) {
int score = 75;
String grade;
if (score >= 90) {
grade = "A(優秀)";
} else if (score >= 70) {
grade = "B(良好)";
} else if (score >= 50) {
grade = "C(普通)";
} else {
grade = "D(要努力)";
}
System.out.println("点数: " + score);
System.out.println("評価: " + grade);
}
}
ポイント: if - else if - else の順番が重要です。上から順に評価されるため、90以上を先に判定し、次に70以上を判定します。
問題3:うるう年の判定 ⭐⭐
問題
変数 year = 2024 がうるう年かどうかを判定して出力してください。
うるう年の条件:
- 4で割り切れる年はうるう年
- ただし、100で割り切れる年はうるう年ではない
- ただし、400で割り切れる年はうるう年
期待する出力
2024年はうるう年です
ヒント
- 条件を
&&(AND)と||(OR)で組み合わせます
模範解答
public class Exercise03 {
public static void main(String[] args) {
int year = 2024;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
System.out.println(year + "年はうるう年です");
} else {
System.out.println(year + "年はうるう年ではありません");
}
}
}
ポイント: 論理演算子の優先順位に注意しましょう。&&は||より優先されますが、括弧を使って明示的にすると読みやすくなります。
検証用テストケース:
- 2024年 → うるう年(4で割り切れる)
- 1900年 → うるう年ではない(100で割り切れるが400で割り切れない)
- 2000年 → うるう年(400で割り切れる)
問題4:曜日の表示(switch文)⭐
問題
変数 dayNumber = 3 に対応する曜日をswitch文で出力してください。
| 番号 | 曜日 |
|---|---|
| 1 | 月曜日 |
| 2 | 火曜日 |
| 3 | 水曜日 |
| 4 | 木曜日 |
| 5 | 金曜日 |
| 6 | 土曜日 |
| 7 | 日曜日 |
該当しない番号の場合は「不正な値です」と出力してください。
期待する出力
3 → 水曜日
模範解答
public class Exercise04 {
public static void main(String[] args) {
int dayNumber = 3;
String day;
switch (dayNumber) {
case 1: day = "月曜日"; break;
case 2: day = "火曜日"; break;
case 3: day = "水曜日"; break;
case 4: day = "木曜日"; break;
case 5: day = "金曜日"; break;
case 6: day = "土曜日"; break;
case 7: day = "日曜日"; break;
default: day = "不正な値です"; break;
}
System.out.println(dayNumber + " → " + day);
}
}
ポイント: switch文では各caseの最後に break を忘れないようにしましょう。breakがないと次のcaseに フォールスルー (落ちていく)してしまいます。
問題5:季節の判定(switch式 Java 14+)⭐⭐
問題
月(month = 8)から季節を判定してください。switch式(アロー構文) を使ってください。
| 月 | 季節 |
|---|---|
| 3, 4, 5 | 春 |
| 6, 7, 8 | 夏 |
| 9, 10, 11 | 秋 |
| 12, 1, 2 | 冬 |
期待する出力
8月は夏です
模範解答
public class Exercise05 {
public static void main(String[] args) {
int month = 8;
String season = switch (month) {
case 3, 4, 5 -> "春";
case 6, 7, 8 -> "夏";
case 9, 10, 11 -> "秋";
case 12, 1, 2 -> "冬";
default -> "不正な月です";
};
System.out.println(month + "月は" + season + "です");
}
}
ポイント: Java 14以降の switch式 では -> を使い、breakが不要です。また switch 全体が値を返すため、変数に直接代入できます。従来のswitch文との違いを理解しておきましょう。
問題6:三角形の判定 ⭐⭐
問題
3辺の長さ a = 3、b = 4、c = 5 が三角形を構成できるか判定し、構成できる場合はどんな三角形かを出力してください。
判定条件:
- 三角形の成立条件:任意の2辺の和が残りの1辺より大きい
- 正三角形:3辺がすべて等しい
- 二等辺三角形:2辺が等しい
- 直角三角形:a² + b² = c²(最大辺をcとする)
- 上記以外:一般の三角形
期待する出力
辺: a=3, b=4, c=5
三角形を構成できます
種類: 直角三角形
模範解答
public class Exercise06 {
public static void main(String[] args) {
int a = 3, b = 4, c = 5;
System.out.println("辺: a=" + a + ", b=" + b + ", c=" + c);
// 三角形の成立条件
if (a + b <= c || a + c <= b || b + c <= a) {
System.out.println("三角形を構成できません");
return;
}
System.out.println("三角形を構成できます");
// 種類の判定
if (a == b && b == c) {
System.out.println("種類: 正三角形");
} else if (a == b || b == c || a == c) {
System.out.println("種類: 二等辺三角形");
} else if (a * a + b * b == c * c ||
a * a + c * c == b * b ||
b * b + c * c == a * a) {
System.out.println("種類: 直角三角形");
} else {
System.out.println("種類: 一般の三角形");
}
}
}
ポイント: 複数の条件を組み合わせる問題です。判定の順番が重要で、まず三角形が成立するかを確認してから種類を判定します。
問題7:料金計算 ⭐⭐
問題
映画館の料金を年齢と曜日で計算するプログラムを作成してください。
料金体系:
| 区分 | 通常料金 |
|---|---|
| 大人(18歳以上) | 1800円 |
| 中高生(12〜17歳) | 1200円 |
| 子供(6〜11歳) | 800円 |
| 幼児(6歳未満) | 無料(0円) |
割引条件:
- 水曜日は全員 200円引き(幼児除く)
変数:age = 15、dayOfWeek = "水曜日"
期待する出力
年齢: 15歳(中高生)
曜日: 水曜日
通常料金: 1200円
割引: -200円
お支払い: 1000円
模範解答
public class Exercise07 {
public static void main(String[] args) {
int age = 15;
String dayOfWeek = "水曜日";
String category;
int price;
if (age >= 18) {
category = "大人";
price = 1800;
} else if (age >= 12) {
category = "中高生";
price = 1200;
} else if (age >= 6) {
category = "子供";
price = 800;
} else {
category = "幼児";
price = 0;
}
int discount = 0;
if (dayOfWeek.equals("水曜日") && price > 0) {
discount = 200;
}
int finalPrice = price - discount;
System.out.println("年齢: " + age + "歳(" + category + ")");
System.out.println("曜日: " + dayOfWeek);
System.out.println("通常料金: " + price + "円");
if (discount > 0) {
System.out.println("割引: -" + discount + "円");
}
System.out.println("お支払い: " + finalPrice + "円");
}
}
ポイント: 文字列の比較には == ではなく .equals() を使います。== は参照の比較であり、文字列の内容を比較するには .equals() が必要です。
問題8:じゃんけん判定 ⭐⭐
問題
自分の手(myHand = "グー")と相手の手(opponentHand = "チョキ")でじゃんけんの勝敗を判定してください。
期待する出力
自分: グー vs 相手: チョキ
結果: あなたの勝ち!
模範解答
public class Exercise08 {
public static void main(String[] args) {
String myHand = "グー";
String opponentHand = "チョキ";
System.out.println("自分: " + myHand + " vs 相手: " + opponentHand);
String result;
if (myHand.equals(opponentHand)) {
result = "あいこ!";
} else if (
(myHand.equals("グー") && opponentHand.equals("チョキ")) ||
(myHand.equals("チョキ") && opponentHand.equals("パー")) ||
(myHand.equals("パー") && opponentHand.equals("グー"))
) {
result = "あなたの勝ち!";
} else {
result = "あなたの負け...";
}
System.out.println("結果: " + result);
}
}
ポイント: 勝ちパターンを列挙する方法がシンプルです。あいこ → 勝ち → 負け(それ以外)の順で判定すると、負けパターンを個別に書く必要がありません。
問題9:電卓 ⭐⭐⭐
問題
2つの数値と演算子を使って計算結果を出力する簡易電卓を作成してください。
num1 = 10.0num2 = 3.0operator = "/"
対応する演算子:+、-、*、/
0で割る場合は「エラー:0で割ることはできません」と出力してください。
期待する出力
10.0 / 3.0 = 3.3333333333333335
模範解答
public class Exercise09 {
public static void main(String[] args) {
double num1 = 10.0;
double num2 = 3.0;
String operator = "/";
System.out.print(num1 + " " + operator + " " + num2 + " = ");
switch (operator) {
case "+":
System.out.println(num1 + num2);
break;
case "-":
System.out.println(num1 - num2);
break;
case "*":
System.out.println(num1 * num2);
break;
case "/":
if (num2 == 0) {
System.out.println("エラー:0で割ることはできません");
} else {
System.out.println(num1 / num2);
}
break;
default:
System.out.println("エラー:未対応の演算子です");
break;
}
}
}
ポイント: switch文の中にif文をネストすることもできます。除算の場合はゼロ除算のチェックが必要です。Java 7以降、switch文で String を使えるようになりました。
問題10:通知判定システム ⭐⭐⭐
問題
以下の条件でユーザーへの通知メッセージを決定するプログラムを作成してください。
ユーザー情報:
-
isLoggedIn = true(ログイン状態) -
role = "admin"(ユーザー権限: "admin", "member", "guest") -
hasUnreadMessages = true(未読メッセージあり) -
systemMaintenance = false(メンテナンス中)
通知ルール:
- メンテナンス中なら → 「現在メンテナンス中です」(他の条件に関わらず)
- ログインしていない → 「ログインしてください」
- ログイン済みかつadmin → 「管理者ダッシュボードへようこそ」
- ログイン済みかつmember → 「マイページへようこそ」
- ログイン済みかつguest → 「ゲストとして閲覧中です」
- 未読メッセージがある場合は、上記メッセージに追加で「(未読メッセージがあります)」を表示
期待する出力
=== 通知判定 ===
メッセージ: 管理者ダッシュボードへようこそ(未読メッセージがあります)
模範解答
public class Exercise10 {
public static void main(String[] args) {
boolean isLoggedIn = true;
String role = "admin";
boolean hasUnreadMessages = true;
boolean systemMaintenance = false;
System.out.println("=== 通知判定 ===");
String message;
if (systemMaintenance) {
message = "現在メンテナンス中です";
} else if (!isLoggedIn) {
message = "ログインしてください";
} else {
// ログイン済み
switch (role) {
case "admin":
message = "管理者ダッシュボードへようこそ";
break;
case "member":
message = "マイページへようこそ";
break;
case "guest":
message = "ゲストとして閲覧中です";
break;
default:
message = "不明な権限です";
break;
}
if (hasUnreadMessages) {
message += "(未読メッセージがあります)";
}
}
System.out.println("メッセージ: " + message);
}
}
ポイント: 実務では複数の条件を組み合わせて処理を分岐させることが頻繁にあります。条件の優先順位(メンテナンス > ログイン状態 > 権限)を明確にしてからコードを書くと、ロジックが整理されます。
まとめ
| 問題 | テーマ | 難易度 |
|---|---|---|
| 問題1 | 偶数・奇数の判定 | ⭐ |
| 問題2 | 成績判定(if-else if) | ⭐ |
| 問題3 | うるう年判定(論理演算子) | ⭐⭐ |
| 問題4 | 曜日表示(switch文) | ⭐ |
| 問題5 | 季節判定(switch式) | ⭐⭐ |
| 問題6 | 三角形の判定 | ⭐⭐ |
| 問題7 | 料金計算 | ⭐⭐ |
| 問題8 | じゃんけん判定 | ⭐⭐ |
| 問題9 | 簡易電卓 | ⭐⭐⭐ |
| 問題10 | 通知判定システム | ⭐⭐⭐ |
次回は 繰り返し処理(for / while) のコーディング問題です!
シリーズ一覧:Java研修コーディング問題集
- 変数・データ型・演算子 編
- 👉 条件分岐(if / switch)編(本記事)
- 繰り返し処理(for / while)編
- 配列 編
- メソッド 編
- 文字列操作(String)編
- クラスとオブジェクト 編
- 継承とインターフェース 編
- 例外処理 編
- コレクションと Stream API 編
著者: @kotaro_ai_lab
AI駆動開発やテック情報を毎日発信しています。フォローお気軽にどうぞ!