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

演習問題(中級・上級)

解答は earth.mlab.im.dendai.ac.jp/home/submit/1I-Computer2/[初級の出題日]/[学籍番号] のディレクトリに提出しなさい。 ソースファイル (〜.java) のみを提出すること。

ファイルの送信には ftp ソフトを用いる。 Linux の gFTP を使った提出方法 (実験室のマニュアル) を参照すること。

なお、中級・上級問題は楽しめる範囲で取り組めばよい。

問題1

問題1-1

財布を表すクラス Wallet を定義しなさい。 財布にはお金以外にカード類や領収書などを収納する機能があるが、 ここではお金を収納する機能にのみ着目する。

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

クラス Wallet の使用例と実行例は以下の通り。

class PersonWithWallet {
    public static void main(String[] args) {
        System.out.println("財布: ");
        Wallet wallet = new Wallet();
        wallet.put(1000);
        System.out.println("中身は " + wallet.getAmount() + " です。");
        wallet.get(10000);
        System.out.println("中身は " + wallet.getAmount() + " です。");
    }
}

class Wallet {
    // ここを考える
}
$ java PersonWithWallet
財布: 
1000 入れました。
中身は 1000 です。
10000 取り出します。
10000 もありません。1000 だけ取り出します。
中身は 0 です。
$

問題1-2

ブタ(pig)の形をした貯金箱(piggy bank)を定義しなさい。 この貯金箱は、お金を収納できるので財布の一種と考えることができるが、 お金を一部だけ取り出すことはできず、壊して全額取り出すことしかできない。

この貯金箱を表すクラス PiggyBank を、 財布を表すクラス Wallet を継承させて作成しなさい。 その際、Wallet に実装されているが Wallet とは動作の異なるメソッドを、 オーバーライドして作成することになる。 例えば、get は常に 0 を返すメソッドにする必要がある。

余力のある人は、一度壊したら (= getAll したら)、 それ以降は put もできないようにすること。


class PersonWithWallet {
    public static void main(String[] args) {
        System.out.println("財布: ");
        Wallet wallet = new Wallet();
        wallet.put(1000);
        System.out.println("中身は " + wallet.getAmount() + " です。");
        wallet.get(10000);
        System.out.println("中身は " + wallet.getAmount() + " です。");
        System.out.println();
        
        System.out.println("貯金箱: ");
        Wallet piggyBank = new PiggyBank();
        piggyBank.put(1000);
        System.out.println("中身は " + piggyBank.getAmount() + " です。");
        piggyBank.get(500);
        System.out.println("中身は " + piggyBank.getAmount() + " です。");
        piggyBank.getAll();
        System.out.println("中身は " + piggyBank.getAmount() + " です。");
        piggyBank.put(10000);
    }
}

class Wallet {
    // ここは問題1-1のものをそのまま使う
}

class PiggyBank extends Wallet {
    // ここを考える
}
$ java PersonWithWallet
財布: 
1000 入れました。
中身は 1000 です。
10000 取り出します。
10000 もありません。1000 だけ取り出します。
中身は 0 です。

貯金箱: 
1000 入れました。
中身は 1000 です。
一部だけ取り出すことはできません。
中身は 1000 です。
全額取り出しました。この貯金箱はもう使えません。
中身は 0 です。
入れられません。
$

問題2

この問題は上級者向けである。

問題2-1

CDとDVD Videoについて考えよう。 CDには音楽作品(Music)が複数記録されており、 DVD Videoには映像作品(Movie)が複数記録されている。

ここで、音楽作品と映像作品の性質を考えると、 どちらも作者(演奏家)と題名を持つ似たような性質のものだと考えられる。 そこで、まず音楽作品と映像作品に共通する性質を抽出し スーパクラスとして「メディア(Media)」を定義し、 メディアを継承することで「音楽」と「映像」のクラスを定義することが考えられる。 ただし、映像作品には、言語音声の種類や字幕、 視聴可能なリージョン(国や地域)などの情報が含まれているとする。

以上のような考え方に基づき、 メディア (クラス Media)、 音楽 (クラス Music)、 映像 (クラス Movie) を作成しなさい。

ファイル名は VariousMedia.java とし、適当な main メソッドを書くこと。

問題2-2

上で定義したメディアが複数記録できるディスク (クラス Disc) を作成し、 この Disc クラスを継承する形で CD (クラス CompactDisc) 、DVD Video (クラス DVDVideo) を作成しなさい。

ファイル名は CDAndDVD.java とし、適当な main メソッドを書くこと。

問題2-3

上で定義した DVD Video が視聴できる DVD プレーヤを表すクラス DVDPlayer を定義しなさい。 DVD プレーヤでは DVD Video の視聴のみならず CD も演奏可能なものとすること。

ファイル名は DVDWatcher.java とする。 適当な映像作品を題材とした DVD Video および、 適当な音楽作品を題材とした CD を作成し、 視聴できる様子を main メソッドに書くこと。