Попытка получить число в массиве, который является дважды средним числом

Я был присвоен для установки массива с точками. Мне говорят получить максимальное значение, среднее число, и в этом том же массиве, если какая-либо точка в массиве является дважды средним числом, я должен cout "изолированная часть". До сих пор я получил средние и максимальные количества в массиве. но я не могу установить программу на cout изолированная часть. Вместо этого это дает мне несколько из среднего числа. вот программа;

int main()
{
    const int max = 10;
    int ary[max]={4, 32, 9, 7, 14, 12,  13, 17, 19, 18};
    int i,maxv;
    double out,sum=0;
    double av;


    maxv= ary[0];

    for(i=0; i<max; i++)
    {
        if(maxv<ary[i])
            maxv= ary[i];

    }
    cout<<"maximum value: "<<maxv<<endl;

    for(i=0; i<max; i++)
    {

        sum = sum + ary[i];
        av = sum / max;
    }
    cout<<"average: "<<av<<endl;

    out = av * 2;

    if(ary[i]>out)
    {
        cout<<"outlier:  "<<maxv<<endl;
    }
    else
    {
        cout<<"ok"<<endl;
    }


    return 0;
}
6
задан Bill the Lizard 20 September 2012 в 12:52
поделиться

4 ответа

Вот решение вашего задания на C ++, но вам, вероятно, не разрешат передать его; -)

#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <numeric>

int main()
{
    const int N = 10;
    int ary[N] = {4, 32, 9, 7, 14, 12, 13, 17, 19, 18};

    int max = *std::max_element(ary, ary + N);
    std::cout << "maximum: " << max << std::endl;

    double average = std::accumulate(ary, ary + N, 0.0) / N;
    std::cout << "average: " << average << std::endl;

    std::cout << "outlier: ";
    std::remove_copy_if(ary, ary + N,
                        std::ostream_iterator<int>(std::cout, " "),
                        std::bind2nd(std::less_equal<double>(), 2 * average));
    std::cout << std::endl;
}
4
ответ дан 8 December 2019 в 17:19
поделиться

Вам нужно использовать два цикла for. Вы должны пройти по ary и проверить каждый элемент по out, затем cout << ary[i].

Возможно, это было бы немного более очевидно, если бы вы объявляли свои переменные там, где они используются, в минимально возможной области видимости.

Например:

for (int i = 0; ...) {
}

и

double outlier = avg * 2;

Кстати, это может быть немного не в вашу голову (прямо сейчас), но STL предоставляет функции для определения max (max_element) и sum (accumulate) массива. Возможно, будет интересно почитать.

0
ответ дан 8 December 2019 в 17:19
поделиться

Если оно ровно вдвое больше среднего, оно должно быть '==', а не больше, чем вдвое больше среднего.
А почему вы выводите maxv ? Старайтесь использовать более значимые имена.
Не следует ли вам вместо этого вывести ary [i] ? Кроме того, почему вы не зацикливаете массив снова с помощью цикла for? Разве вы не должны перебирать его, чтобы найти все планировщики, или следует проверять только последний элемент для планировщика.

0
ответ дан 8 December 2019 в 17:19
поделиться

Ваш код содержит тонкую и сложную для обнаружения ошибку. Вы используете ary[i] после последнего цикла for. В этот момент значение i равно max, поэтому оператор if сравнивает случайную память, поскольку вы переходите к концу массива.

Поскольку это C++, а не C, вы могли бы избежать этой конкретной ошибки, объявив переменные цикла в цикле for следующим образом

for (int i = 0; i < max; ++i) {
    ....
}
10
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: