0

こんにちは、rand() と time.h に基づくサイコロを振るジェネレーターに必要なコードを作成しました。基本的に、サイコロを振る回数を入力するようにユーザーに要求し、それらの X 回を転がします。1 ~ 6 の数字のそれぞれがロールされた回数を配列に保存し、各数字のパーセンテージを別の配列に保存します。

今、私がやりたいことは、数字が 1 ~ 6 で、X 軸にパーセンテージと | があるヒストグラムを作成することです。列の Y 軸と星 (*)。

このようなもの:

10% | *
 8% |* * *
 6% |* * * * *
 4% |* * * * * *
 2% |* * * * * *
    +------------
     1 2 3 4 5 6

まず何かを見つけるためにGoogleで検索しましたが、最初に役立つ私のケースに似たものを実際に見つけました。

したがって、私のコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int random_number();
float calc_percentage(int totals, int nums);
float calc_maxper(float perc[6]);
float calc_minper(float perc[6]);
float permin;
float permax;


int main(void)
{
  int nums;
  int i;
  int totals[6] = {0};
  float percentages[6] = {0};

  srand(time(NULL));

  printf("How many numbers to generate?");
  scanf("%d", &nums);

  for (i = 1; i <= nums; i++)
  {
    int x = random_number();
    totals[x-1]++;
  }

  for (i = 0; i<6; i++)
  {
    percentages[i] = calc_percentage(totals[i],nums);
    printf("The percentage of each number is: %.2f%\n", percentages[i]);
  }


  permin = calc_minper(percentages);
  permax = calc_maxper(percentages);

  if (((permax) - (permin)) > 5)
    printf("The generator is not good.\n");
  printf("The percentage difference is:%.1f\n", permax-permin);

  system("pause");
  return 0;
}



int random_number()
{
  int randnum;
  randnum = 1 + (rand() % 6);

  return randnum;
}

float calc_percentage(int totals, int numbers)
{
  float a;

  a = (totals * 100)/numbers;

  return a;
}

float calc_minper(float perc[6])
{
  int i;
  float min;
  min = perc[0];

  for (i=1; i<6; i++)
  {
    if (perc[i] < min)
      min = perc[i];
  }
  return min;
}

float calc_maxper(float perc[6])
{
  int i;
  float max;
  max = perc[0];

  for (i=1; i<6; i++)
  {
    if (perc[i] > max)
      max = perc[i];
  }
  return max;
}

わかりました、私はついにこれを成し遂げました。

ちょっと長くて厄介ですが、それは間違いなく仕事を成し遂げます!!

printf("20%|");
for (i=0; i<6; i++)
{
    if (percentages[i] >= 20)
       printf("* ");
}
printf("\n");

printf("16%|");
for (i=0; i<6; i++)
{
    if (percentages[i] >= 16)
       printf("* ");
}  
printf("\n");


printf("12%|");
for (i=0; i<6; i++)
{
    if (percentages[i] >= 12)
       printf("* ");
}  
printf("\n");


printf(" 8%|");
for (i=0; i<6; i++)
{
    if (percentages[i] >= 8)
       printf("* ");
}  
printf("\n");


printf(" 4%|");
for (i=0; i<6; i++)
{
    if (percentages[i] >= 4)
       printf("* ");
}  



printf("\n");
printf("  +------------\n");   
printf("   1 2 3 4 5 6\n");

あなたのアイデアをありがとう!それを短くするための簡単なアイデアがあれば、すべて耳にします!

4

1 に答える 1

1

各範囲 (10%、8% など) について、現在のサイコロの数 (1 ~ 6) のパーセンテージがそれを超えているかどうかを確認し、* (範囲の最小値を満たしていない場合はスペース) を出力します。最後に、グラフ ベースを印刷します。

for を使用して範囲を処理できます。

float range;
float interval = (permax-permin)/(NUM_INTERVALS-1);
for (range = permax; range >= permin - EPSILON; range -= interval){
    int i;
    printf("%2.2f%% | ", range);
    for(i=0; i<6; i++){
        char *out = percentages[i] >= range ? "*" : " ";
        printf("%s ", out);
    }
    printf("\n");
}
printf("      | 1 2 3 4 5 6\n");
于 2012-04-16T19:47:53.333 に答える