第04週目課題

課題0401

コンソールに整数を一つ入力させ、入力された値を1づつ0に近づかせながら表示するプログラム ToZero.java をパッケージ j1.lesson04 に作成しなさい。

このプログラムでは、まずコンソールに整数を一つ入力させる。

その値が 5 であった場合は、次のように表示する。

5
4
3
2
1
0

上記のように、まず入力された値自身を表示し、そこから0に1づつ近づけながら表示させる。最後に0を表示させたらプログラムを終了させる。

また、マイナスの値として -3 が入力された場合は、次のように表示する。

-3
-2
-1
0

0が入力された場合は、

0

とだけ表示する。

また、コンソールへの入力要求は次のように表示する。

整数を入力:

結果の例

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

整数を入力:3
3
2
1
0

手順

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

  1. パッケージ j1.lesson04 にクラス ToZero を作成 (ファイル名は ToZero.javaとなる)
  2. クラス ToZero 内に throws IOException の指定をした mainメソッド (public static void main(String[] args) throws IOException { }) を作成
  3. テスト項目「ToZero に対する骨格テスト」をパス
  4. mainメソッド内に課題の内容を実装
  5. テスト項目「ToZero に対する機能テスト」をパス

ヒント

第03週の演習にある、Sign.java を参照。

3つあるいは2つの場合分けをして、入力された値の符号によって処理を変えてやればよい。

この問題はforループを一つで済ませる方法もある。余裕のある人は挑戦してみること。

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
クラスが存在しません j1.lesson04 に ToZero クラスが存在していない。パッケージやクラス名を確認
クラスがpublicで宣言されていません class の前に public の指定がない。
mainメソッドが存在しません public static void main(String[]) が存在していない。mainという名前やString[]の部分を確認
mainメソッドがpublicで宣言されていません mainメソッドを作る際に public が抜けている。
mainメソッドがstaticで宣言されていません mainメソッドを作る際に static が抜けている。
mainメソッドがvoidで宣言されていません mainメソッドを作る際に void 以外を指定している。
mainメソッドにthrows IOExceptionの指定がありません mainメソッドを作る際にthrows IOExceptionの指定を行っていない。

機能テスト

メッセージ 詳細
余計な入力を待っていると考えられます コンソール入力を取得する命令を2回以上行っていないか確認
次の入力を変換できませんでした (???) ??? を取得しようとして失敗している。コンソール入力を取得する命令を確認
期待された結果と異なります 出力された結果が期待された値と異なる。「期待された値」と「実際の値」を比較 (エラーメッセージが出力されているエリアの下のほうにあるバーをスクロールさせれば見ることができる) し確認。他にも直接プログラムを実行して結果を調べたり、エラーメッセージの2行目にあるat以下を参考にプログラムを見直す

機能テストのエラーメッセージから見るヒント

メッセージ テストの内容
期待された結果と異なります (M5) 入力が-5
期待された結果と異なります (M1) 入力が-1
期待された結果と異なります (0) 入力が0
期待された結果と異なります (1) 入力が1
期待された結果と異なります (5) 入力が5

課題0402

コンソールに繰り返す回数を整数で入力させ、さらに指定された回数だけコンソールから実数を入力させ、それら入力された実数の平均値を表示するプログラム Average.java をパッケージ j1.lesson04 に作成しなさい。

最初に繰り返す回数を入力させる、コンソールへの入力要求は次のように表示する。

繰り返す回数を入力してください:

ここで、繰り返す回数に0以下が指定された場合は、以下のように表示してプログラムを終了させる。

繰り返す回数には1以上を入れてください。

指定された回数だけ実数を入力させる、コンソールへの入力要求は次のように表示する。この入力要求は入力のたびに表示させる。

値を入力してください:

指定回数だけ実数を入力させた後、以下のように結果を表示させる。

平均は x

ただし、xの部分には指定した回数だけ繰り返し入力させた値の平均値を出力すること。

結果の例

繰り返す回数に3、実数の入力にそれぞれ1.5, 2.5, 2.0を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

繰り返す回数を入力してください:3
値を入力してください:1.5
値を入力してください:2.5
値を入力してください:2.0
平均は2.0

同様に、繰り返す回数に0を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

繰り返す回数を入力してください:0
繰り返す回数には1以上を入れてください。

手順

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

  1. パッケージ j1.lesson04 にクラス Average を作成 (ファイル名は Average.javaとなる)
  2. クラス Average 内に throws IOException の指定をした mainメソッド (public static void main(String[] args) throws IOException { }) を作成
  3. テスト項目「Average に対する骨格テスト」をパス
  4. mainメソッド内に課題の内容を実装
  5. テスト項目「Average に対する機能テスト」をパス

ヒント

繰り返し回数だけ値を入力させる必要があるので、繰り返し文の中で入力をさせる必要がある。

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
クラスが存在しません j1.lesson04 に Average クラスが存在していない。パッケージやクラス名を確認
クラスがpublicで宣言されていません class の前に public の指定がない。
mainメソッドが存在しません public static void main(String[]) が存在していない。mainという名前やString[]の部分を確認
mainメソッドがpublicで宣言されていません mainメソッドを作る際に public が抜けている。
mainメソッドがstaticで宣言されていません mainメソッドを作る際に static が抜けている。
mainメソッドがvoidで宣言されていません mainメソッドを作る際に void 以外を指定している。
mainメソッドにthrows IOExceptionの指定がありません mainメソッドを作る際にthrows IOExceptionの指定を行っていない。

機能テスト

メッセージ 詳細
余計な入力を待っていると考えられます コンソール入力を取得する命令を必要以上に行っていないか確認
次の入力を変換できませんでした (???) ??? を取得しようとして失敗している。コンソール入力を取得する命令を確認
期待された結果と異なります 出力された結果が期待された値と異なる。「期待された値」と「実際の値」を比較 (エラーメッセージが出力されているエリアの下のほうにあるバーをスクロールさせれば見ることができる) し確認。他にも直接プログラムを実行して結果を調べたり、エラーメッセージの2行目にあるat以下を参考にプログラムを見直す

機能テストのエラーメッセージから見るヒント

メッセージ テストの内容
期待された結果と異なります (M5) 繰り返す回数が-5
期待された結果と異なります (M1) 繰り返す回数が-1
期待された結果と異なります (0) 繰り返す回数が-0
期待された結果と異なります (1) 繰り返す回数が1、入力が100
期待された結果と異なります (5) 繰り返す回数が5、入力がそれぞれ-10.0, 0.0, 20.0, 70.5, -30.5

課題0403 (optional)

コンソールに積分区間(下端、上端の順)を入力させ、sin(x)を指定された積分区間でxについて定積分の近似を求めるプログラム TrapezoidRule.java をパッケージ j1.lesson04 に作成しなさい。

ただし、定積分の近似を求める際は、以下のアルゴリズムのどちらかを用いること。

テストは積分区間を10000分割した台形公式で求められた値で正解になるように作成されている(これ以上の精度であれば問題ない)。

コンソールへの入力要求は次のように表示する。

開始位置を入力:
終了位置を入力:

結果の表示は以下のようにする。

結果は x

ただし、xには指定された積分区間についてsin(x)のxに関する定積分を近似で求めた値を出力すること。

結果の例

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

開始位置を入力:0.0
終了位置を入力:3.1415926535
結果は1.9999999835506583

手順

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

  1. パッケージ j1.lesson04 にクラス TrapezoidRule を作成 (ファイル名は TrapezoidRule.javaとなる)
  2. クラス TrapezoidRule 内に throws IOException の指定をした mainメソッド (public static void main(String[] args) throws IOException { }) を作成
  3. テスト項目「Trapezoid に対する骨格テスト」をパス
  4. mainメソッド内に課題の内容を実装
  5. テスト項目「Trapezoid に対する機能テスト」をパス

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
クラスが存在しません j1.lesson04 に TrapezoidRule クラスが存在していない。パッケージやクラス名を確認
クラスがpublicで宣言されていません class の前に public の指定がない。
mainメソッドが存在しません public static void main(String[]) が存在していない。mainという名前やString[]の部分を確認
mainメソッドがpublicで宣言されていません mainメソッドを作る際に public が抜けている。
mainメソッドがstaticで宣言されていません mainメソッドを作る際に static が抜けている。
mainメソッドがvoidで宣言されていません mainメソッドを作る際に void 以外を指定している。
mainメソッドにthrows IOExceptionの指定がありません mainメソッドを作る際にthrows IOExceptionの指定を行っていない。

機能テスト

メッセージ 詳細
余計な入力を待っていると考えられます コンソール入力を取得する命令を3回以上行っていないか確認
次の入力を変換できませんでした (???) ??? を取得しようとして失敗している。コンソール入力を取得する命令を確認
期待された結果と異なります 出力された結果が期待された値と異なる。「期待された値」と「実際の値」を比較 (エラーメッセージが出力されているエリアの下のほうにあるバーをスクロールさせれば見ることができる) し確認。他にも直接プログラムを実行して結果を調べたり、エラーメッセージの2行目にあるat以下を参考にプログラムを見直す

機能テストのエラーメッセージから見るヒント

メッセージ テストの内容
期待された結果と異なります (ZeroZero) 積分区間が[0,0]
期待された結果と異なります (Zero2Pi) 積分区間が[0,2π]
期待された結果と異なります (2PiZero) 積分区間が[2π,0]
期待された結果と異なります (Zero2Pi) 積分区間が[0,2π]
期待された結果と異なります (M2PiZero) 積分区間が[-2π,0]
期待された結果と異なります (ZeroM2Pi) 積分区間が[0,-2π]
期待された結果と異なります (M2PiZero2Pi) 積分区間が[0,2π]
期待された結果と異なります (MPiPi) 積分区間が[-π,π]
期待された結果と異なります (PiMPi) 積分区間が[π,-π]
期待された結果と異なります (ZeroHalfPi) 積分区間が[0,π/2]
期待された結果と異なります (ZeroMHalfPi) 積分区間が[0,-π/2]
期待された結果と異なります (HalfPiPi) 積分区間が[π/2,π]
期待された結果と異なります (MHalfPiMPi) 積分区間が[-π/2,-π]
期待された結果と異なります (ZeroPi) 積分区間が[0,π]
期待された結果と異なります (ZeroMPi) 積分区間が[0,-π]
期待された結果と異なります (2PiPi) 積分区間が[2π,π]
期待された結果と異なります (M2PiMPi) 積分区間が[-2π,-π]
期待された結果と異なります (HalfPiZero) 積分区間が[π/2,0]
期待された結果と異なります (MHalfPiZero) 積分区間が[-π/2,0]
期待された結果と異なります (PiHalfPi) 積分区間が[π,π/2]
期待された結果と異なります (MPiMHalfPi) 積分区間が[-π,-π/2]
期待された結果と異なります (PiZero) 積分区間が[π,0]
期待された結果と異なります (MPiZero) 積分区間が[-π,0]
期待された結果と異なります (Pi2Pi) 積分区間が[π,2π]
期待された結果と異なります (MPiM2Pi) 積分区間が[-π,-2π]

課題0404 (optional)

自然対数の底eの近似をマクローリン展開によって求めるプログラム MaclaurinExpansion.java をパッケージ j1.lesson04 に作成しなさい。

この問題にはテストは用意されていない。Math.E という定数を用いて誤差を計算し、相対誤差が1%未満になるようにせよ。

ヒント

自然対数の底eの近似をマクローリン展開によって求めるには、以下の式を使用すればよい。項の数を増やせば増やすほど精度が高くなっていく。


また、相対誤差εは以下の式によって求まる。ただし、eは自然対数の底(Math.Eという定数を使う)を表し、xは計算によって求めた近似解である。


繰り返しの中で繰り返しを行うことができる。

for (int i = 0; i < m; i++) {
  for (int j = 0; j < n; j++) {
    System.out.println("(i, j) = (" + i + ", " + j +")");
  }
}

上記で、例えば m = 3, n = 2 であったとすると、以下のように表示される。

(i, j) = (0, 0)
(i, j) = (0, 1)
(i, j) = (1, 0)
(i, j) = (1, 1)
(i, j) = (2, 0)
(i, j) = (2, 1)

この問題では、前回の階乗の値を記憶しておくことによって1重の繰り返しのみでも計算できる。