whileループ 例題

例題1. 0から1まで0.1間隔で表示する

forループではカウンタは整数でした。whileループを使うと実数のカウンタを利用できます。

// whileループ 0から1まで0.1刻みでカウント
class Ex_while_01 {
  public static void main(String args[]){
    double R = 0;
    while (R <= 1.0){
	  System.out.println(R);
      R += 0.1;
	}
  }
}

実行するとどんな結果になるでしょう?

例題2. 二乗の計算

0から1まで、0.1間隔で各実数の二乗と平方根を表示するプログラムです。

// whileループ 0から1まで0.1刻みでカウント
import java.text.*;

class Ex_while_02 {
  public static void main(String args[]){
    double C = 0;
    double J, R;
  
    while (C <= 1.0){
      J = Math.pow(C, 2);
      R = Math.sqrt(C);
      System.out.println(C + "の二乗は" + J + "\t" + C + "の平方根は" + R);
      C += 0.1;
    }
  }
}

例題3. 出力のフォーマット

これまでの例題で出力される数値の桁数はまちまちで見づらかったと思います。そこで数値の桁数を整えることができればより見やすい出力がえられます。

次のプログラムは例題2の出力の桁数を整えて出力するものです。

// whileループ 0から1まで0.1刻みでカウント
import java.text.*;

class Ex_while_03 {
  public static void main(String args[]){
    double C = 0;
    double J, R;
    String SC, SJ, SR;
    DecimalFormat DF1 = new DecimalFormat();
    DecimalFormat DF2 = new DecimalFormat();
 
    DF1.applyPattern("0.0000");
    DF2.applyPattern("0.0");
  
    while (C <= 1.0){
      J = Math.pow(C, 2);
      SJ = DF1.format(J);
      R = Math.sqrt(C);
      SR = DF1.format(R);
      SC = DF2.format(C);
      System.out.println(SC + " の二乗は " + SJ + "\t" + SC + " の平方根は " + SR);
      C += 0.1;
    }
  }
}

applyPatternはDecimalFormatクラスのメソッドで、引数に指定したパターンに従って数値をフォーマットします。

この例の場合、DecimalFormatのインスタンスDF1には0.0000が、DF2には0.0がフォーマットパターンとして指定されています。パターンの表現で0は数字を示すものです。

例題4. 整数の合計と平均

0以上の整数を繰り返し入力し、その都度合計を計算する。負の整数が入力されると繰り返しを終了し、平均を計算し、表示する。

データの個数が決まっていない時の合計や平均を求める時にはforループよりもwhileループを使います。

whileループの性質上、最初のデータだけはループ外で読み込みます。

// 入力された数値の合計と平均を算出
import java.io.*;
import java.text.*;

class Ex_while_04 {
  public static void main(String args[]){

// 変数宣言と初期化
    int Gokei = 0, InputData, C = 0;
    double Heikin;
    String S;
    Number Num;
    DecimalFormat DF = new DecimalFormat();
    
    BufferedReader BR = new BufferedReader(new InputStreamReader(System.in));

// 入力促進メッセージの表示
    System.out.println("0以上の整数の平均と合計を求めます。");
    System.out.println("入力する数値は0以上の整数です。");
    System.out.println("プログラムを終了するには負の数を入力します。");
    
// 最初のデータの入力
    System.out.print("入力 : ");
    try {
      S = BR.readLine();
      Num = DF.parse(S);
      InputData = Num.intValue();
    }
    catch (Exception e) { InputData = 0; }

// 二個目以降のデータの入力と合計計算
    while (InputData >= 0) {
      Gokei += InputData;  // 合計計算
      C++;                 // カウントアップ
      System.out.print("入力 : ");
      try {
        S = BR.readLine();
        Num = DF.parse(S);
        InputData = Num.intValue();
      }
      catch (Exception e) { InputData = 0; }
    }

// 平均値計算
    Heikin = (double)Gokei / C;

// 結果の表示
    System.out.println("データ数 : " + C + "\t合計 : " + Gokei + "\t平均 : " + Heikin);
  }
}

例題5 最大値の検出

例題4と同じ要領で繰り返しデータを読み込み、その中から最大値を検出するプログラムを示します。読み込むデータは0以上の整数値とし、繰り返しは負の数を入力すると終わるものとする。

プログラムの処理手順はおおよそ次のようになります。

  1. 最大値を記憶する変数の初期値は扱うデータ型の最小値に設定しておく
  2. 最初のデータを入力する
  3. ループに入る。入力されたデータが負の数でなければ次の手順に進む
  4. 現在の最大値と入力したデータとを比較する
  5. もし、入力したデータの方が大きければ、そのデータを新しい最大値とする
  6. 新しいデータの入力をする
  7. 手順3に戻る
// 最大値の検出
import java.io.*;
import java.text.*;

class Ex_while_05 {
  public static void main(String args[]){

//変数宣言
    int InputData, Max;
    String s;
    Number Num;
    
    DecimalFormat DF = new DecimalFormat();
    BufferedReader BR = new BufferedReader(new InputStreamReader(System.in));

// 仮の最大値の設定
    Max = Integer.MIN_VALUE;
    
    System.out.println("最大値検出プログラム");
    System.out.print("データを入力 : ");

// 最初のデータの入力
    try {
      s = BR.readLine();
      Num = DF.parse(s);
      InputData = Num.intValue();
    }
    catch (Exception e) { InputData = 0; }

// ループ開始
    while (InputData >= 0){

// 最大値の検出
      if(InputData > Max) {
        Max = InputData;
      }

// 二個目以降のデータ入力
      System.out.print("データを入力 : ");
      try {
        s = BR.readLine();
        Num = DF.parse(s);
        InputData = Num.intValue();
      }
      catch (Exception e) { InputData = 0; }
    }

// 結果の出力
    System.out.println("入力されたデータの最大値は" + Max + "でした");
  }
}