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

コンピュータIIB(Javaプログラミング入門)第4回

目次
4.1 式と演算子(2)
4.1.1 実数の表記法
4.1.2 実数の演算
4.1.3 実数の精度
4.2 変数と代入文(2)
4.2.1 実数型の変数
4.2.2 整数と実数の変換
4.2.3 数学的な定数と関数
4.3 データの入出力(1)
4.3.1 改行
4.3.2 データの入力
4.4 変数と代入文(3)
4.4.1 実数の使用例
4.5 演習4
4.6 レポート課題
4.7 参考文献
索引
readLineメソッド   キャスト   指数表記   実数型   整数型   浮動小数点数型  

4.1 式と演算子(2)

4.1.1 実数の表記法

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 の後にずらした桁数を書くということです。 指数表記は、非常に大きな数や非常に小さな数を書き表す時に便利です。 以下の表を見て理解してください。

表 4.1  指数表記の例
実数 指数表記
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*/ }
asiaa1:~/comp2b k12x1001$ java ExponentTest
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
asiaa1:~/comp2b k12x1001$

4.1.2 実数の演算

整数と同様に、実数でも四則演算が行えます。 特に、割り算については意味が変わります。 整数のときは、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*/ }
asiaa1:~/comp2b k12x1001$ java OperationTest
2.6
2.4
0.25
25.0
asiaa1:~/comp2b k12x1001$

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

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

4.1.3 実数の精度

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

次のプログラムでは、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*/ }
asiaa1:~/comp2b k12x1001$ java PrecisionTest
1.0
0.9999999999999999
asiaa1:~/comp2b k12x1001$

4.2 変数と代入文(2)

4.2.1 実数型の変数

前回は、変数に整数を格納しました。 変数に実数を格納することもできます。 整数と同様、変数を利用する前に、変数の宣言が必要です。 整数を格納すると宣言した変数を、 整数型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*/ }
asiaa1:~/comp2b k12x1001$ java DoubleTest
1.23
asiaa1:~/comp2b k12x1001$

4.2.2 整数と実数の変換

実数型の変数に整数を格納するには、整数を実数に変換してから格納します。 実数に変換するには、 (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*/ }
asiaa1:~/comp2b k12x1001$ java CastTest
3
3.5
3.5
asiaa1:~/comp2b 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*/ }
asiaa1:~/comp2b k12x1001$ java CastTest2
3.5
3
3
asiaa1:~/comp2b k12x1001$

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

4.2.3 数学的な定数と関数

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

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

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

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

表 4.3  数学的な関数
関数名 意味
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*/ }
asiaa1:~/comp2b k12x1001$ java MathematicsTest
3.141592653589793
0.1
2.0
3.0
2.0
1.7320508075688772
asiaa1:~/comp2b k12x1001$

4.3 データの入出力(1)

4.3.1 改行

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

System.out.println(データ);

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

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

System.out.print(データ);

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

System.out.println();

とします。

4.3.2 データの入力

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*/ }
asiaa1:~/comp2b k12x1001$ java InputTest
整数を入力してください: 100
整数は 100 です。
asiaa1:~/comp2b k12x1001$

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

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

整数でなく実数を入力するには、 Integer.parseInt の代わりに Double.parseDouble を書きます。

/*  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*/ }
asiaa1:~/comp2b k12x1001$ java DoubleInputTest
実数を入力してください: 1.23
実数は 1.23 です。
asiaa1:~/comp2b k12x1001$

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


4.4 変数と代入文(3)

4.4.1 実数の使用例

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

半径(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*/ }
asiaa1:~/comp2b k12x1001$ java CircleArea
半径を入力してください: 10.0
円の面積は 314.1592653589793 です。
asiaa1:~/comp2b 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*/ }
asiaa1:~/comp2b k12x1001$ java VelocityFormula
距離を入力してください: 100.0
時間を入力してください: 2.5
速度は 40.0 です。
asiaa1:~/comp2b k12x1001$

4.5 演習4

次の問題を考えます。

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

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

asiaa1:~/comp2b k12x1001$ java TriangleArea
底辺を入力してください: 8.0
高さを入力してください: 2.5
三角形の面積は 10.0 です。
asiaa1:~/comp2b k12x1001$

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


4.6 レポート課題

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


4.7 参考文献


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

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