カテゴリー
Java

Java(Step2-2)

変数を使おう②

キーボードからの入力

変数を使うことの最大のメリットは、自由に値を入れたり出したりできることです。

外部コンソール設定

前回までは、デバックコンソールに実行結果は出力していましたが、これでは、キーボードからの入力を受け付けることができません。そのため、「launch.json」ファイルでコンソールの設定を変える必要があります。以下のように記述を変更または追記し、再設定しましょう。

"console": "externalTerminal"

すると、デバックを実行すると外部のコンソールに出力されます。

キーボードからの入力

キーボードからの2つの整数値を読み込んで、それらに加算、減算、乗算、除算を行った結果を表示しましょう。コードは以下に記します。

//ArthInt.java
//2つの整数値を読み込んで加減乗除した値を表示
import java.util.Scanner;

public class ArithInt {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);
        System.out.println("xとyを加減乗除します");

        System.out.print("xの値:"); //xの値を入力
        int x = stdIn.nextInt(); //xに整数値を読み込む
        System.out.print("yの値:"); //yの値を入力
        int y = stdIn.nextInt(); //yに整数値を読み込む

        System.out.println("x + y = " + (x + y));
        System.out.println("x - y = " + (x - y));
        System.out.println("x * y = " + (x * y));
        System.out.println("x % y = " + (x % y));
        stdIn.close();
    }
}
ArthInt.java実行結果

キーボードからの読み込みにはいくつかの手順があるので、順を追って説明していきます。現時点では、こういう記述をするんだということを覚えておくだけで大丈夫です。

  1. プログラムの先頭に「import java.util.Scanner;」をプログラムの先頭(クラス宣言前に)置きましょう。
  2. mainメソッドの先頭に「Scanner stdIn = new Scanner(System.in);」を記述します。System.inは、キーボードと結びつく標準入力ストリーム(standard input stream)になります。
  3. キーボードからの読み込みを行う部分として「stdIn.nextInt();」を記述しましょう。このプログラムではint型整数値を読み込むように設定しています。

演算子とオペランド

今回のプログラムでも使っている演算を行う + や – などの記号を演算子(operator) と呼びます。演算の対象となる式をオペランド(operand)と呼びます。

たとえば、xとyを求める式x + yにおいて、演算子は + であり、オペランドは、x、yの2つになります。このように2つのオペランドを持つ演算子を2項演算子(binary operator)と呼ばれます。それ以外にも、オペランドが1つの単項演算子(unary operator)、3つの3項演算子(ternary operator)があります。

x + y
x – y
加減演算子(additive operator)
x * y
x / y
x % y
乗除演算子(multiplicative operator)
+x
-y
単項符号演算子(unary plus operator and unary minus operator)

単項保符号演算子を使ったプログラムの例は以下のようになります。

//Minus.java
//整数値を読み込んで符号を反転した値を表示
import java.util.Scanner;

public class Minus {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("整数値:");
        int a = stdIn.nextInt(); //aに整数値を読み込む
        int b = -a; //aの符号を反転した値でbを初期化
        System.out.println(a + "の符号を反転した値は" + b + "です。");
        stdIn.close();
    }
}
Minus.java実行結果

基本型

ここまでのプログラムでは、int型の変数を使ってきました。Javaでは、多くの型があり、自分で型を作ることもできます。Javaで標準でサポートしている型を基本型(primitive type)と呼びます。以下に例を記しておきます。

整数型

整数を表し、代表的なのは以下の4つです。型によって表現できる数値の範囲が異なります。

  • byte…1バイト整数 -128 ~ 127
  • short…短い整数 -32,768 ~ 32,767
  • int…整数 -2,147,483,648 ~ 2,147,483,647
  • long…長い整数 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
浮動小数点型

実数を表し、2つの型があります。

  • float…単精度浮動小数点数 ±3.40282347E+38 ~ ±1.40239846E-45
  • double…倍精度浮動小数点数 ±1.79769313486231507E+378 ~ ±4.9406564841246544E-324

実数の内部は浮動小数点数(floating point number)という形式で表現されます。また、3.14とか13.5といっ定数値は、浮動小数点リテラル(floating point literal)と呼びます。

この他に文字型(char)と論理型(boolean)がありますが、後のページで説明します。

実数値の読み込み

2つの実数値を加減乗除するプログラムを作りましょう。今回は実数を扱うdouble型を使って見ましょう。

//ArthDouble.java
//2つの実数値を読み込んで加減乗除した値を表示
import java.util.Scanner;

public class ArithDouble {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);
        System.out.println("xとyを加減乗除します");

        System.out.print("xの値:"); //xの値を入力
        double x = stdIn.nextDouble(); //xに実数値を読み込む
        System.out.print("yの値:"); //yの値を入力
        double y = stdIn.nextDouble(); //yに実数値を読み込む

        System.out.println("x + y = " + (x + y));
        System.out.println("x - y = " + (x - y));
        System.out.println("x * y = " + (x * y));
        System.out.println("x % y = " + (x % y));
        stdIn.close();
    }
}
ArthDouble.java実行結果

注意点としては、double型の実数値を読み込むには、nextInt()ではなく、nextDouble()を使わなければいけないです。

fainal変数

次に、円の半径をキーボードから読み込んで、その円の円周の長さと面積を求めて表示するプログラムを作りましょう。

//Circle1.java
//円周の長さと円の面積を求める
import java.util.Scanner;

public class Circle1 {
    
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("半径:");
        double r = stdIn.nextDouble();

        System.out.println("円周の長さは" + 2 * 3.14 * r + "です。");
        System.out.println("面積は" + 3.14 * r * r + "です。");
        stdIn.close();
    }    
}
Circle1.java実行結果

円周率は3.14ではなく、無限に続く数値です。プログラム中に複数3.14を使っている箇所が場合によっては選択的な置換が要求されることもあります。そこで、効力を発揮するのが、値を書き換えることのできないfinal変数になります。次のプログラムはそれを使って書き換えたものになります。

//Circle2.java
//円周の長さと円の面積を求める
import java.util.Scanner;

public class Circle2 {
    public static void main(String[] args){
        final double PI = 3.1416;
        Scanner stdIn = new Scanner(System.in);

        System.out.print("半径:");
        double r = stdIn.nextDouble();

        System.out.println("円周の長さは" + 2 * PI * r + "です。");
        System.out.println("面積は" + PI * r * r + "です。");
        stdIn.close();
    }
}
Circle2.java実行結果

final変数を使うメリットは、以下の通りです。

  • 値の管理を一か所に集約できる

円周率の値3.1416は、final変数PIの初期化子となっています。もし、他の値に変える場合は、この一か所だけで済みます。

  • プログラムが読みやすくなる

プログラムの中では、数値ではなく変数名PIで円周率を参照できるので、プログラムが読みやすくなります。

また、final変数の名前は大文字とすることが推奨されています。普通の変数と見分けやすくするためです。加えて、初期化するのが原則です。

乱数の生成

キーボードから値を読みこむのではなく、コンピュータに値を作ってもらうことができます。以下のプログラムは、0~9までの数値から1つランダムに生成して表示しています。

//LuckyNo.java
//0~9のラッキーナンバーを乱数で作成
import java.util.Random;

public class LuckyNo {
    public static void main(String[] args){
        Random rand = new Random();

        int lucky = rand.nextInt(10); //0~9の乱数
        System.out.println("今日のラッキーNo." + lucky);

    }
}
LuckyNo.java実行結果

コンピュータがランダムに生成する値のことを乱数と言います。いくつかの手順があるので、順を追って説明していきます。

  1. プログラムの先頭に「import java.util.Random;」をプログラムの先頭(クラス宣言前に)置きましょう。
  2. mainメソッドの先頭に「Random rand = new Random();」を記述します。
  3. 「rand.nextInt(n);」を記述し、値の範囲を決めましょう。()内に入力した数値は、0以上n未満の数値になります。したがった、今回はnを10として値の範囲を0以上9以下で実現しています。

文字列の読み込み

ここまでは、数値を扱ってきましたが、文字列を扱うプログラムを作ってみましょう。名前を入力させて、それに対する挨拶を表示するようにしましょう。

//HelloNext.java
//名前を読み込んで挨拶する1
import java.util.Scanner;

public class HelloNext {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("お名前は:");
        String s = stdIn.next(); //文字列を読み込む
        System.out.println("Hello" + s + "さん");
        stdIn.close();
    }    
}
HelloNext.java実行結果

組み込んだ文字列を格納する変数sの型は、String型になります。これは文字列を表すための型です。ただし、このプログラムでは、空白文字やタブ文字が文字列の区切りとみなされます。そのため、1行分の文字列入力を可能にするには、以下のようにnextLine()を使わなければいけません。

//HelloNextLine.java
//名前を読み込んで挨拶する2
import java.util.Scanner;

public class HelloNextLine {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("お名前は:");
        String s = stdIn.nextLine(); //一行分の文字列読み込み
        System.out.println("Hello" + s + "さん");
        stdIn.close();
    }
}
HelloNextLine.java実行結果

文字列s1は、”ABC”で初期化され、その後”DEF”で代入されます。したがって、s1は”ABC”から”DEF”に変更されます。

以上で、キーボードからの読み込みが終わったので、次からはプログラムの流れの分岐を学んでいきましょう。