Top / Graphics / 2016 / ex05

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

注意 [edit]

  • 実習のすすめ方 Graphics/2016/ex00
  • この実習では,ls,cd,cpなどのUNIXのコマンドや,emacsというエディタを用います.これらの使い方を忘れた人は,次のページを参照しなさい: Docs/4UNIXBeginners
  • 前回同様に,TurtleクラスおよびTurtleクラスを使うプログラムとそうでないプログラムで保存するディレクトリを分けること.

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

教科書p.44のリスト5.1のプログラムを次のように改造しなさい.

  • クラス名を G05Kame とする
  • \( i \) 番目のタートルは \( (2i + 3) \) 角形を描くようにする
  • 配列のインスタンス変数 length を用いるようにする

check

  • このプログラムの実行時の hm.length の値はいくつ?
  • かめを100匹にするにはどこをどう書き換えればよい? ちゃんと一カ所書き換えるだけで済むようになっている?

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

aという名前の整数配列に格納された値の「和」,「0より大きく100以下の数の個数」,「最大値」,「最大値を与える配列のインデックス(添字番号)のうち一番大きいもの」(注)を表示するプログラムを作りなさい. クラス名は G05Array とすること.

注: ↓の例では、最大値を与えるインデックスが1ではなく3ですね

例えば,int[]型の変数aを

int[] a = { 11, 200, 123, 200, -99, 0, 7, 77, 100 };

と初期化すると,次のような出力が得られるようにすること(インスタンス変数 length を使いなさい).

$ java G05Array
0:11 1:200 2:123 3:200 4:-99 5:0 6:7 7:77 8:100 
和 = 619
0より大きく100以下の数の個数 = 4
最大値 = 200 (3番目)

check 次の例で実行したり,自分で様々な条件のデータを作って動作確認すること.

	  { 868, 260, 304, 382, 962, 576, 855, 310, 157, 376,
            814, 164, 587, 686, 400, 528, 651, 431, 738, 333,
            404, 760, 778, 921, 870, 998, 697, 722, 622, 459,
            699, 245, 872, 2166, 634, 0, 699, -999, 657, 424,
            802, 977, 816, 799, 732, 321, 627, 525, 411, 980 }
   { -5, -4, -3, -2, -1 };

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

教科書p.47の練習問題5.10をやりなさい(Graph51). ただし,次のようにすること.

  • addMesh()する
  • 最初の点までの移動時には線をひかない
  • 次のような場合にもエラーになってしまわないようにする
    1. 配列 graph の長さが0や1のとき ==> プログラムを実行しても何もしないで or Frame を描画しただけで終了
      int graph[] = {};
      int graph[] = { 50 };
    2. 配列 graph の長さが奇数のとき ==> 配列の最後の値を無視する.ヒント(白字で書いてます):いろんなやり方がありますが,graph の長さが奇数のとき,例えば 7 のとき, graph.length / 2 の値は...で, i = 1, 2 のとき 2*i と 2*i+1 は ...
      int graph[] = { 50, 300, 100, 100, 300 };
  • チェック時のために,上記の例をソース中にコメントとして残しておきましょう
      // int graph[] = {}:
      // int graph[] = { 50 }:
      // int graph[] = { 50, 300, 100, 100, 300 }:
    

check

  • 教科書p.14 によると,addMesh() は何クラスのメソッド? インスタンスメソッド? それともクラスメソッド? 両者のどちらであるかはどこを見ればわかる?
  • 練習問題に示された例や上記の例で望み通りの動作をすることを確認しよう.
  • それらがうまくいったら,次の例で動作確認すること
    	int 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
    	};
    

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

課題Bのプログラムを元にして,以下のような動作をするプログラムを作りなさい.

$ java G05Array2 100 200 3.14
0:100.0 1:200.0 2:3.14 
和 = 303.14
0より大きく100以下の数の個数 = 2
最大値 = 200.0 (1番目)

ただし…

  • クラス名は,G05Array2 とすること.G05Array.java を cp コマンドでコピーして G05Array2.java を作り,それを修正しなさい.
  • 適切な型で a という名前の配列を作成し,コマンドライン引数の値を一度そこに格納してから和その他の計算を行うように作ること. そうすれば,G05Array をだいぶ流用できますね. ヒント: 配列 a の大きさは args.length で決めたらよい. 文字列をint型に変換するにはIntegerというラッパークラスを使ったのだから,doubleに変換するには...(p.59とJava API仕様参照)
  • 引数なしで実行したら次のようにする.ヒント: 条件判定して return で main から抜けたらよい
    $ java G05Array2
    なんか入力してよ
  • 入力が数でない場合の対応は考えなくてよい.次の実行例が示すように,例外が発生して異常終了するようなもので構わない.
    $ java G05Array2 1 2.2 ほげ
    0:1.0 1:2.2 Exception in thread "main" java.lang.NumberFormatException: For input string: "ほげ"
    	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
    	at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    	at java.lang.Double.parseDouble(Double.java:538)
    	at G05Array2.main(G05Array2.java:23)
    

check

  • a の型は正しく選択してる?
  • Java API仕様のどこを見て double に変換する処理を書いたか,人に説明できますか?
  • ここまで,C言語における scanf() 等のようにキーボードからの入力を扱うプログラムを学んでいないので,「Javaではそういうことができない」と勘違いする人がたまにいますが,そんなことはありません.興味があるひとは,たとえば Graphics/2015/ex04#kadaiS をどうぞ.

課題S(おまけ) [edit]

数理情報学科の学力認定試験の問題に挑戦してみよう. 2012年2月に行われた2011年度試験の専門Iの問題IV. 次のようにして問題を閲覧できる.

  1. 数理情報学科のWikiのサイトから「学力認定試験」へ

    数理情報学科のwikiサイトのアクセス時に求められるユーザ名とパスワードは,全学統合認証のものと同じ. 学力認定試験の他にも定期試験の過去問,教員による授業自己点検報告書なども閲覧できる.

  2. 「大学院入試問題」(←学力認定試験の過去問もこちら) へ
  3. 「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

とする.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-05-17 (火) 16:36:39 (549d)