プログラミング基礎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)


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 と
同じ変換をするのが良い解答
 実行時エラーまで再現する必要はない
