プログラミング実習I : 課題 R2
目標
- 教科書の 2 章の 2.5 節以降の内容を理解し,Java のオブジェクトに関する基礎知識を得る
- 教科書の 3 章の内容を理解し,ウィンドウの作成や図形の描画方法を学ぶ
R2_1
準備
- 教科書 p.39 から p.46 までをよく読み,2.5 節 および 2.6 節の内容を理解する
課題
- 以下の質問とその回答( 1 〜 3 行程度 )をレポートにまとめよ(プログラムの作成は行わなくてよい).
- MyFrame 型のオブジェクト(モノ)を用いるとどのようなことができるか? 教科書でどのように説明されていたか答えよ.
- new とはどういう演算子か?
- null とはどういう意味か?
- extends を用いるとどのようなことができるか?
- 「クラス」と「継承」という用語を用いて説明せよ
- MyFrame 型の setLocation や setSize はどのような命令か?
- それぞれの命令に与えられる数値がどのような意味を持っているか分かるように答えよ.
- リスト 2.22 の RectFrame とリスト 2.23 の Start はどのような関係にあるか答えよ
- リスト 2.22 で追加された public void run () {…} の「…」 の部分がどういう意味を持つか想像して答えよ
- リスト 2.22 にある fillRect とはどのような命令か?
- 命令に与えられる数値がどのような意味を持っているかを想像して答えよ.
R2_2
準備
- 以下から,MyFrame2.java をダウンロードせよ
- MyFrame2.java のダウンロード : ここを右クリックして保存
- 本実習では,MyFrame.java ではなく MyFrame2.java を使用してください
- MyFrame2.java には MyFrame2 型が定義されています
- MyFrame2 型とは?
- 基本的には,MyFrame 型と同じです
- ただし,MyFrame 型に対する様々な改良が行われており,多くの問題を未然に防いでくれます
- MyFrame と記載するところを, MyFrame2 に変更するだけで使用できます
- p.39 の内容に従って,新規作成したプロジェクトにダウンロードした MyFrame2.java を追加する
- ドラック & ドロップした際に,以下のウィンドウが表示された場合は,「ファイルをコピー」を選択して,「OK」ボタンをクリック
※ 以降の課題でも,MyFrame 型を使う課題のプロジェクトには,MyFrame2.java をコピーすること
図1: MyFrame.java のコピー(Windows)
図2: MyFrame.java のコピー(macOS)
- リスト 2.18 から 2.20 にある Start.java をそれぞれ作成し,実行せよ
MyFrame 型ではなく MyFrame2 型を使ってください
- リスト 2.18 の場合は,以下の図のように記述する必要があります (4 行目が変わっていることに注意)
図3: MyFrame2 型を使ったリスト 2.18
課題
- リスト 2.20 を参考に Start.java を修正し,以下の図のように,大きさの異なる 3 つのウィンドウが重ならないように画面に表示するプログラム(Start.java)を作成せよ.
- 考察のポイント: ウィンドウが重ならないために,各ウィンドウの横や縦の位置と大きさをどのように与えたらよいか?
図4: R2_2 で作成するプログラムで表示される 3 つのウィンドウの例
R2_3
準備
- リスト 2.22 とリスト 2.23 の内容に基づく RectFrame.java (以下の図のもの)を作成し,実行せよ
- 以下の図の RectFrame.java を実行すると,リスト 2.23 の Start.java と同じ実行例となる
- ※ 注意事項
- R2_2 で使用した MyFrame2.java を,新規プロジェクトにも追加する必要がある
- リストで MyFrame となっている箇所を,MyFrame2 に変更する必要がある
図5: R2_3 の準備で作成する RectFrame.java
課題
- 準備で作成した RectFrame.java を修正し,以下の図のように,3 つすべてのウィンドウに四角形を描画するプログラム(RectFrame.java)を作成せよ.
- ウィンドウの重なりや,四角形のはみだしは気にしなくてよい
図6: R2_3 で作成するプログラムで表示される 3 つのウィンドウの例
R2_4
準備
- 教科書 p.49 から p.60 までをよく読み,3 章の内容を理解する
課題
- 以下の質問とその回答( 1 〜 3 行程度 )をレポートにまとめよ(プログラムの作成は行わなくてよい).
- 教科書の記述に基づくと,以下の用語はどのような意味であるか?
- メソッド
- 呼び出し
- fillRect(x, y, w, h) という命令(メソッド)において引数はどれか?
- 教科書の記述に基づくと,以下の用語はどのような意味であるか?
R2_5
準備
- リスト 3.4 およびリスト 3.6 の内容に基づく RectTest.java を作成し,実行せよ
- R2_3 の準備で作成した RectTest.java と同様に,RectTest.java (リスト 3.6) に Start.java (リスト 3.4) の main メソッドを追加すること
- ※ 注意事項
- R2_2 で使用した MyFrame2.java を,新規プロジェクトにも追加する必要がある
- リストで MyFrame となっている箇所を,MyFrame2 に変更する必要がある
課題
- 準備で作成した RectTest.java を修正し,以下の図のような市松模様が描かれたウィンドウを出力するプログラム(RectTest.java) を作成せよ
- ただし,市松模様を構成する四角形は,50×50 の正方形である
- 市松模様で用いる 2 つの色は好きなものを用いよ
- ただし異なる色にすること
- 必要事項ではないが,なるべく少ない fillRect メソッドの呼び出しで行えるように工夫せよ
- その際に,後から描画した図形は,上書きされることに注意せよ
- ※ なるべく変数を使い,各四角形の左上の座標を手計算しなくてもよいようにすること
図7: R2_5 で作成するプログラムで出力されるウィンドウ
R2_6
準備
- リスト 3.7 およびリスト 3.8 の内容に基づく OvalTest.java を作成し,実行せよ
- R2_3 の準備で作成した RectTest.java と同様に,OvalTest.java (リスト 3.7) に Start.java (リスト 3.8) の main メソッドを追加すること
- ※ 注意事項
- R2_2 で使用した MyFrame2.java を,新規プロジェクトにも追加する必要がある
- リストで MyFrame となっている箇所を,MyFrame2 に変更する必要がある
課題
- 準備で作成した OvalTest.java を修正し,以下の図のように 3 つの円が重なって描かれたウィンドウを出力するプログラム(OvalTest.java) を作成せよ
- ただし,以下を満たすこと
- 3 つの円は異なる色にすること
- リスト 3.6 (異なる色を持つ 3 つの四角形を描画するプログラム)を参考にするとよい
- 後に描画する円は,既に描画されている円の内側に描くこと
- 3 つの円は異なる色にすること
- ただし,以下を満たすこと
図8: R2_6 で作成するプログラムで出力されるウィンドウ
R2_7
準備
- リスト 3.10 およびリスト 3.11 の内容に基づく TextTest.java を作成し,実行せよ
- R2_3 の準備で作成した RectTest.java と同様に,TextTest.java (リスト 3.10) に Start.java (リスト 3.11) の main メソッドを追加すること
- ※ 注意事項
- R2_2 で使用した MyFrame2.java を,新規プロジェクトにも追加する必要がある
- リストで MyFrame となっている箇所を,MyFrame2 に変更する必要がある
課題
- 準備で作成した TextTest.java を修正し,以下の図のように,自分の名前(ローマ字)の下に下線を引いて描画するプログラム(TextTest.java) を作成せよ.
- 注意事項
- drawString メソッドに与える引数は,教科書の記述とは異なり,文字列の 左下隅 であることに注意
- 下線は,fillRect を用いて細長い四角形(高さが 1 の四角形)を描画すればよい
- 名前は 2 つ以上に分けて描画すること
- ※ 以下の図では,「姓」と「名」に分けて描画している
- 注意事項
図9: R2_7 で作成するプログラムで出力されるウィンドウの例
R2_8 (オプション)
課題
- 四角形と楕円を組み合わせて好きなロゴを出力するプログラム(Logo.java) を作成せよ.
- 例えば,以下のようなもの
- 円を描画し,その上に,色を変えて半径を少し小さくした円を描けば輪郭線が描画できる
- 以下の図では,この方法を応用して,三日月に輪郭を追加している
- 円を描画し,その上に,色を変えて半径を少し小さくした円を描けば輪郭線が描画できる
- 注意事項
- ※ Start.java は作らずに,Logo.java に main メソッドを追加すること
- 例えば,以下のようなもの
図10: R2_8 で作成するプログラムで出力されるウィンドウの例(関学のロゴみたいなもの)
図11: R2_8 で作成するプログラムで出力されるウィンドウの例(虹みたいなもの)
R2_9 (オプション)
課題
- 以下の図のような \(4 \times 4\) の簡易版魔方陣(縦・横・斜めの和が等しい行列) を描画するプログラム(Magic.java) を作成せよ.
- ※ 本来の魔方陣は \(1\) から \(4^2\) までの数字を一つずつ使って,縦・横・斜めの和が全て等しくなる行列のこと
- ここでの,簡易版魔方陣の各成分は,8 つの整数 \(A\) 〜 \(D\) および \(a\) 〜 \(d\) を用いて次の表 1 で表されるものとする
- 各行と各列のそれぞれの和は全て \(A + B + C + D + a + b + c + d\) となる
- drawString の第一引数に 「"" + val」を与えれば,変数 val の値を文字として描画できる
- 変数 val に,\(A+a\) や \(B+b\) などの式に基づいて計算した値を格納しておけばよい
- \(A\) 〜 \(D\) および \(a\) 〜 \(d\) には,8 ケタの学籍番号を上位ケタから 1 ケタずつ代入して用いよ.
- 例: 学籍番号が 12345678 である場合 → \(A = 1\), \(B = 2\), \(C = 3\), \(D = 4\), \(a = 5\), \(b = 6\), \(c = 7\), \(d = 8\)
- 重要なこと
- なるべく変数を利用し,各成分を手計算をしなくてもよいようにすること
- 以下の値を用いた場合,簡易版魔方陣は 図 12 のようになる
- \(A = 1\), \(B = 8\), \(C = 2\), \(D = 7\), \(a = 3\), \(b = 6\), \(c = 4\), \(d = 5\)
\(A + a\) | \(B + b\) | \(C + c\) | \(D + d\) |
\(C + d\) | \(D + c\) | \(A + b\) | \(B + a\) |
\(D + b\) | \(C + a\) | \(B + d\) | \(A + c\) |
\(B + c\) | \(A + d\) | \(D + a\) | \(C + b\) |
図12: R2_9 で作成するプログラムで出力されるウィンドウの例