Нахождение среднего арифметического между первым минимальным и последним максимальным элементом в массиве - PullRequest
0 голосов
/ 16 октября 2018

Мне нужно решить следующую проблему: для данного массива мне нужно найти среднее арифметическое между элементами с индексами первого минимального и последнего максимального элемента (границы индексов не включаются).

Например, учитывая{1, 5, 1, 9, 2, 7, 1, 3}, первый минимальный и последний максимальный элементы равны 1 и 9 соответственно, их индексы равны 0 и 3, поэтому ответом будет среднее арифметическое элементов с индексами 1..2, то есть среднее арифметическое 5 и 1, что3.

Я знаю, как найти mean всего массива, но как найти mean между первым минимальным и последним максимальным элементом массива?

#include <iostream>

using namespace std;

int main(){
    setlocale(LC_ALL,"RUS");
    cout << "Enter the array: ";
    int k;
    double Sum = 0;
    double min = 0;
    double max = 0;
    const int n = 7;
    double mass[8] = {0, 0, 0, 0, 0, 0, 0, 0};

    for(k = 0; k <= n; k++){
        cin >> mass[k];
    }
    for(int i = 0; i <= 7; i++){
        if(mass[i] > max){
           max = mass[i];
        }
        else if (mass[i] < min){
            min = mass[i];
        }
    }


    int i;

    for(i = 0; i <= n; i++){
        Sum = Sum + mass[i];

    }
    cout << Sum / 8;

    return 0;
}

Ответ должен быть 3.

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Сначала необходимо найти индексы.

Затем выполнить цикл по массиву от первого минимума до индекса последнего максимума.

Вы можете использовать приведенный ниже код

#include <iostream>

using namespace std;

int main()
{
    int array[] = { 1, 5, 2, 10, 2, 7, 1, 10};
    int min = array[0];
    int max = array[0];
    int indexOfMin = 0;
    int indexOfMax = 0;
    int sum = 0;
    float dist = 0;
    float mean = 0;
    int arrSize = sizeof(array)/sizeof(array[0]);

    for (int i = 0; i < arrSize; i++){
        if(array[i] >= max ){
            max = array[i];
            indexOfMax = i;
        }
    }

    cout << "Max is at index [" << indexOfMax << "]  : " << max << endl;

    for (int i = 0; i < arrSize; i++){
        if(array[i] == min){
            continue;
        }
        if(array[i] < min){
            min = array[i];
            indexOfMin = i;
        }
    }

    cout << "Min is at index [" << indexOfMin << "]  : " << min << endl;

    if(indexOfMin > indexOfMax){
        indexOfMax++;
        indexOfMin--;
        for(int i = indexOfMax; i <= indexOfMin; i++){
            sum += array[i];
        }
        dist = indexOfMin - indexOfMax + 1;
    }else if(indexOfMin < indexOfMax){
        indexOfMax--;
        indexOfMin++;
        for(int i = indexOfMin; i <= indexOfMax; i++){
            sum += array[i];
        }
        dist = indexOfMax - indexOfMin + 1;
    }

    mean = sum/dist;

    cout << "Sum: " << sum << " && dist: " << dist << endl;
    cout << "Mean: " << mean << endl;
    return 0;
}

Вывод:

Макс. По индексу [7]: 10

Мин. По индексу [0]: 1

Сумма: 27 && dist: 6

Среднее значение: 4,5


Выход для int array[] = {1, 5, 1, 9, 2, 7, 1, 3}:

Макс. По индексу [3]: 9

Мин. Индекс: [0]: 1

Сумма: 6 && dist: 2

Среднее значение: 3

0 голосов
/ 17 октября 2018

Вы должны думать с точки зрения итераторов, а не значений.Вместо того, чтобы записывать первое минимальное значение, создайте итератор, который направляет элемент на единицу позади него.Вместо записи последнего максимального значения создайте итератор, который указывает на это значение.Затем вы можете передать диапазон , определенный ими, итераторам к std::accumulate, чтобы выполнить суммирование, а затем разделить его на std::distance того же диапазона, чтобы найти среднее.Но учтите, что количество элементов между min и max может быть 0.

0 голосов
/ 17 октября 2018

Я предполагаю, что вам нужна программа на C ++, использующая функции C ++.Ваша текущая программа - это программа на C, которая использует C ++ I / O.Дайте мне знать, если вы хотите программу на C, которая использует функции C.

Программа на C ++ означает, что вы должны использовать std :: vector, но в случае, если для присвоения требуется массив стиля C, вот версия:

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

int main() {
    int size, *array;
    std::cout << "How many elements? ";
    std::cin >> size;
    // create the array
    array = new int[size];
    if (array) {
        // fill the array from the keyboard (could also use std::generate_n)
        std::for_each(array, array+size, [index = 0](int& value) mutable {
            std::cout << "Element " << ++index << "? ";
            std::cin >> value;
        });
        // calculate the index of the max and min
        auto minmax = std::minmax_element(array, array+size);
        std::cout << "\nThe min " << *minmax.first << " is located at index " << std::distance(array, minmax.first);
        std::cout << "\nThe max " << *minmax.second << " is located at index " << std::distance(array, minmax.second);
        // calculate the average between the indexes
        double average = std::accumulate(++minmax.first, minmax.second, 0.0, [count = 0](double average, int value) mutable {
            std::cout << "\nAdding " << value << " to average";
            return average + (value - average)/++count;
        });
        // print the result
        std::cout << "\nAverage is " << average;
        // delete the array
        delete[] array;
    }
}

И в случае, если я ошибаюсь, и вам разрешено использовать std :: vector, вот версия:

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

int main() {
    int size;
    std::vector<int> array;
    std::cout << "How many elements? ";
    std::cin >> size;
    // fill the array from the keyboard
    std::generate_n(std::back_inserter(array), size, [index = 0, value = 0]() mutable {
        std::cout << "Element " << ++index << "? ";
        std::cin >> value;
        return value;
    });
    // calculate the index of the max and min
    auto minmax = std::minmax_element(array.begin(), array.end());
    std::cout << "\nThe min " << *minmax.first << " is located at index " << std::distance(array.begin(), minmax.first);
    std::cout << "\nThe max " << *minmax.second << " is located at index " << std::distance(array.begin(), minmax.second);
    // calculate the average between the indexes
    double average = std::accumulate(++minmax.first, minmax.second, 0.0, [count = 0](double average, int value) mutable {
        std::cout << "\nAdding " << value << " to average";
        return average + (value - average)/++count;
    });
    // print the result
    std::cout << "\nAverage is " << average;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...