Сжать массив, удалив из него все элементы, величина которых находится в интервале [a,b]. C++

464
26 ноября 2016, 18:55

Сжать массив, удалив из него все элементы, величина которых находится в интервале [a,b]. Освободившийся в конце массива элементы заполнить нулями.

Помогите с этим заданием пожалуйста. Элементы я нулями заменил но как только я пытаюсь их поменять местами программа выдает ошибку...

http://pastebin.com/42HEW32q

Помогите пожалуйста

for (i = 0; i < n; i++){
    if ( arr[i] >= a && arr[i] <= b ){
        arr[i] = arr[i+1];
        arr[i] = 0;
    }
}    
for (i = 0; i < n; i++){
    cout << arr[i] << " ";
}
Answer 1
int i = 0, j = i;
for (; i < n; i++)
{
    if (arr[i] < a || arr[i] > b)
        arr[i - j] = arr[i];
    else
        j++;
}
for (i = n - j; i < n; i++)
    arr[i] = 0;

более понятное =)

Answer 2

А так не сойдет? :)

int arr[10] = { 1, 2, 5, 8, 12, 15, 45, 3, 4, 7 };
int main(int argc, const char * argv[])
{
    int a = 6, b = 20;
    fill(remove_if(arr,arr+10,[a,b](int x){ return (x >= a && x <= b); }),arr+10,0);
    for(auto x: arr) cout << x << " ";
    cout << endl;
}

Специально для @pavel: :-)

void removeArr(int * arr, int size, int a, int b)
{
    struct pred
    {
        pred(int a, int b):a(a),b(b){}
        bool operator()(int x) { return (x >= a && x <= b); }
        int a, b;
    };
    fill(remove_if(arr,arr+size,pred(a,b)),arr+size,0);
}
Answer 3

В этом цикле

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

имеет место выход за пределы массива, когда i равно n-1 в предложении

    arr[i] = arr[i+1];

и кроме того тело цикла не имеет смысла, так как сначала идет присвоение для элемента с индексом i значения arr[i+1], а затем это значение перезаписывается нулем.

    arr[i] = arr[i+1];
    arr[i] = 0;

Ниже приведена демонстрационная программа, показывающая, как можно "удалить" элементы из массива, которые лежат в отрезке [a, b], используй циклы

#include <iostream>
int main() 
{
    int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    const size_t N = sizeof( arr ) / sizeof( *arr );
    for ( size_t i = 0; i < N; i++ ) std::cout << arr[i] << ' ';
    std::cout << std::endl;
    int a = 3, b = 6;
    size_t k = 0;
    for ( size_t i = 0; i < N; i++ )
    {
        if ( not ( a <= arr[i] && arr[i] <= b ) )
        {
            if ( i != k ) arr[k] = arr[i];
            ++k;
        }
    }
    for ( size_t i = k; i < N; i++ ) arr[i] = 0;
    for ( size_t i = 0; i < N; i++ ) std::cout << arr[i] << ' ';
    std::cout << std::endl;
    return 0;
}

Вывод программы на консоль

0 1 2 3 4 5 6 7 8 9 
0 1 2 7 8 9 0 0 0 0 

Тоже самое можно сделать с использованием стандартных алгоритмов. Например,

#include <iostream>
#include <algorithm>
int main() 
{
    int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    const size_t N = sizeof( arr ) / sizeof( *arr );
    for ( size_t i = 0; i < N; i++ ) std::cout << arr[i] << ' ';
    std::cout << std::endl;
    int a = 3, b = 6;
    size_t k = 0;
    std::fill( 
        std::remove_if( arr, arr + N, [&]( int x ) { return a <= x && x <= b; } ),
        arr + N, 0 );
    for ( size_t i = 0; i < N; i++ ) std::cout << arr[i] << ' ';
    std::cout << std::endl;
    return 0;
}

Вывод этой программы аналогичен показанному выше

0 1 2 3 4 5 6 7 8 9 
0 1 2 7 8 9 0 0 0 0 
Answer 4

В дополнение к уже данным ответам. Можно обойтись всего одним циклом с двумя индексами. Как только первый индекс достигает конца массива, все элементы между вторым индексом и концом можно заменять 0.

for(int i=0, j=0;i<N;){
    if(j<N){
        if(!(arr[j] >= a && arr[j] <=b)){
            i++;
        }
        arr[i]=++j<N? arr[j]:0;
    }
    else{
        arr[i++]=0;
    }
}

Пример на ideone

Answer 5

Как Вы думаете, что произойдет здесь

arr[i] = arr[i+1];

при i = n - 1?

Вот Вам код. Оптимизация на Ваше усмотрение

int i = 0;
int lastIdx = n - 1;
while (i <= lastIdx) {
  if (arr[i] >= a && arr[i] <= b) {
    for (int j = i; j < lastIdx; j++)
      arr[j] = arr[j + 1];
    arr[lastIdx--] = 0;
  } else
    i++;
}
READ ALSO
Перевод изображения в матрицу чисел

Перевод изображения в матрицу чисел

С помощью каких библиотек можно представить изображение в виде матрицы чисел RGB

472
Обратиться к слоту

Обратиться к слоту

Расширяю класс, создаю таймер и слот таймераПри исполнении говорит, что нет слота в классе, который расширяю

253
Время жизни временной переменной

Время жизни временной переменной

Пусть есть две функции

253
pthread_create() как правильно работает?

pthread_create() как правильно работает?

У меня проблемы с использованием pthread_create если передавать в аргумент метод класса, потому что компилятор постоянно выдает ошибку:

273