第19週目課題

課題1901

架空の店「ほげマート」のレシートを表すクラス HogeMartReceipt をパッケージ j2.lesson06 に作成しなさい。

ほげマートのレシートの例を挙げる。

ほげマート
東京店
=============
事務用品
    5000円
筆記用具
    120円
雑誌
    220円

合計:5340円
=============
加算ポイント:53
担当者: ふー

"=" で囲まれた部分の表示形式は、「ほげ書店」のレシートの "-" で囲まれた部分のそれと同様である。また、担当者はコンストラクタでその名前を指定し、加算ポイントは合計金額の1/100の小数点以下を切り捨てた値を表示する

ほげ書店
TEL:03-xxxx-yyyy
----------------
(購入した商品)
    (購入した商品の価格)円
...

合計: (価格の合計)円
----------------
ありがとうございました。

このクラスは、演習で作成した AbstractReceipt クラスを継承して作成すること。どのメソッドをオーバーライドしてもかまわないが、このクラスを abstract として宣言しないこと。また、 AbstractReceipt, Receipt はそれぞれ変更しないこと。

HogeMartReceipt は次のようなpublicとして指定されたコンストラクタを用意すること。

クラスが完成したら、mainメソッドを用意してそこに簡単なプログラムを書いてみること。

手順

指定した箇所で必ずテストを行うこと。

  1. 各メソッドに対する詳細な擬似コードを作成する
  2. パッケージ j2.lesson06 にクラス HogeMartReceipt を作成
  3. 指定したインスタンスメソッドやコンストラクタを作成する
  4. テスト項目「HogeMartReceiptに対する骨格テスト」をパス
  5. インスタンスメソッドやコンストラクタの中身を書く (演習と同様)
  6. main メソッドを書いて簡単なテストを行う
  7. テスト項目「HogeMartReceiptに対する単体テスト」をパス

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
(クラス名), existence パッケージ内に課題で指定したクラスが存在していない。パッケージやクラス名を確認
(クラス名), not abstract クラスを作る際に abstract を指定してしまっている
(クラス名), extends <C> クラスを作る際に継承するクラスが間違っている。正しくは <C>
(メンバ名), existence 指定されたメンバが存在しない
(メンバ名), public メンバを作る際に public の指定がない
(メンバ名), protected メンバを作る際に protected の指定がない
(メンバ名), not static メンバを作る際に static が余計についている
(メンバ名), type <T> メンバを作る際に型の指定を間違っている。正しくは <T>

単体テスト

メッセージ 詳細
期待された結果と異なります (メソッド名)を起動した結果が期待された結果と異なる。テスト項目を参照

単体テストの項目

テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。

項目名 詳細
show_void new HogeMartReceipt("a").show()
show_99 new HogeMartReceipt("b"), addItem("c", 99), show()
show_100 new HogeMartReceipt("b"), addItem("c", 100), show()
show_sample new HogeMartReceipt("b"), addItem("p1", 198), addItem("p2", 198), addItem("p3", 198), show()

課題1902

「ほげ書店」の正式な領収書を表すクラス HogeBooksAcquittance をパッケージ j2.lesson06 に作成しなさい。

このクラスは、次のインターフェース Acquittanceを実装すること。

package j2.lesson06;

public interface Acquittance {
    
    // 支払人の名前を取得する
    String getPayerName();
    
    // 発行者の名前を取得する
    String getIssuerName();
    
    // 合計金額を取得する
    int getTotalAmount();
    
    // 但し書きを取得する
    String getFinePrint();
    
    // 領収書全体を表示する
    void show();
}

「ほげ書店」の正式な領収書は、次のような形式である。

領収書
(支払人)様
¥(合計金額).-
(但し、(但し書き)として)
確かに領収いたしました。
          (発行者)

「支払人」「合計金額」「但し書き」「発行者」はそれぞれ getPayerName(), getTotalAmount(), getFinePrint(), getIssuerName() を呼び出した結果と同じである。

このクラスには、次のような public で宣言されたコンストラクタ、およびインスタンスメソッドを用意すること。

(最近は上様宛ての領収書は発行してくれないので、現実で試さないように。)

show() メソッドは以下のものを使ってよい。別の書き方をしてもかまわないが、出力は下記のものと揃えること。

// この領収書全体を表示する
public void show() {
    // print "領収書", 改行
    System.out.println("領収書");
    // print (支払人) + "様", 改行
    System.out.println(getPayerName() + "様");
    // print "¥" + (合計金額) + ".-", 改行
    System.out.println("¥" + getTotalAmount() + ".-");
    // print "(但し、" + (但し書き) + "として)", 改行
    System.out.println("(但し、" + getFinePrint() + "として)");
    // print "確かに領収いたしました。", 改行
    System.out.println("確かに領収いたしました。");
    // print "          " + (発行者), 改行
    System.out.println("          " + getIssuerName());
}

また、これを動かす簡単な main メソッドを用意して実行してみること。

手順

指定した箇所で必ずテストを行うこと。

  1. 各メソッドに対する詳細な擬似コードを作成する
  2. パッケージ j2.lesson06 にクラス HogeBooksAcquittance を作成
  3. 指定したインスタンスメソッドやコンストラクタを作成する
  4. テスト項目「HogeBooksAcquittanceに対する骨格テスト」をパス
  5. インスタンスメソッドやコンストラクタの中身を書く (演習と同様)
  6. main メソッドを書いて簡単なテストを行う
  7. テスト項目「HogeBooksAcquittanceに対する単体テスト」をパス

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
(クラス名), existence パッケージ内に課題で指定したクラスが存在していない。パッケージやクラス名を確認
(クラス名), not abstract クラスを作る際に abstract を指定してしまっている
(クラス名), extends <C> クラスを作る際に継承するクラスが間違っている。正しくは <C>
(メンバ名), existence 指定されたメンバが存在しない
(メンバ名), public メンバを作る際に public の指定がない
(メンバ名), protected メンバを作る際に protected の指定がない
(メンバ名), not static メンバを作る際に static が余計についている
(メンバ名), type <T> メンバを作る際に型の指定を間違っている。正しくは <T>

単体テスト

メッセージ 詳細
期待された結果と異なります (メソッド名)を起動した結果が期待された結果と異なる。テスト項目を参照

単体テストの項目

テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。

項目名 詳細
show_void new HogeBooksAcquittance().show()
show_fully new HogeBooksAcquittance(), setPayerName("a"), setTotalAmount(5000), setFinePrint("b"), show()

課題1903 (optional)

ほげ書店のレシート兼領収書を表すクラス HogeBooksHybridReceipt をパッケージ j2.lesson06 に作成しなさい。

最近のレシートは、正式な領収書として使えるものがある。これは、レシート上部が正式な領収書の形式をとっていて、下部に通常のレシートが印刷されているものである。

架空の店舗「ほげ書店」では、次のようなレシート兼領収書を発行することになった。

領収書
ふー様
¥780.-
(但し、書籍代として)
確かに領収いたしました。
          ほげ書店
================
ほげ書店
TEL:03-xxxx-yyyy
----------------
雑誌
    250円
文庫
    530円

合計:780円
----------------
ありがとうございました。

これは、全体を "="の繰り返し で区切って、上部に HogeBooksAcquittance の show() メソッドを呼び出した結果を、下部に HogeBooksReceipt の show() メソッドを呼び出した結果を表示している。

HogeBooksHybridReceipt は、インターフェース Receipt と Acquittance をそれぞれ実装し、次のようなpublicとして指定されたコンストラクタ、インスタンスメソッドを用意すること。

ただし、2つのインターフェースは直接実装しなくても (親の誰かが実装しているだけでも) よい。そのため、下記の全てのメソッドを HogeBooksHybridReceipt 内で実装しなくても、親の誰かが実装していればよい。

setPayerName, setFinePrint メソッドが一度も呼び出されていない場合の表示は、HogeBooksAcquittance クラスを扱った際に同名のメソッドが一度も呼び出されていない場合と同じものを領収書部分に表示すること。

この課題で注意すべき点として、上記の仕様の中に setTotalAmount() メソッドが存在しないという点である。領収書部分を表示する際には注意すること。

手順

指定した箇所で必ずテストを行うこと。

  1. 各メソッドに対する詳細な擬似コードを作成する
  2. パッケージ j2.lesson06 にクラス HogeBooksHybridReceipt を作成
  3. クラス内に必要なコンストラクタ、メソッドの骨格を作成
  4. テスト項目「HogeBooksHybridReceiptに対する骨格テスト」をパス
  5. 擬似コードを各メソッドにコメントとして貼り付ける
  6. 擬似コードに対するプログラムを書く (main メソッド以外)
  7. 各メソッドをテストする (JUnitを用いてもよい)
  8. 単体テスト 「HogeBooksHybridReceiptに対する単体テスト」 をパス
  9. mainメソッドを実装する
  10. 実際に実行して動作を確認する

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
(クラス名), existence パッケージ内に課題で指定したクラスが存在していない。パッケージやクラス名を確認
(クラス名), extends <C> クラスを作る際に継承するクラスが間違っている。正しくは <C>
(メンバ名), existence 指定されたメンバが存在しない
(メンバ名), public メンバを作る際に public の指定がない
(メンバ名), private メンバを作る際に private の指定がない
(メンバ名), final メンバを作る際に final の指定がない
(メンバ名), not static メンバを作る際に static が余計についている
(メンバ名), type <T> メンバを作る際に型の指定を間違っている。正しくは <T>

単体テスト

メッセージ 詳細
期待された結果と異なります (メソッド名)を起動した結果が期待された結果と異なる。テスト項目を参照
未初期化フィールド インスタンスを代入すべきフィールドにインスタンスを代入していない可能性がある

単体テストの項目

テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。

項目名 詳細
show_void new HogeBooksHybridReceipt().show()
show_sample new HogeBooksHybridReceipt(), addItem("a", 5000), setPayerName("b"), setFinePrint("c"), show()

課題1904 (optional)

既約分数を表すクラス Rational をパッケージ j2.lesson06 に作成しなさい。

既約分数とはそれ以上約分することのできない分数のことである。通常の分数を既約分数に変換するには、分子と分母をそれらの最大公約数で割ってやればよい。ただし、このクラスが表す既約分数には、次のようなルールを与える。

Java には数値全般を表すクラスとして、java.lang.Number というクラスが存在する。既約分数 is-a Number であるので、このクラスを Rational が継承すること。

次のようなpublicとして指定されたコンストラクタ、インスタンスメソッドを用意すること。これ以外のメンバを用意してもよいが、その際は private で宣言すること。

また、Number クラスにはいくつかの abstract メソッドが存在する。このクラスを継承しているので、次のメソッドをオーバーライドすること。

public long longValue() {
    return this.intValue();
}
public float floatValue() {
    return (float) this.doubleValue();
}
int a = 10;
int b = 3;
double c = (double) a / (double) b;

上記のように書くことによって、c には 3 ではなく 3.33333... が代入される。

また、Rational クラス内に簡単な main メソッドを用意し、動作を確認すること。

手順

指定した箇所で必ずテストを行うこと。

  1. パッケージ j2.lesson06 にクラス Rational を作成
  2. 指定したインスタンスメソッドやコンストラクタを作成する
  3. main メソッドを作成する (この時点では空でもよい)
  4. テスト項目「Rationalに対する骨格テスト」をパス
  5. インスタンスメソッドやコンストラクタの中身を書く (演習と同様)
  6. main メソッドを書いて簡単なテストを行う
  7. テスト項目「Rationalに対する単体テスト」をパス

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
(クラス名), existence パッケージ内に課題で指定したクラスが存在していない。パッケージやクラス名を確認
(クラス名), extends <C> クラスを作る際に継承するクラスが間違っている。正しくは <C>
(メンバ名), existence 指定されたメンバが存在しない
(メンバ名), public メンバを作る際に public の指定がない
(メンバ名), private メンバを作る際に private の指定がない
(メンバ名), final メンバを作る際に final の指定がない
(メンバ名), not static メンバを作る際に static が余計についている
(メンバ名), type <T> メンバを作る際に型の指定を間違っている。正しくは <T>

単体テスト

メッセージ 詳細
期待された結果と異なります (メソッド名)を起動した結果が期待された結果と異なる。テスト項目を参照

単体テストの項目

テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。

項目名 詳細
toString_0 new Rational(0, 100).toString()
toString_M1a new Rational(-1, 1).toString()
toString_M1b new Rational(1, -1).toString()
toString_1a new Rational(1, 1).toString()
toString_1b new Rational(100, 100).toString()
add new Rational(3, 5).add(new Rational(2, 5)).toString()
sub new Rational(3, 5).add(new Rational(1, 10)).toString()
multiply new Rational(3, 4).multiply(new Rational(4, 3)).toString()
divide new Rational(10, 1).divide(new Rational(1, 10)).toString()
intValue new Rational(12, 5).intValue()
doubleValue new Rational(12, 5).doubleValue()