2つのデータの和と差

  プログラム例 3.1 と全く同じ内容を Java を使用して書いてみました.まだクラスに関する説明を行っていませんので,その内容を詳細に説明することはできません.しばらくの間,形式的に以下のプログラムをまねして書いてください.

01	/****************************/
02	/* 2つのデータの和と差     */
03	/*      coded by Y.Suganuma */
04	/****************************/
05	import java.io.*;
06
07	public class Test {
08		public static void main(String args[]) // throws IOException
09		{
10	//		double sa, wa, x, y;
11
12			try {
13		/*
14				データの入力
15		*/
16				BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
17				System.out.print("1つ目のデータを入力してください ");
18				double x = Double.parseDouble(in.readLine());
19				System.out.print("2つ目のデータを入力してください ");
20				double y = Double.parseDouble(in.readLine());
21		/*
22					和と差の計算
23		*/
24				double wa = x + y;
25				double sa = x - y;
26		/*
27					結果の出力
28		*/
29				System.out.println("和は=" + wa + " 差は=" + sa);
30	//			System.out.printf("和は=%f 差は=%f\n", wa, sa);
31			}
32			catch (IOException ignored) {}
33		}
34	}
		
01 ~ 04 行目

  プログラムに対する注釈です.Java では,C++ と同じ記述方法を使用できます.

05 行目

  プログラム例 3.1 の 05 行目に対応する部分です.入出力を行う場合は必ず必要です.

07 行目

  「Test」という名前のクラス定義の始まりであり,34 行目まで続きます.Java においては,すべての処理をクラス内で行わなければなりませんので,必ずクラスを定義する必要があります.クラスの名前は任意ですが,ファイル名と一致させなければなりません.この例の場合,上のプログラムは,「Test.java」というファイル名で保存する必要があります.

08 ~ 33 行目

  プログラム例 3.1 の 07 行目から 26 行目に相当します.08 行目が,「 int main() 」に相当します.

10 行目

  プログラム例 3.1 と同様,この位置で型宣言を行うことも可能ですが,ここでは,18,20,24,25 行目のように,各変数が使用される位置で型宣言を行っています.

12 行目

  入出力で発生する例外(例えば,ファイルから入力しようとしたが,指定されたファイルが存在しない等)処理を行うための文です.13 行目から 30 行目までの間で発生した例外を,その例外の種類によって,32 行目で処理します.ただし,この例では,処理方法の中に何も書かれていません( 32 行目の「 { } 」)ので,何も行いません.したがって,実行を継続するのが不可能であるような例外が生じた場合はプログラムが強制的に停止されます.このように,Java においては,ほとんどの入出力を行うとき,必ずその際に発生する例外の処理を行ってやる必要があります(何も行わない処理を含む).ただし,08 行目のコメント記号を外せば,12,31,32 行目は必要なくなります.なお,例外処理の詳細については,7.5.3 節 において説明します.

16 行目

  BufferedReader クラスのオブジェクトを生成し,変数 in に代入しています.この行によって,データをどこから入力するのかを記述しています.この行は,
  InputStreamReader isr = new InputStreamReader(System.in);
  BufferedReader in = new BufferedReader(isr);
			
のように,2 行に分けて記述することもできます.「 System.in 」における in は,System クラスの変数であり,標準入力ストリームを表しています( InputStream クラスのオブジェクト).このように,クラスの変数またはメソッドを利用する際は,「クラス名(オブジェクト名).変数名(メソッド名)」のように,ピリオドによってクラス名またはオブジェクト名を指定する必要があります.BufferedReader のすぐ後の in は,BufferedReader クラスのオブジェクトであり,その名前は任意ですので,好きな名前を付けられます.もちろん,その場合は,以下の行における対応する箇所も変えてやる必要があります.

  これらの行は,型変化の拡張だと考えるとわかりやすいと思います.例えば,上の 2 行目は,BufferedReader 型の変数を定義し,その変数を,新しく生成した BufferedReader クラスのオブジェクトで初期設定をしていることになります.また,BufferedReader クラスのオブジェクトを生成するためには,InputStreamReader クラスのオブジェクトに関する情報が必要なため,BufferedReader(isr) という形で,括弧内に isr を記述しています.

17,19 行目

  「 System.in 」の in と同様,17,19 行目における「 System.out 」の out は,System クラスの変数であり,標準出力ストリームを表しています( PrintStream クラスのオブジェクト).ここでは,PrintStream クラスのメソッド(関数) print によってメッセージを出力しています.プログラム例 3.1 の 13 行目に相当します.

18,20 行目

  プログラム例 3.1 の 14 行目に相当します.Java においては,基本的に,すべてのデータを文字列として入力し,かつ,文字列として出力します.「in.readLine()」によって,キーボードから入力された return キーまでのデータを文字列として受け取ります.これらの行では,そのデータを,Double クラスのメソッド parseDouble によって浮動小数点数に変換しています.また,整数に変換したいような場合は,Integer クラスのメソッド parseInt を使用します.

  プログラム例 3.1 や 3.2 の場合は,2 つのデータを一つずつ return キーで区切って入力しても,2 つのデータを例えば「2 3」のように半角スペースで区切り一度に入力しても,全く同様の処理が可能です.しかし,Java においては,1 行分のデータが 1 つの文字列として処理されるため,それらに対する処理を変えてやる必要があります.この例では,データを一つずつ入力していますが,例えば,「2 3」と入力した場合は,"2 3" という文字列として入力されますので,そのまま数値に変換することができません.この文字列データから 2 と 3 を切り出してから,数値に変換する必要があるからです(下の例参照).

29 行目

  プログラム例 3.1 の 23 行目に相当します.17 行目や 19 行目で使用した「print」との違いは,最後に改行を行うか否かの違いです.「println」の場合は改行を行います.wa や sa は,文字列に変換され,それらが加算演算子によって他の文字列リテラルと連結された形で出力されます.30 行目のように,C/C++ と同じような方法で出力することも可能です.

[ Console クラスの利用 ]

  コンソールから入出力を行う場合は,以下に示す例のように,Console クラスを使用した方が便利かと思います.ただし,このように記述すると,リダイレクトしてファイルから入力させるような操作ができなくなります.

/****************************/
/* 2つのデータの和と差     */
/*      coded by Y.Suganuma */
/****************************/
import java.io.*;

public class Test {
	public static void main(String args[])
	{
					// データの入力
		Console con = System.console();
		double x = Double.parseDouble(con.readLine("1つ目のデータを入力してください "));
		double y = Double.parseDouble(con.readLine("2つ目のデータを入力してください "));
					// 和と差の計算
		double wa = x + y;
		double sa = x - y;
					// 結果の出力
		con.printf("和は=%f 差は=%f\n", wa, sa);
	}
}
		

[ 1 行に 2 つ以上のデータを入力( Console クラスを利用した場合の例.Console クラスを利用しない場合も同様)]

  Java の StringTokenizer クラスを利用して,変数 line ( 文字列を扱う String クラスのオブジェクト)に読み込まれた 1 行分のデータを分離しています.
/****************************/
/* 2つのデータの和と差     */
/*      coded by Y.Suganuma */
/****************************/
import java.io.*;
import java.util.*;

public class Test {
	public static void main(String args[])
	{
					// データの入力
		Console con = System.console();
		String line = con.readLine("2つのデータをスペースで区切って入力してください ");
		StringTokenizer str = new StringTokenizer(line, " ");
		double x = Double.parseDouble(str.nextToken());
		double y = Double.parseDouble(str.nextToken());
					// 和と差の計算
		double wa = x + y;
		double sa = x - y;
					// 結果の出力
		con.printf("和は=%f 差は=%f\n", wa, sa);
	}
}