【问题标题】:Mean function using values from double array displaying wrong values使用显示错误值的双数组中的值的平均函数
【发布时间】:2020-02-20 10:06:57
【问题描述】:

对 C 来说非常陌生,无论如何都要编写一个程序,您可以在其中输入存储在单独数组中的双精度对。我创建了一个函数来获取数字的平均值,但是当我在 main 内部调用它时,值是不同的。有任何想法吗?

平均函数:

mean(double *arr)
{
    double sum = 0.0;
    double meanValue = 0.0;
    int i;

    for (i = 0; i < arr[i]; i++)
    {
        sum += arr[i];
        meanValue = sum / i;
    }

    printf("\nmean: %.3lf", meanValue);
}

主要:

double num1[1001];
mean(num1);

而且,我正在使用以下方法获取 num1 和 num2 值:

for (k = 0; (scanf_s("%lf,%lf", &num1[k], &num2[k] ) == 2); k++)

【问题讨论】:

  • i &lt; arr[i] 作为循环条件毫无意义。
  • 你需要将数组的大小传递给函数,然后使用i &lt; size
  • 而且你只需要在循环外计算一次meanValue
  • 应该是meanValue = sum / size;
  • @Barmar 喜欢 sizeof(arr)?

标签: c


【解决方案1】:

函数需要知道它应该处理多少个数组元素。

mean(double *arr, int size)
{
    double sum = 0.0;
    double meanValue = 0.0;
    int i;

    for (i = 0; i < size; i++)
    {
        sum += arr[i];
    }
    meanValue = size > 0 ? sum / size : 0;

    printf("\nmean: %.3lf", meanValue);
}

大小是输入循环完成后k的值,所以你叫它:

mean(num1, k);

【讨论】:

    【解决方案2】:

    你的函数需要的信息:

    • 指向数据数组的指针;
    • 数组的大小(元素数)。

    但是,您计算平均值的方式会受到不良数值条件的影响(浮点溢出)。在这里,我建议改用Incremental Averaging。请考虑以下代码:

    double mean(double *arr, int num)
    {
        double res = arr[0];
    
        for (int i = 1; i < num; ++i)
            res += (arr[i] - res) / (i+1.0);
    
        return res;
    }
    
    

    请注意,我假设您在 for 循环中使用符合 C99 的编译器来声明整数。

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      相关资源
      最近更新 更多