Упорядочить массив C++
Условие задания:
В одномерном массиве, состоящем из n действительных элементов, вычислить:
- номер максимального по абсолютному значению элемента массива;
- сумму частей массива, расположенных после первого положительного элемента.
- Превратить массив таким образом, чтобы сначала располагались все элементы, целая часть которых находится в интервале [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 шт):
С новым массивом - хорошая идея. Как мне кажется ,проще всего так - один раз пройти по старому массиву, переписывая в новый по порядку числа из интервала, а вторым проходом - числа вне его.
Также обратите внимание на реализацию условия целая часть которых находится в интервале [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];