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

演習問題

解答は

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

問題1

パソコンを表すクラス PC を定義しなさい。電源スイッチとキーボードがあり、 押したキーに従ってその文字が画面に出力されるものとする。 ファイル名は PCUser.java とし、以下の各小問を解いた最終版を提出すること。 クラス PCUser は次のように定義する(メソッドは例)。

class PCUser {
    public static void main(String[] args) {
	PC myPC = new PC();
	myPC.power();      // 電源スイッチを押す(電源が入る)
	myPC.type('t');    // キー「t」を押す
	myPC.type('d');    // キー「d」を押す
	myPC.type('u');    // キー「u」を押す
	myPC.enter();      // キー「Enter」を押す
	myPC.power();      // 電源スイッチを押す(電源が切れる)
    }
}

上記のプログラムを実行すると、画面にtduという文字が表示され、改行されて終了する。

$ java PCUser
tdu
$

問題 1-1

メソッド type(入力文字) により、引数で指定した文字が画面に表示されるようにしなさい。 また、メソッド enter() により改行されるようにしなさい。 (メソッド power() は実行しなくてよい)

問題 1-2

電源をon/offするメソッド power を実装(作成)し、 電源が入っていないときにはキーを押しても反応しないようにしなさい。

ヒント: インスタンス内で電源がonかoffかの状態を保持する必要がある。 boolean 型の変数を属性として用意するとよい。

問題2

CD Player を表すクラス CDPlayer と、 CD を表すクラス CD を定義しなさい。 ファイル名は CDListener.java とし、以下の各小問を解いた最終版を提出すること。

問題 2-1

まず CD を CD Player に出し入れができるよう、 少なくとも以下の属性/メソッドを持つクラスを設計しなさい。

CD

CD Player

クラス CDListener の定義は、例えば以下のようになる。

class CDListener {
    public static void main(String[] args) {
	CDPlayer player = new CDPlayer();
	// CD 1枚目の生成
	CD cd1 = new CD();
	cd1.setArtist("Jerry Lee Lewis");
	cd1.setTitle("Great Balls of Fire");
	// CD 2枚目の生成
	CD cd2 = new CD();
	cd2.setArtist("The Beatles");
	cd2.setTitle("Penny Lane");
	// CDの出し入れ
	player.load(cd1);
	player.eject();
	player.load(cd2);
	player.eject();
    }
}

上記の例では、メソッド setArtist(名前) でアーティスト名、 メソッド setTitle(名前) でタイトルを指定している。 これをコンストラクタでも指定できるようにすること。

余力がある人は、矛盾した操作がされたときにエラーを表示するようにしなさい。 例えば、ディスクがすでに入っているのに load しようとしたり、 ディスクが入っていないの eject しようとした場合がこれに相当する。 (eject がトレイの eject だと考えると別。解釈はどちらでもよい。)

ヒント: CD Player の属性として、CD Player に CD が入っているかを表す boolean 型の変数を用意する方法と、 クラス CD の変数を用意する方法の2通りが考えられる。 後者の場合、その変数の値が、

となるようにしておけば、CD が入っているかどうかの判定が可能となる。 具体的には、変数名を cd とすると、CD が入っていないときには cd = null として null を代入しておく。 CD が入っているときにはその CD のインスタンスを入れておく。 CD が入っているかどうかを調べるには if(cd == null) ... として値が null かどうかを調べればよい。

問題 2-2

CD が演奏できるよう、クラス CD およびクラス CDPlayer の定義を変更しなさい。 少なくとも以下の属性/メソッドは追加すること。

CD

CD Player

各トラックの曲名は以下のように外部から指定してよい。

class CDListener {
    public static void main(String[] args) {
	CDPlayer player = new CDPlayer();
	// CD 1枚目の生成
	CD cd1 = new CD();
	cd1.setArtist("Jerry Lee Lewis");
	cd1.setTitle("Great Balls of Fire");
	String[] cd1Tracks = new String[2];    // 2トラック分のタイトルを保持する配列
	cd1Tracks[0] = "Great Balls of Fire";  // 1曲目タイトル
	cd1Tracks[1] = "You Win Again";        // 2曲目タイトル
	cd1.setTracks(cd1Tracks);
	// CD 2枚目の生成
	CD cd2 = new CD();
	cd2.setArtist("The Beatles");
	cd2.setTitle("Penny Lane");
	String[] cd2Tracks = {"Penny Lane", "Strawberry Fields Forever"};  // こういう初期化も可能
	cd2.setTracks(cd2Tracks);
	// CD 1枚目を再生
	player.load(cd1);
	player.play();    // 全曲演奏
	player.eject();
	// CD 2枚目を再生
	player.load(cd2);
	player.play();    // 全曲演奏
	player.play(2);   // 2曲目だけ演奏
	player.eject();
    }
}

問題 2-1 ではアーティスト名とタイトルをコンストラクタで指定できるようにしたが、 今回は各トラックの曲名もコンストラクタで与えることができるようにすること。 簡単には、上記の cd1Tracks のように String の配列をあらかじめ用意しておき、 その配列をコンストラクタの引数として与えればよい。 引数の型は String[] となる。

実行例:

$ java CDListener
Artist: Jerry Lee Lewis
Title: Great Balls of Fire
 now playing: Great Balls of Fire
 now playing: You Win Again
 ejected.
Artist: The Beatles
Title: Penny Lane
 now playing: Penny Lane
 now playing: Strawberry Fields Forever
 now playing: Strawberry Fields Forever
 ejected.
$

なお、CD の内容はこの例題や友達とは異なるものにすること。

問題3

前回の問題3では移動する車のシミュレーションを行った。 このように、時間とともに変化する現象を一つ選んで、 簡単なシミュレーションを行うプログラムをつくりなさい。 ファイル名は MySimulation.java とする。

ソースファイルの先頭に、 そのシミュレーションのタイトルと、 どのような内容かを説明する文章をコメントの形式で書いておくこと。

シミュレーションとは、 実際の現象をプログラムとして再現しコンピュータの中で真似をすることである。 例えば、次のようなシミュレーションが考えられる。

問題4 (余力のある人のみ)

前回の問題3が2台の車のシミュレーションであることに注目する。 このように、 2つの同じ種類のものが相互作用するような現象を考えて、 簡単なシミュレーションを行うプログラムをつくりなさい。 ファイル名は MutualAction.java とする

ソースファイルの先頭に、 そのシミュレーションのタイトルと、 どのような内容かを説明する文章をコメントの形式で書いておくこと。

例えば、つぎのようなシミュレーションが考えられる。

シミュレーションの対象となる「もの」のクラスを定義し、 インスタンスを2つ作ることになる。