課題1501
直円柱を表すクラス Cylinder をパッケージ j2.lesson02 に作成しなさい。
直円柱とは円筒状の物体で、底面に円を持つ柱のことである。
このクラスにどのようなインスタンスフィールドを用意するかは問わないが、次のようなインスタンスメソッドを用意すること。
- 体積を求めるインスタンスメソッド public double volume()
- 引数なし
- 戻り値 double
- 対象の直円柱インスタンスの体積を計算し、返す
- 表面積を求めるインスタンスメソッド public double surfaceArea()
- 引数なし
- 戻り値 double
- 対象の直円柱インスタンスの表面積を計算し、返す
また、次のようなコンストラクタを用意すること。
- public Cylinder(double radius, double height)
- 引数 radius: この直円柱の底面の半径を設定する
- 引数 height: この直円柱の高さを設定する
上記に記載されていないインスタンスフィールド、インスタンスメソッド、クラスメソッド、コンストラクタは必要ならば自由に用意して構わない。
πの値は、Math.PI を使用すると 3.14 よりも正確な値を使用できる。
手順
指定した箇所で必ずテストを行うこと。
- 各メソッドに対する詳細な擬似コードを作成する
- パッケージ j2.lesson02 にクラス Cylinder を作成
- 指定したインスタンスメソッドやコンストラクタを作成する
- テスト項目「Cylinderに対する骨格テスト」をパス
- インスタンスメソッドやコンストラクタの中身を書く (演習と同様)
- 簡単なテストを行う
- テスト項目「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(), 改行
- (*) で指定した箇所は、コンストラクタ Cylinder(double, double) を使用すること
結果の例
入力に順に 2.5, 4.0 を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。
円柱の底面の半径を入力:2.5 円柱の高さを入力:4.0 体積は78.53981633974483 表面積は102.10176124166827
手順
指定した箇所で必ずテストを行うこと。
- 各メソッドに対する詳細な擬似コードを作成する
- パッケージ j2.lesson02 にクラス CylinderAction を作成
- クラス内に throws IOException の指定をした mainメソッド (public static void main(String[] args) throws IOException { }) を作成
- 必ず throws IOException の記述を付加しておくこと (つまり、import java.io.*;も必要となる)
- テスト項目「CylinderActionに対する骨格テスト」をパス
- 擬似コードをコメントとして貼り付ける
- mainメソッドを実装する
- 実際に実行して動作を確認する
- テスト項目 「CylinderActionに対する機能テスト」 をパス
テストの失敗メッセージ
骨格テスト
メッセージ | 詳細 |
---|---|
(クラス名), existence | パッケージ内に課題で指定したクラスが存在していない。パッケージやクラス名を確認 |
(メソッド名), existence | 指定されたメソッドが存在しない。名前や仮引数の型を確認 |
(メソッド名), public | メソッドを作る際に public が抜けている |
(メソッド名), static | メソッドを作る際に static が抜けている |
(メソッド名), type <T> | メソッドを作る際に戻り値型の指定を間違っている。正しくは <T> |
(メソッド名), throws ... | メソッドを作る際に throws... の指定がない |
機能テストの項目
テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。
項目名 | 詳細 |
---|---|
sample | 結果の例と同じ入力 |
課題1503 (optional)
三角形を表すクラス Triangle をパッケージ j2.lesson02 に作成しなさい。
Triangle クラスはいくつかのインスタンスフィールドと、1つのインスタンスメソッド、2つのコンストラクタを持つ。
インスタンスメソッドは次のものを用意すること。
- 面積を計算するメソッド public double area()
- 引数なし
- 戻り値 double
- 対象の三角形インスタンスの面積を計算し、返す
コンストラクタは次のものを用意すること。
- 3辺の長さ を与え、その長さを持つ三角形を作成する public Triangle(double a, double b, double c)
- 引数 a: 辺 a の長さ
- 引数 b: 辺 b の長さ
- 引数 c: 辺 c の長さ
- 頂点の座標 (2次元座標) を3つ与え、その3点を頂点とする三角形を作成する public Triangle(Point p1, Point p2, Point p3)
- 引数 p1: 1つ目の頂点の座標
- 引数 p2: 2つ目の頂点の座標
- 引数 p3: 3つ目の頂点の座標
- Pointは演習で作成した j2.lesson02.Point を使用すること
インスタンスフィールドはどのようなものを用意しても良いが、与えられた三角形に対して適切に面積を計算できるようにすること。
また、実際にこのクラスを使用するための簡単な main メソッドを Triangle クラス内に用意すること。
手順
指定した箇所で必ずテストを行うこと。
- 各メソッドに対する詳細な擬似コードを作成する
- パッケージ j2.lesson02 にクラス Triangle を作成
- Triangle クラス内にmainメソッドを作成
- クラス内に必要なコンストラクタ、メソッドの骨格を作成
- テスト項目「Triangleに対する骨格テスト」をパス
- 擬似コードを各メソッドにコメントとして貼り付ける
- 擬似コードに対するプログラムを書く (main メソッド以外)
- 各メソッドをテストする (JUnitを用いてもよい)
- テスト項目「Triangleに対する単体テスト」 をパス
- mainメソッドを実装する
- 実際に実行して動作を確認する
テストの失敗メッセージ
骨格テスト
メッセージ | 詳細 |
---|---|
(クラス名), 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クラスには次のようなインスタンスメソッドを持たせること。
- public Turtle move()
- 向いている方向に 1 だけ進む
- 自分自身を返す (return this; する)
- public Turtle turnLeft()
- 右に90度向きを変える
- 自分自身を返す (return this; する)
- public Turtle turnRight()
- 左に90度向きを変える
- 自分自身を返す (return this; する)
- public Point getCurrentPosition()
- 現在位置を j2.lesson02.Point 型で返す
亀が移動できる空間は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メソッド内に書け。
手順
指定した箇所で必ずテストを行うこと。
- 各メソッドに対する詳細な擬似コードを作成する
- パッケージ j2.lesson02 にクラス Turtle を作成
- Turtle クラス内にmainメソッドを作成
- クラス内に必要なコンストラクタ、メソッドの骨格を作成
- テスト項目「Turtleに対する骨格テスト」をパス
- 擬似コードを各メソッドにコメントとして貼り付ける
- 擬似コードに対するプログラムを書く (main メソッド以外)
- 各メソッドをテストする (JUnitを用いてもよい)
- テスト項目 「Turtleに対する単体テスト」 をパス
- mainメソッドを実装する
- 実際に実行して動作を確認する
テストの失敗メッセージ
骨格テスト
メッセージ | 詳細 |
---|---|
(クラス名), 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() |