【问题标题】:How can I solve this problem with arrays in C++?如何用 C++ 中的数组解决这个问题?
【发布时间】:2020-06-07 12:24:46
【问题描述】:

我正在处理 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 语句,但在此处缩短发布代码时忘记添加它。否则,这不是真正的问题。现在我不能在问题中添加它,因为 cmets 是错误的。 cmets 与上面的问题有关,但我真正的问题(对于坚持这个问题的未来读者)是:

如何将数组作为参数传递给函数。

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

【问题讨论】:

  • a good textbook学习总是一个好主意。
  • int mean(int data) 的参数是单个整数,而不是数组。 sizeof 也不适用于数组参数(请参阅 this),并且您在 mean 中缺少 return
  • @R Sahu 有没有在线的教科书?从教科书中学习是否比从错误中学习和通过小项目学习更好?
  • 至于否决票:您的代码看起来好像您甚至没有阅读教科书的相关章节或其他一些结构化的教学材料。同样,如果您搜索错误消息,则可以在此站点上找到 许多 答案。由于这些原因,“没有显示任何研究努力”的反对理由似乎适用,imo。 SO 并不意味着可以替代一本好的教科书或教你。问题和答案也应该对其他读者有所帮助,请参阅meta.stackoverflow.com/questions/252677/…
  • 那么强烈建议您停止浏览各种网站,转而阅读good textbook。众所周知,大多数 C++ 教程网站都很糟糕。

标签: c++ arrays mean visual-studio-2019


【解决方案1】:

当作为参数传递给函数时,数组会衰减为指针(在这种情况下为 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';
}

【讨论】:

    【解决方案2】:

    你的 mean 函数,嗯,很卑鄙。
    1、不返回值;没有return 声明。
    2. 使用与函数相同的变量名(不推荐的编码风格)。
    3.有一个全局变量datamain内部的局部变量data隐藏。
    4. 你混淆了编译器和读者:全局变量data 是一个单个 intmain 中的局部变量是int数组

    最后一行应该是:
    return mean;

    【讨论】:

    • 我该如何做 int 数组?我一开始就说我是初学者。
    • 您有一个int 数组:int data[] = { 1, 2, 3, 4};。这里的变量是一个 int 数组。代码顶部的变量不是,而是同名。
    • 和有什么区别?
    • 数组和单个变量的区别还是局部变量和全局变量的区别?
    • 请在单数和数组之间。
    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 2021-07-28
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多