第15週目課題

課題1501

直円柱を表すクラス Cylinder をパッケージ j2.lesson02 に作成しなさい。

直円柱とは円筒状の物体で、底面に円を持つ柱のことである。

このクラスにどのようなインスタンスフィールドを用意するかは問わないが、次のようなインスタンスメソッドを用意すること。

また、次のようなコンストラクタを用意すること。

上記に記載されていないインスタンスフィールド、インスタンスメソッド、クラスメソッド、コンストラクタは必要ならば自由に用意して構わない。

πの値は、Math.PI を使用すると 3.14 よりも正確な値を使用できる。

手順

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

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

テストの失敗メッセージ

骨格テスト

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

単体テスト

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

単体テストの項目

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

項目名 詳細
volume_1_1 new Cylinder(1.0, 1.0) で作成したインスタンスに対して volume メソッドを起動
volume_2_3 new Cylinder(2.0, 3.0) で作成したインスタンスに対して volume メソッドを起動
volume_3_2 new Cylinder(3.0, 2.0) で作成したインスタンスに対して volume メソッドを起動
surfaceArea_1_1 new Cylinder(1.0, 1.0) で作成したインスタンスに対して surfaceArea メソッドを起動
surfaceArea_2_3 new Cylinder(2.0, 3.0) で作成したインスタンスに対して surfaceArea メソッドを起動
surfaceArea_3_2 new Cylinder(3.0, 2.0) で作成したインスタンスに対して surfaceArea メソッドを起動

課題1502

課題1501で作成した Cylinder クラスを実際に動作させるプログラム CylinderAction をパッケージ j2.lesson02 に作成しなさい。

このクラスには、mainメソッドだけを用意すればよい。

mainメソッドの動作を表す擬似コードは以下の通りである。出力する文字列などは以下の擬似コードに従うこと。

プログラム全体
    print "円柱の底面の半径を入力:"
    radius = 入力 (double)
    print "円柱の高さを入力:"
    height = 入力 (double)
    cylinder = 底面の半径 radius, 高さ height を持つ Cylinder インスタンス (*)
    print "体積は" + cylinder.volume(), 改行
    print "表面積は" + cylinder.surfaceArea(), 改行

結果の例

入力に順に 2.5, 4.0 を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

円柱の底面の半径を入力:2.5
円柱の高さを入力:4.0
体積は78.53981633974483
表面積は102.10176124166827

手順

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

  1. 各メソッドに対する詳細な擬似コードを作成する
  2. パッケージ j2.lesson02 にクラス CylinderAction を作成
  3. クラス内に throws IOException の指定をした mainメソッド (public static void main(String[] args) throws IOException { }) を作成
  4. テスト項目「CylinderActionに対する骨格テスト」をパス
  5. 擬似コードをコメントとして貼り付ける
  6. mainメソッドを実装する
  7. 実際に実行して動作を確認する
  8. テスト項目 「CylinderActionに対する機能テスト」 をパス

テストの失敗メッセージ

骨格テスト

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

機能テストの項目

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

項目名 詳細
sample 結果の例と同じ入力

課題1503 (optional)

三角形を表すクラス Triangle をパッケージ j2.lesson02 に作成しなさい。

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

インスタンスメソッドは次のものを用意すること。

コンストラクタは次のものを用意すること。

インスタンスフィールドはどのようなものを用意しても良いが、与えられた三角形に対して適切に面積を計算できるようにすること。

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

手順

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

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

テストの失敗メッセージ

骨格テスト

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

単体テスト

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

単体テストの項目

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

項目名 詳細
area_L (1.0, 1.0, 1.41421356) の長さを持つインスタンスから area メソッドを起動
area_P 頂点 {(0,0),(1,0),(0,1)} を持つインスタンスから area メソッドを起動
area_L345 (3.0, 4.0, 5.0) の長さを持つインスタンスから area メソッドを起動
area_L354 (3.0, 5.0, 4.0) の長さを持つインスタンスから area メソッドを起動
area_L435 (4.0, 3.0, 5.0) の長さを持つインスタンスから area メソッドを起動
area_L453 (4.0, 5.0, 3.0) の長さを持つインスタンスから area メソッドを起動
area_L534 (5.0, 3.0, 4.0) の長さを持つインスタンスから area メソッドを起動
area_L543 (5.0, 4.0, 3.0) の長さを持つインスタンスから area メソッドを起動
area_P345 頂点 {(-1,-1),(-1,+2),(+3,-1)} を持つインスタンスから area メソッドを起動
area_P354 頂点 {(-1,-1),(+3,-1),(-1,+2)} を持つインスタンスから area メソッドを起動
area_P435 頂点 {(-1,+2),(-1,-1),(+3,-1)} を持つインスタンスから area メソッドを起動
area_P453 頂点 {(-1,+2),(+3,-1),(-1,-1)} を持つインスタンスから area メソッドを起動
area_P534 頂点 {(+3,-1),(-1,-1),(-1,+2)} を持つインスタンスから area メソッドを起動
area_P543 頂点 {(+3,-1),(-1,+2),(-1,-1)} を持つインスタンスから area メソッドを起動

課題1504 (optional)

移動する亀を表すクラス Turtle をパッケージ j2.lesson02 に作成しなさい。

この亀は二次元座標上をユーザの命令どおり動き回るだけの生き物である。

Turtleクラスには次のようなインスタンスメソッドを持たせること。

亀が移動できる空間は2次元の座標上で、引数なしのコンストラクタでインスタンスを生成すると、初期状態として x=0, y=0 の位置で北を向いている。

北を向いた状態で move() メソッドを呼び出すと y の値が 1 だけ増加し、逆に南を向いた状態で move() メソッドを呼び出すと y の値が 1 だけ減少する。

同様に、東を向いた状態で move() メソッドを呼び出すと x の値が 1 だけ増加し、逆に西を向いた状態で move() メソッドを呼び出すと x の値が 1 だけ減少する。

向きを変えるメソッドは turnLeft() と turnRight() があり、turnLeft() メソッドを呼び出すたびに亀の方向は ...→北→西→南→東→北→... と変化していく。turnRight() メソッドは逆の動きをする。

getCurrentPosition() メソッドは亀の現在座標を演習で作成した Point クラスのインスタンスとして返すためのメソッドである。

以下のようなプログラムを例として挙げる。

Turtle t = new Turtle();
t.move();
t.turnRight();
t.move();
t.move();
t.turnLeft();
t.move();
t.move();
Point p = t.getCurrentPosition();
System.out.println("(" + p.x + ", " + p.y + ")");

この結果として、次のように表示される。

(2.0, 3.0)

北に1, 東に2, 北に2 動いたので、合計で 東に2, 北に3 動いたことになった。

また、次のようにプログラムを書くこともできる (難しいので理解できなくても良い)。

Turtle t = new Turtle();
// そのまま 1 進む
t.move();
// 右を向いて 2 進む
t.turnRight().move().move();
// 左を向いて 2 進む
t.turnLeft().move().move();
Point p = t.getCurrentPosition();
System.out.println("(" + p.x + ", " + p.y + ")");

課題としては、上記のようなクラスを用意し、動作させるためのサンプルプログラムをTurtleクラスのmainメソッド内に書け。

手順

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

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

テストの失敗メッセージ

骨格テスト

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

単体テスト

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

単体テストの項目

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

項目名 詳細
move_0 t
move_1 t.move()
move_2 t.move().move()
move_3 t.move().move().move()
move_4 t.move().move().move().move()
move_5 t.move().move().move().move().move()
turnLeft_1 t.turnLeft().move()
turnLeft_2 t.turnLeft().turnLeft().move()
turnLeft_3 t.turnLeft().turnLeft().turnLeft().move()
turnLeft_4 t.turnLeft().turnLeft().turnLeft().turnLeft().move()
turnRight_1 t.turnRight().move()
turnRight_2 t.turnRight().turnRight().move()
turnRight_3 t.turnRight().turnRight().turnRight().move()
turnRight_4 t.turnRight().turnRight().turnRight().turnRight().move()
sample t.move().turnRight().move().move().turnLeft().move().move()
cycleLeft t.move().turnLeft().move().turnLeft().move().turnLeft().move().turnLeft()
cycleRight t.move().turnRight().move().turnRight().move().turnRight().move().turnRight()