プログラミング実習I : 課題 R4
目標
- 教科書にはないが,繰り返しの入れ子(多重ループ)に関する基礎知識を得る
- 教科書の 4 章の後半(p.76 から p.83)の内容を理解し,条件判断に関する基礎知識を得る
- if 文の使い方を学ぶ
- if 文と for 文を組み合わせた使い方を学ぶ
R4_1
準備
課題
- 準備で作成した RectLoop.java を修正し,以下の図のように,四角形の色がグラデーションして描画されるプログラム(RectLoop.java) を作成せよ.
- 左上が最も暗く,右下が最も明い色になる
- 図 1 の 2 重の for 文内において \(i+j\) が等しい場合の四角形の色は全て同じ色となるようにすればよい
- 図に示す例では,緑をベースとしたグラデーションにしているが,そのようにする必要はない
- 自分の好きな色でグラデーションさせてみよ
- 参考: RGB の色をスライダーで作成する
- setColor に指定する 3 つの引数(赤成分,緑成分,青成分)を変化さた時の色の変化を上記のページで確認できる
- 好きな色を setColor で指定する際の参考になる
- 参考: カラーコードの一覧
- それぞれの色に対してどのような赤緑青成分を指定すればよいかが一覧でまとまってる
- 左上が最も暗く,右下が最も明い色になる
図3: R4_1 で作成するプログラムで表示されるウィンドウの例
R4_2
準備
- 教科書 p.76 から p.83 までをよく読み,4.4 節の内容を理解する
- ※ 教科書にあるリスト 4.15 から 4.17 のコメント中にある「i < 8」 は,正しくは 「i < 9」であることに注意
- リスト 4.14 の基づく RectIf.java を作成し,実行する
- ※ RectIf.java には,RectIf クラスを呼び出す main メソッドを追加すること
課題
- 準備で作成した RectIf.java を修正し,以下の条件を満たすように 10 個の四角形を描画するプログラム(RectIf.java) を作成せよ.
- 条件
- (a) for 文内の \(i\) が偶数である場合 → 左上の y 座標が 100 の四角形を描画
- (b) for 文内の \(i\) が奇数である場合 → 左上の y 座標が 80 の四角形を描画
- 注意事項
- ※ 四角形の x 座標,横幅,高さおよび色は,リスト 4.14 のものをそのまま用いよ
- 条件
図4: R4_2 で作成するプログラムで表示されるウィンドウの例
R4_3
準備
- R4_2 で作成した RectIf.java の run メソッドの開始直後に,以下の図のように 「setSize(500, 400);」 を追加せよ
- ※ setSize はウィンドウのサイズを変更するメソッド
- ※ 課題で作成するプログラムでは,ウィンドウサイズを 500x400 に変更しないと描画する全ての四角形が見えない
図5: run メソッドの開始直後で setSize を実行する例
課題
- 準備で作成した RectIf.java を修正し,以下の条件を満たす 20 個の四角形を描画するプログラム(RectIf.java) を作成せよ.
- 条件
- (a) for 文内の \(i\) が 15 の倍数である場合
- → 高さが \(25 \times a + 10\) の四角形を描画
- (b) 条件 (a) を満たさず,for 文内の \(i\) が 5 の倍数である場合
- → 高さが \(18 \times a + 10\) の四角形を描画
- (c) 条件 (a) および (b) を満たさず,for 文内の \(i\) が 3 の倍数である場合
- → 高さが \(10 \times a + 10\) の四角形を描画
- (d) 上記の条件を全て満たさない場合
- → 高さが \(10\) の四角形を描画
- ※ if, else if および else を用い,その際に条件式がなるべく簡単になるようにすること
- ※ 四角形の高さの違いが比較しやすいように,すべての四角形の左上の y 座標は同じにすること
- (a) for 文内の \(i\) が 15 の倍数である場合
- 注意事項
- ※ \(a\) は学籍番号の下 1 ケタとする(下 1 ケタが 0 である場合は,\(a = 10\) とすること)
- ※ \(i = 0\) の時は,条件 (a) が満たされることに注意すること
- そのため,\(i = 0\) 時の四角形の高さは \(25 \times a + 10\) となる
- 条件
図6: R4_3 で作成するプログラムで表示されるウィンドウの例 (\(a = 5\) の場合)
R4_4
課題
- R4_1 で示したサンプルの RectLoop.java を修正し,以下の条件を満たすように四角形を描画するプログラム(RectLoop.java) を作成せよ
- ※ setColor に与える(赤成分,緑成分,青成分)のことを RGB 値と呼ぶことにする
- 条件(※ ただし,\(c\) は 200 前後の好きな整数でよい)
- (a) 多重の for 文内で \(i+j\) が 6 の倍数の場合
- → RGB 値が \((c, 0, 0)\) である色の四角形を描画
- (b) 条件 (a) を満たさず,多重の for 文内で \(i+j\) が 3 の倍数の場合
- → RGB 値が \((0, c, 0)\) の色の四角形を描画
- (c) 条件 (a) および (b) を満たさず,多重の for 文内で \(i+j\) が 2 の倍数の場合
- → RGB 値が \((0, 0, c)\) の色の四角形を描画
- (d) 上記の条件を全て満たさない場合
- → RGB 値が \((c, c, c)\) の色の四角形を描画
- (a) 多重の for 文内で \(i+j\) が 6 の倍数の場合
- 注意事項
- ※ R4_3 と同様に,if,if else および else を用い,その際に条件式がなるべく簡単になるように書くこと
- ※ \(i+j = 0\) の時は,条件 (a) が満たされることに注意すること
- そのため,\(i+j = 0\) の時は,RGB 値が \((c, 0, 0)\) である色の四角形が描画されることになる
図7: R4_4 で作成するプログラムで表示されるウィンドウの例 (\(c = 190\) の場合)
R4_5 (オプション)
課題
- R4_1 や R4_4 で作成した RectLoop.java を修正し,以下の図のように垂線(x 軸に垂直な直線)を中心に対称に四角形を描画するプログラム(RectLoop.java) を作成せよ.
- ※ 図 8 では,説明のしやすさのためにウィンドウの中心を通る垂線を描画している
- 作成するプログラムでは垂線を描画する必要はない
- ※ 説明のために,表示される縦方向の位置によって,上から 0 段目,1段目,…, n-1 段目と番号が付けられているとする(注:0 オリジン)
- 図 8 の例では,0 段から 9 段まで存在し,それぞれの番号を表示している
- 実行結果の理解しやすさのために,段の番号を表示しているが,作成するプログラムでは表示する必要はない
- 作成するプログラムでは,以下の条件を満たすこと
- 全ての四角形が表示されるように,垂線の x 座標が適切に設定されていること
- 変数を用いて垂線の x 座標が指定できるようにし,全ての四角形が表示されない場合は,垂線の位置を調整可能なようにしておくとよい
- 段の数 \(n\) が指定でき,指定された \(n\) での描画が行えること
- \(i\) 段目には,\(i + 1\) 個の四角形を描画すること \((i = 0, ..., n-1)\)
- それぞれの四角形の色が,ある座標 \((p, q)\) からの距離に応じてグラデーションするように描画すること
- ※ 四角形の中でグラデーションさせる必要はない
- \((p, q)\) から四角形の左上までの距離で,四角形の色を決めればよい
- ※ 図 8 では,ウィンドウの左上 \((0, 0)\) から遠くなるほど色が暗くなるように描画している
- ※ 四角形の中でグラデーションさせる必要はない
- 全ての四角形が表示されるように,垂線の x 座標が適切に設定されていること
- レポートでは,座標 \((p, q)\) として以下を用いた結果を貼り付けよ (※ \(k\) は,学籍番号を 4 で割った余り)
- \(k = 0\) の場合 → \((p, q) = (0, 0)\) (ウィンドウの左上)
- \(k = 1\) の場合 → \((p, q) = (0, 400)\) (ウィンドウの左下)
- \(k = 2\) の場合 → \((p, q) = (400, 400)\) (ウィンドウの右下)
- \(k = 3\) の場合 → \((p, q) = (400, 0)\) (ウィンドウの右上)
- また,レポートでは,距離や色をどのように計算したかを簡単にまとめること
- ※ 図 8 では,説明のしやすさのためにウィンドウの中心を通る垂線を描画している
図8: R4_5 で作成するプログラムで表示されるウィンドウの例 (段の数 \(n = 10\) で,\((0, 0)\) から遠いほど暗くなる)
R4_6 (オプション)
- 以下の図のように,自分の誕生年月のカレンダ(自分の誕生日を含む,月めくりカレンダーの 1 ヶ月分)を描画するプログラム(Cal.java) を作成せよ.
- 注意事項
- ※ 下の図では誕生年月日を 1999 年 4 月 25 日としている
- ※ 誕生年月以外の年月のカレンダは描画できなくてもよい
- ※ 描画の際に,祝日は考慮しなくてよい
- ※ 誕生日をいつに設定したかをレポートに記載すること
- 誕生日を知られたくない場合は,適当な日付を誕生日に設定すること
- 誕生年月のカレンダを描画する際に,以下の条件を満たすこと
- 一週間の日付を日曜日始まりで描画すること
- 誕生日の日付は,赤・青・黒以外の好きな色で描画すること
- 下の図では誕生日をオレンジで表示している
- 誕生日でない日曜日の日付は,赤で描画すること
- ※ 赤の RGB 値(255, 0, 0)
- 誕生日でない土曜日の日付は,青で描画すること
- ※ 青の RGB 値(0, 0, 255)
- 誕生日でない月曜日〜金曜日の日付は,黒で描画すること
- ※ 黒の RGB 値(0, 0, 0)
- 上記の条件を満たすために,run メソッドの中で,for 文を 1 つだけ用いること
- ヒント
- 注意事項
図9: R4_6 で作成するプログラムで表示されるウィンドウの例(※誕生年月日を「1999年 4月 25日」としている)
R4_7 (オプション)
課題
- 図 10 のように,\(n\) 個の四角形を以下の色でそれぞれ描画するプログラム(Prime.java) を作成せよ.
- ※ 説明のために,\(n\) 個の四角形には 0 番から \(n-1\) 番までの番号が付けられているものとする
- ※ 図 10 では,\(n = 150\) (番号の最大値は 149) とした時の実行結果を表している
- この図では,各四角形の番号が分かりやすいように,四角形の番号 \(i\) の 1 の位と 10 の位以上をそれぞれ上と左に表示しているが,作成するプログラムでは表示しなくてもよい
- 以下の条件を満たすこと
- レポートには,\(n\) を以下の値で与えた場合の実行結果(スクリーンショット)を貼り付けること
- \(n\) = (学籍番号の下 2 ケタ) + 50
- ヒント
- 以下の手順を行うと,2 以上の番号が素数とそうでない場合で色分けできる
- まず,\(0\) と \(1\) 番の四角形を★色で描画する
- 次に,\(2\) から \(n-1\) 番までのすべての四角形を黒で描画する
- 次に,\(2^2\) 以上 \(n-1\) 以下のすべての \(2\) の倍数 \((2\,j)\) の番号に対応する四角形の上に★色の四角形を描画する
- 次に,\(3^2\) 以上 \(n-1\) 以下のすべての \(3\) の倍数 \((3\,j)\) の番号に対応する四角形の上に★色の四角形を描画する
- \(\vdots\)
- 最後に,\(m^2\) 以上 \(n-1\) 以下のすべての \(m\) の倍数 \((m\,j)\) の番号に対応する四角形の上に★色の四角形を描画する
- ただし,\(m\) は \(m^2 \le n-1\) を満たす最大の整数
- \(n = 150\) の時 → \(m = 12\)
- ただし,\(m\) は \(m^2 \le n-1\) を満たす最大の整数
- 以下の手順を行うと,2 以上の番号が素数とそうでない場合で色分けできる
- 考察のポイント
- 「エラトステネスのふるい」を調べて,なぜ,上記の手順でうまくいくのかを考えてみよ
図10: R4_7 で作成するプログラムで表示されるウィンドウの例 (\(n = 150\) の場合)
図11: それぞれの四角形の番号 \(i\) と描画位置