第26週目課題

課題2601

下記の式で表されるロジスティック写像の n 番目の X を求めるクラス ChaosGenerator クラスをパッケージ j2.lesson13 に作成しなさい。


ただし、a, X0 はそれぞれ


とする。

上記 Xn は n が変化するたびに複雑な値をとる。n が 0 から 199 まで変化する間に、Xn の値は次のように非周期的で複雑な振る舞いを見せる。


ここで作成するクラス ChaosGenerator は java.lang.Runnable インターフェースを実装し、次のようなコンストラクタ、メソッドを持つこと。

run() メソッドの実行中に、実行しているスレッドに対して割り込みが掛けられた場合、0.5 秒以内に計算を打ち切ってこのメソッドの実行を中止すること

必要ならば、メソッドに synchronized を修飾してもよい。

実行例

X10000 を計算するには、次のような main メソッドを用意すればよい。

public static void main(String[] args) {
    ChaosGenerator chaos = new ChaosGenerator(10000);
    chaos.run();
    System.out.println("X10000 = " + chaos.getResult());
}

このプログラムを実行すると、次のように表示される (浮動小数点の精度の問題で、結果が異なる場合がある)。

X10000 = 0.8646700012330764

手順

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

  1. 詳細な擬似コードを作成する
  2. パッケージ j2.lesson13 にクラス ChaosGenerator を作成
  3. 必要なインターフェースを実装する
  4. 必要なコンストラクタ、メソッドを用意する
  5. テスト項目「ChaosGeneratorに対する骨格テスト」をパス
  6. 各コンストラクタやメソッドにプログラムを書く
  7. テスト項目「ChaosGeneratorに対する単体テスト」をパス

テストの失敗メッセージ

骨格テスト

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

単体テスト

メッセージ 詳細
期待された結果と異なります (メソッド名)を起動した結果が期待された結果と異なる。テスト項目を参照

単体テストの項目

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

項目名 詳細
run_normal_<n> new ChaosGenerator(n).run(), getResult()
run_max new ChaosGenerator(2147483647).run() を別スレッドで実行し、0.2 秒後に interrupt, 0.5 秒後にスレッドが生きているか判定
isFinished_runless new ChaosGenerator(n), isFinished() (run() を呼び出していない)
isFinished_ran new ChaosGenerator(n), run(), isFinished() (run() を呼び出している)

ヒント

InterruptedException がスローされるのは、Thread.sleep, Thread.join, Object.wait を実行したときである。

割り込まれているかどうか調べるには、java.lang.Thread のクラスメソッド interrupted() メソッドを使用する方法などがある。

課題2602

下記の擬似コードで表されるプログラム ChaosAction クラスをパッケージ j2.lesson13 に作成しなさい。

print "正の整数を入力:"
n = コンソール入力 (int)
if 入力された値が整数でない、または入力された値が 0 未満
    print "正の整数を入力してください", 改行
    return
chaos = new ChaosGenerator(n)
chaos.run() を最大で3秒間だけ実行
if chaos.run() の実行が約 3 秒以内に終了した
    print n + "番目の値は" + chaos.getResult(), 改行
else
    print "時間内に計算できませんでした", 改行

上記の擬似コードに相当するプログラムは、ChaosAction クラスの main メソッド内に記述すること。

また、「chaos.run() を最大で3秒間だけ実行」の部分は、3 秒以内に run() メソッドの実行が完了した場合、直ちに以降のプログラムを実行すること (毎回無駄に3秒待ったりしない)。

手順

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

  1. 詳細な擬似コードを作成する
  2. パッケージ j2.lesson13 にクラス ChaosAction を作成
  3. main メソッドを作成する
  4. アクションを記述するために必要なクラスが他にあれば、そちらも作成する
  5. テスト項目「ChaosActionに対する骨格テスト」をパス
  6. 各コンストラクタやメソッドにプログラムを書く
  7. テスト項目「ChaosActionに対する機能テスト」をパス

ヒント

java.lang.Thread クラスには、授業で紹介しなかった有用なメソッドが多数ある。

この問題では、引数をとる join メソッドを使用するとよい。

テストの失敗メッセージ

骨格テスト

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

機能テスト

メッセージ 詳細
期待された結果と異なります 出力された結果が期待された値と異なる。「期待された値」と「実際の値」を比較し確認。他にも直接プログラムを実行して結果を調べたり、エラーメッセージの2行目にあるat以下を参考にプログラムを見直す

機能テストの項目

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

項目名 詳細
main_aaa 入力に "aaa"
main_M10 入力に "-10"
main_M1 入力に "-1"
main_0 入力に "0"
main_2 入力に "2"
main_4 入力に "4"
main_max 入力に "2147483647"

課題2603 (optional)

アナログ時計を表示するプログラム AnalogClock クラスをパッケージ j2.lesson13 に作成しなさい。

このプログラムは、実行すると下図のように現在時刻をアナログ時計のように表示する (下図は 10時10分35秒)。


このプログラムは、毎秒ごとに時計の表示を更新し、最新時刻を表示し続ける (サンプル)。

この時計のレイアウトはどのように行ってもよいが、短針、長針、秒針は必ず表示すること。また、その表示によって時刻が明らかになるようにデザインすること。

このクラスには main メソッドを用意し、それを実行することによって上記のような時計を表示すること。

課題2604 (optional)

スレッドを使用し、何かアプリケーションを一つ作成せよ。