我怎样才能用 C++ 中的数组解决这个问题?

How can I solve this problem with arrays in C++?

我正在应对 Edabit 挑战:获取给定数组的算术平均值。现在我有这样的代码:

#include <iostream>
int data;
using namespace std;
int mean(int data);
int main()
{
    int data[] = { 1, 2, 3, 4 };
    cout << mean(data);
}
int mean(int data)
{
    double mean = 0;
    for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++)
    {
        mean += data[i];
    }
    mean /= sizeof(data) / sizeof(data[0]);
}

我卡住了。我在 Windows 7 Professional 上使用 Visual Studio 2019,并在 3 个字符(data[i] 和 2x data[0])下划线。为此 x Visual Studio 表示 expression must have pointer-to-object type (Error E0142) 我不知道这意味着什么。我只知道指针是什么


在 Visual studio 中我添加了 return 语句,但是在此处缩短发布代码时忘记添加它。否则,这不是实际问题。现在我不能在问题中添加它,因为评论是错误的。评论与上面的问题有关,但我真正的问题(对于未来坚持这个问题的读者)是:

How to pass array as an argument in the function.

现在,我更精通 C++,我知道术语和如何表述它,而且我也知道这对初学者来说不是那么清楚:你不能只写 f(int[] arr) (你不能传递数组),但你必须写 f(int* arr) (你可以传递指向该数组的指针)。那时我不能随便搜索,因为我对C++术语了解不多。

你的 mean 函数,好吧,很平均。
1. 它没有 return 值;没有 return 声明。
2. 它使用与函数相同的变量名(不是推荐的编码风格)。
3.main.
里面有一个全局变量data被局部变量data隐藏了 4. 您混淆了编译器和 reader:全局 data 变量是一个 单个 intmain 中的局部变量是 int.

数组

最后一行应该是:
return mean;

数组作为参数传递给函数时会衰减为指针(在本例中为 int*)。您的 mean 函数只接受一个 int.

当数组衰减为指针时,大小信息将丢失。但是,您可以通过定义一个函数来防止这种情况发生,该函数接受您需要的确切类型和大小的数组。这可以通过模板来完成:

#include <iostream>

template<typename T, size_t N>
double mean(const T (&data)[N]) {
    double sum = 0;
    for (size_t i = 0; i < N; ++i)
    {
        sum += data[i];
    }
    return sum / N;
}

int main()
{
    int input[] = { 1, 2, 3, 4, 5, 6, 7 };
    std::cout << mean(input) << '\n';
}

如果您不想使用模板(或只接受特定大小的数组),您需要手动将大小信息传递给函数:

#include <iostream>
#include <iterator> // std::size

double mean(const int* data, size_t N)
{
    double sum = 0;
    for (size_t i = 0; i < N; ++i)
    {
        sum += data[i];
    }
    return sum / N;
}

int main()
{
    int input[] = { 1, 2, 3, 4, 5, 6, 7 };
    std::cout << mean(input, std::size(input)) << '\n';
}