Javaプログラミング基礎

演習問題

解答は

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

問題1 (Basic)

円の面積と外周を求めるプログラムを書きなさい。

この問題を「円」というモノに着目すると、 以下のような円クラスを考えることができる。

main メソッドを作成するクラスは PropertyOfCircle とする。 Java では main メソッドのあるクラスの名前と ファイル名 を同じ名前にするという決まりがある。 したがって、このプログラムのファイル名は PropertyOfCircle.java となる。

プログラムの概略は次のようになるはずである。

class PropertyOfCircle {
    public static void main(String[] args) {
        円オブジェクトを生成する ;
        円の半径を設定するメソッドを実行 ;

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

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

    void setRadius(int r) {
        ......
        半径の属性値を設定する処理
    }

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

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

なお、半径は任意に決めて良い。 円周率は 3 とする。各計算は整数で行えば良い。

問題2 (Basic)

現実世界の犬をプログラムとして書くことを考える。 犬には次のような属性と振る舞いがあるとする。

犬の鳴き声は年齢によって変化するものとし、 5歳未満であれば「キャンキャン」、 5歳以上であれば「ワンワン」、 10歳以上であれば「クンクン」と鳴くとする。

このような犬 (Dog) クラスを定義しなさい。 main メソッドのあるクラス名は DogPen とする。 よって、このプログラムのファイル名は DogPen.java となる。 プログラムの大枠は次のようになる。

class DogPen {
    public static void main(String[] args) {
        Dog pochi = new Dog();
        pochi.setName("ぽち");

        pochi.setYears(1);
        System.out.print(pochi.getYears() + "歳の" + pochi.getName() +
                           "が鳴いた: ");
        pochi.bark();

        pochi.setYears(6);
        System.out.print(pochi.getYears() + "歳の" + pochi.getName() +
                           "が鳴いた: ");
        pochi.bark();

        pochi.setYears(15);
        System.out.print(pochi.getYears() + "歳の" + pochi.getName() +
                           "が鳴いた: ");
        pochi.bark();
    }
}

class Dog {
     // ここにクラス Dog の定義を書く
}

問題3 (Standard)

成長するサボテンの例題のプログラムを改造し、 成長率の異なる2つのサボテンの成長をみることができるプログラムにしなさい。 Cactusクラスの内容は例題と同じにすること (変更してはいけない)。 main メソッドを作成するクラスは CactusesObservation とする。 (ファイル名 CactusesObservation.java)

問題4 (Standard)

現実世界のペットボトルと同様の動きを プログラムの世界の中で再現しなさい。

現実世界でのペットボトルの性質を考えてみると、 飲料の名前、値段、容量、残量、色、形、重さなどがある。 また、我々がペットボトルに対して行うことができる操作は、 飲む、開ける、閉める、つぶすなどである。

このようにペットボトルに対して分析を行った結果、 今回のプログラムでは次のようなペットボトルをプログラムの中に 書くことにする。

このような動きを実現するクラス PETBottle を作成しなさい。

属性の登録を行うメソッドは、 引数に与えられた情報を自分のクラスの属性に代入するだけのメソッドである。 また、属性の値を調べるメソッドは、 自分のクラスの属性を return 文で返すだけのメソッドになる。

飲むという動作をペットボトルから見ると、 飲まれたぶんだけ残量が減少することになる。 何 ml 飲むかを引数で指定するようにする。 これをプログラムとして書くとどうなるか考えること。

main メソッドを作成するクラスは PETBottleDrinker (ファイル名 PETBottleDrinker.java) とすると、 プログラムの大枠は次のようになる。

class PETBottleDrinker {
    public static void main(String[] args) {
        PETBottle gogo = new PETBottle();

        // 名前と容量の登録
        gogo.setName("午後も紅茶");
        gogo.setVolume(500);

        System.out.println(gogo.getName() + " の残量は " +
                           gogo.getVolume() + " です");

        // 100ml 飲む
        gogo.drunk(100);
        System.out.println(gogo.getName() + " の残量は " +
                           gogo.getVolume() + " です");

        // 150ml 飲む
        gogo.drunk(150);
        System.out.println(gogo.getName() + " の残量は " +
                           gogo.getVolume() + " です");

        // 250ml 飲む
        gogo.drunk(250);
        System.out.println(gogo.getName() + " の残量は " +
                           gogo.getVolume() + " です");
    }
}

class PETBottle {

    // クラス PETBottle の定義をここに書く

}

問題5 (Advanced)

上のペットボトルの演習問題で定義したクラス PETBottle をそのまま使い、 2 人がジュースの早飲み競争を行うプログラムを作成しなさい。 main メソッドのあるクラス名は DrinkCompetition とする。 (ファイル名: DrinkCompetition.java)

このプログラムでは、 main メソッドで PETBottle のオブジェクトを 2 つ作る。 それぞれについて、毎秒飲む速度を決め、 1,2,3,...,t 秒経過したときの残量を表示するようにする。 どちらかの残量が 0 になったら競争は終了である。 最後にどちらが勝ったかあるいは引き分けだったか表示すること。 なお、PETBottle クラスの内容は前の演習問題の解答と同じにすること (変更してはいけない)。

ちなみに、1人 (John) がペットボトルの飲み物を飲む様子は次のように プログラムで表すことができる。

PETBottle johnsBottle = new PETBottle();
johnsBottle.setVolume(500);
int johnsDrinkRate = 10; // 毎秒飲める量

int second = 0;
while (johnsBottle.getVolume() > 0) {
    System.out.println(second +"秒後のJohnのボトル残量: " + johnsBottle.getVolume());
    johnsBottle.drunk(johnsDrinkRate);
    second++;
}
System.out.println("Johnは" + second + "秒で飲み干した");

これを参考にJohnとPaulの2人が競争する場合のプログラムを考えること。

問題6 (Advanced)

あなたはゲームプログラマを目指し、 自分で RPG のプログラムを作ることにした。

問題6-1

登場人物のクラスを設計するにあたり、登場人物の属性、 動作などを箇条書きにして書き出しなさい。 ファイル名は Charactor.txt とする。

属性の例

動作の例

上記の例を含め、2つ以上の属性、3つ以上の動作を取りあげること。

問題6-2

問題6-1 での分析を踏まえ、登場人物のクラスを記述し、 用意したメソッドを一通り実行するプログラムを作成しなさい。 ファイル名は RPG.java とする。 また、実行結果の例をファイルで提出しなさい。 ファイル名は RPG.txt とする。

登場人物のクラス名は Charactor とする。 オブジェクトの状態を表示する showStatus() というメソッドを用意し、 これを動作の前後で実行することにより状態の変化を表示するようにすること。

以下のようなプログラムに追加する形で作成してもよい。

class RPG {
    public static void main(String[] args) {
        Charactor john = new Charactor();

        john.setHitPoint(1000);
        john.showStatus();
        john.walk(3);
        john.showStatus();
        john.sleep();
        john.showStatus();
    }
}

/** 登場人物のクラス */
class Charactor {
    /** 体力 */
    int hitPoint;
    /** 体力をセット */
    void setHitPoint(int hp) {
        hitPoint = hp;
    }
    /** 距離 distance を移動 */
    void walk(int distance) {
        System.out.println("Walking...(" + distance + ")");
        // 距離に比例して体力を消耗
    }
    /** 寝る */
    void sleep() {
        System.out.println("Sleeping...");
        // 睡眠をとると体力がある程度回復する
    }
    /** 状態表示 */
    void showStatus() {
        System.out.println("HitPoint: " + hitPoint);
    }
}

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