変数を使おう②
キーボードからの入力
変数を使うことの最大のメリットは、自由に値を入れたり出したりできることです。
外部コンソール設定
前回までは、デバックコンソールに実行結果は出力していましたが、これでは、キーボードからの入力を受け付けることができません。そのため、「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();
}
}
キーボードからの読み込みにはいくつかの手順があるので、順を追って説明していきます。現時点では、こういう記述をするんだということを覚えておくだけで大丈夫です。
- プログラムの先頭に「import java.util.Scanner;」をプログラムの先頭(クラス宣言前に)置きましょう。
- mainメソッドの先頭に「Scanner stdIn = new Scanner(System.in);」を記述します。System.inは、キーボードと結びつく標準入力ストリーム(standard input stream)になります。
- キーボードからの読み込みを行う部分として「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 |
x * y | |
x / y | |
x % y |
+x | |
-y |
単項保符号演算子を使ったプログラムの例は以下のようになります。
//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();
}
}
基本型
ここまでのプログラムでは、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();
}
}
注意点としては、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();
}
}
円周率は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();
}
}
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);
}
}
コンピュータがランダムに生成する値のことを乱数と言います。いくつかの手順があるので、順を追って説明していきます。
- プログラムの先頭に「import java.util.Random;」をプログラムの先頭(クラス宣言前に)置きましょう。
- mainメソッドの先頭に「Random rand = new Random();」を記述します。
- 「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();
}
}
組み込んだ文字列を格納する変数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();
}
}
文字列s1は、”ABC”で初期化され、その後”DEF”で代入されます。したがって、s1は”ABC”から”DEF”に変更されます。
以上で、キーボードからの読み込みが終わったので、次からはプログラムの流れの分岐を学んでいきましょう。