我怎样才能用 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
变量是一个 单个 int
。 main
中的局部变量是 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';
}
我正在应对 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
变量是一个 单个 int
。 main
中的局部变量是 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';
}