c - 为什么我的数字数组的平均值不正确?
问题描述
我写了一个方法来获取一个数组(通过指针)和它的大小来计算平均值。我对指针还比较陌生。我试图在整个代码中删除引用运算符,直到它将编译,但返回的值不是预期的。例如,如果我传入一个大小为 3 的数组,然后我的数组值为 {1,2,3},闭上眼睛我可以告诉你平均值应该是 2。但是我的代码返回 2.666666667。反过来想,我将 2.6666...7 乘以 3,等于 8。这让我认为我在某个地方,a 2 被修改为数组,例如 {1,2,3,2},但是我我现在不确定。如果有人对指针/简单算术有任何经验,我将不胜感激您的建议,因为我再次对指针和按地址引用的这种想法不熟悉。谢谢!
double *Average(double *arr, int size)
{
double *avg;
avg = (double *)malloc(sizeof(double));
*avg = 0;
int i;
for (i = 0; i < size; i++)
{
*avg = *avg + arr[i];
}
*avg = *avg / (double) size;
printf("The average of the array: %f\n", *avg);
return avg;
}
如何从 main 调用该方法:
else if (choice == 'C' || choice == 'c')
{
int count;
printf("How many numbers do you want to use in the array?\n> ");
scanf("%d", &count);
double *arr;
arr = (double *)malloc(sizeof(double) * count);
int i;
for (i = 0; i < count; i++)
{
printf("Please enter a number (%d of %d)\n> ", i + 1, count);
scanf("%lf", &arr[i]);
}
Min(arr, count);
Max(arr, count);
Average(arr, count);
}
测试:
- 平均({1,3,5}, 3)
预期:3,得到:4.333333
- 平均({1,1,1}, 3)
预期:1,得到:1
- 平均({1,2,3,4,5,6,7,8,9}, 9)
预期:5,得到:5.888889
每个用户请求的两个额外方法:
double *Min(double *arr, int size)
{
double *min = &arr[0];
int i;
for (int i = 1; i < size; i++)
{
if (arr[i] < *min)
{
*min = arr[i];
}
}
printf("Smallest number in array: %f\n", *min);
return min;
}
double *Max(double *arr, int size)
{
double *max = &arr[0];
int i;
for (int i = 1; i < size; i++)
{
if (arr[i] > *max)
{
*max = arr[i];
}
}
printf("Largest number in array: %f\n", *max);
return max;
}
解决方案
问题就在这里,纠正这个:
*max = arr[i];
您正在将*max
其更改arr[0]
为数组的最大值或最小值。因此,当Average()
函数获取数组时,它不是您输入的数组,而是更改了。例如:
Max({1,3,5})=5
数组变为:
arr={5,3,5}
正确的平均值是:
Average({5,3,5} = 4.3333
推荐阅读
- python - scikit-learn 逻辑回归求解器中的 FutureWarning
- python - 如何通过 Python 在 XML 中插入父节点?
- makefile - 如何让 make 自动响应相同源数据的其他模板?
- java - 出现软键盘时使用 Recycler View 调整布局大小
- python-3.x - 如何从下面提到的 xml 文件中获取所需的值?
- c# - 生产者消费者竞争条件
- flutter - 将图像添加到扩展磁贴
- c# - C#/JSON - TypeNameHandling 仅在 SerializationBinder 被触发时
- node.js - 打字稿获取响应流
- python-3.x - “对象没有属性‘配置’”——Label.Configure 只工作一次?