【问题标题】:How to count instance of items from an array in C?如何计算C中数组中的项目实例?
【发布时间】:2018-03-31 12:59:04
【问题描述】:

如果这个问题看起来太含糊,我深表歉意,但我是一个完全的初学者,我被困在如何计算数组中的数字实例。

我有一个名为 create_hist() 的函数,它有三个输入:一个输入双精度数组,其数字范围从 016,一个输入整数,指示数组中有多少个元素,以及一个输出大小为17 的整数数组。目标是计算第一个数组中有多少每个数字,然后将该数字分配给输出数组的正确索引,即:

如果输入数组包含{0,1,1,2,3,4,4},则计数为7,输出数组应为{1,2,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0}

我对 C 编程非常陌生,我不知道从哪里开始。我的想法是我可以遍历输入数组中的每个元素,如果元素等于零,则将1 添加到输出数组的第一个索引,依此类推。我知道这是错误的,但我不知道另一种方式。有人可以指导我如何开始这个吗?我的第一次尝试如下。

int create_hist( double input_array[], int count, int hist[17] ) {
    for ( int i = 0; i < count; i++ ) { 
        if ( input_array[i] == 0; ) {
            // then add 1 to hist[0]
        }
        if ( input_array[i] == 1; ) {
            // then add 1 to hist[1]
            // etc.
    }
}   

【问题讨论】:

    标签: c arrays loops for-loop count


    【解决方案1】:

    您离一个好的解决方案还差一百万英里。如果您已经有 count 可以传入,那就很方便了。否则,您可以将其替换为:

    sizeof(input_array)/sizeof(double)
    

    如果您确定输入数组中可以出现的最大值,那么剩下的问题应该很容易了。

    循环遍历 input_array 中的每个项目,就像您已经在做的那样。然后增加与当前项的值相关的 hist 的索引,如下所示:

    for(int i = 0; i<count; i++){
        hist[input_array[i]]++;
    }
    

    这应该会提供您正在寻找的输出。为了将来参考,这称为countoccurrence算法。

    【讨论】:

    • 谢谢,这很有道理。我遇到的唯一问题是我的 input_array 被声明为双精度,当我尝试运行它时,我得到“数组下标不是整数”。我应该尝试以某种方式将双 input_array 转换为 int 吗?
    • 这会使事情稍微复杂化——因为我们使用 input_array 的值作为 hist 数组的索引,所以我们需要它们是整数。如果您确定它们将是整数,则可以通过将 (int) 直接放在对变量的引用前面来转换它们。您可以通过搜索“c cast double to int”来了解更多信息。如果您不确定它们是否是整数,则必须考虑使用不同的数据结构进行输出。
    • 是的,看来我必须截断一些数组值才能使用它们。我试过### for (int i = 0; i
    • 通过您正在使用的分配,您正试图将一个整数放回双精度数组中。尝试将循环的内容替换为: hist[(int)input_array[i]]++;
    【解决方案2】:

    函数可以如下所示

    size_t create_hist( const double in[], size_t n, int out[] ) 
    {
        const size_t N = 17;
    
        memset( out, 0, N * sizeof( *out ) );
    
        for ( size_t i = 0; i < n; i++ ) ++out[( size_t )in[i]];
    
        size_t m = 0;
    
        for ( size_t i = 0; i < N; i++ )
        {
            if ( out[i] ) ++m;
        }
    
        return m;
    }
    

    这是一个演示程序

    #include <stdio.h>
    #include <string.h>
    
    #define SIZE    17
    
    size_t create_hist( const double in[], size_t n, int out[] ) 
    {
        const size_t N = SIZE;
    
        memset( out, 0, N * sizeof( *out ) );
    
        for ( size_t i = 0; i < n; i++ ) ++out[( size_t )in[i]];
    
        size_t m = 0;
    
        for ( size_t i = 0; i < N; i++ )
        {
            if ( out[i] ) ++m;
        }
    
        return m;
    }
    
    int main(void) 
    {
        double a[] = { 0, 1, 1, 2, 3, 4, 4 };
        int b[SIZE];
    
        size_t n = create_hist( a, sizeof( a ) / sizeof( *a ), b );
    
        printf( "There are %zu unique elements\n", n );
    
        for ( size_t i = 0; i < SIZE; i++ ) printf( "%d ", b[i] );
        putchar( '\n' );
    
        return 0;
    }
    

    它的输出是

    There are 5 unique elements
    1 2 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多