第17週目課題

課題1700

以下のクラス Book を理解し、同じ内容の Book.java をパッケージ j2.lesson04 に作成しなさい。

package j2.lesson04;

 // 本を表すクラス
public class Book {
    
    // この本のタイトル
    private final String title;
    
    // この本のページ数
    private final int pages;
    
    // コンストラクタ
    public Book(String title, int pages) {
        this.title = title;
        this.pages = pages;
    }

    // タイトルを取得
    public String getTitle() {
        return this.title;
    }

    // ページ数を取得
    public int getPages() {
        return this.pages;
    }
    
    // この本の文字列表現を返す
    public String toString() {
        return this.title + "(" + this.pages + "ページ)";
    }
}

課題1701

辞書を表すクラス Dictionary をパッケージ j2.lesson04 に作成しなさい。

辞書 is-a 書籍 であるので、このクラスは先ほどの Book クラスを継承すること。

このクラスに次のようなインスタンスフィールドを用意すること。また、private, final として指定すること。

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

また、次のようなインスタンスメソッドを用意すること。これらは public として指定すること。

上記に記載されていないインスタンスフィールド、インスタンスメソッド、クラスメソッド、コンストラクタは必要ならば自由に用意して構わない。ただし、Book クラスに変更を加えないこと。

手順

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

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

テストの失敗メッセージ

骨格テスト

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

単体テスト

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

単体テストの項目

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

項目名 詳細
getTitle_a new Dictionary("a", 100, 1).getTitle()
getTitle_hoge new Dictionary("hoge", 100, 1).getTitle()
getPages_1 new Dictionary("a", 1, 1).getPages()
getPages_50 new Dictionary("a", 50, 1).getPages()
getPages_100 new Dictionary("a", 100, 1).getPages()
toString_simple new Dictionary("辞書A", 1000, 500000).toString()
getDefinitions_1 new Dictionary("a", 1, 1).getDefinitions()
getDefinitions_100 new Dictionary("a", 1, 100).getDefinitions()
getDefinitions_10000 new Dictionary("a", 1, 10000).getDefinitions()
getDictionarySpec_a11 new Dictionary("a", 1, 1).getDictionarySpec()
getDictionarySpec_simple new Dictionary("辞書A", 1000, 500000).getDictionarySpec()

課題1702

訳本 (翻訳した本) を表すクラス Translation をパッケージ j2.lesson04 に作成しなさい。

訳本 is-a 書籍 であるので、このクラスは先ほどの Book クラスを継承すること。

このクラスにはどのようなインスタンスフィールドを用意してもかまわないが、private, final として指定すること。
また、次のようなコンストラクタを用意すること。これは public として指定すること。

また、次のようなインスタンスメソッドを用意すること。これらは public として指定すること。

上記に記載されていないメンバや、コンストラクタは必要ならば自由に用意して構わない。ただし、Book クラスに変更を加えないこと。

手順

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

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

テストの失敗メッセージ

骨格テスト

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

単体テスト

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

単体テストの項目

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

項目名 詳細
getTitle_a new Translation("あ", 1, new Book("a", 1)).getTitle()
getTitle_hoge new Translation("ほげ", 1, new Book("hoge", 1)).getTitle()
getPages_1 new Translation("あ", 1, new Book("a", 2)).getPages()
getPages_100 new Translation("ほげ", 100, new Book("hoge", 200)).getPages()
toString_dic new Translation("辞書A", 1000, new Dictionary("DIC-A", 2000, 1000000)).toString()
getOriginalTitle_a new Translation("あ", 1, new Book("a", 1)).getriginalTitle()
getOriginalTitle_hoge new Translation("ほげ", 1, new Book("hoge", 1)).getriginalTitle()
getOriginalPages_2 new Translation("あ", 1, new Book("a", 2)).getriginalTitle()
getOriginalPages_200 new Translation("ほげ", 100, new Book("hoge", 200)).getriginalTitle()

課題1703 (optional)

20冊の本を収納できる本棚を表すクラス Bookshelf をパッケージ j2.lesson04 に作成しなさい。

Bookshelf クラスはいくつかのフィールドと、1つの public コンストラクタ、4つの public インスタンスメソッドを持つ。

インスタンスフィールドはどのようなものを持ってもかまわない。ただし、すべて private で宣言すること。

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

インスタンスメソッドは次のものを用意すること。これらは public として指定すること。

また、実際にこのクラスを使用するための簡単な main メソッドを Bookshelf クラス内に用意すること。

手順

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

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

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
(クラス名), existence パッケージ内に課題で指定したクラスが存在していない。パッケージやクラス名を確認
(メソッド名), existence 指定されたメソッドが存在しない。名前や仮引数の型を確認
(メソッド名), public メソッドを作る際に public が抜けている
(メソッド名), static メソッドを作る際に static が抜けている
(メソッド名), type <T> メソッドを作る際に戻り値型の指定を間違っている。正しくは <T>

単体テスト

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

単体テストの項目

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

項目名 詳細
totalBooks_0 new BookShelf().totalBooks()
totalBooks_1 new BookShelf().put(new Book("a", 100)).totalBooks()
totalBooks_10 new BookShelf().put(new Book("a", 100))..(10 times).totalBooks()
totalBooks_20 new BookShelf().put(new Book("a", 100))..(20 times).totalBooks()
totalBooks_21 new BookShelf().put(new Book("a", 100))..(21 times).totalBooks()
totalPages_0 new BookShelf().totalBooks()
totalPages_1 new BookShelf().put(new Book("a", 1)).totalPages()
totalPages_10 new BookShelf().put(new Book("a", 1)).put(new Book("b", 2)).put(new Book("c", 3)).put(new Book("d", 4)).totalPages()
totalPages_100 new BookShelf().put(new Book("a", 10))..(10 times)
put_1 new BookShelf().put(new Book("a", 100))
put_10 new BookShelf().put(new Book("a", 100))..(10 times)
put_20 new BookShelf().put(new Book("a", 100))..(20 times)
put_21 new BookShelf().put(new Book("a", 100))..(21 times)
showList さまざまな本を20冊追加して showList()

課題1704 (optional)

トランプを使用した自分の好きなゲームをパッケージ j2.lesson04 に作成しなさい。ゲームの進行方法や、ゲーム結果の表示方法などは自分で好きなようにしてよい。

現在の自分の能力を把握するため、今までに習った技術や自分で調べた技術などをプログラムに盛り込んでみること。今週のテーマである「継承」は、必ずしも使用する必要はない。

このプログラムを作成するにあたり、、card.zip にあるファイルをインポートして使用してもよい。このファイルをインポートすると、j2.lesson04.card というパッケージ内に、Card.java と CardDeck.java というファイルが作成される。

作業手順やテストは自分で考え、必要なだけ行うこと。

上記のプログラムはソースコードを読んでも理解するのが困難である可能性があるため、簡単な仕様を以下に示す。

CardDeck クラス

Card クラス