第6週:いろいろなデータ


6. 1 
6. 2 小数の計算
6. 3 練習問題
6. 4 整数と浮動小数点数の混合計算
6. 5 練習問題
6. 6 浮動小数点数の計算における注意点
6. 7 練習問題
6. 8 数学関数
6. 9 練習問題
6.10 真偽値型
6.11 文字型と文字列型
6.12 練習問題
6.13 宿題

6.1 型

変数は、それぞれ記憶できるデータの種類が決まっています。前に int と書いてある変数は整数しか記憶できず、String と 書いてある変数は文字列しか記憶できません。このようなデータの種類のこと を(type)と呼びます。

一見同じように見えるデータでも、型が違うと全く違う取り扱いを受けます。 例えば、

    1 + 2
は整数の加算なので、結果は 3 になりますが、
    "1" + "2"
は文字列の結合なので、結果は "12" になります。

変数を使うときは、必ずそれが記憶できる型を指定しなければなりません。こ れを変数宣言(variable declaration)と呼びます。普通は、クラス 宣言やメソッド宣言の先頭、または変数を初めて使うところで宣言します。 (変数宣言の位置については第9週で詳しく説明します。)

    型 変数名 = 最初の値;
必要がなければ "= 最初の値" は省略できます。また、同じ型の変 数はコンマで区切って並べることができます。

メソッドの仮引数と返り値にも型を指定します。値を返さないメソッドには特 別な型 void を指定します。

    型 メソッド名 ( 型 仮引数, … ) {
          メソッド本体
    }

6.2 小数の計算

第2週の
練習問題で、円をドルに直すプログラムを 作りましたが、計算が整数で行われるため、1ドル未満が切り捨てとなり、106 円も200円も1ドルと表示されてしまいます。これを小数部分まで計算するよう に直すと、次のようになります。
 1
 2
 3
 4
 5
 6
 7
 8
class ForeignExchange extends SfcDoNothing {
    double dollar, yen;
    void sfcProcess () {
	yen = Double.parseDouble(sfcInput());
	dollar = yen / 106;
	sfcOutput(Double.toString(dollar));
    }
}

コンピュータで扱う、小数点のついた数のことを正確には浮動小数点数 (floating-point number)と呼びます。

整数と浮動小数点数を表現する型には、intdouble だ けでなく、記憶容量と表現できる範囲や精度の異なる次のような型があります。

整数
記憶容量(bit)表現範囲
byte8-128〜127
short16-32768〜32767
int32-2147483648〜2147483647
long64-9223372036854775808〜9223372036854775807
char160〜65535
(注)char 型は主に数値ではなく文字を表すのに使われます。

浮動小数点数
記憶容量(bit)表現範囲精度
float32絶対値が2の104乗未満10進数で約7桁
double64絶対値が2の970乗未満10進数で約16桁

6.3 練習問題

上のプログラムでは、1セント未満のところまで表示されてしまいます。1セン ト未満を切り捨てて、小数部分を2桁にするように書き換えなさい。ただし、 小数部分を切り捨てるメソッドは
    double Math.floor(double x)
です。

6.4 整数と浮動小数点数の混合計算

一つの式の中に整数と浮動小数点数がある場合の計算規則は次のようになりま す。

整数や浮動小数点数の値を別の型の値として使いたいときは、キャスト (cast)します。キャストは次のように書きます。

    ( 型 ) 式
例えば、int 型の変数 x に対して、(double)x と書くと、x の値を浮動小数点数に変換したものになります。浮動 小数点数を整数型変数にキャストする時は,小数部分が切り捨てられた整数に 変換されます。

6.5 練習問題

6.6 浮動小数点数の計算における注意点

6.7 練習問題

次のプログラムは 1/1000000 +…+ 1/3 + 1/2 + 1/1 を計算しています。
class Precision extends SfcDoNothing {
    void sfcProcess () {
	double x = 0.0;
	for (int i = 1000000; i >= 1; i = i - 1) {
	    x = x + 1.0 / i;
	}
	sfcOutput(Double.toString(x));
    }
}
同じ数値を 1/1 + 1/2 + 1/3 +…+ 1/1000000 と逆順に足すプログラムを作り、 実行結果を比べてみなさい。なぜ、このようになるのでしょうか。

6.8 数学関数

三角関数、平方根などを計算するメソッドが用意されています。
double Math.abs(double x)絶対値
double Math.max(double x, double y)2つの値の大きい方
double Math.min(double x, double y)2つの値の小さい方
double Math.ceil(double x)小数部分切り上げ
long Math.round(double x)小数部分四捨五入
double Math.floor(double x)小数部分切り捨て
double Math.sqrt(double x)平方根
double Math.exp(double x)eの累乗
double Math.log(double x)自然対数
double Math.pow(double x, double y)xy で累乗した値
double Math.sin(double x)正弦 (サイン)
double Math.cos(double x)余弦 (コサイン)
double Math.tan(double x)正接 (タンジェント)
double Math.toDegrees(double x)ラジアンから度に換算
double Math.toRadians(double x)度からラジアンに換算

次のプログラムはサインのグラフを描くものです。
 1
 2
 3
 4
 5
 6
 7
 8
 9
import java.awt.*;
class SinCurve extends SfcDoNothing {
    void sfcDraw(Graphics g) {
	for (int t = -180; t <= 180; t = t + 10) {
	    int x = (t + 180) * 300 / 360;
	    g.drawLine(x, 150, x, 150-(int)(Math.sin(Math.toRadians(t))*150));
	}
    }
}

6.9 練習問題

次のような図形を描くプログラムを書きなさい。

6.10 真偽値型

boolean 型は、条件が成り立つかどうかを表す型です。この型の値 は truefalse の二つしかありません。

6.11 文字型と文字列型

char は整数型の一種ですが、文字を表すのに使われます。文字列を 表す String 型とは全く別の型です。

6.12 練習問題

入力された文字列に大文字が何文字含まれているか数えるプログラムを書きな さい。ただし、ある文字が大文字かどうかを知るメソッドは
    boolean Character.isUpperCase(char c)
です。

6.13 宿題

X座標とY座標を周期の違う三角関数で指定すると、リサージュ図形と呼ばれる 図形が描けます。次のようなリサージュ図形を描くプログラムを書きなさい。 (正確に同じ図形でなくてもかまいません)


慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 1999 慶應義塾大学