0

您好,我已经编写了基于 rand() 和 time.h 的骰子滚动生成器所需的代码。它基本上要求用户输入他希望掷骰子的次数,然后掷 X 次。它保存了 1-6 个数字中的每个数字在一个数组中滚动的次数以及每个数字在另一个数组中的百分比。

现在我想做的是创建一个直方图,其中有数字 1-6 和 - 在 X 轴上,百分比和 | 在 Y 轴上,星号 (*) 用于列。

像这样的东西:

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

我已经通过谷歌搜索以找到开始的东西,但我真的找到了与我的案例类似的任何东西,这将帮助我开始。

因此,我的代码是:

#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 回答