Javaプログラミング基礎

演習問題

解答は

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

問題1

以下に挙げる各組み合わせについて、
     a) クラス - インスタンスの関係か
     b) そう判断した理由
を述べなさい。解答は文章でファイル Q1.txt に記述すること。

  1. 大学 - 私立大学
  2. 私立大学 - 東京電機大学
  3. 東京電機大学 - 情報メディア学科
  4. 情報メディア学科 - 情報メディア学科1年生

ヒント: まず左側がクラスとしてふさわしいかを判断し、クラスだった場合には、次に右側がそのクラスのインスタンスとして正しいかを考えればよい。

問題2

夏休みの課題でボールのアニメーションを行うプログラムを作成した。 今回はボールをクラスとして設計しなさい。 (夏休みの課題は新規履修者 (1年生) を対象として行われた。 再履修者は 課題のページ を参照すること)

枠内を跳ね返りながら移動するボールのアニメーションの原理は次のようであった。

int x, y;          // ボールの位置 (x座標, y座標)
int vx, vy;        // ボールのx軸方向, y軸方向の速度
int width, height; // ボールの動く枠の幅と高さ

while(true) {

    // ボールの位置 (x座標) の計算
    x = x + vx;

    // ボールが枠外なら進む方向を逆転
    if (x > width || x < 0)
        vx = -vx;

    // ボールの位置 (y座標) の計算
    y = y + vy;

    // ボールが枠外なら進む方向を逆転
    if (y > height || y < 0)
        vy = -vy;


    // アニメーションの1コマの表示

    // 時間稼ぎ
}

このプログラムでボールをクラスにすることを考えると、 ボールの属性には、「ボールの位置情報」や、「ボールの速度情報」、 「ボールの動く枠の範囲」があることが考えられる。 また、「ボールを移動する」、「現在のボールの位置情報を取り出す」 というメソッドがあることが考えられる。

次のような枠組みのプログラムを作成し、 ボール (Ball) クラスを用いた、ボールの移動を行うプログラムを作成しなさい。 ファイル名は BallSimulation.java とする。

class BallSimulation {
    public static void main(String[] args) {
        Ball ball = new Ball();

        ballの位置情報を設定 (x座標, y座標を0, 0に設定) ;
        ballの速度情報を設定 (x方向, y方向を1, 1に設定) ;
        ballの動く枠の幅と高さを設定 (幅, 高さを46, 20に設定) ;

        // アニメーションの開始
        while (true) {
            ballの位置を1コマぶん進める;

            ballの位置情報を取りだし、表示;
        }
}

class Ball {

    属性
        ボールの位置情報
        ボールの速度情報
        ボールの動く枠の幅と高さ

    メソッド
        ボールの位置情報を設定する ( ..... )  {
        }

        ボールの速度情報を設定する ( ..... )  {
        }

        ボールの動く枠の幅と高さを設定する ( ..... )  {
        }

        ボールの位置を1コマぶん進める ( ..... ) {
        }

        ボールの位置情報を取り出す ( ..... ) {      ※ x, y それぞれ取り出す
        }
}

なお、このプログラムでは、 1コマごとのボールの位置 (x座標とy座標) が表示されれば良い。 画面の書き換えを伴うアニメーション表示までは必要ない。

このプログラムは無限に繰り返しを行う。終了させるには Ctrl-C を押すこと。

問題3

簡単な自動販売機の動きを真似るプログラムを作成する。

問題3-1

「自動販売機」のクラスを設計する。

ここでは単純に、 お金を入れ「購入ボタン」を押すと物が出てくるような機能簡略版を想定する。 通常のジュースや切符の自動販売機に近い動きをするが、 ジュースの種類の選択や在庫の管理の機能は無いものとする。

まず、自動販売機の利用者が、 どうやって自動販売機を利用するかという「シナリオ」から、 自動販売機にどのようなメソッドがあり、 どのような属性 (変数) があるかを考える必要がある。 では、次のシナリオから、自動販売機のクラスを設計することを考えてみよう。

「利用者は 120 円のジュースを売っている自動販売機に100円を入れた。 購入ボタンを押すと、 20 円不足であると表示された。 次に 50 円を入れた。購入ボタンを押すと、 ジュースとおつり 30 円が出た。」

このシナリオから導き出される自動販売機の仕様は次のようになる。

「自動販売機は利用者からお金を複数回に分けて受け取る。 購入ボタンを押すと、入れたお金が120円以上の場合はジュースとおつりが出る。 入れたお金が120円未満の場合は不足金額が表示される。」

ファイル VendingMachine.txt に自動販売機クラスの設計内容を書きなさい。 ここでは、実際のプログラムを書く必要はなく、 それぞれの属性、メソッドの役割や動作が言葉で説明できていれば良い。

設計内容は次のような形式とする。 それぞれの属性、メソッドごとに1,2行の説明を書くこと。

問題3-2

前の問題の設計に基づき、自動販売機クラスを作成しなさい。 自動販売機クラスを利用して、ジュース買う動作を行うプログラムも作成し、 自動販売機が動いている様子を表示するようにしなさい。

このプログラムの実行の様子は、各自の分析結果によって異なるが、 例えば次のような結果が考えられる。 メソッドmainのあるクラス名は VendingMachineUser とし、 自動販売機のクラス名は VendingMachine とする。 (ファイル名: VendingMachineUser.java)

$ java VendingMachineUser
100 円を入れます。
-----> 投入合計金額は 100 円です。

購入ボタンを押します。
-----> 20 円不足しています。

50 円を入れます。
-----> 投入合計金額は 150 円です。

購入ボタンを押します。
-----> ジュースを出します。
-----> 30 円のおつりを出します。

なお、ジュースやおつりが出てくる場合、 プログラムから本物を出すことはできないので、 「◯◯を出します。」とメッセージを出せば良いものとする。