プログラミング実習I : 課題 R4

目次

目標

  • 教科書にはないが,繰り返しの入れ子(多重ループ)に関する基礎知識を得る
  • 教科書の 4 章の後半(p.76 から p.83)の内容を理解し,条件判断に関する基礎知識を得る
    • if 文の使い方を学ぶ
    • if 文と for 文を組み合わせた使い方を学ぶ

R4_1

準備

  • 前回の R3_4 もしくは R3_5 で作成した RectLoop.java を以下のものに変更し,実行せよ.
    • 1 に示す RectLoop.java を実行すると,図 2 のように 10 個×10個(合計 100 個の四角形が描画示される)
    • このように,for 文を入れ子のようにして使った繰り返しのことを 多重ループ と呼ぶ
      • 入れ子にした分だけ,インデントを入れる(「タブ」キーで行頭に隙間を入れる)

R4_1_samplecode.png

図1: 多重ループのサンプルコード

R4_1_sample.png

図2: 上記のサンプルプログラムで表示されるウィンドウの例

課題

  • 準備で作成した RectLoop.java を修正し,以下の図のように,四角形の色がグラデーションして描画されるプログラム(RectLoop.java) を作成せよ.
    • 左上が最も暗く,右下が最も明い色になる
      • 1 の 2 重の for 文内において \(i+j\) が等しい場合の四角形の色は全て同じ色となるようにすればよい
    • 図に示す例では,緑をベースとしたグラデーションにしているが,そのようにする必要はない
      • 自分の好きな色でグラデーションさせてみよ
      • 参考: RGB の色をスライダーで作成する
        • setColor に指定する 3 つの引数(赤成分,緑成分,青成分)を変化さた時の色の変化を上記のページで確認できる
        • 好きな色を setColor で指定する際の参考になる
      • 参考: カラーコードの一覧
        • それぞれの色に対してどのような赤緑青成分を指定すればよいかが一覧でまとまってる

R4_1.png

図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 のものをそのまま用いよ

R4_2.png

図4: R4_2 で作成するプログラムで表示されるウィンドウの例

R4_3

準備

  • R4_2 で作成した RectIf.java の run メソッドの開始直後に,以下の図のように 「setSize(500, 400);」 を追加せよ
    • ※ setSize はウィンドウのサイズを変更するメソッド
    • ※ 課題で作成するプログラムでは,ウィンドウサイズを 500x400 に変更しないと描画する全ての四角形が見えない

R4_3_samplecode.png

図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\) は学籍番号の下 1 ケタとする(下 1 ケタが 0 である場合は,\(a = 10\) とすること)
      • ※ \(i = 0\) の時は,条件 (a) が満たされることに注意すること
        • そのため,\(i = 0\) 時の四角形の高さは \(25 \times a + 10\) となる

R4_3.png

図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)\) の色の四角形を描画
    • 注意事項
      • ※ R4_3 と同様に,if,if else および else を用い,その際に条件式がなるべく簡単になるように書くこと
      • ※ \(i+j = 0\) の時は,条件 (a) が満たされることに注意すること
        • そのため,\(i+j = 0\) の時は,RGB 値が \((c, 0, 0)\) である色の四角形が描画されることになる

R4_4.png

図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)\) から遠くなるほど色が暗くなるように描画している
    • レポートでは,座標 \((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)\) (ウィンドウの右上)
    • また,レポートでは,距離や色をどのように計算したかを簡単にまとめること

R4_5.png

図8: R4_5 で作成するプログラムで表示されるウィンドウの例 (段の数 \(n = 10\) で,\((0, 0)\) から遠いほど暗くなる)

R4_6 (オプション)

  • 以下の図のように,自分の誕生年月のカレンダ(自分の誕生日を含む,月めくりカレンダーの 1 ヶ月分)を描画するプログラム(Cal.java) を作成せよ.
    • 注意事項
      • ※ 下の図では誕生年月日を 1999 年 4 月 25 日としている
      • ※ 誕生年月以外の年月のカレンダは描画できなくてもよい
      • ※ 描画の際に,祝日は考慮しなくてよい
      • ※ 誕生日をいつに設定したかをレポートに記載すること
        • 誕生日を知られたくない場合は,適当な日付を誕生日に設定すること
    • 誕生年月のカレンダを描画する際に,以下の条件を満たすこと
      1. 一週間の日付を日曜日始まりで描画すること
      2. 誕生日の日付は,赤・青・黒以外の好きな色で描画すること
        • 下の図では誕生日をオレンジで表示している
      3. 誕生日でない日曜日の日付は,赤で描画すること
        • ※ 赤の RGB 値(255, 0, 0)
      4. 誕生日でない土曜日の日付は,青で描画すること
        • ※ 青の RGB 値(0, 0, 255)
      5. 誕生日でない月曜日〜金曜日の日付は,黒で描画すること
        • ※ 黒の RGB 値(0, 0, 0)
      6. 上記の条件を満たすために,run メソッドの中で,for 文を 1 つだけ用いること
    • ヒント
      • 誕生年月の月初めの曜日を調べるには?
        • インターネットでカレンダを検索する → 参考
        • Java の Calendar クラスを活用してみる → 参考
      • 日付をどのように描画していくか?
        • 日付 d が 1, 2, 3, …, と変化する for 文を書き,土曜日の日付を表示した後に改行されるようにすればよい
          • for 文の中に if 文を追加しても改行できるが,R3_6 のヒントを参考にしてもできる

R4_6.png

図9: R4_6 で作成するプログラムで表示されるウィンドウの例(※誕生年月日を「1999年 4月 25日」としている)

R4_7 (オプション)

課題

  • 10 のように,\(n\) 個の四角形を以下の色でそれぞれ描画するプログラム(Prime.java) を作成せよ.
    • ※ 説明のために,\(n\) 個の四角形には 0 番から \(n-1\) 番までの番号が付けられているものとする
    • ※ 図 10 では,\(n = 150\) (番号の最大値は 149) とした時の実行結果を表している
      • この図では,各四角形の番号が分かりやすいように,四角形の番号 \(i\) の 1 の位と 10 の位以上をそれぞれ上と左に表示しているが,作成するプログラムでは表示しなくてもよい
    • 以下の条件を満たすこと
      • 四角形を描画する際の色は以下とすること
        • 番号 \(i\) が素数である四角形 → 黒で描画する
        • それ以外の四角形 → 黒と白以外の見やすい色(以降では★色とする)で描画する
          • ※ 図 10 では,RGB 値が (0,150,150) となる色を★色として描画している
      • 11 のように,一番左上から 0 番,1 番,2 番, … と順番に四角形を描画し,10 個ずつ折り返すこと
        • この図には,青い文字で各四角形の番号 \(i\) を表示している
      • \(n\) が 50 から 150 の範囲で変えられるようにすること
    • レポートには,\(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\)
  • 考察のポイント
    • 「エラトステネスのふるい」を調べて,なぜ,上記の手順でうまくいくのかを考えてみよ

R4_7.png

図10: R4_7 で作成するプログラムで表示されるウィンドウの例 (\(n = 150\) の場合)

R4_7_h.png

図11: それぞれの四角形の番号 \(i\) と描画位置

著者: Yusuke Sakumoto

Created: 2023-10-10 火 14:23

Validate