[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

情報処理技法(Javaプログラミング)I 第4回

目次
索引

式と演算子(2)

実数の表記法

Javaでは、整数だけでなく、実数も扱えます。 ここで言う実数は、数学で言う実数と多少異なります。 例えば、数学の円周率は、小数点の後に無限に数字を並べます。 それに対して、Javaの円周率は、小数点の後に15桁しか数字を並べません。 つまり、Javaの実数はわずかに誤差を含んでいるのです。

Javaでは、整数と実数は厳格に区別されます。 実数を書くべき所に整数を書くと、計算結果が変わる場合があります。 確実に実数を表記するには、小数点を用いるのが簡単です。 つまり、実数 0, 1, 2, ... を、 0.0 , 1.0 , 2.0 , ... と書くのです。 もちろん、実数 1.23 なら、そのまま 1.23 と書きます。

実数を書き表すもう一つの方法は、 指数表記 exponential notation )です。 これは、例えば 12300000.0 を 1.23×10 7 と考えて、 1.23E7 と表記する方法です。 つまり、実数の小数点をずらして x.xxx または -x.xxx にし、 E の後にずらした桁数を書くということです。 指数表記は、非常に大きな数や非常に小さな数を書き表す時に便利です。 以下の表を見て理解してください。

指数表記の例
実数 指数表記
12300000.0 1.23E7
1230000.0 1.23E6
123000.0 1.23E5
12300.0 1.23E4
1230.0 1.23E3
123.0 1.23E2
12.3 1.23E1
1.23 1.23E0
0.123 1.23E-1
0.0123 1.23E-2
0.00123 1.23E-3
0.000123 1.23E-4

以下のプログラムは、この表の実数を指数表記で書いています。 Javaでは、数が大きすぎたり小さすぎたりすると指数表記に切り替わります。

/*  1*/ class ExponentTest { // 指数表記のテスト
/*  2*/     public static void main (String[] args) {
/*  3*/         System.out.println(1.23E7); // 12300000.0
/*  4*/         System.out.println(1.23E6); // 1230000.0
/*  5*/         System.out.println(1.23E5); // 123000.0
/*  6*/         System.out.println(1.23E4); // 12300.0
/*  7*/         System.out.println(1.23E3); // 1230.0
/*  8*/         System.out.println(1.23E2); // 123.0
/*  9*/         System.out.println(1.23E1); // 12.3
/* 10*/         System.out.println(1.23E0); // 1.23
/* 11*/         System.out.println(1.23E-1); // 0.123
/* 12*/         System.out.println(1.23E-2); // 0.0123
/* 13*/         System.out.println(1.23E-3); // 0.00123
/* 14*/         System.out.println(1.23E-4); // 0.000123
/* 15*/     }
/* 16*/ }
24102a1:java1 k12x1001$ java ExponentTest
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
1.23E7
1230000.0
123000.0
12300.0
1230.0
123.0
12.3
1.23
0.123
0.0123
0.00123
1.23E-4
24102a1:java1 k12x1001$

実数の演算

整数と同様に、実数でも四則演算が行えます。 特に、割り算については意味が変わります。 整数のときは、7÷2 = 3 余り 1 でしたが、実数のときは、7.0÷2.0 = 3.5 です。

以下のプログラムは、実数の四則演算の例です。

/*  1*/ class OperationTest { // 四則演算のテスト
/*  2*/     public static void main (String[] args) {
/*  3*/         System.out.println(2.5 + 0.1);
/*  4*/         System.out.println(2.5 - 0.1);
/*  5*/         System.out.println(2.5 * 0.1);
/*  6*/         System.out.println(2.5 / 0.1);
/*  7*/     }
/*  8*/ }
24102a1:java1 k12x1001$ java OperationTest
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
2.6
2.4
0.25
25.0
24102a1:java1 k12x1001$

ここで、実数の四則演算の結果は実数であることに注意してください。 この例なら、2.5÷0.1 は整数 25 ではなく実数 25.0 です。

注意: 「実数+整数」の場合は、整数を実数に変換してから足し算をします。 他の演算についても同様です。

実数の精度

Javaの実数がわずかに誤差を含むことは、すでに説明しました。 この誤差は、普通の計算を行う場合は、ほとんど問題になりません。 問題があるとすれば、数学では A = B となる関係が、Javaでは A B (ほとんど等しい)になりうる点です。

次のプログラムでは、1.0÷32.0×32.0 と 1.0÷49.0×49.0 を計算しています。 数学では両方とも 1.0 と等しいはずですが、Java では「ほとんど等しい」場合があります。

/*  1*/ class PrecisionTest { // 精度のテスト
/*  2*/     public static void main (String[] args) {
/*  3*/         System.out.println(1.0 / 32.0 * 32.0); // 数学的には1.0
/*  4*/         System.out.println(1.0 / 49.0 * 49.0); // 数学的には1.0
/*  5*/     }
/*  6*/ }
24102a1:java1 k12x1001$ java PrecisionTest
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
1.0
0.9999999999999999
24102a1:java1 k12x1001$

変数と代入文(2)

実数型の変数

前回は、変数に整数を格納しました。 変数に実数を格納することもできます。 整数と同様、変数を利用する前に、変数の宣言が必要です。 整数を格納すると宣言した変数を、 整数型 integer type )の変数と言い、実数を格納すると宣言した変数を、 実数型 real type )の変数と言います。 なお、実数型の変数に整数は格納できませんし、整数型の変数に実数は格納できません。

Javaでは、実数型の変数の宣言は、 int の代わりに double を書きます。 なお、実数型という言葉はJavaにはありません。 Javaでは、 浮動小数点数型 floating point number type )と言います。

次のプログラムは、変数を宣言し、実数を格納し、それを取り出しています。

/*  1*/ class DoubleTest { // 実数型の変数のテスト
/*  2*/     public static void main (String[] args) {
/*  3*/         double d; // 宣言文
/*  4*/         d = 1.23; // 代入文
/*  5*/         System.out.println(d);
/*  6*/     }
/*  7*/ }
24102a1:java1 k12x1001$ java DoubleTest
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
1.23
24102a1:java1 k12x1001$

整数と実数の変換

実数型の変数に整数を格納するには、整数を実数に変換してから格納します。 実数に変換するには、 (double) を左側に書きます。 式の場合は、混乱しないように適宜括弧を書いてください。 このような変換を、 キャスト cast )と言います。

次のプログラムでは、整数を実数にキャストして割り算を行っています。

/*  1*/ class CastTest { // キャストのテスト
/*  2*/     public static void main (String[] args) {
/*  3*/         int x = 7, y = 2;
/*  4*/         double d, e;
/*  5*/         System.out.println(x / y); // 7/2=3余り1
/*  6*/         d = (double) x; // 7を7.0に変換
/*  7*/         e = (double) y; // 2を2.0に変換
/*  8*/         System.out.println(d / e); // 7.0/2.0=3.5
/*  9*/         System.out.println(((double) x) / ((double) y)); // その場で変換
/* 10*/     }
/* 11*/ }
24102a1:java1 k12x1001$ java CastTest
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
3
3.5
3.5
24102a1:java1 k12x1001$

整数型の変数に実数を格納するときも、実数を整数に変換します。 整数に変換するには、 (int) を左側に書きます。 整数に変換する際に、小数点以下は切り捨てられます。

次のプログラムでは、実数を整数にキャストして割り算を行っています。

/*  1*/ class CastTest2 { // キャストのテスト2
/*  2*/     public static void main (String[] args) {
/*  3*/         double d = 7.0, e = 2.0;
/*  4*/         int x, y;
/*  5*/         System.out.println(d / e); // 7.0/2.0=3.5
/*  6*/         x = (int) d; // 7.0を7に変換
/*  7*/         y = (int) e; // 2.0を2に変換
/*  8*/         System.out.println(x / y); // 7/2=3余り1
/*  9*/         System.out.println(((int) d) / ((int) e)); // その場で変換
/* 10*/     }
/* 11*/ }
24102a1:java1 k12x1001$ java CastTest2
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
3.5
3
3
24102a1:java1 k12x1001$

注意: 実数から整数へのキャストを忘れると、大抵エラーになりますが、整数から実数へのキャストを忘れても、自動的に変換される場合が多いです。

数学的な定数と関数

Javaには、数学的な定数と関数が用意されています。 これらには、 Math. から始まる名前が付いています。

数学的な定数については、いくつかありますが、基本的なものは以下の通りです。

数学的な定数
定数名 意味
Math.PI 円周率

数学的な関数については、色々用意されていますが、基本的なものは以下の通りです。

数学的な関数
関数名 意味
Math.abs 絶対値
Math.floor 床関数 (それ以下の最大の整数)
Math.ceil 天井関数 (それ以上の最小の整数)
Math.rint 丸め関数 (最も近い整数。2つあるなら偶数のほう。)
Math.sqrt 平方根

以下のプログラムでは、数学的な定数と関数を用いています。

/*  1*/ class MathematicsTest { // 数学的なテスト
/*  2*/     public static void main (String[] args) {
/*  3*/         System.out.println(Math.PI); // π
/*  4*/         System.out.println(Math.abs(-0.1)); // -0.1の絶対値は0.1
/*  5*/         System.out.println(Math.floor(2.5)); // 2.5の床は2.0
/*  6*/         System.out.println(Math.ceil(2.5)); // 2.5の天井は3.0
/*  7*/         System.out.println(Math.rint(2.5)); // 2.5を丸めると2.0
/*  8*/         System.out.println(Math.sqrt(3.0)); // √3.0
/*  9*/     }
/* 10*/ }
24102a1:java1 k12x1001$ java MathematicsTest
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
3.141592653589793
0.1
2.0
3.0
2.0
1.7320508075688772
24102a1:java1 k12x1001$

データの入出力(1)

改行

これまで、「ターミナル」にデータを出力するには、文

System.out.println(データ);

を使ってきました。 文字列をそのまま出力するには、「 データ 」の部分にその文字列をダブルクオート( " )で囲んで書き、変数の値を出力するには、そこにその変数名を書きました。

System.out.println( データ ); は、出力の後に改行します。 改行してほしくないときは、

System.out.print(データ);

と書きます。 また、改行だけしてほしいときは、

System.out.println();

とします。

データの入力

javaコマンドでプログラムを実行している途中で、プログラムにデータを入力することができます。 次のプログラムは、入力された整数をそのまま出力するものです。

/*  1*/ import java.io.*; // データ入力のときに書く
/*  2*/
/*  3*/ class InputTest { // データ入力のときに書く
/*  4*/     public static void main (String[] args) throws IOException { // データ入力のときに書く
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in); // データ入力のときに書く
/*  6*/         BufferedReader br = new BufferedReader(isr); // データ入力のときに書く
/*  7*/         int x;
/*  8*/         System.out.print("整数を入力してください: ");
/*  9*/         x = Integer.parseInt(br.readLine()); // 入力
/* 10*/         System.out.print("整数は ");
/* 11*/         System.out.print(x);
/* 12*/         System.out.println(" です。");
/* 13*/     }
/* 14*/ }
24102a1:java1 k12x1001$ java InputTest
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
整数を入力してください: 100
整数は 100 です。
24102a1:java1 k12x1001$

データ入力のあるプログラムでは、1行目から6行目まではそのまま書くものと考えてください。 ただし、3行目はファイル名によって変わります。

9行目の式

Integer.parseInt(br.readLine())

が入力される整数を表します。 プログラムの実行中にこの式があると、プログラムはいったん停止します。 「ターミナル」で整数を入力してreturnキーを押すと、入力した整数がこの式の値となり、プログラムは続行されます。

整数でなく実数を入力するには、 Integer.parseInt(br.readLine()) の代わりに

Double.parseDouble(br.readLine())

を書きます。

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class DoubleInputTest { // 実数入力のテスト
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         double d;
/*  8*/         System.out.print("実数を入力してください: ");
/*  9*/         d = Double.parseDouble(br.readLine()); // 入力
/* 10*/         System.out.print("実数は ");
/* 11*/         System.out.print(d);
/* 12*/         System.out.println(" です。");
/* 13*/     }
/* 14*/ }
24102a1:java1 k12x1001$ java DoubleInputTest
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
実数を入力してください: 1.23
実数は 1.23 です。
24102a1:java1 k12x1001$

注意: 何も入力しないでreturnキーを押したり、整数や実数でないものを入力した場合、 Integer.parseInt Double.parseDouble の部分でエラーが発生します。 プログラムを中止したい場合は、controlキーを押しながらCキーを押します。


変数と代入文(3)

実数の使用例

実数の使用例として、次の問題を考えます。

半径(radius)を入力して、円(circle)の面積(area)を出力する。

この問題を解決するには、上記の実数入力プログラムを元にして半径を入力し、公式「円の面積=半径×半径×円周率」を計算すればできます。

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class CircleArea { // 円の面積
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         double radius, area;
/*  8*/         System.out.print("半径を入力してください: ");
/*  9*/         radius = Double.parseDouble(br.readLine());
/* 10*/         area = radius * radius * Math.PI; // 面積=半径×半径×円周率
/* 11*/         System.out.print("円の面積は ");
/* 12*/         System.out.print(area);
/* 13*/         System.out.println(" です。");
/* 14*/     }
/* 15*/ }
24102a1:java1 k12x1001$ java CircleArea
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
半径を入力してください: 10.0
円の面積は 314.1592653589793 です。
24102a1:java1 k12x1001$

次の例も、公式を使う問題です。

距離(distance)と時間(time)を入力して、速度(velocity)を出力する。

この問題を解決するには、距離と時間を入力し、公式「速度=距離÷時間」を計算します。

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class VelocityFormula { // 速度の公式
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         double distance, time, velocity;
/*  8*/         System.out.print("距離を入力してください: ");
/*  9*/         distance = Double.parseDouble(br.readLine());
/* 10*/         System.out.print("時間を入力してください: ");
/* 11*/         time = Double.parseDouble(br.readLine());
/* 12*/         velocity = distance / time; // 速度=距離÷時間
/* 13*/         System.out.print("速度は ");
/* 14*/         System.out.print(velocity);
/* 15*/         System.out.println(" です。");
/* 16*/     }
/* 17*/ }
24102a1:java1 k12x1001$ java VelocityFormula
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
距離を入力してください: 100.0
時間を入力してください: 2.5
速度は 40.0 です。
24102a1:java1 k12x1001$

演習4

次の問題を考えます。

底辺(base)と高さ(height)を入力して、三角形(triangle)の面積(area)を出力する。

この問題を解決するアルゴリズムを考え、プログラムを作成してください。 プログラムでは、変数を適切に利用してください。

24102a1:java1 k12x1001$ java TriangleArea
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
底辺を入力してください: 8.0
高さを入力してください: 2.5
三角形の面積は 10.0 です。
24102a1:java1 k12x1001$

余力のある人は、小学校、中学校で習った算数、数学、理科の公式を思い出し、同じような問題を自分で考え、答えを求めるプログラムを作成してください。 プログラムは、何を計算したかが分かるようにしてください。


レポート課題

今日の演習4の答案(Javaプログラム)をメールで提出してください。 差出人は学内のメール・アドレス(学生番号@cis.twcu.ac.jp)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(10月16日)を明記してください。


参考文献


[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

2015年10月16日更新
小西 善二郎 <konishi@cis.twcu.ac.jp>
Copyright (C) 2015 Zenjiro Konishi. All rights reserved.