Javaプログラミング基礎

演習問題

解答は

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

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

問題1

前々回の例題で クラスを用いた電卓のプログラム を示した。 このプログラムは int 型の値同士の四則演算を行うものであった。 このプログラムを元に、 add, sub, multi, divide の各メソッドをオーバロードする形で、 double 型の値同士の四則演算を行うメソッドを追加し、 int 型、double 型両方に対応した電卓プログラムに改良しなさい。 また、メモリ機能は double 型のみに対応するように変更しなさい。

電卓のクラス名は Calculator 、 メソッド main を置くクラス名は OverloadedCalculation とする。 ファイル名は OverloadedCalculation.java である。

class OverloadedCalculation {
    public static void main(String[] args) {
        Calculator calc = new Calculator();

        System.out.println("1 + 2 = " +  calc.add(1, 2) );
        System.out.println("3.3 - 2.5 = " +  calc.sub(3.3, 2.5) );

        // 6.5 * (2.2 - 1.8) を計算
        // まず 2.2 - 1.8 を計算しメモリに記憶
	calc.setMemory(calc.sub(2.2, 1.8));
        // メモリから値を取り出し 5 と掛け算
	double ans = calc.multi(6.5, calc.getMemory());

        System.out.println("6.5 * (2.2 - 1.8) = " + ans);
    }
}

class Calculator {

     int型の値同士の四則演算とdouble型の値同士の四則演算を行うメソッドを書く

     メモリ機能を double 型の値のみを扱うように変更する

}

問題2

円の面積と外周を求めるプログラムを書きなさい。 これは 前々回の問題 と同じであるが、今回はコンストラクタを使用すること。 ファイル名は PropertyOfCircle2.java とする。

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

大枠は次のとおり。

class PropertyOfCircle2 {
    public static void main(String[] args) {
        コンストラクタに対し半径を引数に与え、円オブジェクトを生成する ;

        System.out.println("Area: " + 円の面積を計算するメソッドの実行 );
        System.out.println("Outline: " + 円の外周を計算するメソッドの実行 );
    }
}

class Circle {
    属性「半径」の宣言

    半径を引数に与えたときのコンストラクタの宣言

    int area() {
        ......
        半径の属性値を用い、面積を計算する処理
    }

    int outline() {
        ......
        半径の属性値を用い、円周を計算する処理
    }
}

問題3

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

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

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

        c1 と c2 の距離を求めて表示
        メソッド calcDistance を使って書くこと
    }
}

class Circle {
    // 属性の宣言
    // これ以外の属性は宣言しないこと
    int x, y;              // 中心の座標
    int radius;            // 半径

    コンストラクタの宣言

    メソッドの宣言
    ....
    ....

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

なお、実数 x の平方根は Math.sqrt(x) とすると求まる。

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

問題4

一曲の音楽を表すクラス (Music) を定義しなさい。 このクラスには以下の属性、コンストラクタ、メソッドがあるものとする。

ここで定義したクラス Music を使う例としては、 次のようなプログラムが考えられる。 クラス Music に登録する曲情報は、この例のとおりではなく、 各自のお気に入りの曲にすること。

class MusicFreak {
    public static void main(String[] args) {
        Music[] favoriteSongs = new Music[3];

        favoriteSongs[0] = new Music("Long Train Runnin'", "The Doobie Brothers");
        favoriteSongs[1] = new Music("Kung-Fu World Champion", "Hiromi Uehara");
        favoriteSongs[2] = new Music("Moments Notice", "John Coltrane");

        for( ............... )
            favoriteSongs[n] (n=0〜2) のすべての曲名、ミュージシャン名を表示
    }
}

class Music {
    // クラス Music の内容をここに書く
}

上の枠組みにもとづきクラス Music を作成し、 プログラムが正しく動くようにし提出しなさい。 ファイル名は MusicFreak.java である。