005-001-006
映画チケット料金計算:年齢による条件分岐
中級
問題説明
【解説】
この問題では: 入力された年齢に応じて映画館の料金(子ども料金・一般料金・シニア料金、またはエラーメッセージ)を if-else if-else 構文で判定し、結果を標準出力に表示するプログラムを作成します。
1. 問題の背景と目的
映画館の料金システムを題材に、if文による条件分岐を学びます。実際の映画館でも年齢によって料金が変わるため、身近なシステムをプログラムで再現することで、条件分岐の実用性を理解できます。この学習は、次のステップである複雑な条件判定やswitch文の学習に繋がります。
2. 前提知識の詳細説明
条件分岐とは
条件分岐とは、プログラムが「もし~ならば」という判断を行い、条件に応じて異なる処理を実行する仕組みです。例えば「もし雨が降っているなら傘を持つ、そうでなければ持たない」という日常の判断と同じです。
if文の基本構文
if (条件式) {
// 条件が真のときに実行される処理
} else if (別の条件式) {
// 最初の条件が偽で、この条件が真のときに実行される処理
} else {
// すべての条件が偽のときに実行される処理
}
```java
### <a href="https://javadrill.tech/problems/003/002">比較演算子</a>
- `<` : より小さい
- `<=` : 以下(等しいを含む)
- `>` : より大きい
- `>=` : 以上(等しいを含む)
- `==` : 等しい
- `!=` : 等しくない
### <a href="https://javadrill.tech/problems/003/003">論理演算子</a>
- `||` (OR): いずれかが真なら全体が真
- `&&` (AND): すべてが真なら全体が真
## 3. コードの行ごとの詳細解説
### ステップ1: Scanner準備と入力読み取り
```java
Scanner sc = new Scanner(System.in);
int age = sc.nextInt();
```java
まず、Scannerオブジェクトを作成して、ユーザーからの入力を受け付ける準備をします。`new Scanner(System.in)` は「<a href="https://javadrill.tech/problems/002/001">標準入力</a>(キーボード)からデータを読み取るためのツール」を用意するという意味です。次に `nextInt()` <a href="https://javadrill.tech/problems/008">メソッド</a>で整数値を読み取り、変数ageに保存します。この時点で、変数ageには入力された年齢が整数として格納されています。
### ステップ2: エラーケースのチェック(早期リターンパターン)
```java
if (age < 0 || age > 150) {
System.out.println("Error: Invalid age");
}
```java
まず最初に、異常な値をチェックします。年齢が0歳未満または150歳超の場合、現実的にありえない値なのでエラーメッセージを表示します。`||`(論理OR)を使うことで「どちらか一方でも真ならば全体が真」という条件を作っています。このように、早い段階でエラーケースを処理することを「早期リターンパターン」と呼び、コードの可読性を高める重要なテクニックです。
### ステップ3: 子ども料金の判定
```java
else if (age <= 12) {
System.out.println("Child: 1000 yen");
}
```java
最初のif文が偽(つまり有効な年齢範囲内)の場合、次の条件を調べます。年齢が12歳以下なら子ども料金(1000円)を表示します。`<=`(以下)を使うことで、12歳ちょうども子ども料金に含まれます。もし`<`(未満)を使うと12歳は含まれないので注意が必要です。
### ステップ4: シニア料金の判定
```java
else if (age >= 65) {
System.out.println("Senior: 1200 yen");
}
```java
年齢が65歳以上の場合、シニア料金(1200円)を表示します。ここでは `>=`(以上)を使うことで、65歳ちょうどからシニア料金が適用されます。
### ステップ5: 一般料金の判定(elseで残り全てを処理)
```java
else {
System.out.println("Adult: 1800 yen");
}
```java
これまでのすべての条件に当てはまらなかった場合(つまり13歳~64歳)は、一般料金(1800円)を表示します。ここで重要なのは、elseを使うことで「残り全部」を一括で処理できる点です。明示的に `age >= 13 && age <= 64` と書くこともできますが、既に他の条件で絞り込んでいるため、elseを使う方がシンプルで読みやすくなります。
### ステップ6: リソースのクリーンアップ
```java
sc.close();
```java
最後に、Scannerオブジェクトを閉じてシステムリソースを解放します。これはプログラミングの良い習慣で、使い終わったリソースは必ず閉じることで、メモリリークなどの問題を防ぎます。
## 4. よくある間違い
### 間違い1: 境界値の判定ミス
```java
// ❌ 間違い:12歳が一般料金になってしまう
if (age < 12) {
System.out.println("Child: 1000 yen");
}
// ✅ 正しい:12歳も子ども料金に含める
if (age <= 12) {
System.out.println("Child: 1000 yen");
}
```java
**理由**: `<`(未満)を使うと12歳が含まれません。境界値は問題文の仕様をよく確認し、`<=`(以下)か`<`(未満)を正しく選びましょう。
### 間違い2: 条件の順序が不適切
```java
// ❌ 間違い:elseが先だと他の条件が評価されない
if (age >= 13 && age <= 64) {
System.out.println("Adult: 1800 yen");
} else if (age <= 12) {
System.out.println("Child: 1000 yen");
}
```java
**理由**: 最初の条件が広すぎたり、重複していたりすると、後続の条件が評価されません。エラーケースを先に処理し、次に特殊ケース、最後に一般ケースという順序が推奨されます。
### 間違い3: 論理演算子の誤用
```java
// ❌ 間違い:ANDを使うと両方が真にならない
if (age < 0 && age > 150) {
System.out.println("Error: Invalid age");
}
// ✅ 正しい:ORを使ってどちらか一方でもエラー
if (age < 0 || age > 150) {
System.out.println("Error: Invalid age");
}
```java
**理由**: `&&`(AND)を使うと「0未満かつ150超」という矛盾した条件になり、常に偽になります。エラーチェックでは通常`||`(OR)を使います。
## 5. 実践的な
テストケース例
※ 出力例はプログラミングの国際標準に準拠し英語で表示しています
入力:
8
期待される出力:
Child: yen1000
入力:
25
期待される出力:
Adult: yen1800
入力:
70
期待される出力:
Senior: yen1200
入力:
12
期待される出力:
Child: yen1000
入力:
13
期待される出力:
Adult: yen1800
入力:
64
期待される出力:
Adult: yen1800
入力:
65
期待される出力:
Senior: yen1200
入力:
-5
期待される出力:
Error: Invalid age
入力:
200
期待される出力:
Error: Invalid age
❌ テストに失敗したケースがあります
あなたの解答
現在のモード:● 自分のコード
99
1
2
3
4
5
6
7
8
9
10
›
⌄
⌄
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// ここにコードを書いてください
sc.close();
}
}
0 B / 5 MB
残り 8 回実行可能
