Top / Graphics / 2018 / ex08

グラフィックス基礎及び実習 2018年度 第8回 [edit]

課題A(self) 完成目標: 今回の実習終了まで [edit]

問1,2を全てやりなさい

問1 配列の作り方/添字が範囲をはずれると... [edit]

  1. 教科書の「6.1 配列」(p.64からp.66)を読みなさい
  2. 右のリンク先のPDFファイルを閲覧し,手書きの部分を講義資料に書き写しなさい.資料(学内アクセス限定)
  3. 講義資料 1/5 の 「Javaでintの配列」に記されたプログラムの断片の前後を補ってプログラムを完成させ,動作確認しなさい.ただし,クラス名は G08A とすること.
  4. 講義資料 2/5 の 「6.1.3」の部分を読み,「前頁のソースの4行目を...」を実際にやってみなさい.

check

  • C言語とは配列の作り方が全然違いますね.
  • C言語では,添字が範囲をはずれても何も言わずおかしな動作を続けたり,「セグメントエラー」,「Segmentation Falut」,「Bus Error」というようなエラーメッセージしか出力しません.一方,Java では,添字が範囲をはずれてないか実行中にちゃんとチェックして,はずれたらはずれたと教えてくれる,ということですね.その分,実行に余計な手間がかかってますが....

問2 かめの配列/インスタンス変数 length [edit]

  1. 講義資料 2/5 の「6.1.2」の部分を読みなさい.
  2. HTurtle クラスに次の仕様のコンストラクタの定義を追加しなさい.コンストラクタの定義について自信がないひとは,後述の check 参照.
    HTurtle()
    座標 (200, 200) に 0 度の角度で HTurtle を作成する.
    HTurtle(double x, double y, double angle)
    座標 (x, y) に a 度の角度で HTurtle を作成する.
  3. T61 を作って動作確認しなさい.
  4. Q1 をやりなさい(T61を書き換える).

check HTurtle のコンストラクタは,Turtleの(つまりスーパークラスの)コンストラクタを呼び出すだけでよい.1引数コンストラクタは,単純に super() を呼ぶだけでok.同様に,3引数コンストラクタは super(x, y, angle) を呼ぶだけでok.

check Q1で書き換える前の hm.length の値は 10 で,書き換えたあとは 6 のはずですね.

課題B(self) 完成目標: 今回の実習終了まで [edit]

問1,2を全てやりなさい

問1 配列の初期値/配列の練習問題 [edit]

  1. 講義資料の 3/5 を読みなさい.
  2. 講義資料の Q2 をやりなさい.クラス名は G08B とすること.

check

  • 配列 a の初期値をすべて0より大きい数にしても正しく動作するか?
  • 配列 a の初期値が
    9, 3, 3, 3, 7
    だったとき,「最小値のインデックス」は 1 か 3 のどちらか一方が出力されるように作ればよい.どちらの出力をするかは,プログラム中の1文字を書き換えるだけで変更できるだろう.

問2 main の引数 [edit]

  1. 教科書の「6.7 mainの引数」(p.73)と講義資料 5/5 を読みなさい.
  2. 右のリンク先のPDFファイルを閲覧し,手書きの部分を講義資料に書き写しなさい.資料(学内アクセス限定)
  3. 講義資料の Args01 と Args02 を実際に作って動作確認しなさい.

課題C(TA) 締め切り: 次回実習開始直後 [edit]

教科書p.74の練習問題6.18をやりなさい(PTurtle). ただし,次の手順でやること.

  1. 次のような仕様の PTurtle クラスを作る
    • PTurtle は Turtle のサブクラス
    • このクラスには,次の仕様のインスタンスメソッド draw と main メソッドのみ定義する.
      void draw(double[] path, double x, double y)
      折れ線 path を,折れ線の座標の原点が (x, y) に平行移動したものを描く.詳しくは教科書の該当箇所の説明(脚注40), 41)も)参照.
    • main メソッドの中身は次の通りとする
      	// 例1
      	double[] graph = { 50, 300, 100, 100, 300, 200, 350, 300 };
      	// 例2 奇数個でも大丈夫?
      	//double[] graph = { 50, 300, 100, 100, 300, 200, 350 };
      	// 例3 長さ2のときは?
      	//double[] graph = { 50, 300 };
      	// 例4 長さ1のときは?
      	//double[] graph = { 50 };
      	// 例5 長さ0のときは?
      	//double[] graph = { };
      	// 例6 やつは?
      	/*
      	double[] graph = {
      	    200, 175, 200, 100, 140, 100, 140, 120, 160, 120,
      	    160, 100, 100, 100, 100, 175, 125, 175, 125, 150,
      	    175, 150, 175, 175, 275, 175, 275, 150, 325, 150,
      	    325, 175, 350, 175, 350, 100, 290, 100, 290, 115,
      	    310, 115, 310, 100, 250, 100, 250, 175, 250, 100,
      	    350, 100, 350, 300, 325, 300, 325, 275,  75, 275,
      	    75, 250, 350, 250,  350, 300
      	};
      	*/
      
      	TurtleFrame f = new TurtleFrame(800, 400);
      	f.addMesh();
      	PTurtle m = new PTurtle();
      	f.add(m);
      	m.speed(1);
      	m.draw(graph, 0, 0);
      	m.moveTo(200, 300);
      	m.draw(graph, 400, 0);
      
  2. 例1, 例2が正しく動作するようにしよう.
    • 配列 path の長さが奇数のときも正しく動作させるには → 配列の最後の値を無視するようにすればよい.ヒント(白字で書いてます):いろんなやり方がありますが,path の長さが奇数のとき,例えば 7 のとき, path.length / 2 の値は...で, i = 1, 2 のとき 2*i と 2*i+1 は ...
  3. 例3, 4, 5 が正しく動作するようにしよう.path の長さが2未満のときは,draw は何もせず return するようにすればよい.
  4. 例6 で動作確認しよう.

課題S(omake) [edit]

コマンドライン引数として2つの数を指定すると,下図のような図形を描くプログラムを作りなさい. クラス名は G08Rainbow とし,次の要件を満たすようにすること.

  1. 三角形毎に色を変える
  2. コマンドライン引数で三角形の数と斜辺の長さを指定する

1.については,Colorの配列を用いて実現すること(どんな色を使うかは自分で決めればよいが,色数は以下の例以上にすること). 実行結果の図が示すように,色を順番に使って使い果たしたらまた最初の色から順に使うようにすること.

2.については,次のような動作を実現しよう.

$ java G08Rainbow 6 50   ← 引数を二つ指定すると図形を描く

$ java G08Rainbow     ← 引数を指定しないと以下のメッセージを出して終了
使い方: java G08Rainbow r d
r: 三角形の数, d: 斜辺の長さ

$ java G08Rainbow 6 50 hoge  ← 余分な引数を指定した場合も同様
使い方: java G08Rainbow r d
r: 三角形の数, d: 斜辺の長さ

$ java G08Rainbow 6 hoge  ← 引数が正しい形式でない場合も同様
使い方: java G08Rainbow r d
r: 三角形の数, d: 斜辺の長さ

引数が正しい形式でない場合のチェックを行うには,Integer.parseInt() メソッドの例外処理を行えばよい. 教科書8.3節(p.93-)を参考にしよう.

G06Rainbow-r06.png G06Rainbow-r12.png


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-06-04 (月) 22:37:00 (14d)