課題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 として指定すること。
- 収録語数を表す int definitions
また、次のようなコンストラクタを用意すること。これは public として指定すること。
- Dictionary(String name, int pages, int definitions)
- 引数 title: この辞書のタイトル
- 引数 pages: この辞書のページ数
- 引数 definitions: この辞書に収録されている語数
また、次のようなインスタンスメソッドを用意すること。これらは public として指定すること。
- int getDefinitions()
- この辞書に収録されている語数を返す。
- 戻り値: この辞書に収録されている語数
- String getDictionarySpec()
- この辞書の仕様を次の形式の文字列で返す「辞書のタイトル + ",収録語数" + 収録語数 + "語"」
- 戻り値: この辞書の仕様を表す文字列
上記に記載されていないインスタンスフィールド、インスタンスメソッド、クラスメソッド、コンストラクタは必要ならば自由に用意して構わない。ただし、Book クラスに変更を加えないこと。
手順
指定した箇所で必ずテストを行うこと。
- (先に Book クラスを作っておく)
- 各メソッドに対する詳細な擬似コードを作成する
- パッケージ j2.lesson04 にクラス Dictionary を作成
- 指定したインスタンスメソッドやコンストラクタを作成する
- テスト項目「Dictionaryに対する骨格テスト」をパス
- インスタンスメソッドやコンストラクタの中身を書く (演習と同様)
- main メソッドを書いて簡単なテストを行う
- JUnit を用いてもよい
- テスト項目「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 として指定すること。
- Translation(String name, int pages, Book origin)
- 引数 title: この訳本のタイトル
- 引数 pages: この訳本のページ数
- 引数 origin: 原著 (訳本の元になった本)
また、次のようなインスタンスメソッドを用意すること。これらは public として指定すること。
- String getOriginalTitle()
- 原著のタイトルを返す。
- 戻り値: 原著のタイトル
- int getOriginalPages()
- 原著のページ数を返す。
- 戻り値: 原著のページ数
上記に記載されていないメンバや、コンストラクタは必要ならば自由に用意して構わない。ただし、Book クラスに変更を加えないこと。
手順
指定した箇所で必ずテストを行うこと。
- (先に Book クラスを作っておく)
- 各メソッドに対する詳細な擬似コードを作成する
- パッケージ j2.lesson04 にクラス Translation を作成
- 指定したインスタンスメソッドやコンストラクタを作成する
- テスト項目「Translationに対する骨格テスト」をパス
- インスタンスメソッドやコンストラクタの中身を書く (演習と同様)
- main メソッドを書いて簡単なテストを行う
- JUnit を用いてもよい
- テスト項目「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 として指定すること。
- Bookshelf()
- 本棚インスタンスを生成する。
インスタンスメソッドは次のものを用意すること。これらは public として指定すること。
- int totalBooks()
- この本棚にある蔵書の総数を返す。
- 戻り値: この本棚にある蔵書の総数
- 初期状態では 0 が返ってくる (本棚は空)
- int totalPages()
- この本棚にある蔵書の合計ページ数を返す。一冊もなければ 0 を返す。
- 戻り値: 蔵書の合計ページ数。一冊もなければ 0
- boolean put(Book book)
- 指定された本をこの本棚に追加する。
- ただし、本棚に追加できる本の数には限り (最大20冊) があり、制限を超えてしまう場合は本を追加せずに false を返す。本を追加できた場合は true を返す。
- 引数 book: 追加する本
- 戻り値: 追加できれば true
- void showList()
- 蔵書リストを表示する。表示する順番は格納された順番と同じで、各蔵書の表示を改行で区切る。各本の表示形式は、Book クラスの toString() と同様。
また、実際にこのクラスを使用するための簡単な main メソッドを Bookshelf クラス内に用意すること。
手順
指定した箇所で必ずテストを行うこと。
- 各メソッドに対する詳細な擬似コードを作成する
- パッケージ j2.lesson02 にクラス Bookshelf を作成
- クラス内に必要なコンストラクタ、メソッドの骨格を作成
- テスト項目「BookShelfに対する骨格テスト」をパス
- 擬似コードを各メソッドにコメントとして貼り付ける
- 擬似コードに対するプログラムを書く (main メソッド以外)
- 各メソッドをテストする (JUnitを用いてもよい)
- テスト項目 「BookShelfに対する単体テスト」 をパス
- mainメソッドを実装する
- 実際に実行して動作を確認する
テストの失敗メッセージ
骨格テスト
メッセージ | 詳細 |
---|---|
(クラス名), 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 クラス
- public CardDeck()
- トランプ一式を作成する。
- 初期状態では、スペードA,2..K,ダイヤA,2,..,K,クラブA,2,..,K,ハートのA,2,..,K順に並んでいる
- public void shuffle()
- このデッキをシャッフルする。
- public boolean isEmpty()
- このデッキにカードが残っているかどうか調べる。
- 戻り値: カードが残っていれば true
- public int rest()
- このデッキに残っているカードの枚数を取得する。
- 戻り値: 残っているカードの枚数
- public Card takeFirst()
- デッキの先頭からカードを一枚取得する。取得したカードは、デッキから削除される。
- 戻り値: デッキの先頭にあるカード
- public Card takeLast()
- デッキの末尾からカードを一枚取得する。取得したカードは、デッキから削除される。
- 戻り値: デッキの末尾にあるカード
- public void putFirst(Card c)
- 指定したカードを、デッキの先頭に追加する。
- c - デッキに納めるカード
- public void putLast(Card c)
- 指定したカードを、デッキの末尾に追加する。
- c - デッキに納めるカード
Card クラス
- public static int SPADE
- スペードを表す定数 (=0)
- public static int DIAMOND
- ダイヤを表す定数 (=1)
- public static int CLUB
- クラブを表す定数 (=2)
- public static int HEART
- ハートを表す定数 (=3)
- public String getSuite()
- このカードのマークを表す文字列を取得する。
- 戻り値: このカードのマークを表す文字列
- public int getSuiteAsInt()
- このカードのマークを 0 から 3 の値として取得する。このクラスで宣言されている定数と照らし合わせることにより、マークを判定できる。
- 戻り値: このカードのマークを表す数値
- public String getRank()
- このカードのランクを表す文字列を取得する。
- "A", "1",..,"10", "J", "Q", "K" のいずれか
- 戻り値: このカードのランクを表す文字列
- public int getRankAsInt()
- このカードのランクを 1 から 13 の値として取得する。
- 戻り値: このカードのランク
- public boolean isHeart()
- このカードがハートであるかどうか調べる。
- 戻り値: ハートならば true
- public boolean isSpade()
- このカードがスペードであるかどうか調べる。
- 戻り値: スペードならば true
- public boolean isClub()
- このカードがクラブであるかどうか調べる。
- 戻り値: クラブならば true
- public boolean isDiamond()
- このカードがダイヤモンドであるかどうか調べる。
- 戻り値: ダイヤモンドならば true
- public String toString()
- このカードの文字列表現を取得する。
- 戻り値: このカードの文字列表現