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 "データ個数を入力:"
* dataSize = コンソール入力 (整数)
* if dataSize が1以下
* print "データ個数は、2以上にして下さい。"
* プログラムの終了
* data = 長さ dataSize の新しい配列 (int[])
* print "データは0以上100以下で入力して下さい。"
* for i を 0 から dataSize - 1 まで
* print "第" + i + "番目のデータを入力:"
* 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 "データの総和:" + total
* print "データの平均:" + average
* print "データの分散:" + v
* print "データの標準偏差:" + sigma
* if 標準偏差 < 0.01
* print "すべてのデータの偏差値は50"
* else
* for i を 0 から dataSize - 1 まで
* print i + "番目のデータの偏差値は" + ((data[i] - average) * 10/ sigma +50) )
* </code></pre>
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws 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] - average) * 10 / sigma + 50));
}
}
}
}
|