while が繰り返すかどうか判断するのは繰り返し部分を実行する前です。これを一度実行したあとに条件判定をしたい場合が出てきます。
do { /* 繰り返しの処理の内容 */ }while( 終了判定条件 );
do ではどんな場合でも、繰り返しの処理の内容を1度は実行します。
次の例は1をどんどん2倍して表示し、1000より大きくなったらやめるプログラムです。
/** whileの使い方 */
public class Dloop {
public static void main( String[] args ) {
double x = 1;
do {
System.out.println( x );
x = x * 2;
} while( x < 1000 );
}
}
結果は以下の通り。前のページのものと同一です。
1.0 2.0 4.0 8.0 16.0 32.0 64.0 128.0 256.0 512.0
do while の振る舞いも単純です。
while を書かなければ、無限に繰り返すプログラムになります。
for や while に比べて異なる形をしています。while では、
while ( 判定条件 ) { 繰り返しの処理の内容 }
do では、
do { 繰り返しの処理の内容 } while ( 判定条件 );
while を使って次のように書くと do と同等のことをするプログラムになります。
繰り返しの処理の内容 while ( 判定条件 ) { 繰り返しの処理の内容 }
上記の Dloop.java を作りなさい。
次は繰り返し乱数を発生させ、0.999より大きい数が出るまでに何回繰り返したかと、その数を表示するプログラムです。例によって Math.random() が 0~1 未満の数値を返す関数です。
public class Dloop2 { public static void main( String[] args ) { double x; int i = 0; x = Math.random(); i++; while( 0.999 > x ){ x = Math.random(); i++; } System.out.println(i + "回目で" + x + "が出ました。"); } }
上記のプログラムを while でなく、do while を用いて書くと次の様にすっきりする。このような場合には do while が便利であることを感じ取りなさい。
public class Dloop3 { public static void main( String[] args ) { double x; int i = 0; do { x = Math.random(); i++; }while( 0.999 > x ); System.out.println(i + "回目で" + x + "が出ました。"); } }
上記のプログラムを参考に、繰り返し乱数を発生させ、0.001より小さい数が出るまでに何回繰り返したかと、その数を表示するプログラムを、do while を用いて作りなさい。
注 このプログラムはDloop3.javaと同じように表示すると分かりにくい表記になる
System.out.println(i + "回目で" + x + "が出ました。");
例えばこんな感じ
$ java Dloop4 425回目で4.293599243221369E-5が出ました。
これは 4.293599243221369 × 10-5 のことで、小数点を5桁左に動かして、
0.00004293599243221369 という数値がでたということになります。
課題としてはこれでOKですが、不満な方はSystem.out.printlnの次の行に以下の1行を加えてください。
System.out.printf("%3d回目で%10.9fが出ました。\n",i,x);
すると、0.000...という答えも一緒に出てきます。
$ java Dloop4 425回目で4.293599243221369E-5が出ました。 425回目で0.000042936が出ました。