カテゴリー
Java

Java(Step4-1)

プログラムの流れの繰り返し

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();
    }
}
Season2.java実行結果

mainメソッドの大部分がdoとwhileで囲まれています。この囲んでいる文をdo文(do statement)と呼びます。

doは、「実行せよ」という意味で、whileは「~のあいだ」という意味です。do文は、式を評価した値がtrueである限り、文を繰り返し実行します。このプログラムの流れは、図のようになります。

Season2.javaのdo文のフローチャート

繰り返しのことをループ(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();
    }    
}
FingerFlashing3.java実行結果

このプログラムのdo文の制御式は、次のようになっています。

hand < 0 || hand > 2   //handが0~2の範囲外か

変数handの値が、不正な値(0より小さいかまたは2より大きい値)であれば、この式を評価した値はtrueとなります。そのため、handが0、1、2以外の値であれば、ループ本体であるブロックが繰り返し実行されます。

このdo文の流れを示したのが以下の図になります。

FingerFlashing3.javaの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();
    }
}
NumGussing.java実行結果

プログラムのフローチャートを以下に示します。

NumGussing.javaのフローチャート
  1. 「数を入力してください」と数値の入力を促して、変数xに値を読み込みます。
  2. 読み込んだxの値がnoより大きければ、「もっと小さい数です」と表示し、xの値がnoより小さければ「もっと大きいです」と表示します。

それから、do文を繰り返すかどうかの判定を行います。判定のための制御式は、

x != no       //読み込んだxと当てるべき数noが等しくないか

です。したがって、読み込んだxの値が当てるべき数noと等しくない間do文が繰り返されることになります。数が当たったら、do文は終了し、「正解です」と表示してプログラムを終了します。