170 likes | 304 Views
プログラミング基礎 I( 再 ). 山元進. 今日 は課題を 解くの メイン. 指示をよく読むこと まず、この PowerPoint の資料があったのと同じ Web page から、 Perm.class をダウンロードし、今日の課題プログラムを作成するディレクトリに置く。 同様に、 Ex01.java をダウンロードし、同じディレクトリに置く。 Ex01.java の id=999; という行の 999 を、自分の学籍番号の下 3 ケタに書きかえる。. 課題. class Ex01 {
E N D
プログラミング基礎I(再) 山元進
今日は課題を解くのメイン • 指示をよく読むこと • まず、この PowerPoint の資料があったのと同じ Web page から、 Perm.classをダウンロードし、今日の課題プログラムを作成するディレクトリに置く。 • 同様に、Ex01.java をダウンロードし、同じディレクトリに置く。 • Ex01.java の id=999; という行の999を、自分の学籍番号の下3ケタに書きかえる。
課題 class Ex01 { public static void main(String[] args){ int id=999; int[] test={0,1,2,3,4,5,6,7,8,9}; Perm.print(test); do{ Perm.permutation(id,test); Perm.print(test); }while(! Perm.isIdentity(test)); System.out.println("Finished."); } }
付加説明 • Perm.print(int[] input) • 長さ10の整数配列を画面に印字する • Perm.permutation(intkey,int[] inout) • 長さ10の整数配列を並べ替える。 • ただし、入力には制限があり、条件を満たさないと実行時エラーになる • booleanPerm.isIdentity(int[] input) • 長さ10の配列が、{0,1,2,3,4,5,6,7,8,9} と等しければ true そうでなければ false を返す • これらの3つのメソッドは、Perm.classが同じディレクトリにあると使える。
以下、id=999; が書き換え済みであるとする。 • 問1 Ex01.java をコンパイル・実行し、結果を確認せよ。このプログラムで、 Perm. print, Perm.permutation, Perm.isIdentityの3つのメソッドは、どのような順序で実行されるか? 紙に書いて説明せよ。図を併用しても良い。 • 問2 Ex01.java と同じ動作をするプログラムを、do を使わずに while のみを使って作れ。class 名は Report01 とする。 • 問3 Ex01.java と同じ動作をするプログラムを、do も while も使わずに、for を使って作れ。class 名は Report02 とする。
以下では、Perm.permutation の1番目の引数が、自分の学籍番号の下3ケタで固定されているとして答えよ。2番目の引数については、実行時エラーにならない限り、何でも良い。以下では、Perm.permutation の1番目の引数が、自分の学籍番号の下3ケタで固定されているとして答えよ。2番目の引数については、実行時エラーにならない限り、何でも良い。 • 問4 Perm.permutationが行っている置き換えはどのような置き換えか、置き換え規則を明文化せよ。 • この問の解答にはグレードがある。 • 良い解答は、2番目の引数の配列に蓄えられたデータの並びが、どのようなものであっても、Perm.permutationが行う置き換えの結果を再現する規則を書くことである。 • 普通の解答は、実行時に出力される 21 個のデータの並び方に対して置き換えの結果を再現する規則である。 • 1番目の引数が自分の学籍番号以外についてまで再現する必要はない。 • 理解を補助する目的で図を加えても良い。
問5 Perm.permutationの1番目の引数を自分の学籍番号の下3ケタに固定した場合と同じ動作をするメソッド permutation (int[ ] array)を作成し、permutation とPerm.permutationとの動作比較をするプログラムを作れ。ただし、class 名は Report03 とすること。 • この問の解答にも、問4と同様のグレードがある。 • 1番目の引数が自分の学籍番号以外についてまで再現する必要はない。→ 今回作る permutation の引数が 1 つしかないのは、そのため。
id=999; の場合の実行例 0123456789 1行目は、繰り返し処理の前に実行した print で印字されたもの 8901564237 繰り返し処理 1 回目 3789645012 繰り返し処理 2 回目 1237456890 繰り返し処理 3 回目 9012564378 7890645123 2378456901 0123564789 8901645237 3789456012 1237564890 9012645378 7890456123 2378564901 0123645789 8901456237 3789564012 1237645890 9012456378 7890564123 2378645901 0123456789 繰り返し処理 21 回目 ここで元の並びに戻ったので繰り返し終了 Finished. 終わったしるしに "Finished." と印字
do~while文 (Ex01) do { 継続条件がtrueの間、繰り返し行う処理 } while( 継続条件 ) ; 最低1回は { } 内の処理が行われる ※ 繰り返し行う処理が 1 文であるばあい、 { } で括る必要はない。しかし、形式を整えるため、いつでも { } を入れておいた方が良い。
do~while 文の実行順序 do 繰り返し行う処理 ({ } の中の処理) while 継続条件 true false do~while 文の次の文へ
while 文 (Report1) while( 継続条件 ) { 継続条件がtrueの間、繰り返し行う処理 } while 文で継続条件が true である間、繰り返す処理が記述できる。 条件の記述に気をつける。 ※ 繰り返し行う処理が 1 文であるばあい、 { } で括る必要はない。しかし、形式を整えるため、いつでも { } を入れておいた方が良い。
while 文の実行順序 繰り返し行う処理 ({ } の中の処理) while 継続条件 true 初めに継続条件が false だと、 一度も「繰り返し行う処理」を実行せずに終了 false while 文の次の文へ
for 文 (Report2) for ( 初期化 ; 継続条件 ; 更新処理 ) { 繰り返し行う処理 } 何回も繰り返す処理を簡単に記述できる ※ 繰り返し行う処理が 1 文であるばあい、 { } で括る必要はない。しかし、形式を整えるため、いつでも { } を入れておいた方が良い。
for 文の実行順序 初期化 更新処理 繰り返し行う処理 ({ } の中の処理) for 継続条件 true 初めに継続条件が false だと、 一度も「繰り返し行う処理」を実行せずに終了 false for 文の次の文へ
id=999; の場合の変換規則 0123456789 1行目は、繰り返し処理の前に実行した print で印字されたもの 8901564237 繰り返し処理 1 回目 3789645012 繰り返し処理 2 回目 1237456890 繰り返し処理 3 回目 9012564378 7890645123 2378456901 0123564789 8901645237 3789456012 1237564890 規則の明文化の例 0→8 9012645378 1→9 7890456123 2→0 2378564901 3→1 0123645789 4→5 8901456237 5→6 3789564012 6→4 1237645890 7→2 9012456378 8→3 7890564123 9→7 2378645901 0123456789 繰り返し処理 21 回目 ここで元の並びに戻ったので繰り返し終了 Finished. 終わったしるしに "Finished." と印字
ただし… • 前頁の規則は、入力する配列のデータの並びを、前頁に出てくる 21 種に限定すれば正しいが、例えば {0,1,2,3,4,5,6,7,9,8} を入れると正しくない • どんな入力に対しても Perm.permutationと同じ変換をするのが良い解答 • 実行時エラーまで再現する必要はない