Top / Graphics / 2016 / ex04

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

おしらせ [edit]

  • 実習のすすめ方 Graphics/2016/ex00
  • この実習では,ls,cd,cpなどのUNIXのコマンドや,emacsというエディタを用います.これらの使い方を忘れた人は,次のページを参照しなさい: Docs/4UNIXBeginners
  • 注意: 今回の課題の中には,Turtle.class も TurtleFrame.class も使わないものがあります.そのようなソースファイルは,それらと同じディレクトリに置く必要はありません.すなわち,~/Graphics20XY/turtle の下にある必要はありません.そのようなソースファイルは,~/Graphics20XY の中に置くようにして下さい(今後同様のケースがあれば同じ扱いをして下さい).

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

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

問1 [edit]

教科書p.35の練習問題4.8 (P46 & P47).ただし,次のようにすること.

  • P46ではTurtleクラスのクラスメソッドを,P47では同クラスのインスタンスメソッドを用いて,かめを最高速にすること.

check

  • P46
    • 二重ループになってるはずやけど,内外のループはそれぞれ何をしてるの?
    • 内側と外側の繰り返し回数を数える変数は,内外どっちが先に変化していくの?
    • かめを最高速にするために用いたクラスメソッドの名前は何? 教科書p.14のどこに載ってる?
  • P47
    • かめを最高速にするために用いたインスタンスメソッドの名前は何? 教科書p.14のどこに載ってる?
  • 共通
    • API仕様のメソッド一覧でクラスメソッドとインスタンスメソッドを見分けるポイントは何?

問2 [edit]

教科書p.36の練習問題4.11のうち,Q43, Q44の2つ. いずれも,何行何列出力するかを変数 n で表すようにすること.

check

  • 正しく仕様を満たしているか? n 行 n列から1行または1列ずれているのに ok だと思い込むいい加減な人が多いです.きちんと確認してください.n をいろいろ変えても大丈夫かどうかも

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

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

問1 [edit]

// (A)
if(x % 4 == 0) System.out.println("ほげ");
if(x % 4 == 1) System.out.println("ふが");
else                  System.out.println("へな");

// (B)
if(x % 4 == 0)         System.out.println("ほげ");
else if(x % 4 == 1) System.out.println("ふが");
else                           System.out.println("へな");

次の if 文と同じふるまいをするのは上記の (A), (B) のどちらか考えなさい.

if(x % 4 == 0){
    System.out.println("ほげ");
}else{
    if(x % 4 == 1){
	System.out.println("ふが");
    }else{
	System.out.println("へな");
    }
}

check

  • x の値が 0 のとき,(A) と (B) では出力が違います.どう違う?
  • if-else の構造の理解があいまいだと思うひとは,↑の例のように,条件成立時/不成立時に実行する部分が一文しかなくても { と } を使ってブロックを明示する書き方をすることを強くおすすめします.

問2 [edit]

教科書p.40の練習問題4.15をやりなさい(Janken41).

check 教科書の問題文を最後までよく読みなさい.脚注も.

以下を元にして,どこがどう間違いなのか考えながら修正すること.

/** じゃんけんプログラム(間違いがあるよ)*/

public class Gaian41{

    public static void main(String[] args){
	if(random() < 2/3){
	    System.out.println("ぐぅ〜");
	}
	if(random() < 1/3){
	    System.out.println("ちょき〜ん");
	}else{
	    System.out.println("ぱぁ〜");
	}
   }

}

check

  • コンパイルが通るように修正すればよいというものではない. 正しい動作(例えば,ぐーちょきぱーは等確率になるようにするとか)を実現すること.
  • Javaに限らずプログラミングを学んでいると,99/100 とかいう式見たらどきどきしますね(プログラミング言語によっては気をきかせてこの式の値を0.99 にしてくれるのもありますが…).
  • 妹のペンネームはクリスチーネ剛田

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

Sum44Sample.class

上記のリンク先のクラスファイルは,教科書p.37の練習問題4.12の解答の一例である.このプログラムを参考に,ある正の整数 \( N \) が与えられたときに,

\[ \displaystyle\sum_{k=1}^{n}(3k^2-3k+1) \geq N \]

となる正の整数 \( n \) のうち最小のものを求めるプログラムを作りなさい(G04Sum).ただし,次のようにすること.

  • 上記の「…作りなさい(G04Sum)」という表記のカッコ中は,この課題で定義するべきクラス名を表している.今後の課題でも同様.
  • \( N \) はint型変数で表し,値を変更するのが簡単なようにする(ソースを一箇所修正するだけで済むようにする)こと.
  • 出力の形式は,上記のサンプルと同様にすること
  • \( N \) を適当に変えて自分で動作確認すること.\( N = 1000 \), \( 2000 \) とか \( N = 1000000 \) とか.数列の和を手計算してみると...

課題S(おまけ) [edit]

以下のプログラムとその実行結果を参考にして,キーボードから年月日を入力すると,その日の曜日を教えてくれるプログラムを作ろう.

  • クラス名は G04WeekdayName とすること
  • 1901年以降について計算できればよい.1901年の1月1日は火曜日である.
  • 自分で導出できない謎の公式を使わずに計算するものとすること.
  • 計算機室のLinux環境では cal コマンドでカレンダーを表示できる(動作確認にどうぞ)
    $ cal
    $ cal 1901
  • ヒント: http://ja.wikipedia.org/wiki/%E9%96%8F%E5%B9%B4 の「グレゴリオ暦」の項を参照すると,ある年がうるう年かどうかの判定法がわかる.
  • 簡潔なプログラムを書こうと思うと,配列を使いたくなるかもしれない.教科書第5章へどうぞ(p.45?).
/** キーボードから入力した数の和を表示 */

import java.util.*;  // Scanner クラスのために

public class G04Scan{

    public static void main(String[] args){
	
	// Scannerクラスの使い方は,p.208やJava API参照
	Scanner s = new Scanner(System.in);
	double sum = 0.0;

	System.out.println("スペースや改行を区切りにしていくつか数値を入力してみてね");
	System.out.println("最後は数値以外の文字を入力してね");
	while(s.hasNextDouble()){
	    sum += s.nextDouble();
	}
	System.out.println("合計は" + sum + "だぴょん");
    }
}
$ java G04Scan
スペースや改行を区切りにしていくつか数値を入力してみてね
最後は数値以外の文字を入力してね
1 1 3.14     ← キーボードからの入力
1 1 1        ← キーボードからの入力
hoge 999     ← キーボードからの入力
合計は8.14だぴょん

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