如何用数字块打印int数组? (直方图打印)

时间:2016-10-21 12:29:24

标签: c arrays histogram

对于这个程序,我的意思是生成一定数量的具有给定范围的随机整数。例如,在0-10之间的100英寸。

我创建了一个分布数组(称为distTab),它显示了生成某个数字的次数。然后我将数字打印为for循环中的星号。检查下面的图片。

enter image description here

这适用于0-10但是说我在0-1000之间生成10000个数字我的打印功能会打印distTab的每个索引。我想按范围剪切并在该范围内相互添加索引值。例如在0-100之间 - > 20星,101-200 - > 21星等等。

这是我目前打印直方图的代码:

int inc=0;

printf("\n%s\t%s\n","Number", "Histogram\n");
for(int i=0; i <= max; i++) {
    if(distTab[i]==0)       
        continue;

    printf("  %d\t",i);
    int lim = distTab[i];

    for(int j=1; j<=lim; j++){          
        printf("*");
        inc++;
    }
    printf("\n");
}

随机数和distTab就像这样创建(在for循环中):

int distTab[MAX_RAND];
memset(distTab, 0, sizeof distTab);

//for(0 -> desired number of ints)
    rnd = (rand() % limit)+1;
    if (max < rnd)
        max = rnd;  //max value generated.
    distTab[(int)rnd]++;
//}

提前感谢您的时间,我希望尽可能清楚地解释我的问题。

2 个答案:

答案 0 :(得分:0)

缩放直方图。或者甚至更好地以百分比打印它。 我会做类似

的事情
lim = distTab[i] / max_distTab * max_lim;

这样,您最常用的值总是与之相同。

答案 1 :(得分:0)

以下是我将如何处理0到9999之间的数字以及范围100:

int inc=0;
int count[10] = {0};
printf("\n%s\t%s\n","Number", "Histogram\n");
for(int i = 0; i <= max; i++) {
    if(distTab[i]==0)       
        continue;

    count[max % 100] += distTab[i];
 }

 for (int i = 0; i < 10; ++i){
    printf("%4d-%4d\t",i * 100, (i + 1) * 100);
    int lim = count[i];

    for(int j=1; j<=lim; j++){          
        printf("*");
        inc++;
    }
    printf("\n");
}

我使用硬值来避免变量长度数组,但更好的做法是malloc你的数组或使用define。

如果你想要一个自定义范围,你也可以使用另一个排序的int数组:

int ranges[] = {100, 300, 450, 600, 1000};
// assuming ranges is sorted
int get_index(int value, int* ranges){
  int count = 0;
  if (value > ranges[ranges.size() - 1])
    return -1;
  while (value < ranges[count])
    ++count;
  return count;
}

并替换

for(int i = 0; i <= max; i++) {
    if(distTab[i]==0)       
        continue;

    count[max % 100] += distTab[i];
 }

通过:

for(int i = 0; i <= max; i++) {
    if(distTab[i]==0)       
        continue;

    count[get_index(i, ranges)] += distTab[i];
 }