【问题标题】:Calculate the mean of an array of n numbers in C计算C中n个数字的数组的平均值
【发布时间】:2020-08-01 04:46:59
【问题描述】:

我是 C 新手,我正在努力掌握基础知识,所以我编写了一个程序,它可以为您提供树数的平均值并且它可以工作,但是当我尝试编写它的更通用版本时,作为我收到的输出:插入一系列数字:“数字的平均值是-nan”。这意味着我什至不能插入数字。我现在不知道如何以更好的方式编写 scanf 部分。

代码如下:

#include <stdio.h>

int main() {

    int p;
    double n[p];
    int i;
    double sum = 0;
    double m;

    printf("Insert a series of numbers:\n");

    for(int r = 0; r < p; r++) {
        scanf("%lf", &n[r]);
    }

    for(i = 0; i < p; i++) {
        sum += n[i];
    }

    m = sum / p;
    printf("The mean of the numbers is %lf", m);

    return 0;
}

【问题讨论】:

  • 未定义的行为。 p 未初始化,因此定义 double n[p]; 未定义。
  • 这里有一些问题。首先你还没有定义p! for 循环如何知道何时停止?当您声明变量 int p 时,它有一个随机值。确保初始化变量,例如 int p=10'
  • 我什至可以让用户决定 p 的值吗?也许通过在第一个 for 之前放置另一个 printf 和 scanf
  • @Schiele 是的,那么n 就是所谓的 VLA 或可变长度数组 -> en.wikipedia.org/wiki/Variable-length_array。

标签: c arrays initialization variable-assignment


【解决方案1】:
int p;

您忘记初始化p。由于p 是automatic 存储类的对象,它具有不确定的值。

因此,

double n[p];
....

for(int r = 0; r < p; r++){
    scanf("%lf", &n[r]);
}

for(i = 0; i < p; i++){
    sum += n[i];
}
m = sum / p;

调用undefined behavior。

像 f.e. 一样初始化 p

int p = 5;

如果所有项目都分配成功,也不要忘记检查scanf()的返回值,例如:

if(scanf("%lf",&n[r]) != 1) 
{
     fprintf(stderr,"Error at scanning!");
     return 1;
}

【讨论】:

  • 我还有一个疑问,尽管已初始化,但我收到以下警告:'p' is used uninitialized is this function,指的是双n [p]。为什么?
  • @Schiele 在您的编译代码中是 int p = N; 在 double n[p]; 之前(就像问题中提供的示例一样)?
  • 是的,就像问题中的例子一样。
  • @Schiele 嗯,与问题中提供的代码相比,您到底做了什么更改?你如何初始化p?
  • @Schiele 我在答案中添加了一些重要的内容 - 始终检查 scanf() 的返回。别忘了检查一下。
猜你喜欢
  • 2019-04-08
  • 2016-10-24
  • 2021-01-25
  • 2019-07-30
  • 1970-01-01
  • 2014-05-14
  • 2013-10-25
  • 2015-04-22
相关资源
最近更新 更多