グラフィックス基礎及び実習 2019年度 第5回 †[edit]
課題A(self) 完成目標: 今回の実習終了まで †[edit]
- 右のリンク先のPDFファイルを閲覧し,手書きの部分を講義資料に書き写しなさい.資料(学内アクセス限定)
- 右のリンク先のクラスファイルをダウンロードしなさい HWSample.class
- 上記資料の G05Fugayo.java を実際に作って動作確認しなさい.ただし,ここでは HW クラスのかわりに HWSample クラスを使う.HWSample クラスは,HWクラスとクラス名が異なるのみで,同じAPI仕様をもち同じ動作をする.したがって,あちこちの HW のかわりに...
課題B(self) 完成目標: 今回の実習終了まで †[edit]
- 教科書 p.44-48 を読みなさい.
- 右のリンク先のPDFファイルを閲覧し,手書きの部分を講義資料に書き写しなさい.資料(学内アクセス限定)
- 教科書 p.46 の HTurtle.java を作成しなさい.
- それをコンパイルしなさい.エラーが出たら修正しなさい.ただし,
$ java HTurtle
と実行してもエラーになる(HTurtle.javaにはmainがないため)だけなので注意.
- 教科書 p.44 の HTurtle クラスのAPI仕様を見て理解しながら,p.45の T51.java を作成しなさい.
- それをコンパイルしなさい.エラーが出たら修正しなさい.
- 実行してみなさい.エラーが出たら修正しなさい.
$ java T51
check
- 次の文の空白部分には「Turtle」,「HTurtle」,「インスタンス」,「クラス」,「ほげ」のいずれかが入る.
それぞれ何が入るか考えなさい(白字で正解が書いてある)
T51.javaの変数 m は,6行目をみると分かるように HTurtle クラスのオブジェクトを指す変数である.
9行目や11行目では,mの指すオブジェクトに対して house や polygon という インスタンス メソッドを呼び出している.これらのメソッドは HTurtle クラスで定義されている.
このクラスの定義は,ソースファイル HTurtle.java に書かれている.
一方,10行目などでは,mの指すオブジェクトに対して up, lt, fd 等の Turtle クラスで定義された インスタンス メソッドが呼び出せている.これは,HTurtle クラスがTurtle クラスを拡張して定義されたたものだからである.
また,8行目では,TurtleFrame クラスの インスタンス メソッド add に対して,HTurtle クラスのインスタンスを指す変数 m を渡している.
しかし,この add メソッドは,本来は Turtle クラスのインスタンスを指す変数を引数にとるものである.
このようなプログラムが動作するのも,Turtle クラスを拡張して HTurtle クラスを定義したからである.
課題C(TA) 締切: 次回の実習開始直後 †[edit]
次のことを順番にやりなさい.
- HTurtle.java をコピーして HHogeTurtle.java というソースファイルを作る.
- HHogeTurtle.java を次のように修正する
- HHogeTurtle クラスが 第4回課題C の HogeTurtle クラスを拡張したものになるようにする.polygon および house メソッドはそのままでよい.
- HogeTurtle は Turtle を拡張したものだった.HHogeTurtle はさらにその HogeTurtle を拡張したものとなる.
- T51.java をコピーして G05HHT.java というソースファイルを作る.
- G05HHT.java を次のように修正する
- HTurtle のかわりに HHogeTurtle を使う
- G05HHT が T51 と同じ動作をすることを確認する.
- G05HHT.java をさらに修正し,実行結果が下図の通りになるようにする.ただし,HHogeTurtle クラスには引数ありのコンストラクタが定義されていない(詳しくは次回以降説明する).下図のような結果を得るためには,右下の方のかめインスタンスを表す変数を h として,次のように書けばよい.
:
HHogeTurtle h = new HHogeTurtle();
(フレームに載せ,やる気アップ)
h.up();
h.moveTo(295, 300);
h.down();
(やつを描く)
:
課題S(omake) †[edit]
数理情報学科の学力認定試験の問題に挑戦してみよう.
2012年2月に行われた2011年度試験の専門Iの問題IV.
次のようにして問題を閲覧できる.
- https://wiki.math.ryukoku.ac.jp/ から「学力認定試験」へ
数理情報学科のwikiサイトのアクセス時に求められるユーザ名とパスワードは,全学統合認証のものと同じ.
学力認定試験の他にも定期試験の過去問,教員による授業自己点検報告書なども閲覧できる.
- 「大学院入試問題」(←学力認定試験の過去問もこちら) へ
- 「media:学力認定試験(2012.2).pdf」を開く
問(1)の「クラスメソッドbproblem() を書きなさい」とか,「Randクラスのクラスメソッドirand()…」みたいな指示になるべく沿ってソースを角煮は,↓に示すようなソースファイルを作るとよい.試験問題では,Randクラスが存在すると仮定して,そのソースは書く必要がないということだが,ここではそれもあわせて書く例にしてある.
// クラス BProblem の定義
class BProblem {
// クラスメソッド bproblem の定義
static int bproblem(int m) {
:
return n;
}
// mainメソッドの定義
public static void main(String[] args) {
ここでクラスメソッド bproblem を呼ぶには
n = bproblem(10) または n = BProblem.bproblem(10) のように書けばよい
}
}
// クラス Rand の定義
class Rand {
// クラスメソッド irand の定義
static int irand() {
return (int)(365*Math.random());
}
}
ここでは,一つのソースファイルで複数のクラスを定義する例を示している.
class の前に public がついていないことに注意.このソースファイル自体の名前は,
二つのクラス名と無関係に適当な名前をつければよい(ここでは Birth.java とする).
このとき,
$ javac Birth.java
とコンパイルすると,BProblem.class と Rand.class ができる.実行するには,実行したいmainメソッドを含むクラスの名前を指定すればよいので,
$ java BProblem
とする.