| 
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 "受験者数を入力:"
 *     count = コンソール入力 (整数)
 *     if count が負の値
 *         print "受験者数には0以上の値を入力してください"
 *         プログラムの終了
 *     score-list = 長さ count の新しい配列 (int[])
 *     for i を 0 から count - 1 まで
 *         print "点数を入力:"
 *         score-list[i] = コンソール入力(整数)
 *     distribution = create-distribution(score-list)
 *     print-distribution(distribution)
 * </pre>
 * @param args 無視される
 * @throws IOException 入力時に例外が発生した場合
 */
 public static void main(String[] args) throws 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 (0 <= 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 "-" score-end ":" distribution[i], 改行
 *     print "100:" 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]);
 }
 }
 |