こんにちは。「Javaを復習する初心者」です。点数とその度数が与えられときに、コンソールに度数分布図を「*」で出力してみました。グラフは横向きです。
準備
点数の範囲は0~ 9点、10~19点、・・・、90~99点、100点とします。それぞれに人数が設定されている場合に、その度数分布図をコンソールに出力してみようということです。
点数はランダムに1000件用意します。
処理の流れ
全体の処理の流れは以下の通りです。
- 点数をランダムで格納する。
- 点数を以下の区分で集計する。
0~ 9点、10~19点、・・・、90~99点、100点 - 以下の定義で出力
- 出力する行のフォーマット
- [ラベル]:[人数]:[*のグラフ]
- 出力するラベル
-
以下を右詰めで出力
- 0~ 9点
- 10~19点
- 20~29点
- 30~39点
- 40~49点
- 50~59点
- 60~69点
- 70~79点
- 80~89点
- 90~99点
- 100点
- 出力する人数
- 半角数字4桁のフィールドで「○人」
- *のグラフ
-
条件 出力内容 0人の場合 出力なし 1人以上、10人未満の場合 「*」を1個出力 10人以上の場合 「*」を「割る10したもの + 1」個出力
点数をランダムで格納するにはRandomクラスを使いました。[インスタンス].nextInt(101)で101未満の整数をランダムに得ることができます。1000個の要素からなるint型配列に格納しました。
集計では11個の要素からなるint型配列を定義しました。点数を11区分にするからです。点数pointに対してpoint / 10が格納する先の要素番号になります。for文で点数を走査し対象を加算しています。
出力では書式文字列「”%s:%4d人:%s”」を使いました。順番に、ラベル、人数、グラフです。グラフの生成はメソッドにしました。人数を引数にし、*の文字列を返却します。if文で処理を分岐し、*の長さを調整してます。
プログラム
以下はソースと実行結果です。
ソースコード
package practice;
import java.util.Random;
public class Hello20160802 {
public static void main(String[] args) {
// 点数をランダムで格納
int[] points = new int[1000];
Random random = new Random();
for (int i = 0; i < points.length; i++) {
points[i] = random.nextInt(101);
}
// 集計
int[] counts = new int[11];
for (int point : points) {
counts[ point / 10 ] ++;
}
// 出力
String[] labels = {
" 0~ 9点",
"10~19点",
"20~29点",
"30~39点",
"40~49点",
"50~59点",
"60~69点",
"70~79点",
"80~89点",
"90~99点",
" 100点",
};
for (int i = 0; i < counts.length; i++) {
System.out.printf("%s:%4d人:%s", labels[i], counts[i], graphOf(counts[i]));
System.out.println();
}
}
private static String graphOf(int count) {
StringBuilder sb = new StringBuilder();
int length = 0;
if (0 < count && count < 10) {
// 1人以上、10人未満の場合、1
length = 1;
} else if (10 <= count) {
// 10人以上の場合、割る10したもの + 1
length = count / 10 + 1;
}
for (int i =0; i < length; i++) {
sb.append("*");
}
return sb.toString();
}
}
結果
0~ 9点: 100人:***********
10~19点: 116人:************
20~29点: 106人:***********
30~39点: 100人:***********
40~49点: 78人:********
50~59点: 108人:***********
60~69点: 84人:*********
70~79点: 108人:***********
80~89点: 86人:*********
90~99点: 107人:***********
100点: 7人:*
ランダムに点数を得ているため、どの区分もそれなりの人数です。100点は区分が狭いから人数が少ないです。