1

Тема: Добуток елементів, що розташовані між min і max елементами;

Доброго усім дня або вечора, я нещодавно почав вивчати плюси і маю ще деякі проблеми з порозумінням логіки коду, тут в мене завдання знайти добуток елеметів в масиві між минемальним та максимальним числом їх індукси я знайшов, а ось з написанням цього діпазону проблема


#include <iostream>

using namespace std;
int main() {
int minRand = -10;
    int maxRand = 10;
    int const n = 5;
    int arr[n];
    for (int i = 0; i < n; i++) {
        arr[i] = minRand + rand() % (maxRand - minRand + 1);
        cout << arr[i] << "\t";
    }
    int sum = 0;
    float prod = 1.0;
    for (int i = 0; i < n; i++) {
        if (arr[i] < 0)
            sum += arr[i];
    }
    int max = arr[0];
    int min = arr[0];
    int imax = 0, imin = 0;
    for (int i = 1; i < n; i++) {
        if (arr[i] > max) {
            max = arr[i];
            imax = i;
        }
        if (arr[i] < min) {
            min = arr[i];
            imin = i;
        }
        for (int i = imin + 1; i < imax; i++) {
            prod *= arr[i];
        }
        for (int i = imax + 1; i < imin; i++) {
            prod *= arr[i];
        }

    }
    cout << "\n" << "minimum " << min << " pos " << imin << "\t" << "maximum " << max << " pos " << imax << "\n";
    cout << "\n" << "Sum of negative numbers " << sum << "\n";
    cout << "\n" << "Mult of numbers between max and min " << prod << "\n";
}

2

Re: Добуток елементів, що розташовані між min і max елементами;

Спершу знаходите imax та imax, а потім (після цього циклу) обчислюєте добуток.

3

Re: Добуток елементів, що розташовані між min і max елементами;

Дякую за відповідь, я вже це зробив тут:

for (int i = 1; i < n; i++) {
        if (arr[i] > max) {
            max = arr[i];
            imax = i;
        }
        if (arr[i] < min) {
            min = arr[i];
            imin = i;
        }

Потім я хочу зробити цикл для перемноження в діапазоні мінімального і максимального

 for (int i = imin + 1; i < imax; i++) {
            prod *= arr[i];
        }
        for (int i = imax + 1; i < imin; i++) {
            prod *= arr[i];
        }

Але виходить постійно 1

 float prod = 1.0;

як я записав тут, через дебаггер перевірив що в циклі imax i imin мають правильне значення, але функція

 prod *= arr[i];

нічого не робе(

4 Востаннє редагувалося lucas-kane (25.01.2023 10:16:27)

Re: Добуток елементів, що розташовані між min і max елементами;

 for (int i = imin + 1; i < imax; i++) {
            prod *= arr[i];
        }
        for (int i = imax + 1; i < imin; i++) {
            prod *= arr[i];
        }

другий цикл FOR зайвий. Він може не спрацювати так як ти задумав. Крім того можна отримати помилку коли максимальний елемент масиву буде останнім елементом. Перед ініціалізацією циклу, краще перевір індекси масиву хто більший imin чи imax, а тоді вирішую, чи буде i рівне мін./мак. індексу.
А на рахунок того, що виходить 1 - перевір вхідний масив. можливо максимальний та мінімальний елементи стоять поруч, через те і не виходить.

Ще хочу підмітити, що float prod = 1.0; не зобов'язаний бути float. Коли множиш, додаєш чи віднімаєш цілі числа результат - ціле число, А от при ділені - float;

Подякували: BATMAH, leofun012

5 Востаннє редагувалося koala (25.01.2023 10:48:29)

Re: Добуток елементів, що розташовані між min і max елементами;

BATMAH, наголошую: не В тому ж циклі, а ПІСЛЯ цього циклу.

for(...){
  //в циклі - НЕ ТУТ
}
//після циклу - ТУТ

1, швидше за все, виходить тому, що у вашому масиві мінімальний та максимальний елементи розташовані поруч (ну і решта теж якось специфічно, треба трохи подумати, як саме, але ліньки). Наведіть повний результат роботи програми.
Функція rand повертає псевдовипадкові числа у певній послідовності. Завжди одній і тій самій, але визначеній не стандартом, а залежній від компілятора, тому я не можу відтворити ваш результат. Ви можете поміняти місце в цій послідовності викликом srand; наприклад, srand(time(NULL)) виставляє поточний стан генератора залежно від часу виконання, що дає кожного разу новий результат. Викликати srand(time(NULL)), звісно, треба лише один раз.

lucas-kane, там нормально з двома циклами, інакше доведеться перевіряти, хто з imin та imax більший та переставляти межі. А так один з циклів гарантовано не спрацює. І float має більший діапазон значень за int, тому має сенс для пошуку добутку кількох значень виставляти цей тип. Звісно, поки елементів масиву 5 від -10 до 10, то добуток не вийде за 1000. Але якщо переставити на 20 елементів від -100 до 100, то int дуже легко переповнити.

Подякували: BATMAH, lucas-kane2

6

Re: Добуток елементів, що розташовані між min і max елементами;

Дякую усім за допомогу, все ж розібрався

7

Re: Добуток елементів, що розташовані між min і max елементами;

В студентські часи ми суму шукали в 1 цикл (через різницю). Але добуток так не вийде, бо 0 ламає діленя.
Хоча, якщо не вводити 0, то результат навіть збігається.

#include <functional>
#include <iostream>

template<typename T>
T get_product_between_a_b(
    /*//
    std::function<bool (T const &)> is_a,
    std::function<bool (T const &)> is_b,
    std::function<T ()> get_next,
    /*/
    bool (*const is_a)(T const &),
    bool (*const is_b)(T const &),
    T (*const get_next)(),
    //*/
    int const count
) {
    T p = 1;
    if(count <= 0) return p;
    T pp = p, pa = p, pb = p, ppa = p, ppb = p;
    for(int i = 0; i < count; ++i) {
        pp = p;
        T v = get_next();
        p *= v;
        if(is_a(v)) { pa = p; ppa = pp; }
        if(is_b(v)) { pb = p; ppb = pp; }
    }
    return
        (pa < ppb) ? (ppb / pa) :
        (pb < ppa) ? (ppa / pb) :
        1;
}

int main(int argc, char **argv) {
    int count = 0;
    std::cout << "Input count: ";
    std::cin >> count;
    std::cout << "Input array values: ";
    float product = get_product_between_a_b<float>(
        [](float const &value) -> bool {
            static bool is_none = true;
            static float min = 0.f;
            if(is_none || value < min) {
                min = value;
                is_none = false;
            }
            return value == min;
        },
        [](float const &value) -> bool {
            static bool is_none = true;
            static float max = 0.f;
            if(is_none || value > max) {
                max = value;
                is_none = false;
            }
            return value == max;
        },
        []() -> float {
            float value = 1.f;
            std::cin >> value;
            return value;
        },
        count
    );
    std::cout << "Product: " << product;
    return 0;
}

Це можна використати як приклад що можна робити, але для як треба робити це поганий приклад.

Подякували: BATMAH1

8

Re: Добуток елементів, що розташовані між min і max елементами;

leofun01, те що ви написали ще дуже складно для мене, я тільки тільки почав вивчати цю мову)