解答例 - j1.lesson11basic.ArrayStatistics3

package j1.lesson11basic;

import java.io.*;

/**
 * 課題1114 - 解答例.
 @author java2005
 @version $Id: ArrayStatistics3_java.rps,v 1.1 2006/07/14 05:33:59 java2005 Exp $
 */
public class ArrayStatistics3 {

    /**
     * コンソールから100点満点の成績データを次々と入力し、各データの偏差値を表示するプログラム。
     * 統計用語については自分で調べて欲しいが、要点だけ箇条書きにする。
     <ol>
     <li> 個々のデータと平均のを差をそのデータの偏差という。 </li>
     <li> 偏差の平方の平均を分散という。(偏差の平均は当然0になる) </li>
     <li> 分散の平方根を標準偏差という。標準偏差は、個々のデータの平均値からの「標準的なずれ」と考えることができる。 </li> 
     </ol>
     * 偏差値はデータを標準化するというアイデアに基づく。実際は、平均点が50点、標準的なずれが10点となるように点数のスケールを1次関数で変換する。
     * 詳細は擬似コード内の式を参照して欲しい。
     * この課題で作成するプログラムにおいては標準偏差が0.01より小さくなった場合、すべてのデータの偏差値を50とみなすことにする。
     * また、データの個数については2以上であることを要請する。
     * mainメソッドの動作を表す擬似コードは以下の通りである。
     <pre><code>
     * プログラム全体
     *     print &quot;データ個数を入力:&quot;
     *     dataSize = コンソール入力 (整数)
     *     if dataSize が1以下
     *         print &quot;データ個数は、2以上にして下さい。&quot;
     *         プログラムの終了
     *     data = 長さ dataSize の新しい配列 (int[])
     *     print &quot;データは0以上100以下で入力して下さい。&quot;
     *     for i を  0 から dataSize - 1 まで
     *         print &quot;第&quot; + i + &quot;番目のデータを入力:&quot;
     *         data[i] = コンソール入力(整数)
     *     // 総和を集計する
     *     total = 0
     *     for i を  0 から dataSize - 1 まで
     *         total に data[i] を加える
     *     // 平均を計算する
     *     average = total / data.length
     *     // 分散を求める
     *     v = 0
     *     for i を  0 から dataSize - 1 まで
     *         v に data[i]-average の平方を加える
     *     v を data.length で割る
     *     // 標準偏差を求める
     *     sigma = v の平方根
     *     // 結果の出力
     *     print &quot;データの総和:&quot; + total
     *     print &quot;データの平均:&quot; + average
     *     print &quot;データの分散:&quot; + v
     *     print &quot;データの標準偏差:&quot; + sigma
     *     if 標準偏差 &lt; 0.01
     *         print &quot;すべてのデータの偏差値は50&quot;
     *     else
     *         for i を  0 から dataSize - 1 まで
     *             print i + &quot;番目のデータの偏差値は&quot; + ((data[i] - average) * 10/ sigma +50) )
     </code></pre>
     
     @param args
     @throws IOException
     */
    public static void main(String[] argsthrows IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        // データの個数を入力する
        System.out.print("データ個数を入力:");
        int dataSize = Integer.parseInt(reader.readLine());
        if (dataSize < 2) {
            System.out.print("データ個数は、2以上にして下さい。");
            return;// または,system.exit(1);
        }
        // データを入力する
        int[] data = new int[dataSize];
        System.out.println("データは0以上100以下で入力して下さい。");
        for (int i = 0; i < data.length; i++) {
            System.out.print("第" + i + "番目のデータを入力:");
            data[i= Integer.parseInt(reader.readLine());
        }
        // 総和を集計する
        double total = 0;
        for (int i = 0; i < data.length; i++) {
            total += data[i];
        }
        // 平均を計算する
        double average = 0;
        average = total / data.length;
        // 分散を求める
        double v = 0;
        for (int i = 0; i < data.length; i++) {
            v += Math.pow(data[i- average, 2);
        }
        v /= data.length;
        double sigma = Math.sqrt(v);

        System.out.println("データの総和:" + total);
        System.out.println("データの平均:" + average);
        System.out.println("データの分散:" + v);
        System.out.println("データの標準偏差:" + sigma);

        if (sigma < 0.01) {
            System.out.println("すべてのデータの偏差値は50");
        }
        else {
            for (int i = 0; i < data.length; i++) {
                System.out.println(i + "番目のデータの偏差値は" ((data[i- average10 / sigma + 50));
            }
        }
    }
}