山元進 指示をよく読むこと まず、この 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) Perm.permutation(int key,int[] inout) 長さ10の整数配列を並べ替える。 ただし、入力には制限があり、条件を満たさないと実行時 エラーになる boolean Perm.isIdentity(int[] input) 長さ10の整数配列を画面に印字する 長さ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番目の引数については、実行時エラーに ならない限り、何でも良い。 問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 つしかないのは、そのため。 0123456789 8901564237 3789645012 1237456890 9012564378 7890645123 2378456901 0123564789 8901645237 3789456012 1237564890 9012645378 7890456123 2378564901 0123645789 8901456237 3789564012 1237645890 9012456378 7890564123 2378645901 0123456789 Finished. 1行目は、繰り返し処理の前に実行した print で印字されたもの 繰り返し処理 1 回目 繰り返し処理 2 回目 繰り返し処理 3 回目 繰り返し処理 21 回目 ここで元の並びに戻ったので繰り返し終了 終わったしるしに "Finished." と印字 do { 継続条件がtrueの間、繰り返し行う処理 } while( 継続条件 ) ; 最低1回は { } 内の処理が行われる ※ 繰り返し行う処理が 1 文であるばあい、 { } で括る必要はない。しかし、形式を整えるため、 いつでも { } を入れておいた方が良い。 do 繰り返し行う処理 ({ } の中の処理) while 継続条件 false do~while 文の次の文へ true while( 継続条件 ) { 継続条件がtrueの間、繰り返し行う処理 } while 文で継続条件が true である間、繰り返す 処理が記述できる。 条件の記述に気をつける。 ※ 繰り返し行う処理が 1 文であるばあい、 { } で 括る必要はない。しかし、形式を整えるため、い つでも { } を入れておいた方が良い。 繰り返し行う処理 ({ } の中の処理) while 継続条件 false while 文の次の文へ true 初めに継続条件が false だと、 一度も「繰り返し行う処理」を実行せずに終了 for ( 初期化 ; 継続条件 ; 更新処理 ) { 繰り返し行う処理 } 何回も繰り返す処理を簡単に記述できる ※ 繰り返し行う処理が 1 文であるばあい、 { } で括る必要はない。しかし、形式を整えるため、 いつでも { } を入れておいた方が良い。 初期化 更新処理 繰り返し行う処理 ({ } の中の処理) for 継続条件 false for 文の次の文へ true 初めに継続条件が false だと、 一度も「繰り返し行う処理」を実行せずに終了 0123456789 8901564237 3789645012 1237456890 9012564378 7890645123 2378456901 0123564789 8901645237 3789456012 1237564890 9012645378 7890456123 2378564901 0123645789 8901456237 3789564012 1237645890 9012456378 7890564123 2378645901 0123456789 Finished. 1行目は、繰り返し処理の前に実行した print で印字されたもの 繰り返し処理 1 回目 繰り返し処理 2 回目 繰り返し処理 3 回目 規則の明文化の例 0→8 1→9 2→0 3→1 4→5 5→6 6→4 7→2 8→3 9→7 繰り返し処理 21 回目 ここで元の並びに戻ったので繰り返し終了 終わったしるしに "Finished." と印字 前頁の規則は、入力する配列のデータの並 びを、前頁に出てくる 21 種に限定すれば正 しいが、例えば {0,1,2,3,4,5,6,7,9,8} を入れ ると正しくない どんな入力に対しても Perm.permutation と 同じ変換をするのが良い解答 実行時エラーまで再現する必要はない
© Copyright 2025 ExpyDoc