*グラフィックス基礎及び実習 2017年度 第9回 [#e9701092]
 
#contents
 
&color(#ff0000){工事中}; 
//&color(#ff0000){工事中}; 
**課題A(self) 完成目標: 今回の実習終了まで [#kadaiA]
問1,2を全てやりなさい
***問1  コンストラクタの作り方を学ぶ [#l1ed896f]
+教科書の「7.4 コンストラクタ」(p.70,71)と講義資料の 1/3 を読みなさい
+ 右のリンク先のPDFファイルを閲覧し,手書きの部分を講義資料に書き写しなさい.[[資料(学内アクセス限定)>Graphicsgakunai:scan2017-09-p1.pdf]]
***問2  HTurtle クラスにコンストラクタの定義を追加しよう [#dfc2e61e]

[[第7回課題B>Graphics/2017/ex07#kadaiB]] で作成した HTurtle クラスを改造しよう.
以下では,[[第8回課題A>Graphics/2017/ex08#kadaiA]] で作成した MyTurtle クラスも利用する.
+ 下記のAPI仕様を満たすように,HTurtle クラスに2つのコンストラクタの定義を追加しなさい.
+ 以下の「ほげ」の部分を正しく書いた G09exA クラスを作成し,動作確認しなさい.
#pre{{
public class G09exA{
   public static void main(String[] args){
       TurtleFrame f = new TurtleFrame();
       「引数なしのHTurtleのコンストラクタを用いてインスタンスを生成,変数名はh1とする」
       「3引数(引数には順に300,300,90を設定する)のHTurtleのコンストラクタを用いてインスタンスを生成,変数名はh2とする」
       「MyTurtleのインスタンスを生成,変数名はmとする」
       f.add(h1); f.add(h2); f.add(m);
       MyTurtle.speedAll(1);
       h1.house(50);
       h2.polygon(9, 20);
       m.ppolygon(100, 100, 5, 3, 20);
   }
}
}}

- &color(white,blue){check}; [ヒント]HTurtleの3引数のコンストラクタは,Turtleクラスの(つまり &color(white){スーパー};クラス)の3引数のコンストラクタを呼んで,それから線の色を赤にすればよいだろう.
- &color(white,blue){check}; [ヒント]HTurtleの引数なしのコンストラクタは,上記の3引数の方を呼ぶように作ろう.
- &color(white,blue){check}; MyTurtle は自分でコンストラクタを定義していない.このような場合,&color(white){ super(); }; とだけ書いた引数なしコンストラクタが自動的に定義されているとみなされる.m が描く図形も線が &color(white){ 赤色 }; になっているのは,このルールが適用されて,MyTurtle() を呼ぶとそのスーパークラスである &color(white){ HTurtle }; クラスの引数なしコンストラクタが呼び出されるからである.
- &color(white,blue){check}; MyTurtle.speedAll(1); という文は,MyTurtle クラスの &color(white){ クラス }; メソッドの呼び出しであるが,3匹とも速くなっている.speedAll メソッドが MyTurtle クラスの親の &color(white){ HTurtle }; クラスの親の &color(white){ Turtle }; クラスで定義されたものであり,それを継承したものだからである.
***HTurtleクラスのAPI仕様(追加分のみ示す) [#a79804c8]

''コンストラクタ''

:HTurtle() | (200,200)という座標に0度の角度で,線の色が赤であるHTurtleを生成する.
:HTurtle(int x, int y, int angle) | (x, y) という座標に angle 度の角度で,線の色が赤であるHTurtleを生成する.


**課題B(self) 完成目標: 今回の実習終了まで [#kadaiB]
問1,2を全てやりなさい

***問1 クラス変数とクラスメソッドの作り方を学ぶ [#g2702219]
+教科書の「7.5 クラス変数,クラスメソッド」(p.72)と講義資料の 2/3 を読みなさい
+ 右のリンク先のPDFファイルを閲覧し,手書きの部分を講義資料に書き写しなさい.[[資料(学内アクセス限定)>Graphicsgakunai:scan2017-09-p2.pdf]]
***問2 HWクラスを完成させる [#nf9ba892]

[[第8回課題C>Graphics/2017/ex08#kadaiC]] で一部を作成したHWクラスを改造し,完成させよう.&color(blue){HWクラスのAPI仕様は第7回講義資料参照};.動作確認用には,[[第7回課題A>Graphics/2017/ex07#kadaiA]] で作った G07Fugayo.java の中身を修正して使おう.
**課題C(TA) 締切: 次回の実習開始直後 [#kadaiC]

//&color(red){文章工事中};

HWクラスと同様のことをデータを隠蔽して実現するクラス HW2 を作ろう.

- この HW2 クラスは,以下のAPI仕様を実現するように新しく作成する
-- API仕様から分かるように,インスタンス変数やクラス変数はすべて非公開とする
-- printHimando の判定基準とする2つの変数 Border1 と Border2 は,次のように宣言したらよい
#pre{{
    private static final double Border1 = 20.0;
    private static final double Border2 = 25.0;
}}
finalという修飾子については,教科書 p.27 および p.68 の脚注 34) 参照.final をつけて変数を宣言すると,C言語の #define による定数定義をもっとスマートに実現できる.型があるし,インスタンス変数にもクラス変数にもできるし....
- HW2クラスが作れたら,以下の G09Fugayo.java を使って動作確認しよう

***HW2クラスのAPI仕様 [#icd0098d]

個人の身長体重のデータを扱うためのクラス.HWとは別もの(HWを拡張したクラスではない).

''コンストラクタ''

:HW2() | 名前 ”ほげお”,身長 170.0[cm],体重 62.0[kg] のインスタンスを生成.
:HW2(String n, double h, double w) | 名前 n,身長 h[cm],体重 w[kg] のインスタンスを生成.

''メソッド''

:void print() | このインスタンスの名前,身長,体重を表示する.
:double calcBMI() | このインスタンスの BMI を計算して返す. BMI = (体重 [kg])/(身長 [cm]/100)2
:static void printHimando(double bmi) | bmi が Border1 未満,Border1 以上 Border2 未満,Border2 以上の三つの場合に分けてメッセージを出力(Border1, Border2については上述).順に,「やせてんなぁ」,「ふつー」,「太ってる...かな?」.
:void setName(String n)| このインスタンスの名前を n にする.
:String getName()| このインスタンスの名前を返す.
:void setHeight(double h)| このインスタンスの身長を h にする.
:double getHeight()| このインスタンスの身長を返す.
:void setWeight(double w)| このインスタンスの身長を w にする.
:double getWeight()| このインスタンスの体重を返す.
:void pocha()| このインスタンスの体重を 1.1 倍する.

''フィールド''

:公開されているインスタンス変数・クラス変数はない|


***動作確認用のクラス [#j6fd196a]


&gist(4acf98339318f409d4d2b851175be6d3);
**課題S(おまけ) [#kadaiS]


複素数を扱うクラスを作ろう.
***step1 [#b5fa30c6]

以下のAPI仕様を満たす Complex.java と,Complexクラスの全てのメソッドを呼んで動作確認するmainメソッドを書いた G09exS.java を作る.
以下の仕様からわかるように,データは隠蔽しよう

''コンストラクタ''

:Complex(double re, double im) | re を実部の値,im を虚部の値にもつインスタンスを生成する
:Complex() | &mathjax{ 0 + 0i }; を値にもつインスタンスを生成する

''メソッド''

:void setRe(double re) | このインスタンスの実部の値を re にする
:void setIm(double im) | このインスタンスの虚部の値を im にする
:double getRe() | このインスタンスの実部の値を返す
:double getIm() | このインスタンスの虚部の値を返す
:Complex add(Complex z) | このインスタンスに z を加えた新しいインスタンスを返す
:static Complex add(Complex z1, Complex z2) | z1 + z2 を返す

ヒント: どちらのaddメソッドも,インスタンスの値を変更するものではないですね.new してそれを return したらよいでしょう.
***step2 [#o3dd8c02]

Complexクラスを拡張したクラス Complex2 をつくろう.
このクラスは,次のようなものとすること.

(1) コンストラクタの仕様はComplexと同じ

(2) 次の仕様のメソッドを定義する
:String toString() | このインスタンスが表す複素数を String にして返す.戻り値の例は(注)へ.

(3) さらに次のようなものを計算するメソッドを追加しよう.乗算,絶対値,共役複素数.

注: 上記の toString メソッドは,Objectクラスで定義されているものを「再定義(オーバーライド)」することになります(教科書p.81参照).
System.out.printlnにオブジェクトを渡すと,そいつのtoStringを呼んで返ってきた文字列を使って表示してくれるので,こんなことができるようになります.
#pre{{
Complex2 z1 = new Complex2(2.0, 3.0);
Complex2 z2 = new Complex2(2.0, -3.0);
System.out.println(z1);                → 出力例:    2.0+3.0i
System.out.println(z2);                → 出力例:    2.0-3.0i
}}
***step3 [#jf8e8a47]

できあがった Complex2 クラスを使うプログラムを作り,動作確認しよう.
さらに,次の問の答えを計算してみよう.

&mathjax{ z = 2\cos{\frac{5}{3}}\pi + 2i \sin{\frac{5}{3}}\pi }; とおくとき,&mathjax{ z^6 }; はいくつか? 手計算の結果と比較すること.

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS