Как я могу решить эту проблему с массивами в C ++? - PullRequest
0 голосов
/ 23 февраля 2020

Я работаю над проблемой Edabit: Получите среднее арифметическое c для данного массива. Теперь у меня есть такой код:

#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]);
}

, и я застрял. Я использую Visual Studio 2019 на Windows 7 Professional, и я подчеркнул 3 символа (data [i] и 2x data [0]). Для этого x Visual Studio говорит expression must have pointer-to-object type (Error E0142), и я понятия не имею, что это значит с этим. Я знаю только, что такое указатель.

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Ваша mean функция, ну, в общем, средняя.
1. Она не возвращает значение; оператор return отсутствует.
2. Он использует имя переменной так же, как и функция (не рекомендуемый стиль кодирования).
3. Существует глобальная переменная data, которая скрыта локальной переменной data внутри main.
4. Вы путаете компилятор и читатель: глобальная переменная data представляет собой single int. Локальная переменная в main представляет собой массив из int.

Последняя строка должна быть:
return mean;

0 голосов
/ 23 февраля 2020

Массивы распадаются на указатели (в данном случае 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';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...