_Graphics/2015/ex04
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*グラフィックス基礎・演習 2015年度 演習第4回 [#e9701092]
//&color(#ff0000){工事中};
#contents
**おしらせ [#ma1a0c86]
&color(#ff0000){注意: 今回の課題の中には,Turtle.class も TurtleFrame.class も使わないものがあります.そのようなソースファイルは,それらと同じディレクトリに置く必要はありません.すなわち,~/Graphics2015/turtle の下にある必要はありません.そのようなソースファイルは,~/Graphics2015 の中に置くようにして下さい(今後同様のケースがあれば同じ扱いをして下さい).};
&color(#0000a0){この実習では,ls,cd,cpなどのUNIXのコマンドや,emacsというエディタを用います.これらの使い方を忘れた人は,次のページを参照しなさい:}; [[Docs/4UNIXBeginners]]
**課題A(TA) 締切: 今回の演習開始45分後 [#kadaiA]
%%この課題の解答は講義時に配布した用紙に記入し,%%プログラムを作成してTAさんに提出してチェックを受けてください.
[[Sum44Sample.class>Graphics:Sum44Sample.class]]
上記のリンク先のクラスファイルは,教科書p.37の練習問題4.12の解答の一例である.このプログラムを参考に,ある正の整数 &mathjax{ S }; が与えられたときに,
#mathjax( S < \displaystyle\sum_{k=1}^{n}(3k^2-3k+1) );
となる正の整数 &mathjax{ n }; のうち最小のものを求めるプログラムを作りなさい(G04Sum).ただし,次のようにすること.
- %%指定の紙にソースを書きながら考えること.紙には,%%&mathjax{S = 999}; および &mathjax{S = 1000}; のときの答え(上の式を満たす最小の &mathjax{ n };)もソース中にコメントとして書くこと.
-上記の「…作りなさい(G04Sum)」という表記のカッコ中は,この課題で定義するべきクラス名を表している.今後の課題でも同様.
-&mathjax{S}; はint型変数で表し,値を変更するのが簡単なようにする(ソースを一箇所修正するだけで済むようにする)こと.
- 出力の形式は,上記のサンプルと同様にすること
**課題B(self) 完成目標: 今回の演習終了時 [#kadaiB]
以下の二つのことをやりなさい
***問1 [#rbb5d5b1]
教科書p.35の練習問題4.8 (P46 & P47).ただし,次のようにすること.
-P46ではTurtleクラスのクラスメソッドを,P47では同クラスのインスタンスメソッドを用いて,かめを最高速にすること.
&color(white,blue){check};
- P46
-- 二重ループになってるはずやけど,内外のループはそれぞれ何をしてるの?
-- 内側と外側の繰り返し回数を数える変数は,内外どっちが先に変化していくの?
-- かめを最高速にするために用いたクラスメソッドの名前は何? 教科書p.14のどこに載ってる?
- P47
-- かめを最高速にするために用いたインスタンスメソッドの名前は何? 教科書p.14のどこに載ってる?
- 共通
-- API仕様のメソッド一覧でクラスメソッドとインスタンスメソッドを見分けるポイントは何?
***問2 [#se333795]
教科書p.36の練習問題4.11のうち,Q43, Q44の2つ.
いずれも,何行何列出力するかを変数 n で表すようにすること.
&color(white,blue){check};
- 正しく仕様を満たしているか? n 行 n列から1行または1列ずれているのに ok だと思い込むいい加減な人が多いです.きちんと確認してください.n をいろいろ変えても大丈夫かどうかも
**課題C(self) 完成目標: 次回演習開始直後 [#kadaiC]
以下の二つのことをやりなさい
***問1 [#obf92597]
次の if 文と同じふるまいをするのは (A), (B) のどちらか考えなさい.
#pre{{
if(x % 4 == 0){
System.out.println("ほげ");
}else{
if(x % 4 == 1){
System.out.println("ふが");
}else{
System.out.println("へな");
}
}
}}
&color(white,blue){check};
- x の値が 0 のとき,(A) と (B) では出力が違います.どう違う?
- if-else の構造の理解があいまいだと思うひとは,↑の例のように,条件成立時/不成立時に実行する部分が一文しかなくても { と } を使ってブロックを明示する書き方をすることを強くおすすめします.
#pre{{
(A)
if(x % 4 == 0) System.out.println("ほげ");
else if(x % 4 == 1) System.out.println("ふが");
else System.out.println("へな");
(B)
if(x % 4 == 0) System.out.println("ほげ");
if(x % 4 == 1) System.out.println("ふが");
else System.out.println("へな");
}}
***問2 [#f635e5e7]
教科書p.40の練習問題4.15をやりなさい(Janken41).
&color(white,blue){check}; 教科書の問題文を最後までよく読みなさい.脚注も.
以下を元にして,どこがどう間違いなのか考えながら修正すること.
#pre{{
/** じゃんけんプログラム(間違いがあるよ)*/
public class Jaian41{
public static void main(String[] args){
if(random() < 2/3){
System.out.println("ぐぅ〜");
}
if(random() < 1/3){
System.out.println("ちょき〜ん");
}else{
System.out.println("ぱぁ〜");
}
}
}
}}
&color(white,blue){check};
-コンパイルが通るように修正すればよいというものではない.
正しい動作(例えば,ぐーちょきぱーは等確率になるようにするとか)を実現すること.
- Javaに限らずプログラミングを学んでいると,99/100 とかいう式見たらどきどきしますね(プログラミング言語によっては気をきかせてこの式の値を0.99 にしてくれるのもありますが…).
- 妹のペンネームはクリスチーネ剛田
**課題D(TA) 締切: 次回演習開始直後 [#kadaiD]
教科書p.39の練習問題4.14を参考に,以下に示すように少し違う動作をするプログラムを作りなさい(G04Race).
-3匹のかめ m1, m2, m3 を (0,100), (0,200), (0,300) に右向きに配置
-等確率でどれか1匹を選んで10だけ前に進めることを30回繰り返す
&color(white,blue){check};
- かめの初期位置と向きの設定をするために使ったコンストラクタは,何クラスのコンストラクタか? その引数の数はいくつか? p.14 のどれか?
**課題S(おまけ) [#kadaiS]
以下のプログラムとその実行結果を参考にして,キーボードから年月日を入力すると,その日の曜日を教えてくれるプログラムを作ろう.
-クラス名は G04WeekdayName とすること
-1901年以降について計算できればよい.1901年の1月1日は火曜日である.
-自分で導出できない謎の公式を使わずに計算するものとすること.
-計算機室のLinux環境では cal コマンドでカレンダーを表示できる(動作確認にどうぞ)
$ cal
$ cal 1901
-ヒント:
http://ja.wikipedia.org/wiki/%E9%96%8F%E5%B9%B4
の「グレゴリオ暦」の項を参照すると,ある年がうるう年かどうかの判定法がわかる.
-簡潔なプログラムを書こうと思うと,配列を使いたくなるかもしれない.教科書第5章へどうぞ(p.45?).
#pre{{
/** キーボードから入力した数の和を表示 */
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 + "だぴょん");
}
}
}}
#pre{{
$ java G04Scan
スペースや改行を区切りにしていくつか数値を入力してみてね
最後は数値以外の文字を入力してね
1 1 3.14 ← キーボードからの入力
1 1 1 ← キーボードからの入力
hoge 999 ← キーボードからの入力
合計は8.14だぴょん
}}
終了行:
*グラフィックス基礎・演習 2015年度 演習第4回 [#e9701092]
//&color(#ff0000){工事中};
#contents
**おしらせ [#ma1a0c86]
&color(#ff0000){注意: 今回の課題の中には,Turtle.class も TurtleFrame.class も使わないものがあります.そのようなソースファイルは,それらと同じディレクトリに置く必要はありません.すなわち,~/Graphics2015/turtle の下にある必要はありません.そのようなソースファイルは,~/Graphics2015 の中に置くようにして下さい(今後同様のケースがあれば同じ扱いをして下さい).};
&color(#0000a0){この実習では,ls,cd,cpなどのUNIXのコマンドや,emacsというエディタを用います.これらの使い方を忘れた人は,次のページを参照しなさい:}; [[Docs/4UNIXBeginners]]
**課題A(TA) 締切: 今回の演習開始45分後 [#kadaiA]
%%この課題の解答は講義時に配布した用紙に記入し,%%プログラムを作成してTAさんに提出してチェックを受けてください.
[[Sum44Sample.class>Graphics:Sum44Sample.class]]
上記のリンク先のクラスファイルは,教科書p.37の練習問題4.12の解答の一例である.このプログラムを参考に,ある正の整数 &mathjax{ S }; が与えられたときに,
#mathjax( S < \displaystyle\sum_{k=1}^{n}(3k^2-3k+1) );
となる正の整数 &mathjax{ n }; のうち最小のものを求めるプログラムを作りなさい(G04Sum).ただし,次のようにすること.
- %%指定の紙にソースを書きながら考えること.紙には,%%&mathjax{S = 999}; および &mathjax{S = 1000}; のときの答え(上の式を満たす最小の &mathjax{ n };)もソース中にコメントとして書くこと.
-上記の「…作りなさい(G04Sum)」という表記のカッコ中は,この課題で定義するべきクラス名を表している.今後の課題でも同様.
-&mathjax{S}; はint型変数で表し,値を変更するのが簡単なようにする(ソースを一箇所修正するだけで済むようにする)こと.
- 出力の形式は,上記のサンプルと同様にすること
**課題B(self) 完成目標: 今回の演習終了時 [#kadaiB]
以下の二つのことをやりなさい
***問1 [#rbb5d5b1]
教科書p.35の練習問題4.8 (P46 & P47).ただし,次のようにすること.
-P46ではTurtleクラスのクラスメソッドを,P47では同クラスのインスタンスメソッドを用いて,かめを最高速にすること.
&color(white,blue){check};
- P46
-- 二重ループになってるはずやけど,内外のループはそれぞれ何をしてるの?
-- 内側と外側の繰り返し回数を数える変数は,内外どっちが先に変化していくの?
-- かめを最高速にするために用いたクラスメソッドの名前は何? 教科書p.14のどこに載ってる?
- P47
-- かめを最高速にするために用いたインスタンスメソッドの名前は何? 教科書p.14のどこに載ってる?
- 共通
-- API仕様のメソッド一覧でクラスメソッドとインスタンスメソッドを見分けるポイントは何?
***問2 [#se333795]
教科書p.36の練習問題4.11のうち,Q43, Q44の2つ.
いずれも,何行何列出力するかを変数 n で表すようにすること.
&color(white,blue){check};
- 正しく仕様を満たしているか? n 行 n列から1行または1列ずれているのに ok だと思い込むいい加減な人が多いです.きちんと確認してください.n をいろいろ変えても大丈夫かどうかも
**課題C(self) 完成目標: 次回演習開始直後 [#kadaiC]
以下の二つのことをやりなさい
***問1 [#obf92597]
次の if 文と同じふるまいをするのは (A), (B) のどちらか考えなさい.
#pre{{
if(x % 4 == 0){
System.out.println("ほげ");
}else{
if(x % 4 == 1){
System.out.println("ふが");
}else{
System.out.println("へな");
}
}
}}
&color(white,blue){check};
- x の値が 0 のとき,(A) と (B) では出力が違います.どう違う?
- if-else の構造の理解があいまいだと思うひとは,↑の例のように,条件成立時/不成立時に実行する部分が一文しかなくても { と } を使ってブロックを明示する書き方をすることを強くおすすめします.
#pre{{
(A)
if(x % 4 == 0) System.out.println("ほげ");
else if(x % 4 == 1) System.out.println("ふが");
else System.out.println("へな");
(B)
if(x % 4 == 0) System.out.println("ほげ");
if(x % 4 == 1) System.out.println("ふが");
else System.out.println("へな");
}}
***問2 [#f635e5e7]
教科書p.40の練習問題4.15をやりなさい(Janken41).
&color(white,blue){check}; 教科書の問題文を最後までよく読みなさい.脚注も.
以下を元にして,どこがどう間違いなのか考えながら修正すること.
#pre{{
/** じゃんけんプログラム(間違いがあるよ)*/
public class Jaian41{
public static void main(String[] args){
if(random() < 2/3){
System.out.println("ぐぅ〜");
}
if(random() < 1/3){
System.out.println("ちょき〜ん");
}else{
System.out.println("ぱぁ〜");
}
}
}
}}
&color(white,blue){check};
-コンパイルが通るように修正すればよいというものではない.
正しい動作(例えば,ぐーちょきぱーは等確率になるようにするとか)を実現すること.
- Javaに限らずプログラミングを学んでいると,99/100 とかいう式見たらどきどきしますね(プログラミング言語によっては気をきかせてこの式の値を0.99 にしてくれるのもありますが…).
- 妹のペンネームはクリスチーネ剛田
**課題D(TA) 締切: 次回演習開始直後 [#kadaiD]
教科書p.39の練習問題4.14を参考に,以下に示すように少し違う動作をするプログラムを作りなさい(G04Race).
-3匹のかめ m1, m2, m3 を (0,100), (0,200), (0,300) に右向きに配置
-等確率でどれか1匹を選んで10だけ前に進めることを30回繰り返す
&color(white,blue){check};
- かめの初期位置と向きの設定をするために使ったコンストラクタは,何クラスのコンストラクタか? その引数の数はいくつか? p.14 のどれか?
**課題S(おまけ) [#kadaiS]
以下のプログラムとその実行結果を参考にして,キーボードから年月日を入力すると,その日の曜日を教えてくれるプログラムを作ろう.
-クラス名は G04WeekdayName とすること
-1901年以降について計算できればよい.1901年の1月1日は火曜日である.
-自分で導出できない謎の公式を使わずに計算するものとすること.
-計算機室のLinux環境では cal コマンドでカレンダーを表示できる(動作確認にどうぞ)
$ cal
$ cal 1901
-ヒント:
http://ja.wikipedia.org/wiki/%E9%96%8F%E5%B9%B4
の「グレゴリオ暦」の項を参照すると,ある年がうるう年かどうかの判定法がわかる.
-簡潔なプログラムを書こうと思うと,配列を使いたくなるかもしれない.教科書第5章へどうぞ(p.45?).
#pre{{
/** キーボードから入力した数の和を表示 */
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 + "だぴょん");
}
}
}}
#pre{{
$ java G04Scan
スペースや改行を区切りにしていくつか数値を入力してみてね
最後は数値以外の文字を入力してね
1 1 3.14 ← キーボードからの入力
1 1 1 ← キーボードからの入力
hoge 999 ← キーボードからの入力
合計は8.14だぴょん
}}
ページ名: