Упорядочить массив C++

Условие задания:

В одномерном массиве, состоящем из n действительных элементов, вычислить:

  1. номер максимального по абсолютному значению элемента массива;
  2. сумму частей массива, расположенных после первого положительного элемента.
  3. Превратить массив таким образом, чтобы сначала располагались все элементы, целая часть которых находится в интервале [a, b], а затем – все остальные

Массив: [11.0, 1.0, 3.0, -8.0, 9.0, 0.0, -3.0, 5.0, 3.0, -7.0]

Интервал: 3.0 9.0

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    const int n = 10;
    double arr[n], max_element = arr[0];

    cout << "Введите элементы массива: ";
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }

    int imax;
    for (int i = 0; i < n; i++)
    {
        if (fabs(arr[i]) >= max_element)
        {
            max_element = fabs(arr[i]);
            imax = i;
        }
        else
        {
            max_element = max_element;
        }
    }

    if ((max_element) < 0)
    {
        cout << "Максимальное абсолютное значение в массиве: " << max_element * (-1) << endl;
    }

    else
    {
        cout << "Максимальное абсолютное значение в массиве: " << max_element << endl;
    }

    int index1;
    double sum = 0;

    for (int i = n; i >= 0; i--)
    {
        if (arr[i] >= 0)
        {
            index1 = i;
        }
        else
        {
            index1 = index1;
        }
    }

    for (int i = index1 + 1; i < n; i++)
    {
        sum += arr[i];
    }

    cout << "Сумма: " << sum << endl;

    double a, b, k;
    int j = 0;

    cout << "Введите интервал чисел: ";
    cin >> a >> b;

    if (a > b)
    {
        k = a;
        a = b;
        b = k;
    }

    else
    {
        a = a;
        b = b;
    }

    for (int i = 0; i < n; i++)
    {
        if ((arr[i] >= a) && (arr[i] <= b))
        {
            k = arr[i];
            arr[i] = arr[j];
            arr[j] = k;
            j++;
        }

        else
        {
            arr[i] = arr[i];
        }
    }

    cout << "Упорядоченный массив по значениям интервала: " << endl;
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    return 0;
}

Мой результат кода:

Введите элементы массива: 11.0 1.0 3.0 -8.0 9.0 0.0 -3.0 5.0 3.0 -7.0

Максимальное абсолютное значение в массиве: 11

Сумма: 3

Введите интервал чисел: 3.0 9.0

Упорядоченный массив по значениям интервала: 3 9 5 3 1 0 -3 11 -8 7

!!! Все вроде бы правильно, но упорядоченный массив должен выйти таким: 3 9 5 3 11 1 -8 0 -3 -7

То есть мы сначала выводим те, которые входят в интервал, а потом те, которые не входят, но в том порядке, в котором они стояли в изначальном массиве.

Я создавал новый массив для тех чисел, которые входят в интервал [3 9 5 3] и думал удалять из изначального массива их, но не получилось. Потом думал создать второй массив из тех чисел, которые не входят в интервал [11 1 -8 0 -3 -7] , но не получилось.

Кто подскажет как же в итоге добиться вот такого упорядоченного массива: [3 9 5 3 11 1 -8 0 -3 -7]


Ответы (1 шт):

Автор решения: MBo

С новым массивом - хорошая идея. Как мне кажется ,проще всего так - один раз пройти по старому массиву, переписывая в новый по порядку числа из интервала, а вторым проходом - числа вне его.

Также обратите внимание на реализацию условия целая часть которых находится в интервале [a, b]

int k = 0;
for (int i = 0; i < n; i++) 
     if ((arr[i] >= a) && (arr[i] < b+1))
         newarr[k++] = arr[i]; 
for (int i = 0; i < n; i++) 
     if ((arr[i] < a) || (arr[i] >= b+1))
         newarr[k++] = arr[i]; 
→ Ссылка