【问题标题】:How to print an array of int by blocks of numbers? (Histogram printing)如何按数字块打印 int 数组? (直方图打印)
【发布时间】:2016-10-21 12:29:23
【问题描述】:

对于这个程序,我打算在给定范围内生成一定数量的随机整数。例如 0-10 之间的 100 个整数。

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

这适用于 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]++;
//}

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

【问题讨论】:

  • 你试过什么?
  • 你需要写一个函数int myfunc(int value)(我让你找一个更合适的函数名)如果value在0到100之间返回20,如果value在101之间返回21和 200、22 表示 value 在 201 和 300 之间等。提示:从铅笔和一张纸开始。

标签: c arrays histogram


【解决方案1】:

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

lim = distTab[i] / max_distTab * max_lim;

这样你最常见的值总是与相同的。

【讨论】:

    【解决方案2】:

    对于 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");
    }
    

    我使用硬值来避免可变长度数组,但是更好的做法是对数组进行 m​​alloc 或使用定义。

    如果你想要一个自定义范围,你也可以使用另一个排序的 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];
     }
    

    【讨论】:

    • 谢谢!我目前正在对我的代码实施您的建议。如果有效,会及时通知您。这似乎并不太难,但我就是想不通。
    • 您希望我澄清哪一部分?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2013-09-26
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多