1

いくつかのサイコロのロールのヒストグラムを出力するこのコードがあります。私の問題は、最初のヒストグラムを2番目のヒストグラムの隣に印刷したいということです。現在、出力は次のようになっていますが、次のようここに画像の説明を入力にロール回数の右側に星を配置したい: 2 : 3回 /// 3 : 1回/など。

        public static void main(String[] args) {
    // TODO code application logic here
    System.out.print("Please enter how many times to roll the dice: ");
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int [] rolls = new int[n];


    Random r1 = new Random();
    Random r2 = new Random();

    int dice1;
    int dice2;
    int [] t = new int [13];


    for (int roll=0; roll < rolls.length; roll++)
    {
         dice1 = r1.nextInt(6)+1;
         dice2 = r2.nextInt(6)+1;

         System.out.println(roll + " : I rolled a " + dice1 + " and a " + dice2);

         int sum;
         sum = dice1 + dice2;

         if (sum == 2)
             t[0]++;
         if (sum == 3)
             t[1]++;
         if (sum == 4)
             t[2]++;
         if (sum == 5)
             t[3]++;
         if (sum == 6)
             t[4]++;
         if (sum == 7)
             t[5]++;
         if (sum == 8)
             t[6]++;
         if (sum == 9)
             t[7]++;
         if (sum == 10)
             t[8]++;
         if (sum == 11)
             t[9]++;
         if (sum == 12)
             t[10]++;

    }   

System.out.println("Histogram of rolls:" ); 
    String star ="*";
    int [] h= {t[0], t[1],t[2], t[3],t[4], t[5], t[6], t[7],t[8], t[9],t[10]};
     for (int i=0; i <h.length; i++)
             {
        for(int j = 0; j < h[i]; j++) 
           System.out.print( star);
        System.out.println();
    }



    System.out.println("Histogram of rolls:" );

    System.out.println( "2 : " + t[0] + " times");
    System.out.println("3 : " + t[1] + " times");
    System.out.println("4 : " + t[2] + " times");
    System.out.println("5 : " + t[3] + " times");
    System.out.println("6 : " + t[4] + " times");
    System.out.println("7 : " + t[5] + " times");
    System.out.println("8 : " + t[6] + " times");
    System.out.println("9 : " + t[7] + " times");
    System.out.println("10 : " + t[8] + " times");
    System.out.println("11 : " + t[9] + " times");
    System.out.println("12 : " + t[10] + " times");

}

}

4

2 に答える 2

1

コードの最後の部分を次のように変更します。

    ...
    System.out.println("Histogram of rolls:" ); 
    String star ="*";

    // No point in using "int [] h"

    for (int i=0; i < t.length; i++) {

        // Placing the logic for printing the text inside the loop
        // is how you use arrays
        System.out.print( (i+2) + " : " + t[0] + " times");
        for(int j = 0; j < t[i]; j++) {
           System.out.print(star);
        }
        System.out.println();
    }
}

さらに重要なことは、配列を使用することの重要な利点を見逃している可能性があることです。シーケンシャル ロジックをハードコーディングするのではなく、配列を使用する場合は常にループを使用する必要があります。たとえば、if ステートメントの大きなクラスター:

     if (sum == 2)
         t[0]++;
     if (sum == 3)
         t[1]++;
     if (sum == 4)
         t[2]++;
     if (sum == 5)
         t[3]++;
     if (sum == 6)
         t[4]++;
     if (sum == 7)
         t[5]++;
     if (sum == 8)
         t[6]++;
     if (sum == 9)
         t[7]++;
     if (sum == 10)
         t[8]++;
     if (sum == 11)
         t[9]++;
     if (sum == 12)
         t[10]++;

単純に次のように減らすことができます。

    t[sum-2]++;
于 2012-10-29T01:54:19.330 に答える
1

提案:

1) 配列 h[] はまったく必要ありません

2) 同じループ内で、ヒストグラムの各行 (「***」) と「ロールのヒストグラム数」の各行を一緒に印刷する必要があります。

3) 変数を作成しString asterisks = "************";、"for (...)" ループの代わりに subString.() コピーを使用して正しい数のアスタリスクを出力します。

PS:

String.subString() は、他の質問で提案しようとしたものです

于 2012-10-29T01:54:47.500 に答える