Javaプログラミング基礎 演習問題

解答は

に提出しなさい。クラスファイル (〜.class) は提出しなくてよい。 提出には gFTP 等の ftp ソフトを用いること。

問題1 (Basic)

円柱(cylinder)を表すクラスを定義しなさい。 クラス名は Cylinder とする。

円柱は、底面と側面からできている。 つまり、円柱と底面、円柱と側面の関係は、包含 (has-a) の関係である。 底面は円(circle)であり、側面は長方形(rectangle)である。 クラス Circle とクラス Rectangle を定義し、 これらを属性として持つようなクラス Cylinder を作成し、 円柱の体積を求めるメソッドと表面積を求めるメソッドを作成しなさい。

クラス Circle に面積と円周、 クラス Rectangle に面積を求めるメソッドを実装し、 クラス Cylinder で体積や表面積を求めるときにそれらを用いること。

なお、数値はすべて整数でよい。 円周率は3でよいが、Math.PI とするとπにもっとも近い double 値が得られる(参考)。

メソッドmainのあるクラスをCylinderPropertiesとし、 ファイル名をCylinderProperties.javaとする。 プログラムの大枠は次のとおり。

class CylinderProperties {
    public static void main(String[] args) {
	int radius = 5;
	int height = 10;
	Cylinder cylinder = new Cylinder(radius, height);
	System.out.println("円柱(半径=" + radius + ", 高さ=" + height + ")の");
	System.out.println(" 体積は" + cylinder.volume());
	System.out.println(" 表面積は" + cylinder.surfaceArea());
    }
}

class Cylinder {
    属性
        int height; (高さ)
        Circle base; (底面の円)
        Rectangle side; (側面)

    底面積や、高さと面積を用いて
    円柱の表面積と体積を求めるようなメソッドを書く:

        表面積を求めるメソッド ... {
            return 底面の面積 * 2 + 側面の面積;
        }

        体積を求めるメソッド ... {
            return 底面の面積 * 高さ;
        }
}

class Circle {
    円を表わすクラスの定義を書く
}

class Rectangle {
    長方形を表わすクラスの定義を書く
}

問題2 (Basic)

平面上の2つの円の距離を求めるプログラムを作成しなさい。 ファイル名は DistanceBetweenCircles.java とする。 なお、2つの円が重なっている場合は考慮しなくてよい。

平面上の任意の円を表すには中心の位置情報が必要である。 円を表わすクラス Circle は、中心の位置と半径を属性として持つようにすること。

class DistanceBetweenCircles {
    public static void main(String[] args) {
        Circle c1 = new Circle...
        Circle c2 = new Circle...

        System.out.println("2つの円の距離: " + c1.calcDistance(c2));
    }
}

class Circle {
    ....
    ....

    /** 他の円との距離を求めるメソッド */
    double calcDistance(Circle c) {
        ....
    }
}

なお、実数 x の平方根は Math.sqrt(x) とすると求まる。 求まる結果は double 型の値である。

ヒント: Circle クラスの属性 (例えば radius, x, y) を得るメソッド getRadius(), getX(), getY() を用意するとよい。

問題3 (Standard)

A地点とB地点の間は 4500m 離れている。 今、秒速 20m でA地点からB地点へ向かう車と、 秒速 25m でB地点からA地点へ向かう車が同時に出発したとする。 1秒ごとの車同士の間の距離を表示し、 何秒後にすれ違うかを表示するプログラムを書きなさい。 すれ違ったかどうかの判定は、 車同士の距離が 0 になったかどうかで判定する。 mainメソッドのあるクラス名は MeetingCars とし、 ファイル名は MeetingCars.java とする。

A地点からB地点へ向かう車は位置 0 から 速度 20 で走り、 B地点からA地点へ向かう車は位置 4500 から速度 -25 で走ると考え、 車同士の距離を求めれば良い。

このプログラムは1台の車を表すクラス Car を定義して計算するのが良い。 クラス Car に、他の車との距離を求めるメソッド distance を宣言し、 シミュレーション内で距離計算に使うこと。 その他、適切な属性、コンストラクタ、メソッドについても考えること。

class MeetingCars {
    public static void main(String[] args) {
        Car rx8 = new Car .....;
        Car gtr = new Car .....;
        int t = 0;
	int distance = rx8.distance(gtr);

        // 2台の車を移動させ、車同士の距離を1秒ごとに表示する処理を、
        // 車同士の間の距離が 0m ではない間繰り返す
        while (distance != 0) {
            ....
            ....
	    distance = rx8.distance(gtr);
            ....
        }

        車同士の距離が 0m になると繰り返しを抜けるので、
        ここにすれ違ったときの処理を書く。
    }
}

class Car {
    ....
    ....

    /** 他の車との距離を求めるメソッド */
    int distance(Car c) {
        ....
    }
}

このプログラムを実行した結果、次のように表示されれば良い。

1秒後の距離:4455m
2秒後の距離:4410m
3秒後の距離:4365m
...
...
99秒後の距離:45m
100秒後の距離:0m
100秒後にA地点から2000mの地点ですれ違った

問題4 (Standard)

今回の例題の Music クラスを利用し、 CDを表すクラス (class CD) を定義しなさい。 CD には複数の曲が含まれるので、 CD に含まれる曲は Music クラスの配列で表す。 曲番号 (トラック番号) は 0 から数えるものとする。

クラス CD には、少なくとも以下の属性、コンストラクタ、メソッドがあるものとする。

ここで定義したクラス CD の使用例は、以下のようになる。

        CD cd = new CD("Pet Sounds", "The Beach Boys", 2);
        Music track0 = new Music("Wouldn't it be nice", "The Beach Boys");
        cd.setTrack(0, track0);
        Music track1 = new Music("God only knows", "The Beach Boys");
        cd.setTrack(1, track1);

メソッドmainのあるクラスを CDManager とし、 ファイル名をCDManager.javaとすること。

余力のある人は、トラック番号を指定せずに曲を登録できるメソッドも作成しなさい。 最初に登録した曲が 0 曲目、次に登録した曲が 1 曲目、と自動的に割り当てられることになる。

問題5 (Advanced)

問題3では、移動する車のシミュレーションを行った。 このように、 2つの同じ種類のものが相互作用するような現象を考えて、 簡単なシミュレーションを行うプログラムをつくりなさい。 ファイル名は MutualAction.java とする

ソースファイルの先頭に、 そのシミュレーションのタイトルと、 どのような内容かを説明する文章をコメントの形式で書いておくこと。

例えば、つぎのようなシミュレーションが考えられる。

シミュレーションの対象となる「もの」のクラスを定義し、 インスタンスを2つ作ることになる。

問題6 (Advanced)

問題5は2つの物の相互作用であったが、 多くの同じ種類のもの (例えば 10 個) が相互作用するようなシミュレーションを行うプログラムを考えなさい。 問題5とは違う題材とすること。 メソッドmainのあるクラス名は MutualAction2 とし、 ファイル名は MutualAction2.java とする