-1
void doSomething()
{
    int hist[5] = { 0 };
    int num_bins = 5;
    int indices[10] = { 0, 0, 2, 3, 3, 3, 3, 4, 4, 4 };
    int num_indices = 10;
    int i;

    for (i = 0; i < num_indices; i++)
    {
        hist[indices[i]]++;
    }
    for (i = 0; i < num_bins; i++)
    {
        printf("%d ", hist[i]);
    }
    printf("\n");
}

假设我有正确的库,这是课堂上的一个概念性问题。我想知道数组的 2 0 1 4 3 的答案是如何得出的。

4

6 回答 6

8

线

hist[indices[i]]++

说“转到hist索引处的数组元素indices[i],然后递增它。” 如果您将数组视为计数器列表,则表示要在 position 处递增计数器indices[i]

此代码构建数组中各种数字的频率的直方图。上述代码背后的想法是迭代数组并增加每个元素的频率。

希望这可以帮助!

于 2013-10-02T17:53:06.850 回答
0

从到indices范围内的元素,都是 5 个元素数组的有效索引。(这就是数组命名的原因,因为它用于索引)04histindices

例如,iis 2,然后indices[i]is 2

hist[indices[i]]++;

相当于

hist[2]++;
于 2013-10-02T17:53:34.483 回答
0

对于这样的小问题,您应该尝试在一张纸上写下每个数组的每个元素的状态,并逐步执行您的代码。您还可以编写代码以在运行时打印有用的信息。

如果在那之后您仍然无法弄清楚,那么值得在这里询问。否则你不会学到很多东西。

于 2013-10-02T17:58:01.237 回答
0

该程序将 0 递增

hist

因为它的索引出现在

indices[10]

例如。

当你有第一个进行交互时

hist[indices[0]]++   // hist[0]++  --> 0++;
于 2013-10-02T17:58:33.253 回答
0

看起来“2 0 1 4 3”是对数组中存在多少项的计数。2 个 0、0 个 1、1 个 2、4 个 3 和 3 个 4。所以查询是计算每个数字在数组中有多少个实例,然后打印出该结果。

所以声明:

hist[indices[i]]++

找到 indices[] 的值,然后将 hist[] 数组中的 int 递增 1,从而计算出数组中有多少这些元素。

于 2013-10-02T17:59:25.437 回答
0

1.当您部分初始化数组时,编译器将其他值设置为 0
2.hist[indices[i]]++; 此语句增加 hist[i] 的值,对于 i 的当前值
3.i 的值由您的数组 indices[]
4.try 在您的名为 indices[] 的数组中具有大于 5 的值。

于 2014-07-28T16:54:42.593 回答