レポート課題

Java 6 を使って作りなさい。

課題1

レポート締切日: 2008年12月4日20:00

提出先: レポートボックス

お金を換算する抽象クラス Money、お金の集まりのクラス MoneyCollection、 日本円のクラス Yen が 別ページ のようになっているとする。 この時、以下の小問に答えなさい。

なお、この問題は早々に 2ch に投稿され、既に解答も寄せられています。 同じ掲示板に何度も同じ問題を投稿するのはマナー違反ですので、もう新たに この問題を投稿しないようにして下さい。

課題1-1

クラス Dollar が以下の機能を実現しているとする。

  1. Money のサブクラスである。
  2. コンストラクタに double 型で値を入れるとその値を持つオブジェクトを 生成する。
  3. toString メソッドを使うと、「$(コンストラクタに入れた値)」と通貨記 号 $ が付加された文字列が得られる。
  4. void setYenRate(double) という静的なメソッドを実装している。 getValue() メソッドを行うと、コンストラクタで入れた値とこの setYenRate で 入れた値の積が返ってくる。

上記の条件を満たすクラスと Money, Yen, MoneyCollection の各クラ スと下記のテストクラス Test1 を結合し、実行したとき、 実行結果がどのようになるか予想し、根拠を挙げて説明しなさい。


class Test1{
    public static void main(String[] arg){
	Dollar.setYenRate(98.0);
	Dollar d1 = new Dollar(1);
	System.out.println(d1);
	System.out.println(d1.getValue());
	MoneyCollection mc = new MoneyCollection();
	mc.add(d1);
	mc.add(new Yen(100));
	mc.add(new Dollar(2));
	mc.show();
    }
}

課題1-2

クラス Dollar を作成し、上記のテストを行い、実行結果を検証しなさい。

課題 1-3

  1. MoneyCollection クラスに格納されている各 Money のオブジェクトに対して、 日本円に換算した合計金額を Yen オブジェクトで返す public Yen total() メソッドを実装しなさい。
  2. 下記の Test2 クラスにおいて、出力を手計算で求めなさい(計算式を示す こと)。
  3. プログラムを結合し実行し、手計算で求めた値と一致するか検証しなさい。

class Test2{
    public static void main(String[] arg){
	Dollar.setYenRate(98.0);
	MoneyCollection mc = new MoneyCollection();
	mc.add(new Dollar(1));
	mc.add(new Yen(100));
	mc.add(new Dollar(2));
	Yen y = mc.total();
	System.out.println(y);
    }
}

課題 1-4

  1. Money を日本円での換算金額に基づく順序を与えて Comparable にしなさ い。
  2. Test3 と結合し実行した結果を根拠を挙げて予想しなさい。
  3. Test3 と結合し実行し、結果が予想と一致するか検証しなさい。

class Test3{
    public static void main(String[] arg){
	Dollar.setYenRate(98.0);
	MoneyCollection mc = new MoneyCollection();
	mc.add(new Dollar(2));
	mc.add(new Yen(200));
	mc.add(new Dollar(1));
	mc.add(new Yen(100));
	mc.show();
	System.out.println("---------------");
	java.util.Collections.sort(mc);
	mc.show();
    }
}

課題 1-5

昭和40年の日本の貨幣価値は現在の 10 倍だったそうです。 つまり「昭和40年の1円は現在の10円」となります。 そこで、昭和40年の日本円を表すクラスを Akagi とします。 またこの表示を行う kansan メソッドを用意します。 これをテンプレートメソッドを使用して実装しなさい。 そして、次のテストプログラムと結合して、以下の出力が出るようにしなさ い。


class Test4{
    public static void main(String[] arg){
	Dollar.setYenRate(98.0);
	MoneyCollection mc = new MoneyCollection();
	mc.add(new Yen(100));
	mc.add(new Dollar(100));
	mc.add(new Akagi(100));
	for(Money m : mc){
	    m.kansan();
	}
    }
}

出力

100.0円は100.0円
$100.0は9800.0円
昭和40年の100.0円は現在の1000.0円

なお、現在の日本円に関しては「100.0円は100.0円」と出力せずに 「100.0円」のみを出力するようにできればなおよい(加点の対象)。

レポート作成上の注意点

今回はポリモーフィズム関連のレポートです。ポリモーフィズムという言葉を 使用してください。 また、テンプレートメソッドでのメソッドの呼び出しの仕組などは詳しく説明 してください。

またプログラムの説明で困っている人は、次のようにしてください。 例えば、Money Yen = new Yen(5); System.out.println(yen); でなぜ 5円が表示されるかなど、実際の呼出し時 にどのような動作をするかを中心に説明してください。

課題2

java.util.AbstractSequentialList クラスを利用して、線形リストを実装す ることを考える。 とりあえず、コンパイルエラーが出ないように実装したプログラムとテストプ ログラムを 別ページに用意した。 この時、以下の小問に答えなさい。

2008/12/4
テスト1のプログラムを訂正しました
2008/12/6
課題 2-3の設問を減らしました
2008/12/26
Test1 が誤ったプログラムでも見逃してしまうため、内容を追加しました。 またListIterator の nextIndex を修正しました。
課題 2-2 でプログラムの説明の詳しさを規定するため、チェックポイン トとして図示する状態を指定しました。
2009/1/3
お年玉を用意しました。

課題2-1

TDUList 内に size() を実装しなさい。

課題2-2

TDUListIterator 内に add() を実装しなさい。 そして、テスト1を動かすとどのように動作するか予想し、実際の動作と比較し なさい。 また、このテスト1 において、各メソッドがどのように呼び出されているか示 しなさい。

add のプログラムの説明では、 def が追加されるとき、ghi が追加されるとき、jkl が追加されるときの線形 リストの様子をそれぞれ図示しなさい。

課題2-3

TDUListIterator 内の next(), hasNext(), nextIndex() を実装しなさい。 また、テスト1を動かすとどのように動作するか予想し、実際の動作と比較し なさい。

課題2-4

TDUListIterator 内の set() を次の手順で実装しなさい。 また、テスト2を動かすとどのように動作するか予想し、実際の動作と比較し なさい。

  1. TDUListIterator 内に Node を参照するメンバ変数 last を用意する。
  2. last は next が呼び出された際に、出力する値を持つ Node の参照を代入す る。 また、他のメソッドでは last に null を代入する。
  3. set メソッドは、まず last が null だったら IllegalStateException をス ローする。 null で無いなら、引数を参照先の値に代入し、last を null にセットする。

課題2-5

TDUList があらゆるオブジェクトを扱えるように Generics を使用して書き換 えなさい。 そして、テスト3を動かして、動作を確認しなさい。

最後のヒント(2009/1/12)

課題 2-2 の説明がレポート作成上もっとも重要です。 作成したプログラムの動作原理を図を使って説明するのも重要ですが、 Test1.java において、 tdu.add("def") や、 tdu.listIterator() など、実 装していないメソッドが、どのような仕組みでエラーにもならずに動作するの かを説明する必要もあります。

2,3 年生の提出条件

レポート締切日:
2009年1月15日20:00
提出先:
レポートボックス

4 年生以上の提出条件

レポート締切日:
2008年12月22日20:00
提出先:
レポートボックス
提出形式:

冬休み中にやりとり可能なメールアドレスを記入すること。PDF ファイルを受 信できること

レポート作成上の注意点

  1. プログラミングのレポートでは必ずプログラムの説明をすること。 その時に、一行一行を日本語に直訳するのではなく、データの読み込みとか、 出力とかの部分に分割し、機能毎に使用した手法を説明すること。 プログラム中にコメントを入れてもプログラムの説明とはみなさないので注意 する事。
  2. 「問題を解きなさい」という問に対して「解きました。合ってました」で は正解ではないことはわかるはず。 「テストしなさい」という問に対しては、テストの方法の説明、実際のテスト の実施方法、テスト結果、検証などを説明して下さい。
  3. レポートは手書きでもワープロでも構いません。但し、実行結果はコン ピュータの出力を添付すること。 実行結果が無いレポートは不合格です。
  4. 考察は必ず書いて下さい。
  5. 不必要なことはなるべく書かない事。 長過ぎるレポートは減点します。またなるべく両面印刷にしてください。 但し、文字は必要以上に小さくしない事。レポート本文の文字は 10 ポイント 以上のものを使う事。

なお、写したと思われるほど酷似したレポートが複数提出された場合、原著が どれかの調査を行わず、抽選で一通のレポートのみを評価 の対象とし、他は提出済みの不合格レポートとして再提出は課しません。 自分で意図せずに他人にコピーされてしまった場合も同様ですので、レポート の取り扱いについては十分に注意して下さい。


坂本直志 <[email protected]>
東京電機大学工学部情報通信工学科