プログラムの流れの繰り返し
do文
プログラムで行う処理は一回だけ実行するのではなく、何度も繰り返して実行できます。そのための1つとしてdo文があります。
do文
前の記事では、入力された月の季節を表示するプログラムを作成しました。入力・表示は一回のみに限られています。何度でも入力できるように拡張していきましょう。それが、以下のコードです。
//Season2.java
//入力された月の季節を表示
import java.util.Scanner;
public class Season2 {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
int retry;
do{
System.out.print("季節を求めます。\n何月ですか:");
int month = stdIn.nextInt();
if(month >= 3 && month <= 5)
System.out.println("その季節は春です。");
else if(month >= 6 && month <= 8)
System.out.println("その季節は夏です。");
else if(month >= 9 && month <= 11)
System.out.println("その季節は秋です。");
else if(month >= 12 || month == 1 || month == 2 )
System.out.println("その季節は冬です。");
System.out.print("もう一度? 1…Yes/0…No :");
retry = stdIn.nextInt();
}while(retry==1);
stdIn.close();
}
}
mainメソッドの大部分がdoとwhileで囲まれています。この囲んでいる文をdo文(do statement)と呼びます。
doは、「実行せよ」という意味で、whileは「~のあいだ」という意味です。do文は、式を評価した値がtrueである限り、文を繰り返し実行します。このプログラムの流れは、図のようになります。
繰り返しのことをループ(loop)と呼ぶので、do文が繰り返す文のことをループ本体(loop body)と呼ぶことにします。
一定範囲の値の読み込み
ジャンケンの手である「グー」「チョキ」「パー」を表示するプログラムを以前作りましたが、0、1、2以外の値を入力すると何も表示されません。do文を用いれば、この3つの値のみの入力しか受け付けないようにできます。そのように書き換えたのが以下のプログラムになります。
//FingerFlashing3.java
//読み込んだ値に応じてジャンケンを表示(0,1,2のみ)
import java.util.Scanner;
public class FingerFlashing3 {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
int hand;
do{
System.out.print("何を出しますか?(0…グー、1…チョキ、2…パー):");
hand = stdIn.nextInt();
}while(hand < 0 || hand > 2);
switch(hand){
case 0:System.out.println("グー");break;
case 1:System.out.println("チョキ");break;
case 2:System.out.println("パー");break;
}
stdIn.close();
}
}
このプログラムのdo文の制御式は、次のようになっています。
hand < 0 || hand > 2 //handが0~2の範囲外か
変数handの値が、不正な値(0より小さいかまたは2より大きい値)であれば、この式を評価した値はtrueとなります。そのため、handが0、1、2以外の値であれば、ループ本体であるブロックが繰り返し実行されます。
このdo文の流れを示したのが以下の図になります。
数あてゲーム
これまで習ってきた乱数、if文、do文を利用して数あてゲームを作ってみましょう。0~99の数字の中から数を当てるプログラムを以下に示します。
//NumGussing.java
//数当てゲーム(0-99)
import java.util.Random;
import java.util.Scanner;
public class NumGussing {
public static void main(String[] args){
Random rand = new Random();
Scanner stdIn = new Scanner(System.in);
int num = rand.nextInt(100);
System.out.println("数当てゲームスタート");
System.out.println("0~99の値を当ててください。");
int x;
do{
System.out.println("数を入力してください。:");
x = stdIn.nextInt();
if(x > num)
System.out.println("もっと小さい数です。");
else if(x < num)
System.out.println("もっと大きい数です。");
}while(x != num);
System.out.println("正解です。");
stdIn.close();
}
}
プログラムのフローチャートを以下に示します。
- 「数を入力してください」と数値の入力を促して、変数xに値を読み込みます。
- 読み込んだxの値がnoより大きければ、「もっと小さい数です」と表示し、xの値がnoより小さければ「もっと大きいです」と表示します。
それから、do文を繰り返すかどうかの判定を行います。判定のための制御式は、
x != no //読み込んだxと当てるべき数noが等しくないか
です。したがって、読み込んだxの値が当てるべき数noと等しくない間do文が繰り返されることになります。数が当たったら、do文は終了し、「正解です」と表示してプログラムを終了します。