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

目次

目標

  • 教科書の 4 章の前半(p.61 から p.75)の内容を理解し,繰り返しに関する基礎知識を得る
    • for 文や while 文の使い方を学ぶ

R3_1

準備

  • 教科書 p.61 から p.70 までをよく読み,4.1 節および 4.2 節の内容を理解する

課題

  • 以下の質問とその回答( 1 〜 3 行程度 )をレポートにまとめよ(プログラムの作成は行わなくてよい).
    1. リスト 4.6 の ManyFigures.java を修正し,15 本の縦長の四角形を横並びで描画するにはどのようにしたらよいか?
    2. 以下を条件式で書くとどのようになるか?
      • (a) \(x\) が 101 でない
      • (b) \(x\) が偶数である
        • ヒント: 剰余計算(\(x\) を \(y\) で割った時の余りの計算)を利用すればよい
          • Java では 「\(x\) % \(y\)」で 「\(x\) を \(y\) で割った時の余り」を計算できる(例 13 % 3 → 1 となる)
      • (c) \(x\) が 13 より大きく,20 以下である.
      • (d) \(x\) が,9 以下もしくは 15 以上である.
      • (e) \(x\) が,10 以上 20 以下でかつ,奇数である.
    3. リスト 4.7 の RectLoop.java にある run メソッドが終了する時の \(x\) の値はいくつか?
    4. リスト 4.7 の RectLoop.java を修正し,\(x\) が 100 以上でかつ 400 より小さい間,縦長の四角形を繰り返し描画するためにはどのようにしたらいいか?

R3_2

準備

  • リスト 4.8 およびリスト 4.9 の内容に基づく RectLoop.java を作成し,実行せよ
    • ※ R2 で行ったことと同様に,以下のことを行う必要があるので注意すること(以降の課題でも同様に行う必要があるが,説明は省く)
      • RectLoop.java (リスト 4.9) に Start.java (リスト 4.8) の main メソッドを追加する
      • MyFrame となっているところを MyFrame2 に変更する

課題

  • 準備で作成した RectLoop.java ( 縦長 の四角形を描画するプログラム)を修正し,以下の図のように, 横長 の四角形を描画するプログラム (RectLoop.java)を作成せよ.
    • ただし,以下を満たすこと
      • 1 つの while 文だけ用い,その while 文内でのみ fillRect メソッドを実行すること(リスト 4.9 と同じ)
      • すべての四角形の幅と高さは,それぞれ 100 と 10 にすること
      • すべての四角形の左上の \(x\) 座標は 50 とすること
      • 一番上の四角形の左上の \(y\) 座標は 50 とすること
      • 隣り合う四角形の左上の \(y\) 座標の間隔は \(d\) とすること
        • \(d\) は,「学籍番号の下 1 ケタ」 + 20 とすること
          • 例えば,学籍番号が 12345678 の場合,下 1 ケタは 8 となる
      • 一番下の四角形の左上の \(y\) 座標は 350 以下であること

R3_2.png

図1: R3_2 で作成するプログラムで表示されるウィンドウの例(\(d = 20\))

R3_3

準備

  • 教科書 p.71 から p.75 までをよく読み,4.3 節の内容を理解する

課題

  • 以下の質問とその回答をレポートにまとめよ(プログラムの作成は行わなくてよい).
    1. 無限ループとはどのような状態か? ( 1 〜 3 行程度 )
    2. 以下のプログラムの for 文を,等価な while 文に変換するとどうなるか? また,コンソールに出力される値はいくつか?
      • 注意事項

        • 元々のプログラムで使っている変数だけを用いよ
        • レポートには以下のプログラムをコピペして,それをベースにまとめよ
        • 出力結果は,なるべく動作確認せずに,紙に書いたり,自分の頭で考えたりして答えよ
        int sum = 0;
        for (int x = 1; x <= 10; x++) {
            sum += x;
        }
        System.out.println(sum);
        
    3. 以下のプログラムの while 文を,等価な for 文に変化するとどうなるか? また,コンソールに出力される値はいくつか?
      • 注意事項

        • 元々のプログラムで使っている変数だけを用いよ
        • レポートには以下のプログラムをコピペして,それをベースにまとめよ
        • 出力結果は,なるべく動作確認せずに,紙に書いたり,自分の頭で考えたりして答えよ
        int sum = 0, x = 12;
        while (x > 0) {
            sum += x;
            x -= 2;
        }
        System.out.println(sum);
        

R3_4

準備

  • リスト 4.8 およびリスト 4.13 の内容に基づく RectLoop.java を作成し,実行せよ.

課題

  • 準備で作成した RectLoop.java を修正し,以下の図のように,異なる高さを持つ 10 個の四角形を描画するプログラム(RectLoop.java) を作成せよ.
    • ※ 説明のために,描画される 10 個の四角形に対し,左から順番に,0 番,1 番, … , 9 番の番号が付いているとする
      • 0 番から番号を付けることを 0 オリジン と呼び,プログラミングにおいては様々な理由でよく用いられる
        • 1 番から番号を付けることは 1 オリジン と呼ばれる
          • 教科書(特に,p.63 ページの 2 行目あたり) では 1 オリジンで説明している場合もあり,注意する必要がある
        • 参考: オリジンについて
    • 以下の条件を満たすこと
      • 1 つの for 文だけ用い,その for 文内でのみ fillRect メソッドを実行すること(リスト 4.13 と同じ)
      • \(i\) 番目の四角形の高さは \(a \times i + 10\) とすること
        • ※ \(a\) は「学籍番号の下 1 ケタ」 + 10 とする

R3_4.png

図2: R3_4 で作成するプログラムで表示されるウィンドウの例(\(a = 10\))

R3_5

課題

  • R3_4 で作成した RectLoop.java を修正し,以下の図のような高さを持つ 10 個の四角形を描画するプログラム(RectLoop.java) を作成せよ.
    • ※ 説明のために,R3_4 と同様に,描画される 10 個の四角形に対し,左から順番に,0 番,1 番, … , 9 番の番号が付いているとする
    • 以下の条件を満たすこと
      • 2 個以下の for 文を用い,それら for 文内でのみ fillRect メソッドを実行すること(☆)
      • \(i\) 番目の四角形の高さは,以下とすること
        • \(i = 0\) から \(4\) の時,\(i\) 番目の四角形の高さは,\(a \times i + 10\) とする
        • \(i = 5\) から \(9\) の時,\(i\) 番目の四角形の高さは,\(a \times (9 - i) + 10\) とする
        • ※ \(a\) は「学籍番号の下 1 ケタ」 + 10 とする
        • ※ 例えば 0 番目と 9 番目の四角形の高さは同じとなる
    • ヒント
      • 以下の 2 つの for 文を用いるとよい
        • 0 番目〜 4 番目までの四角形を描画する for 文
        • 5 番目〜 9 番目までの四角形を描画する for 文
    • 補足
      • 次回の内容になるが for 文と if 文を組み合わせて解いても良い

R3_5.png

図3: R3_5 で作成するプログラムで表示されるウィンドウの例 (\(a = 10\))

R3_6 (オプション)

課題

  • R3_4 もしくは R3_5 で作成した RectLoop.java を修正し,図 4 のように,横 \(n\) 個 ×縦 \(m\) 個の四角形を描画するプログラム(RectLoop.java) を作成せよ.
    • レポートには,以下の \(n\) と \(m\) を用いて実行した結果を貼り付けること
      • \(n\) : 「学籍番号の下位ケタから 2 ケタ目の数字」 + 3 (例:12345678 の場合 → 7 + 3 = 10)
      • \(m\) : 「学籍番号の下位ケタから 1 ケタ目の数字」 + 3 (例:12345678 の場合 → 8 + 3 = 11)
    • ヒント(1 つの for 文で行う方法)
      • ※ 説明のために,描画される \(n\,m\) 個の四角形に対し,左上から右下にかけて順番に,図 5 のように,0 番,1 番, … , \(n\,m-1\) 番の番号が付いているとする
        • 5 では,\(n = 6\) および \(m = 3\) としている
          • そのため,四角形の番号は 0 番 〜 17番となっている
      • この時,\(i\) 番目の四角形に対する縦横の位置(左から \(a\) 番目,上から \(b\) 番目)は,以下となる
        • \(a\) は 「\(i\) を \(n\) で割った余り」となる
        • \(b\) は 「\(i/n\) の整数部分」となる
        • ※ \(a\) と \(b\) も 0 オリジンであること(0番目から始まっていること)に注意
      • \(a\) と \(b\) から,\(i\) 番目の四角形の左上の座標 \((x, y)\) を計算する
    • 補足
      • 上記のヒントは,次回のオプション課題を解くためのヒントにもなる
      • 次回の内容になるが,for 文の中に for 文を書いても(2 重ループを用いても)解くことはできる
        • こちらで解いてももちろん問題ない

R3_6.png

図4: R3_6 で作成するプログラムで表示されるウィンドウの例(\(n = 6\) および \(m = 3\))

R3_6_h.png

図5: \(i\) 番目の四角形に対する縦横の位置(左から \(a\) 番目,上から \(b\) 番目)の例(\(n = 6\) および \(m = 3\))

R3_7 (オプション)

課題

  • 6 のように,大きな円と,その回りに \(n\) 個の小さな円を等角度で描画するプログラム(OvalLoop.java) を作成せよ.
    • ただし,以下を満たすこと
      • 大きな円と小さな円の半径をそれぞれ変数 r1 および r2 で与えられるようにすること
      • 大きな円と小さな円のそれぞれの円周がなるべく接するように描画すること
        • ※ 図 6 のように,僅かに離れるのは問題ない
      • 小さな円の数 \(n\) は 2 〜 10 の範囲で変えられるようにすること
    • レポートには,\(n\) を以下の値に設定した場合の実行結果を載せること
      • \(n\) = (学籍番号を 5 で割った余り) + 6
    • 参考
    • 補足
      • 等角度の意味
        • 7 に示すような,大きな円の中心点と小さな円の各中心点を通る直線(放射線)を考える
        • 隣り合う 2 つの放射線から成る中心角がすべて等しい時,等角度であるとする

R3_7.png

図6: R3_7 で作成するプログラムで表示されるウィンドウの例(小さな円の個数 \(n = 7\) の場合)

R3_7_1.png

図7: R3_7 で作成するプログラムの実行結果に放射線を追加したもの(小さな円の個数 \(n = 7\) の場合)

著者: Yusuke Sakumoto

Created: 2023-10-10 火 14:22

Validate