コンピュータ基礎および演習II

演習問題

解答は

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

Circle.class が複数の問題で生成されるので、実行の際には注意すること。 同一のディレクトリで作業している場合、 最後にコンパイルしたソース内の Circle クラスしか残っていないことになる。 実行前に実行するプログラムをコンパイルしなおせば問題は発生しないので、 身に覚えのないエラーが出る場合には試してみるとよい。

問題1

前回の問題2の Circle クラスでは、インスタンス生成後に setRadius(int r) で半径を与えていた。 しかし、半径はすべてのインスタンスに必須の属性なので、 コンストラクタの引数として与えた方がスマートである。 Circle クラスで引数ありのコンストラクタを定義し、 PropertyOfCircle の mainメソッドで、 インスタンス生成時にそのコンストラクタを使用するようプログラムを変更しなさい。 ファイル名は前回同様 PropertyOfCircle.java とする。

問題2

問題1の円は、中心が原点にあり半径が r の円だとする。 任意の点(x, y)が円内に含まれているかどうかを調べるメソッド includes(int x, int y) を Circle クラスに追加しなさい。 ファイル名は PointsAndCircle.java とする。 PointsAndCircle クラスの main メソッドで、点(-10,-10)を左下、 点(10,10)を右上とする矩形内の点が円内に含まれているかをチェックする。 円の半径は10前後にするとよい。

class Circle {
    ...

    /** 指定された点がこの円の内部か否か */
    boolean includes(int x, int y) {
        ...
    }
}

class PointsAndCircle {
    public static void main(String[] args) {
        // 円のインスタンスを生成
        Circle c = ...

        // 矩形内の点が円内にあるかチェック
        for(int y = 10; y >= -10; y--) {
            for(int x = -10; x <= 10; x++) {
                // 円の中に含まれている点であれば * を
                // そうでなければ空白を表示 (改行はしない)
                ...
            }
            System.out.println();
        }
    }
}

なお、実数 x の平方根は Math.sqrt(x) とすると求まるが、 実は使う必要はない。

問題3

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

平面上の任意の円を表すには、これまでと違い、中心の位置情報が必要である。 円のクラス名はこれまで同様 Circle とするが、 中心の位置と半径を属性として持つようにすること。 適切なコンストラクタも用意すること。

class Circle {

    /** 他の円との距離 */
    double calcDistance(Circle c) {
        ....
    }
}

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

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

なお、実数 x の平方根は Math.sqrt(x) とすると求まる (今回は使う必要がある)。

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

備考: 点を表すクラスを使うのもよい。

問題4

X 地点と Y 地点の間は 4500m 離れている。 今、秒速 20 m で X 地点から Y 地点へ向かう A 車と、 秒速 25 m で Y 地点から X 地点へ向かう B 車が同時に出発したとする。 2 つの車について、 1 秒ごとの車の位置を表示し、 何秒後にどの地点ですれ違うかを表示するプログラムを書きなさい。 ファイル名は MeetingCars.java とする。

このプログラムは車を表すクラス Car を定義して計算するのが良い。 クラス Car は属性として、

を持ち、メソッドとして、

を持つクラスとして考えるのが一つの方法である。

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

問題5

前回(の問題4)までのあらすじ: あなたは某RPG作成ソフトにハマり、もっと自由に機能を追加したいと思い、 自分で RPG のプログラムを作ることにした。 登場人物のクラス名は Charactor、ファイル名は RPG.java とした。

以下の条件に従い、プログラムを改良しなさい。 ファイル名は RPG.java のままでよい。

1. 引数のあるコンストラクタ

インスタンスを生成する際に、引数のあるコンストラクタを使用するよう改良しなさい。 インスタンス生成時に必ずセットする属性や必ず実行するメソッドはコンストラクタ内の処理とするとよい。

2. オーバロード

オーバロード(overload)により、同じ種類の動作だが条件の異なる動作を、 1つのメソッド名で定義しなさい。 もちろん、引数の型か引数の個数のどちらかは異なる必要がある。

例: move(距離) と move(距離, 速度)

参考

もし必要であれば、Math.random() により double の乱数(0.0以上1.0未満)を得ることができる。