解答例 - j1.lesson11.Distribution

package j1.lesson11;

import java.io.*;

/**
 * 課題1101 - 解答例.
 @author s.arakawa
 @version $Id: Distribution_java.rps,v 1.1 2006/03/06 12:56:14 java2005 Exp $
 */
public class Distribution {

    /**
     * コンソールからテストの得点を整数で次々と入力し、10点区切りの得点分布表を表示するプログラム。
     * 以下の擬似コードで表される。
     <pre>
     * プログラム全体
     *     print &quot;受験者数を入力:&quot;
     *     count = コンソール入力 (整数)
     *     if count が負の値
     *         print &quot;受験者数には0以上の値を入力してください&quot;
     *         プログラムの終了
     *     score-list = 長さ count の新しい配列 (int[])
     *     for i を 0 から count - 1 まで
     *         print &quot;点数を入力:&quot;
     *         score-list[i] = コンソール入力(整数)
     *     distribution = create-distribution(score-list)
     *     print-distribution(distribution)
     </pre>
     @param args 無視される
     @throws IOException 入力時に例外が発生した場合
     */
    public static void main(String[] argsthrows IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        // print "受験者数を入力:"
        System.out.print("受験者数を入力:");

        // count = コンソール入力 (整数)
        int count = Integer.parseInt(reader.readLine());

        // if count が負の値
        if (count < 0) {
            // print "受験者数には0以上の値を入力してください"
            System.out.println("受験者数には0以上の値を入力してください");
            // プログラムの終了
            return;
        }

        // score-list = 長さ count の新しい配列 (int[])
        int[] scoreList = new int[count];

        // for i を 0 から count - 1 まで
        for (int i = 0; i < count; i++) {
            // print "点数を入力:"
            System.out.print("点数を入力:");

            // score-list[i] = コンソール入力(整数)
            scoreList[i= Integer.parseInt(reader.readLine());
        }

        // distribution = create-distribution(score-list)
        int[] distribution = createDistribution(scoreList);

        // print-distribution(distribution)
        printDistribution(distribution);
    }

    /**
     * 与えられた得点の表に対して、10点区切りの得点分布表を作成する。 得点は0から100が有効で、それ以外の点数が入力された場合は、その値を得点分布表に反映させない。
     * 得点分布表の各要素は、以下のようにする。
     <ol start="0">
     <li> 0 ~ 9 </li>
     <li> 10 ~ 29 </li>
     <li> 20 ~ 39 </li>
     <li> 30 ~ 39 </li>
     <li> 40 ~ 49 </li>
     <li> 50 ~ 59 </li>
     <li> 60 ~ 69 </li>
     <li> 70 ~ 79 </li>
     <li> 80 ~ 89 </li>
     <li> 90 ~ 99 </li>
     <li> 100 </li>
     </ol>
     * 以下の擬似コードで表される
     <pre>
     * create-distribution(score-list)
     *     distribution = 要素数11の新しい配列
     *     for i = 0 から score-list の長さ - 1
     *         score = score-list[i]
     *         if score が 0 以上 100 以下
     *             score-class = score の下1桁を削った値
     *             distribution[score-class] を 1 増加
     *     distribution を返す
     </pre>
     @param scoreList 得点リスト
     @return 得点リストに対する得点分布表
     */
    // create-distribution(score-list)
    public static int[] createDistribution(int[] scoreList) {
        // distribution = 要素数11の新しい配列
        int[] distribution = new int[11];

        // for i = 0 から score-list の長さ - 1
        for (int i = 0; i < scoreList.length; i++) {
            // score = score-list[i]
            int score = scoreList[i];

            // if score が 0 以上 100 以下
            if (<= score && score <= 100) {
                // score-class = score の下1桁を削った値
                int scoreClass = score / 10;

                // distribution[score-class] を 1 増加
                distribution[scoreClass]++;
            }
        }

        // distribution を返す
        return distribution;
    }

    /**
     * 引数に与えられた得点分布表を表示する。 
     * 得点分布表は0点から10点区切りで10要素と、100点の1要素の合わせて11要素の配列とする。
     * 以下の擬似コードで表される。
     <pre>
     * print-distribution(distribution)
     *     for i を 0 から 9 まで
     *         score-start = 10 * i
     *         score-end = score-start + 9
     *         print score-start &quot;-&quot; score-end &quot;:&quot; distribution[i], 改行
     *     print &quot;100:&quot; distribution[10], 改行
     </pre>
     @param distribution 得点分布表
     */
    // print-distribution(distribution)
    private static void printDistribution(int[] distribution) {
        // assert distribution.length == 11;

        // for i を 0 から 9 まで
        for (int i = 0; i <= 9; i++) {
            // score-start = 10 * i
            int scoreStart = i * 10;
            // score-end = score-start + 9
            int scoreEnd = scoreStart + 9;
            // print score-start "-" score-end ":" distribution[i], 改行
            System.out.println(scoreStart + "-" + scoreEnd + ":" + distribution[i]);
        }
        // print "100:" distribution[10], 改行
        System.out.println("100:" + distribution[10]);
    }
}