解答例 - j1.lesson05.Dichotomy

package j1.lesson05;

import java.io.*;

/**
 * 課題0504 - 解答例.
 @author s.arakawa
 @version $Id: Dichotomy_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
 */
public class Dichotomy {

    /**
     * コンソールに実数を一つ入力させ、その値の平方根の近似値を二分法を用いて計算するプログラム。
     @param args 無視される
     @throws IOException 入力中に例外が発生した場合
     */
    public static void main(String[] argsthrows IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        
        // n: 入力された値を保存する
        System.out.print("正の値を入力:");
        double n = Double.parseDouble(reader.readLine());

        if (n < 0) {
            System.out.println("正の値を入力してください");
        }
        else {
            // 方針
            //   課題に書いてある手続をその形のままプログラムへ
            
            // 1. a = 0, b = n とおく
            double a = 0.0;
            double b = n;
            // (n < 1 のときは b = 1 とおく)
            if (n < 1) {
                b = 1.0;
            }

            // c: 中間値を保存する
            double c;
            // do-while を使っているならば変数 c を初期化しないでよいが、
            // while などで実装した場合はこの時点で初期化しておくこと。
            // そうしないと、c に一度も値を代入しないまま使用される可能性があるため、
            // コンパイルエラーとなってしまう。
            // (do-while は必ず1度は実行される(=代入される)ので問題ない)

            // 入り口に判定がなく、出口に判定があるタイプなので
            // この問題では do-while を使用できる
            do {
                // 2. c = (a + b) / 2 とおく
                c = (a + b2;

                // fc: f(c)
                double fc = c * c - n;

                // 3. 次の条件を判定
                // f(c) < 0 であれば a = c とする
                if (fc < 0) {
                    a = c;
                }
                // f(c) == 0 であれば 解は c
                else if (fc == 0) {
                    // これ以上探す必要もないので、a = b = c とする
                    a = c;
                    b = c;
                }
                // f(c) > 0 であれば b = c とする
                else {
                    b = c;
                }

                // 4. 十分に小さくなるまで、現在のa,bを用いて 2 へ戻る
                // 5. b - a が十分に小さくなったら終了、そのとき 解の近似値は c
            while (b - a >= 0.0001);

            // 5. そのとき 解の近似値は c
            System.out.println("結果は" + c);
        }
    }
}