001-001-004

変数宣言:マイレシピカード作成

初級

問題説明

この問題では: 料理名・人数・調理時間をキーボードから読み取り、変数に格納してカード形式で表示するプログラムを作成します。

【解説】

1. 問題の背景と目的

この問題では、プログラミングの最も基本的な概念である「変数」を学びます。変数とは、プログラムが実行中にデータを一時的に記憶しておくための「名前付きの箱」です。料理レシピという身近な題材を使って、変数の宣言、代入、そして使用方法を実践的に学びます。この基礎がしっかりしていれば、今後のより複雑なプログラムも理解しやすくなります。

2. 前提知識の詳細説明

変数とは

変数は「データを入れる箱」と考えてください。箱には名前を付けて、後から「この箱に入っているもの」として参照できます。

例えば、String dishName = "Curry"; と書くと、dishNameという名前の箱に「Curry」という文字列を入れたことになります。

データ型

Javaでは、変数に入れるデータの種類(型)を指定する必要があります:

  • String: 文字列(「Curry Rice」などの文字の並び)
  • int: 整数(1, 2, 100 など小数点のない数)
  • double: 小数(3.14 など小数点のある数)

Scannerクラス

キーボードからの入力を受け取るために使います。Scanner sc = new Scanner(System.in);でScannerオブジェクトを作成し、sc.nextLine()で1行の文字列を、sc.nextInt()で整数を読み取ります。

3. コードの行ごとの詳細解説

import文

import java.util.Scanner;
```java
Scannerクラスを使うために必要な宣言です。Javaの標準ライブラリから<a href="https://javadrill.tech/problems/002">Scanner</a>を「輸入」します。

### Scannerオブジェクトの作成
```java
Scanner sc = new Scanner(System.in);
```java
`System.in`はキーボード入力を表します。これをScannerに渡して、入力を読み取る準備をします。

### 変数への入力保存
```java
String dishName = sc.nextLine();
int servings = sc.nextInt();
int time = sc.nextInt();
```java
- `dishName`に料理名(文字列)を保存
- `servings`に人数(整数)を保存
- `time`に調理時間(整数)を保存

この時点で、3つの変数にユーザーが入力した値が保存されています。

### 出力
```java
System.out.println("| Dish: " + dishName + "...|" );
```java
文字列と変数を`+`で連結して、見やすいカード形式で出力します。

## 4. よくある間違いと修正例

### 間違い1: nextInt()の後のnextLine()問題
```java
// 誤った順序
int num = sc.nextInt();
String text = sc.nextLine(); // 空文字列が入ってしまう
```java
`nextInt()`は改行を消費しないため、次の`nextLine()`が空文字列を読んでしまいます。
```java
// 正しい順序(この問題では最初にnextLine()を使用)
String text = sc.nextLine();
int num = sc.nextInt();
```java

### 間違い2: 変数の型の不一致
```java
// 誤り
int dishName = sc.nextLine(); // 文字列をint型に入れようとしている
```java
```java
// 正しい
String dishName = sc.nextLine();
```java

### 間違い3: 変数名の誤字
```java
String dishName = sc.nextLine();
System.out.println(dishname); // 大文字小文字が違う
```java
Javaは大文字小文字を区別します。`dishName`と`dishname`は別の変数です。

## 5. 実践的なデバッグのヒント

### println()を使ったデバッグ
```java
System.out.println("DEBUG: dishName = " + dishName);
System.out.println("DEBUG: servings = " + servings);
```java
変数の値を途中で表示して、期待通りの値が入っているか確認できます。

### よく見るエラーメッセージ
- `InputMismatchException`: `nextInt()`で数字以外を入力した
- `NoSuchElementException`: 入力が足りない
- `cannot find symbol`: 変数名のタイプミス

## 6. 発展的な内容

### 次のステップ
- <a href="https://javadrill.tech/problems/005">条件分岐</a><a href="https://javadrill.tech/problems/005/001">if</a>):調理時間に応じて「簡単」「普通」「本格的」と表示
- ループ(<a href="https://javadrill.tech/problems/006/001">for</a>):複数のレシピを入力して一覧表示

### 実務での応用
変数は全てのプログラムの基礎です。Webアプリ、スマホアプリ、ゲームなど、あらゆるソフトウェアで変数が使われています。

## 7. 関連する学習項目
- 001-002: 変数の計算(カテゴリ001- 002-001: データ型(カテゴリ002- 005-001: <a href="https://javadrill.tech/problems/005">条件分岐</a>(カテゴリ005

テストケース例

※ 出力例はプログラミングの国際標準に準拠し英語で表示しています

正常系
入力:
Curry Rice
4
45
期待される出力:
+----+
| MY RECIPE CARD |
+----+
| Dish: Curry Rice      |
| Servings: 4 people    |
| Time: 45 minutes      |
+----+
正常系
入力:
Pasta
2
20
期待される出力:
+----+
| MY RECIPE CARD |
+----+
| Dish: Pasta           |
| Servings: 2 people    |
| Time: 20 minutes      |
+----+
境界値
入力:
Soup
1
5
期待される出力:
+----+
| MY RECIPE CARD |
+----+
| Dish: Soup            |
| Servings: 1 people    |
| Time: 5 minutes       |
+----+
正常系
入力:
Steak
3
30
期待される出力:
+----+
| MY RECIPE CARD |
+----+
| Dish: Steak           |
| Servings: 3 people    |
| Time: 30 minutes      |
+----+
境界値
入力:
Pancakes
6
20
期待される出力:
+----+
| MY RECIPE CARD |
+----+
| Dish: Pancakes        |
| Servings: 6 people    |
| Time: 20 minutes      |
+----+
problem.testType.edge
入力:
Tacos
3
15
期待される出力:
+----+
| MY RECIPE CARD |
+----+
| Dish: Tacos           |
| Servings: 3 people    |
| Time: 15 minutes      |
+----+

あなたの解答

現在のモード: 自分のコード
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

残り 10 回実行可能