Java道|2つ以上の数値を入力する流れ

2つの入力は、2本の伝令を順番に受け取ること。readLineを並べて使えば、Javaは複数の数値を扱えるようになる

これまでの学習では、キーボードから文字列を入力し、その文字列を数値に変換して使う方法を学んできました。ここまで理解できると、Javaのプログラムは、あらかじめコードに書かれた値だけでなく、実行中に入力された値を使って動けるようになります。

さらに一歩進むと、入力する数値が1つだけでは足りない場面が出てきます。たとえば、2人分の修行値を入力する、2つの任務得点を入力する、2種類の道具の数を入力する、といった場面です。実際のプログラムでは、複数の値を受け取り、それぞれを別々に保存して使うことがよくあります。

鬼殺隊風にたとえるなら、1つの入力は、1人の隊士から届く伝令です。2つ以上の数値を入力するということは、複数の隊士から順番に届く伝令を受け取り、それぞれの内容を別々の記録札に書き留めるようなものです。1つ目の伝令と2つ目の伝令が混ざってしまうと、どちらがどの値だったのかわからなくなります。そのため、入力された値を順番に受け取り、別々の変数で管理することが大切です。

考え方自体は難しくありません。1つの数値を入力するときの流れを、必要な回数だけ繰り返しているだけです。readLineで文字列として受け取り、Integer.parseIntで整数に変換し、変数に入れて使う。この基本の流れを2回分行えば、2つの数値を入力できます。

ここでは、2つ以上の数値を入力する基本の流れ、複数のreadLineを使う意味、入力順と変数の関係、そして複数入力のコードを読むときの見方を、鬼滅の刃風の修行イメージに置き換えながら、やさしく整理していきます。例示プログラムは Sample6.java のみを使って確認します。

2つ以上の数値を入力するとはどういうことか

2つ以上の数値を入力するとは、キーボードから複数回に分けて値を入力し、それぞれを別々の変数で受け取ることです。

1つの数値を入力する場合は、readLineで1行分の入力を受け取り、その文字列を整数へ変換して、int型の変数に入れました。2つの数値を入力する場合は、この流れを2回行います。

鬼殺隊の任務で考えると、1回目の入力は「剣士Aの修行値」、2回目の入力は「剣士Bの修行値」のように、別々の伝令として受け取ります。どちらも数値ですが、意味が違うため、それぞれ別の変数に入れて管理します。

入力回数入力される内容の例保存先の例
1回目剣士Aの修行値power1
2回目剣士Bの修行値power2

ここで大切なのは、2つの値を一度にまとめて受け取るのではなく、1回ずつ順番に受け取っているということです。

ユーザーが1つ目の値を入力してEnterキーを押すと、1回目のreadLineがその値を受け取ります。次に2つ目の値を入力してEnterキーを押すと、2回目のreadLineがその値を受け取ります。

つまり、複数入力では「入力の順番」と「変数の対応」がとても重要になります。

基本の考え方は1回の入力を繰り返すこと

2つ以上の数値を入力するしくみは、新しい特別なルールではありません。

基本は、1つの数値を入力するときの流れを、必要な回数だけ繰り返しているだけです。

1つの数値を入力するときの流れは、次のようになります。

手順内容
1キーボードから1行の文字列を読み込む
2読み込んだ文字列を数値に変換する
3数値型の変数に入れる
4必要な処理で使う

2つの数値を入力するときは、この流れを2回分行います。

入力文字列として受け取る整数に変換する数値として保存する
1つ目str1Integer.parseInt(str1)power1
2つ目str2Integer.parseInt(str2)power2

鬼殺隊風にたとえるなら、1回目の伝令を記録し、数値として読み直し、剣士Aの記録札に入れます。次に、2回目の伝令を記録し、数値として読み直し、剣士Bの記録札に入れます。

このように、1回分の処理を落ち着いて追えば、2つ以上の入力も自然に理解できます。

複数のreadLineがある意味

2つ以上の数値を入力するコードでは、readLineを複数回使います。

これは、入力を受け取る回数を増やすためです。

readLineは、1回実行されるたびに、1行分の入力を受け取ります。つまり、readLineが2回あれば、プログラムは2回入力を待ちます。

readLineの数入力を待つ回数
1回1回入力を受け取る
2回2回入力を受け取る
3回3回入力を受け取る

たとえば、次のようにreadLineが2回あるとします。

String str1 = br.readLine();
String str2 = br.readLine();

この場合、まず1行目のreadLineで1つ目の入力を受け取ります。次に2行目のreadLineで2つ目の入力を受け取ります。

鬼殺隊風に言うなら、1つ目のreadLineは最初の伝令を受け取る門、2つ目のreadLineは次の伝令を受け取る門です。門が2つあるので、2つの伝令を順番に受け取れるというわけです。

最初の入力と次の入力は別々に保存される

複数の数値を入力するときには、それぞれの入力を別々の変数で受け取ることが大切です。

なぜなら、1つ目の入力と2つ目の入力には、それぞれ違う意味があるからです。

たとえば、1つ目が剣士Aの修行値、2つ目が剣士Bの修行値だとします。この2つを同じ変数に入れてしまうと、どちらの値なのかがわかりにくくなります。

入力順文字列として保存整数として保存
1回目str1power1
2回目str2power2

このように、文字列として受け取る段階でも、数値に変換した後でも、変数を分けると流れが読みやすくなります。

鬼殺隊の記録札で考えると、剣士Aの修行値と剣士Bの修行値を別々の札に書くようなものです。同じ札に上書きしてしまうと、先に受け取った値が消えてしまい、あとから確認しづらくなります。

複数入力では、順番と変数名の対応をていねいに追うことが大切です。

2つの数値入力を確認するプログラム

ファイル名:Sample6.java

import java.io.*;

class Sample6
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("剣士Aと剣士Bの修行値を整数で入力してください。");

        BufferedReader br =
        new BufferedReader(new InputStreamReader(System.in));

        String str1 = br.readLine();
        String str2 = br.readLine();

        int power1 = Integer.parseInt(str1);
        int power2 = Integer.parseInt(str2);

        System.out.println("剣士Aの修行値は " + power1 + " です。");
        System.out.println("剣士Bの修行値は " + power2 + " です。");
    }
}

実行結果

剣士Aと剣士Bの修行値を整数で入力してください。
80
95
剣士Aの修行値は 80 です。
剣士Bの修行値は 95 です。

このプログラムでは、最初に 80 を入力し、次に 95 を入力しています。

1回目の入力である 80 は str1 に入ります。その後、Integer.parseInt(str1) によって整数に変換され、power1 に入ります。

2回目の入力である 95 は str2 に入ります。その後、Integer.parseInt(str2) によって整数に変換され、power2 に入ります。

入力した値文字列として入る変数変換後に入る変数最後に表示される内容
80str1power1剣士Aの修行値
95str2power2剣士Bの修行値

ここで大切なのは、入力された順番どおりに処理されることです。

最初のreadLineは最初の入力を受け取り、次のreadLineは次の入力を受け取ります。Javaはコードを上から下へ順番に実行するため、入力もその順番に対応して変数へ入っていきます。

処理の流れを段階ごとに整理する

Sample6.javaの流れを分解すると、複数入力のしくみがかなり見えやすくなります。

順番処理役割
1メッセージを表示するユーザーに2つの数値入力をうながす
21回目のreadLine最初の入力を文字列として受け取る
32回目のreadLine次の入力を文字列として受け取る
4Integer.parseInt(str1)最初の文字列を整数に変換する
5Integer.parseInt(str2)次の文字列を整数に変換する
6結果を表示するそれぞれの整数を画面に出力する

この表を見ると、2つの数値入力も、入力、変換、出力という基本の流れの延長にあることがわかります。

1つの数値入力では、この流れが1回だけでした。2つの数値入力では、文字列の読み込みと整数への変換が2回分あるだけです。

1つの数値入力2つの数値入力
readLineが1回readLineが2回
parseIntが1回parseIntが2回
数値変数が1つ数値変数が2つ
1つの値を表示2つの値を表示

複数入力だからといって、基本が変わるわけではありません。1回分の入力処理を、必要な数だけ並べていると考えると理解しやすくなります。

入力は1回ずつ順番に処理される

複数入力では、プログラムが一度にすべての入力をまとめて理解しているように見えるかもしれません。

しかし実際には、コードの順番どおりに、1回ずつ入力を受け取っています。

まず、次の文が実行されます。

String str1 = br.readLine();

この時点で、プログラムは1回目の入力を待ちます。ユーザーが 80 と入力してEnterキーを押すと、その内容が str1 に入ります。

次に、次の文が実行されます。

String str2 = br.readLine();

ここで、プログラムは2回目の入力を待ちます。ユーザーが 95 と入力してEnterキーを押すと、その内容が str2 に入ります。

実行される文入力待ちの内容入力後に入る変数
String str1 = br.readLine();1つ目の数値str1
String str2 = br.readLine();2つ目の数値str2

鬼殺隊の伝令でたとえるなら、最初の門で剣士Aの報告を受け取り、次の門で剣士Bの報告を受け取るような流れです。門を通る順番が決まっているため、どの報告がどの記録札に入るのかも決まります。

複数の入力があるときほど、コードの上から下への流れを意識することが大切です。

文字列として受け取り、あとで整数に変換する

2つ以上の数値を入力するときでも、最初の受け取り方は文字列です。

これは、1つの数値を入力するときと同じです。

キーボードから 80 や 95 と入力すると、見た目には数値に見えます。しかし、readLineで受け取った直後は String型の文字列です。そのため、そのままではint型の変数として使えません。

そこで、Integer.parseIntを使って整数へ変換します。

int power1 = Integer.parseInt(str1);
int power2 = Integer.parseInt(str2);

この2文によって、str1とstr2に入っている文字列が、それぞれ整数に変換されます。

段階1つ目の値2つ目の値
入力直後str1に文字列として入るstr2に文字列として入る
変換後power1に整数として入るpower2に整数として入る

鬼殺隊風にたとえるなら、最初は伝令の巻物に文字として書かれた 80 と 95 を受け取ります。その後、それぞれを「整数の修行値」として読み直し、記録札 power1 と power2 に入れるイメージです。

ここで重要なのは、入力された数字は、最初から計算用の数値ではないという点です。数値として扱いたいなら、変換が必要です。

変数名を分けることが大切

複数の値を扱うときは、変数名をわかりやすく分けることがとても大切です。

たとえば、1つ目の入力と2つ目の入力をどちらも同じ変数名で扱おうとすると、どちらの値なのかがわかりにくくなります。複数の値を扱うほど、変数名の役割が重要になります。

Sample6.javaでは、入力直後の文字列を str1 と str2 に分けています。そして、整数に変換した後の値を power1 と power2 に分けています。

変数名役割
str11つ目の入力を文字列として受け取る
str22つ目の入力を文字列として受け取る
power11つ目の入力を整数に変換した値
power22つ目の入力を整数に変換した値

さらに意味をはっきりさせたい場合は、firstPower、secondPower のような名前にすることもできます。

名前のつけ方特徴
str1、str2入力順がわかりやすい
power1、power2数値としての役割がわかりやすい
firstPower、secondPower1つ目、2つ目の意味がより伝わりやすい
swordCount、medicineCount何の数なのかが伝わりやすい

鬼殺隊の記録札でも、「札1」「札2」だけより、「剣士Aの修行値」「剣士Bの修行値」と書かれているほうがわかりやすいです。

プログラムも同じです。変数名が整理されていると、コードの流れも読みやすくなります。

図:2つの数値入力の流れ

↓クリックすると拡大表示されます。

この図が示していること

この図は、2つの数値入力が1回ずつ順番に読み込まれ、それぞれ別々の変数に入る流れを示しています。

1回目の入力は str1 に入り、整数へ変換されて power1 に入ります。2回目の入力は str2 に入り、整数へ変換されて power2 に入ります。

この図から分かること

複数入力では、入力順と変数の対応が大切です。

readLineが2回ある場合、プログラムは2回入力を待ちます。そして、それぞれの入力を別々に保存します。どの入力がどの変数に入るのかを追うことで、複数入力のコードが読みやすくなります。

図:入力、変換、出力の全体像

↓クリックすると拡大表示されます。

この図が示していること

この図は、複数の数値入力でも、基本の流れは入力、変換、出力であることを示しています。

キーボードから2つの値を受け取り、それぞれを文字列から整数へ変換し、変数に入れ、最後に画面へ表示します。

この図から分かること

2つ以上の入力でも、特別なしくみが増えるわけではありません。

1回分の入力処理を、必要な数だけくり返しているだけです。入力された値を変数で分けて管理し、必要なら変換して使うという流れを押さえることが大切です。

2つ以上の入力でも考え方は同じ

複数入力と聞くと、少し難しく感じるかもしれません。

しかし、基本の考え方は変わりません。

基本の流れ内容
入力を受け取るreadLineで1行分を読み込む
必要なら型を変換するInteger.parseIntで整数にする
変数に入れるそれぞれ別の変数に保存する
その値を使う表示や計算に利用する

この流れを、必要な回数だけ繰り返しているだけです。

2つなら2回、3つなら3回、というように考えれば大丈夫です。

鬼殺隊風に言えば、伝令が1人なら1回記録し、2人なら2回記録し、3人なら3回記録します。やっていることは同じで、回数が増えているだけです。

複数入力は、これまで学んできたキーボード入力、変数、型変換、出力の応用です。

実用的なプログラムに近づく感覚

2つ以上の数値を入力できるようになると、Javaプログラムの幅が大きく広がります。

1つの値だけを扱うプログラムよりも、複数の値を扱えるプログラムのほうが、実用的な処理に近づきます。

たとえば、次のような処理につながります。

複数入力でできること
2つの数を使った計算合計、差、平均を求める
複数データの比較どちらが大きいかを調べる
複数人の情報管理2人分の年齢や点数を扱う
条件分岐への応用入力値によって処理を変える

鬼殺隊の修行で考えるなら、1人の修行値だけを見るよりも、2人分の修行値を比べたり、合計したりできるほうが、より実践的な判断につながります。

今の段階では、まず2つの数を順番に入力し、それぞれを正しく受け取れることが大切です。

この基本が身につくと、次に計算や条件分岐を学んだときに、入力された複数の値を使って処理する流れが自然に理解しやすくなります。

複数入力を読むときの見方

2つ以上の数値入力のコードを読むときは、次の順番で見ると整理しやすいです。

見るポイント確認すること
readLineの回数何回入力を受け取るのか
文字列変数入力直後の値がどこに入るのか
parseIntの対象どの文字列を整数へ変換するのか
数値変数変換後の整数がどこに入るのか
出力内容どの変数の値を表示しているのか

Sample6.javaなら、次のように追うとわかりやすいです。

流れ内容
str11つ目の入力を受け取る
str22つ目の入力を受け取る
power1str1を整数に変換した値
power2str2を整数に変換した値
表示power1とpower2を出力する

複数の変数が出てくると、最初は少し混乱しやすいです。けれども、入力順、変換、保存先を1つずつ確認すれば、流れはきれいに見えてきます。

Javaのコードは、上から下へ順番に処理されます。複数入力でも、その基本は変わりません。

2つ以上の数値を入力する流れを理解すると、Javaは「決まった値を表示するだけ」の段階から、「使う人が入力した複数の値を扱う」段階へ進みます。これは、実用的なプログラムへ近づく大切な一歩です。