プログラミング実習I : 課題 R3
目標
- 教科書の 4 章の前半(p.61 から p.75)の内容を理解し,繰り返しに関する基礎知識を得る
- for 文や while 文の使い方を学ぶ
R3_1
準備
- 教科書 p.61 から p.70 までをよく読み,4.1 節および 4.2 節の内容を理解する
課題
- 以下の質問とその回答( 1 〜 3 行程度 )をレポートにまとめよ(プログラムの作成は行わなくてよい).
- リスト 4.6 の ManyFigures.java を修正し,15 本の縦長の四角形を横並びで描画するにはどのようにしたらよいか?
- 以下を条件式で書くとどのようになるか?
- (a) \(x\) が 101 でない
- (b) \(x\) が偶数である
- ヒント: 剰余計算(\(x\) を \(y\) で割った時の余りの計算)を利用すればよい
- Java では 「\(x\) % \(y\)」で 「\(x\) を \(y\) で割った時の余り」を計算できる(例 13 % 3 → 1 となる)
- ヒント: 剰余計算(\(x\) を \(y\) で割った時の余りの計算)を利用すればよい
- (c) \(x\) が 13 より大きく,20 以下である.
- (d) \(x\) が,9 以下もしくは 15 以上である.
- (e) \(x\) が,10 以上 20 以下でかつ,奇数である.
- リスト 4.7 の RectLoop.java にある run メソッドが終了する時の \(x\) の値はいくつか?
- リスト 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 に変更する
- ※ R2 で行ったことと同様に,以下のことを行う必要があるので注意すること(以降の課題でも同様に行う必要があるが,説明は省く)
課題
- 準備で作成した RectLoop.java ( 縦長 の四角形を描画するプログラム)を修正し,以下の図のように, 横長 の四角形を描画するプログラム (RectLoop.java)を作成せよ.
- ただし,以下を満たすこと
- 1 つの while 文だけ用い,その while 文内でのみ fillRect メソッドを実行すること(リスト 4.9 と同じ)
- すべての四角形の幅と高さは,それぞれ 100 と 10 にすること
- すべての四角形の左上の \(x\) 座標は 50 とすること
- 一番上の四角形の左上の \(y\) 座標は 50 とすること
- 隣り合う四角形の左上の \(y\) 座標の間隔は \(d\) とすること
- \(d\) は,「学籍番号の下 1 ケタ」 + 20 とすること
- 例えば,学籍番号が 12345678 の場合,下 1 ケタは 8 となる
- \(d\) は,「学籍番号の下 1 ケタ」 + 20 とすること
- 一番下の四角形の左上の \(y\) 座標は 350 以下であること
- ただし,以下を満たすこと
図1: R3_2 で作成するプログラムで表示されるウィンドウの例(\(d = 20\))
R3_3
準備
- 教科書 p.71 から p.75 までをよく読み,4.3 節の内容を理解する
課題
- 以下の質問とその回答をレポートにまとめよ(プログラムの作成は行わなくてよい).
- 無限ループとはどのような状態か? ( 1 〜 3 行程度 )
- 以下のプログラムの for 文を,等価な while 文に変換するとどうなるか? また,コンソールに出力される値はいくつか?
注意事項
- 元々のプログラムで使っている変数だけを用いよ
- レポートには以下のプログラムをコピペして,それをベースにまとめよ
- 出力結果は,なるべく動作確認せずに,紙に書いたり,自分の頭で考えたりして答えよ
int sum = 0; for (int x = 1; x <= 10; x++) { sum += x; } System.out.println(sum);
- 以下のプログラムの 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 番から番号を付けることは 1 オリジン と呼ばれる
- 0 番から番号を付けることを 0 オリジン と呼び,プログラミングにおいては様々な理由でよく用いられる
- 以下の条件を満たすこと
- 1 つの for 文だけ用い,その for 文内でのみ fillRect メソッドを実行すること(リスト 4.13 と同じ)
- \(i\) 番目の四角形の高さは \(a \times i + 10\) とすること
- ※ \(a\) は「学籍番号の下 1 ケタ」 + 10 とする
- ※ 説明のために,描画される 10 個の四角形に対し,左から順番に,0 番,1 番, … , 9 番の番号が付いているとする
図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 文
- 以下の 2 つの for 文を用いるとよい
- 補足
- 次回の内容になるが for 文と if 文を組み合わせて解いても良い
図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番となっている
- 図 5 では,\(n = 6\) および \(m = 3\) としている
- この時,\(i\) 番目の四角形に対する縦横の位置(左から \(a\) 番目,上から \(b\) 番目)は,以下となる
- \(a\) は 「\(i\) を \(n\) で割った余り」となる
- \(b\) は 「\(i/n\) の整数部分」となる
- ※ \(a\) と \(b\) も 0 オリジンであること(0番目から始まっていること)に注意
- \(a\) と \(b\) から,\(i\) 番目の四角形の左上の座標 \((x, y)\) を計算する
- ※ 説明のために,描画される \(n\,m\) 個の四角形に対し,左上から右下にかけて順番に,図 5 のように,0 番,1 番, … , \(n\,m-1\) 番の番号が付いているとする
- 補足
- 上記のヒントは,次回のオプション課題を解くためのヒントにもなる
- 次回の内容になるが,for 文の中に for 文を書いても(2 重ループを用いても)解くことはできる
- こちらで解いてももちろん問題ない
- レポートには,以下の \(n\) と \(m\) を用いて実行した結果を貼り付けること
図4: R3_6 で作成するプログラムで表示されるウィンドウの例(\(n = 6\) および \(m = 3\))
図5: \(i\) 番目の四角形に対する縦横の位置(左から \(a\) 番目,上から \(b\) 番目)の例(\(n = 6\) および \(m = 3\))
R3_7 (オプション)
課題
- 図 6 のように,大きな円と,その回りに \(n\) 個の小さな円を等角度で描画するプログラム(OvalLoop.java) を作成せよ.
- ただし,以下を満たすこと
- 大きな円と小さな円の半径をそれぞれ変数 r1 および r2 で与えられるようにすること
- 大きな円と小さな円のそれぞれの円周がなるべく接するように描画すること
- ※ 図 6 のように,僅かに離れるのは問題ない
- 小さな円の数 \(n\) は 2 〜 10 の範囲で変えられるようにすること
- レポートには,\(n\) を以下の値に設定した場合の実行結果を載せること
- \(n\) = (学籍番号を 5 で割った余り) + 6
- 参考
- 小さな円を描画する際に用いる左上座標の計算するためには,Math クラスにある三角関数を使うこと
- 補足
- 等角度の意味
- 図 7 に示すような,大きな円の中心点と小さな円の各中心点を通る直線(放射線)を考える
- 隣り合う 2 つの放射線から成る中心角がすべて等しい時,等角度であるとする
- 等角度の意味
- ただし,以下を満たすこと
図6: R3_7 で作成するプログラムで表示されるウィンドウの例(小さな円の個数 \(n = 7\) の場合)
図7: R3_7 で作成するプログラムの実行結果に放射線を追加したもの(小さな円の個数 \(n = 7\) の場合)