C程序返回错误...谷歌不知道

wfsdck30  于 2023-01-04  发布在  其他
关注(0)|答案(1)|浏览(112)

下面的代码获取一个整数数组,并创建一个带有移动的平均值的数组(即第i位的值是数组中第i位之前最后n个元素的平均值(如果它们存在);如果i〈n,则为i之前的现有元素的平均值。例如:对于n=3 1 2 3 4 5 6 -〉1 1.5 2 3 4 5

#include <stdio.h>
#include <stdlib.h>

float *
mobMean (int x[], int n, int nval)
{
    int i, j, sum, num;
    float *means;

    if(means=malloc(sizeof(float) * nval))
    {
        for(i=0; i<nval; i++)
        {
            sum=0;
            num=0;
            for(j=i; j>=0 && i-j>=n; j--)
            {
                sum+=x[j];
                num++;
            }
            *(means+i)=(float)sum/num;
        }
    }
    else
        printf("e");
    return means;
}

int
main()
{
    int a[10], i;
    float *b;
    for(i=0; i<10; i++)
        scanf("%d", &a[i]);
    b=mobMean(a,3,10);
    for(i=0; i<10; i++)
        printf("%f", *(b+i));
    free(b);
    return 0;
}

控制台(gcc编译器)作为输出返回-nan连续10次。不仅我的pc,而且在线编译器。谷歌没有一个线索,这是什么。我真的很感激你的帮助。

a11xaf1n

a11xaf1n1#

此for循环的主体

for(j=i; j>=0 && i-j>=n; j--)

由于条件i-j>=n而从不执行,因为最初i - j等于0
你可以这样写

sum = x[i];
        num = 1;
        for ( j = i; j-- != 0 && num < n; ++num )
        {
            sum += x[j];
        }

这是一个演示程序。

#include <stdio.h>
#include <stdlib.h>

float * mobMean( const int a[], size_t size, size_t n )
{
    float *means = NULL;

    if (( means = malloc( sizeof( float ) * size ) ) != NULL)
    {
        for (size_t i = 0; i < size; i++)
        {
            float sum = a[i];
            size_t num = 1;

            for (size_t j = i; j-- != 0 && num < n; ++num)
            {
                sum += a[j];
            }

            means[i] = sum / num;
        }
    }

    return means;
}

int main( void )
{
    int a[] = { 1, 2, 3, 4, 5, 6 };
    const size_t N = sizeof( a ) / sizeof( *a );

    float *b = mobMean( a, N, 3 );
        
    if (b != NULL)
    {
        for (size_t i = 0; i < N; i++)
        {
            printf( "%.1f ", b[i] );
        }
        putchar( '\n' );
    }

    free( b );
}

程序输出为

1.0 1.5 2.0 3.0 4.0 5.0

我在for循环中声明了局部变量,如果你用语言标签c89标记了这个问题,你可以在代码块开始的循环之前声明它们。

相关问题