式と変数

今回の内容

今回はプログラムの一般的な構造である「入力→処理→出力」のうち、簡単な「処理」について紹介します。前回の「入出力」では、入力した文字列を少しだけ加工して出力するのみでしたが、今回は入力された文字列を数値に変換し、簡単な計算を行うところまでやってみます。

今回の講義で、入力された値を使った数値の計算ができるようになりますので、簡単な電卓くらいのプログラムを作成してみましょう。

今回の作業

今回の例題、練習問題、課題は以下のパッケージに作成してください。

パッケージの名前
j1.lesson02

クラスの作成方法については、「クラスを作成する」を参照してください。

値と計算

値のリテラル

次のプログラムはどのような動きをするでしょうか。実行して確認してみましょう。

リスト: Literals
package j1.lesson02;

import javax.swing.JOptionPane;

public class Literals {

    public static void main(String[] args) {
        new Literals().start();
    }

    void start() {
        JOptionPane.showMessageDialog(null, "法政大学");
        JOptionPane.showMessageDialog(null, -100);
        JOptionPane.showMessageDialog(null, 3.14);
    }
}

実行してみると、次のような順でダイアログが表示されたと思います:

  1. 法政大学
  2. -100
  3. 3.14

上記のそれぞれのダイアログは、順に「文字列」「整数」「実数」の値を表示していて、プログラム中の次の3行に上から順に対応します。

JOptionPane.showMessageDialog(null, "法政大学");
JOptionPane.showMessageDialog(null, -100);
JOptionPane.showMessageDialog(null, 3.14);

1行目では「"法政大学"」という書き方で「法政大学」という文字列を表しています。このように、特定の文字列を表示させる場合には " (ダブルクウォーテーション)で表示させたい文字列を囲んでやります。


次の2行目では「-100」という書き方で「-100 (まいなすひゃく)」という整数を表しています。整数を表示させる場合には、そのまま表示させたい値を書きます。今回は負の値を表示させるために、数値「100」の前に – (マイナス)という記号を入れています 。

最後の3行目では「3.14」という書き方で「3.14(さんてんいちよん)」という実数を表しています。先ほどの整数との違いは、数値の途中に小数点を表す . (ドット)をはさんでいる点です。ドットの左側にある「3」という数値が整数部として扱われ、ドットの右側にある「14」が小数部として扱われます。また、「-100」のときと同様に先頭にマイナス記号を付ければ負の実数を表すこともできます。

上記のように「書いたとおりの値を表す」ものをJavaでは「リテラル (literal)」と呼びます。また、"100" (文字列の100)と 100 (整数の100)はコンピューターの内部で別のものとして取り扱います。これについては次の項で紹介します。

練習: 値のリテラル

作成するクラスの名前
MoreLiterals

「情報科学部」、「9999」、「-2.718」と順にダイアログを表示するプログラムを書きなさい。ただし、「情報科学部」には文字列のリテラル、「9999」には整数のリテラル、「-2.718」には実数のリテラルをそれぞれ利用すること。

数値の計算

次のプログラムはどのような動きをするでしょうか。実行して確認してみましょう。

リスト: IntOperation
package j1.lesson02;

import javax.swing.JOptionPane;

public class IntOperation {

    public static void main(String[] args) {
        new IntOperation().start();
    }

    void start() {
        JOptionPane.showMessageDialog(null, 1 + 2);
        JOptionPane.showMessageDialog(null, 9 - 5);
        JOptionPane.showMessageDialog(null, 3 * 4);
        JOptionPane.showMessageDialog(null, 12 / 2);
        JOptionPane.showMessageDialog(null, 1 + 2 * (3 - 4));
    }
}

実行すると、3, 4, 12, 6, -1 の順に表示されたと思います。これはプログラム中の次の5行に上から順に対応します。

リスト: IntOperation(抜粋)
JOptionPane.showMessageDialog(null, 1 + 2);
JOptionPane.showMessageDialog(null, 9 - 5);
JOptionPane.showMessageDialog(null, 3 * 4);
JOptionPane.showMessageDialog(null, 12 / 2);
JOptionPane.showMessageDialog(null, 1 + 2 * (3 - 4));

このプログラムには、数値の間に +, -, *, / という記号が含まれています。これらは算数の「足し算」「引き算」「掛け算」「割り算」にそれぞれ対応しています。また、計算の順序も算数で習ったものと同じで、「(3 – 4)」のように「かっこ 」で囲んだ計算式を最初に計算し、次に掛け算や割り算、その次に足し算や引き算の計算が行われます。

図: 計算順序

このように、プログラム中で +, -, *, / などの記号を使って数値の計算ができます。この記号のことをJavaでは「演算子 (operator)」と呼び、整数や実数などのいろいろな種類の値に対して簡単な計算から、それらを組み合わせた複雑な計算まで行えます。

Javaでの書き方 算数での書き方 意味
a + b a + b aとbの和
a – b a - b aとbの差
a * b a × b aとbの積
a / b a ÷ b aとbの商

練習: 数値の計算

作成するクラスの名前
DoubleOperation

次の3つの値を順に表示するプログラムを書きなさい。ただし、いずれもプログラムの中で値を計算して表示すること。

  • 半径の長さ 3.0 の円の面積 (πの値は 3.14 とする)
  • 「100.0」に「150.0に0.8を掛けたもの」を足した結果
  • 「100.0に150.0を足したもの」に0.8を掛けた結果

文字列の結合

さて、数値以外の値ではどうでしょうか。次のプログラムを実行して確認してみましょう。

リスト: StringConcat
package j1.lesson02;

import javax.swing.JOptionPane;

public class StringConcat {

    public static void main(String[] args) {
        new StringConcat().start();
    }

    void start() {
        JOptionPane.showMessageDialog(null, "1 + 2 = " + (1 + 2));
    }
}

実行すると、「1 + 2 = 3」と表示されたと思います。プログラム中の該当箇所を再度確認してみましょう。

リスト: StringConcat(抜粋)
JOptionPane.showMessageDialog(null, "1 + 2 = " + (1 + 2));

このプログラムでは、「"1 + 2 = "」という文字列リテラルと、「(1 + 2)」という計算式の間に + 演算子が書かれています。このように、+ 演算子の左右に文字列と数式が同時に来る 場合、結果は文字列と数式の結果 を結合した文字列となります。今回は「1 + 2 = 」という文字列に「(1 + 2)」の結果を結合しますので、結果は「1 + 2 = 3」という文字列になり、その文字列が最終的にダイアログに表示されています。

なお、文字列を結合する部分を「"1 + 2 = " + 1 + 2」とかっこなしで書いてはいけません。この場合には左から計算が行われ、「("1 + 2 = " + 1) + 2」というように解釈されてしまいます。そのため、最初に「1 + 2 =」という文字列に「1」を結合したのち、さらに「2」を結合してしまいます (何が表示されるか考えてみましょう) 。

練習: 文字列の結合

作成するクラスの名前
StringWrap

半径3.0の円の面積を表示するプログラムを書きなさい。ただし、「半径3.0の円の面積は(計算結果)です」のような形式で表示し、「(計算結果)」の部分にはプログラム中で計算した半径3.0の円の面積を表示させること。

値の記憶

変数の宣言と使用 (文字列)

前回に紹介したもっとも簡単なプログラムでは、文字列リテラルを使用しないでダイアログに文字列を表示していました。

リスト: First(再掲)
package j1.lesson01;

import javax.swing.JOptionPane;

public class First {

    public static void main(String[] args) {
        new First().start();
    }

    void start() {
        String input = JOptionPane.showInputDialog("メッセージをどうぞ");
        JOptionPane.showMessageDialog(null, input);
    }
}

ここでは「input」という名前で入力した文字列を表しています。この「input」のように、何らかの値を記憶 させておいて、あとからその値を使用できるようにする入れ物のようなものを「変数」と呼びます。

この変数は、入力された文字列以外の値も記憶させることができます。次のプログラムを実行してみましょう。

リスト: StringVariable
package j1.lesson02;

import javax.swing.JOptionPane;

public class StringVariable {

    public static void main(String[] args) {
        new StringVariable().start();
    }

    void start() {
        String input = "こんにちは!";
        JOptionPane.showMessageDialog(null, input);
    }
}

この例では、入力の代わりに「こんにちは!」という文字列リテラルを利用しています。この場合、入力のダイアログは表示されずに、「こんにちは!」というメッセージだけが表示されます。

変数に文字列を記憶させる場合は、まず次のように「変数の宣言」ということを行います。

String <変数の名前> = <変数の初期値>;

そして、変数に記憶させた値をプログラム中で利用する場合、リテラルの代わりに変数の名前 を書きます。すると、コンピューターは変数に記憶させた値をコピーしてきて、その値を使って処理を進めます。

リスト: StringVariable(抜粋)
String input = "こんにちは!";
JOptionPane.showMessageDialog(null, input);
図: 変数の使用

変数はプログラム中に複数宣言することもできます。次のプログラムを実行してみましょう。

リスト: StringVariableWithInput
package j1.lesson02;

import javax.swing.JOptionPane;

public class StringVariableWithInput {

    public static void main(String[] args) {
        new StringVariableWithInput().start();
    }

    void start() {
        String input = JOptionPane.showInputDialog("文字列を入力");
        String message = "入力された文字列は" + input;
        JOptionPane.showMessageDialog(null, message);
    }
}

ただし、Javaでは同じ名前の変数を2回以上宣言するとエラーになってしまいますので注意してください。上記の例では、入力された文字列を記憶させた変数「input」のほかに、それを加工した文字列を記憶させた「message」という変数を宣言して利用しています。

練習: 文字列変数

作成するクラスの名前
MultiStringVariable

2つの文字列を入力して、「入力された文字列は(1つ目に入力された文字列)と(2つ目に入力された文字列)」と表示するプログラムを書きなさい。ただし、「(1つ目に入力された文字列)」「(2つ目に入力された文字列)」はそれぞれ1つ目に入力された文字列、2つ目に入力された文字列が表示されるものとする。また、表示する文字列は「message」という名前の変数を宣言し、そこに記憶させること。

変数の宣言と使用 (数値)

次に、変数に文字列以外の値を記憶させてみましょう。下記のプログラムを実行すると何が表示されるでしょうか。ただし、「double」というのは実数のことを表していて、また「Double.parseDouble(input)」という部分は「入力された文字列を実数にする」という処理です。

リスト: CircleArea
package j1.lesson02;

import javax.swing.JOptionPane;

public class CircleArea {

    public static void main(String[] args) {
        new CircleArea().start();
    }

    void start() {
        String input = JOptionPane.showInputDialog("円の半径を入力");
        double radius = Double.parseDouble(input);
        JOptionPane.showMessageDialog(null, radius * radius * 3.14);
    }
}

このプログラムで重要なのは次の2行です。

リスト: CircleArea(抜粋)
String input = JOptionPane.showInputDialog("円の半径を入力");
double radius = Double.parseDouble(input);

上記の1行目では先ほどまでと同様に文字列の変数を宣言して、入力された文字列を記憶させています。その次の2行目では文字列を表す「String」の代わりに、実数を表す「double」を使って「実数を記憶させる変数 radius」を宣言しています。この変数radiusには、Double.parseDoubleを使ってinputに記憶させた文字列に対応する実数を取り出しています。たとえば、"3.14"という文字列はDouble.parseDoubleを使うと3.14という実数に変換されます。

図: Double.parseDouble

このDouble.parseDouble(…)もリテラルの代わりに利用できて、かっこの中に指定した文字列に対応する実数を計算してくれます。最後の3行目では、この実数を円の半径とした円の面積を計算して表示しています。

リスト: CircleArea(抜粋)
JOptionPane.showMessageDialog(null, radius * radius * 3.14);

まとめると、変数に実数を記憶させるには、まず次のように変数を宣言します。

double <変数名> = <変数の初期値>;

そして、変数に文字列を記憶させた場合と同様に、プログラム中に変数名を書いて記憶させた実数をプログラムから利用できます。

同様に、変数に整数を記憶させることもできます。この場合、その変数はStringやdoubleの代わりに整数を表すintを指定します。

int <変数名> = <変数の初期値>;

このString, double, intは、それぞれ宣言する変数に記憶させられる値の種類を表しています。このようなものを変数の「型」と言い、それぞれ文字列型、実数型、整数型、という用に呼ぶこともあります。

なお、文字列に対応する整数を取り出す場合、Double.parseDouble(…)の代わりにInteger.parseInt(…)というものを使用します。使い方は実数のときと同様で、かっこの中に整数を表す文字列を指定します。

練習: 数値変数

作成するクラスの名前
AddInput

2つの整数を表わす文字列を入力して、それらの和を表示するプログラムを書きなさい。ただし、和を計算する前に、それぞれの整数を別々の変数に記憶させ、それらの変数に記憶された値の和を計算して表示するようにすること。

  • ヒント: Integer.parseInt(…)を利用できる

変数への代入

最後に、変数に記憶させた値をプログラム中に変更する方法を紹介します。下記のプログラムを実行すると、どのような結果が表示されるでしょうか。

リスト: StringAssign
package j1.lesson02;

import javax.swing.JOptionPane;

public class StringAssign {

    public static void main(String[] args) {
        new StringAssign().start();
    }

    void start() {
        String input = JOptionPane.showInputDialog("名前を入力");
        input = "代入による上書き";
        JOptionPane.showMessageDialog(null, input);
    }
}

このプログラムでは、一度は変数 input に入力された文字列を記憶させていますが、そのあとにさらに「代入による上書き」という新しい文字列を記憶させています。

リスト: StringAssign(抜粋)
String input = JOptionPane.showInputDialog("名前を入力");
input = "代入による上書き";
JOptionPane.showMessageDialog(null, input);

この場合、最初に記憶させた文字列(入力ダイアログに入力したもの)は消え、そのあとの「代入による上書き」という文字列を記憶させられます。このような操作を「変数への代入」と呼び、次のような形式で書きます 。

<変数の名前> = <代入する値>;

また、上記の代入する値には、代入先の変数を使うこともできます。次のプログラムを実行してみましょう。

リスト: Summation
package j1.lesson02;

import javax.swing.JOptionPane;

public class Summation {

    public static void main(String[] args) {
        new Summation().start();
    }

    void start() {
        int total = 0;
        total = total + 1;
        total = total + 2;
        total = total + 3;
        total = total + 4;
        total = total + 5;
        total = total + 6;
        total = total + 7;
        total = total + 8;
        total = total + 9;
        total = total + 10;
        JOptionPane.showMessageDialog(null, "合計は" + total);
    }
}

この場合、 = (イコール)の右側が先に計算され、そのあとに = の左側の変数に計算結果が代入されます。このため、最終的にプログラム中の total は、1から10までを順番に足した値を記憶することになります。

まとめ

値のリテラル

リテラルとは「書いたとおりの値」のことで、今回は3種類のリテラルを紹介しました。

  • 文字列を表すリテラル ("と"で囲む, "こんにちは!" など)
  • 整数を表すリテラル (0から9までの数字の列, 12345 など)
  • 実数を表すリテラル (途中に.を含む数字の列, 3.141592 など)

変数と型

プログラムで計算の途中結果の値を記憶させるために、変数を紹介しました。

String <変数名> = <文字列>;
int <変数名> = <整数>;
double <変数名> = <実数>;

また、変数に記憶させた値を利用するには、リテラルの代わりに宣言した変数の名前を指定します。なお、String, int, double をそれぞれ変数の「型」と呼び、変数に記憶させられる値の種類は、それぞれ型ごとに決められています。

値の計算

リテラルや変数を組み合わせて、新しい値を作りだす方法を紹介しました。

Javaでの書き方 算数での書き方 意味
a + b a + b aとbの和 (文字列を含む場合はaとbの結合)
a – b a - b aとbの差
a * b a × b aとbの積
a / b a ÷ b aとbの商

ただし、算数と同様に掛け算や割り算を先に計算して、そのあとに足し算や引き算を計算します。順番を変える場合にはかっこで囲むのも算数同様です。

文字列の変換

入力された値は文字列になるため、整数や実数に変換して利用します。

int <変数名> = Integer.parseInt(<文字列>);
double <変数名> = Double.parseDouble(<文字列>);

いずれも、リテラルの代わりに利用できます。

以上が今回のまとめです。「入力された値を処理し、結果を出力する」というようなプログラムを書けるようになりました。