【问题标题】:Using a function to find the average of an array C++使用函数查找数组 C++ 的平均值
【发布时间】:2015-02-17 19:39:16
【问题描述】:

这个任务的目的是求一个数组的平均值,但不在主数组内,我必须调用一个函数来求和并显示平均值。

虽然我的代码是正确的,但它只是返回“平均值为 011014F1”

我已经尝试了几种不同的方法来完成这个功能,但我在某个地方出错了,也许到处都是!

请注意,我刚开始编程。

这是我的代码:

#include <iostream>
#include <vector>

using namespace std;


void printArray(int theArray[], int sizeOfarray);
float average(float numbers[], float size, float arrayAverage);

int main()
{

   int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

   printArray(array, 10);

   cout << "The average is: " << average << endl;

   return 0;
}

void printArray(int theArray[], int sizeOfarray)
{
   for (int x = 0; x < sizeOfarray; x++)
  {
    cout << theArray[x] << endl;

  }
}

float average(float numbers[], float size, float arrayAverage)
{
        double sum = 0.0;
        for (int x = 0; x < size; x++)
    {
        sum += numbers[x];
        arrayAverage = sum / size;
    }
        return (arrayAverage);
}

我将浮点平均函数最初设置为浮点数,“数字”、“大小”和“数组平均”为 int,但我认为我会将它们全部更改为浮点数,这样它们就不会发生冲突。比如将 int 转换为 float 等。

正如我所说,我对此很陌生,所以我的逻辑并不真正存在,但我认为我在正确的轨道上。

知道为什么它返回 011014F1 和类似的数字,而不仅仅是 1-10 的平均值吗?

非常感谢任何提示!

【问题讨论】:

  • 你打印的是average函数的地址。您必须使用参数调用它才能使其工作(否则它怎么知道它打算使用什么数组?)
  • 有一个错字。在cout 中你想要average(array, 10) 否则,正如你所发现的,它会打印函数指针。
  • @user3528438: std::valarray 是整个 C++ 标准库中最糟糕的东西,就在 std::vector&lt;bool&gt; 旁边。我从来没有在任何地方看到过推荐(或使用过)它,而且它在标准库中的事实更像是一个历史事故。参见例如Josuttis 的“C++ 标准库”一书了解详细信息。
  • 你应该学习一门不同的 C++ 课程,在数组之前教授 std::vector。在函数之间传递时,数组的工作量更大。
  • @ChristianHackl 如果你非常喜欢手写平均/最小值/最大值函数

标签: c++ arrays function


【解决方案1】:

average 是一个函数,您需要调用,并打印它返回的内容。你现在打印的是那个函数的地址

【讨论】:

  • 另外,正如所写,arrayAverage 参数绝对不会执行 OP 打算执行的操作。事实上,他们计算平均值的数学也是不正确的。
  • 其实不应该打印1,因为函数指针被转换为布尔值吗?这实际上是 VC 2013 发生的情况,包括有关转换的警告 (warning C4305: 'argument' : truncation from 'float (*)(float [],float,float)' to 'std::_Bool')。顺便说一句,我在 ideone.com 上也有同样的行为。问题是:为什么 OP 会在这里打印一个明显的地址?
  • @ChristianHackl 这可能是特定于编译器(或特定于平台)的。我当然不希望函数指针在流中被隐式转换为 bool。
【解决方案2】:

这里有很多问题。第一:

cout << "The average is: " << average << endl;

这只是打印出average 函数的地址,而不是调用它。你想做的是:

cout << "The average is: " << average(array, 10, 0) << endl;

其次,你的方法签名有各种类型的不匹配。预期的数组值类型是float,但您传递给它的是int 的数组。这不起作用,因为编译器不允许从int[]float[] 的隐式转换。您的 size 参数在方法签名中也应该是 int,而不是 float,因为数组大小始终是整数。

第三,arrayAverage 参数似乎没有任何目的,只是可能会甩掉你的数学。您将它用作运行累加器,这很好,但没有理由将它传递给函数,它可能只是一个本地值。因此,您的方法签名应如下所示:

float average(float numbers[], int size);

最后,您计算数组平均值的数学方法是错误的。你这样做:

for (int x = 0; x < size; x++)
{
    sum += numbers[x];
    arrayAverage = sum / size;
}

尤其是arrayAverage = sum / size 是错误的。或者更确切地说,仅在最终循环迭代期间是正确的。这意味着这只是浪费数学。应该是:

float average(float numbers[], int size) {
    double sum = 0;
    for (int x = 0; x < size; x++)
    {
        sum += numbers[x];
    }
    return sum /(double)size;
}

【讨论】:

  • 只是误按了输入,无论如何我确实在另一次中确实以这种方式进行了数学运算,但整个事情都是错误的并且没有工作,所以我改变了它....看起来更糟。正如我所说的那样,我的逻辑和理解并不完全是诚实的,这就是为什么我将int改为float等......但我现在已经把它们改回来了。尽管“平均值为:”
  • 它说 int 与 float 不兼容.....是因为“数字”是浮点数吗?
  • 如果您按照我的建议修改了average 方法的签名,那么它就只是average(array, 10),因为不再需要arrayAverage 参数作为参数。
  • @molebox 啊,正确,我忘记了 C++ 不会将 int[] 隐式转换为 float[]。在方法之间传递数组时,它们的类型必须匹配。有一些方法可以使用模板来解决这个问题,但我非常怀疑此时您是否想要参与其中。
  • 我摆脱了 arrayAverage 并将浮点数更改为 int,我还按照您所说的整理了计算,并且看到了该死的东西有效!感谢您的帮助!令人沮丧的是,我实际上之前也有过同样的计算,但我把整个事情都刮了一遍,然后又开始认为这是我的问题之一。所以我得到平均回报为 011014F1 的原因是我没有正确调用函数?
【解决方案3】:

您没有将任何东西传递给您的函数平均值,浮点平均值(浮点数 [],浮点大小,浮点数组平均)您应该将数组作为第一个参数传递,并将数组的大小传递给第二个参数,第三个参数传递给您不需要它,我建议你删除它你的功能将是:

float average(float numbers[], float size)
{
float average;
        double sum = 0.0;
        for (int x = 0; x < size; x++)
    {
        sum += numbers[x];
        arrayAverage = sum / size;
    }
        return (average);
}

在你的主要你做一个 float averageResult = average(array, size); qDebug()《averageResult;

【讨论】:

  • arrayAverage = sum / size; 放在循环内是浪费时间,您可以将其移到循环外的末尾。
【解决方案4】:
#include <iostream>
#include <vector>

using namespace std;

void printArray(int theArray[], int sizeOfarray);

int main()
{
   int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
   printArray(array, 10);
   return 0;
}

void printArray(int theArray[], int sizeOfarray)
{
   for (int x = 0; x < len(theArray); x++)
  {
    average = average + theArray[x]
  }
  average = average/(len(theArray));
  cout << average;
}

【讨论】:

  • len(theArray) 是什么?如果你很久没有用 C++ 写代码,不要盲目发错代码
  • 不,你不是,你的代码不能编译,你误导了 OP 和其他人说有类似 len 的函数,实际上没有这样的函数。建议你删除这个帖子或者重新写固定的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 2015-01-15
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多