【发布时间】:2017-11-29 03:52:57
【问题描述】:
我目前正在用 c 编写一个程序,该程序是通过函数做一些方程式。可能要读取的数据最多为 100 万个不包括 0 的两个精度浮点数。当我尝试计算读入数组的数字数量时出现错误,但由于某种原因,我得到了一个默认值264 每次我运行程序。因此,例如,如果不输入任何值,我会得到 264、1 值 265、2 值 266 等等。我想我可以从 count 中减去 264 以获得准确的总数,但我想知道为什么会发生这种情况以及 264 的来源。我在下面附上了到目前为止的代码。谢谢。
#include <stdio.h>
#include <stdlib.h>
#define N 1000000
int count_num(double numbers[]);
double sum(double numbers[]);
double max(double numbers[]);
double min(double numbers[]);
double ar_mean(double numbers[]);
double har_mean(double numbers[]);
double variance(double numbers[]);
int main(void)
{
double numbers[N];
int i =0;
while(scanf("%lf.2",&numbers[i])!=EOF&&i<N)
{
i++;
}
int count=count_num(numbers);
printf("Count: %d\n", count);
}
int count_num(double numbers[])
{
int count=0;
for(int i=0;i<N;i++)
{
if((numbers[i]!=0)&&(numbers[i]!=0.0))
{
count++;
}
}
return count;
}
【问题讨论】:
-
有几个问题,但我认为主要问题是 C 没有将值初始化为默认值(即您的双精度数组未初始化为 0 数组)。这仍然不能完全解释为什么你继续得到 264...
-
首先,在
count_num中,您总是查看大小为N的整个数组,而只有该数组中的第一个i值是有意义的。其余的都是不可预测的垃圾。分析和统计这些垃圾有什么意义? -
将一个 3.8 MB 的数组放入堆栈对我来说似乎并不明智。
-
感谢您的帮助。我以为我必须遍历整个数组,因为我不知道输入的大小只是它的最大大小。我知道我可以在 Java 中使用 ArrayList 之类的东西,但我认为在课堂上的这一点上,我们不应该使用 C 中的东西(例如动态内存分配)来解决这个问题。如果我不需要的话,我认为这将是不浪费内存来保存 100 万个双精度值的最佳方法。