変数への代入:料理レシピカード
問題説明
この問題では: Scannerを使って料理名・人数・調理時間・主な材料を読み取り、適切なデータ型の変数に代入した後、レシピカード形式で結果を標準出力に表示するプログラムを作成します。
【解説】
1. 問題の背景と目的
この問題では、Java プログラミングの最も基本的な概念の一つである「変数への代入」を学びます。変数とは、プログラムが実行中にデータを一時的に記憶しておくための「名前付きの箱」です。実際の開発では、ユーザーからの入力を受け取り、それを適切な型の変数に保存して処理することが頻繁に行われます。この問題を通じて、Scanner を使った入力の受け取り方と、異なるデータ型の変数への代入方法を習得できます。
2. 前提知識の詳細説明
変数とは
変数は、プログラムが実行中にデータを一時的に記憶しておくための「名前付きの箱」です。例えば、ユーザーが入力した料理名を後で使いたい場合、その料理名を変数に保存しておきます。
データ型
Java では、変数にはデータの種類(型)を指定する必要があります:
- String: 文字列を保存する型(例:「Pasta Carbonara」)
- int: 整数を保存する型(例:2、20)
- double: 小数を保存する型(例:3.14)
Scanner クラス
Scanner は、キーボードからの入力を読み取るための便利なクラスです。new Scanner(System.in) で作成し、nextLine() で文字列を、nextInt() で整数を読み取ることができます。
代入演算子(=)
変数にデータを保存することを「代入」と呼び、= 記号を使います。例:String name = "Alice"; は、変数 name に「Alice」という文字列を代入しています。
3. コードの行ごとの詳細解説
ステップ1: Scanner オブジェクトの作成
Scanner sc = new Scanner(System.in);
この行で、キーボード入力を読み取るための Scanner オブジェクトを作成します。System.in はキーボード入力を表し、これを Scanner に渡すことで、キーボードからの入力を読み取る準備ができます。変数 sc に Scanner オブジェクトを保存しているので、この後 sc.nextLine() のように使えるようになります。
ステップ2: 料理名の読み取りと保存
String dish = sc.nextLine();
ユーザーがキーボードから入力した1行分の文字列を読み取り、String 型の変数 dish に代入します。例えば、ユーザーが「Pasta Carbonara」と入力すると、この時点で変数 dish には「Pasta Carbonara」という文字列が保存されます。
ステップ3: 人数分の読み取りと検証
int servings = sc.nextInt();
if (servings <= 0) {
System.out.println("Error: Servings must be positive");
return;
}
ユーザーが入力した整数を読み取り、int 型の変数 servings に代入します。その後、入力値が正の数かどうかをチェックします。もし 0 以下の値が入力された場合は、エラーメッセージを表示してプログラムを終了します。この検証により、不正なデータでプログラムが誤動作することを防ぎます。
ステップ4: 調理時間の読み取り
int time = sc.nextInt();
sc.nextLine(); // 改行文字を読み捨て
調理時間を整数として読み取り、変数 time に保存します。重要なのは次の行の sc.nextLine() です。nextInt() は数値だけを読み取り、その後の改行文字(Enter キー)は読み取りません。そのため、次に nextLine() を使うと、残っている改行文字だけが読み取られてしまい、意図した文字列が読み取れなくなります。これを防ぐために、改行文字を読み捨てる必要があります。
ステップ5: 主な材料の読み取り
String ingredient = sc.nextLine();
主な材料を文字列として読み取り、変数 ingredient に保存します。ステップ4で改行文字を読み捨てているため、この nextLine() は正しくユーザーの入力を読み取ることができます。
ステップ6: 保存したデータの出力
System.out.println("=== Recipe Card ===");
System.out.println("Dish: " + dish);
System.out.println("Servings: " + servings + " people");
System.out.println("Time: " + time + " minutes");
System.out.println("Ingredient: " + ingredient);
変数に保存したデータを使って、指定された形式で出力します。+ 演算子を使って文字列を連結しています。例えば、"Dish: " + dish は、「Dish: 」という文字列と変数 dish の値を結合します。変数 servings や time は整数ですが、文字列と + で連結すると自動的に文字列に変換されます。
ステップ7: エラー処理
try {
// メイン処理
} catch (Exception e) {
System.out.println("Error: Invalid number format");
} finally {
sc.close();
}
try-catch ブロックで、数値入力のエラーをキャッチします。ユーザーが数値を入力すべき箇所に文字を入力した場合、InputMismatchException が発生しますが、catch ブロックでキャッチして優しいエラーメッセージを表示します。finally ブロックでは、エラーが発生してもしなくても必ず Scanner を閉じて、リソースを適切に解放します。
4. よくある間違いと修正例
間違い1: nextInt() の後に nextLine() を使う際の改行文字の扱い
間違った例:
int servings = sc.nextInt();
int time = sc.nextInt();
String ingredient = sc.nextLine(); // 改行文字だけが読み取られてしまう
テストケース例
※ 出力例はプログラミングの国際標準に準拠し英語で表示しています
Pasta Carbonara 2 20 Bacon
=== Recipe Card === Dish: Pasta Carbonara Servings: 2 people Time: 20 minutes Ingredient: Bacon
Vegetable Curry 4 45 Potato
=== Recipe Card === Dish: Vegetable Curry Servings: 4 people Time: 45 minutes Ingredient: Potato
Quick Salad 1 5 Lettuce
=== Recipe Card === Dish: Quick Salad Servings: 1 people Time: 5 minutes Ingredient: Lettuce
Cake abc 30 Flour
Error: Invalid number format
Soup -2 15 Carrot
Error: Servings must be positive
あなたの解答
残り 9 回実行可能
