Сжать массив, удалив из него все элементы, величина которых находится в интервале [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] << " ";
}
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;
более понятное =)
А так не сойдет? :)
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);
}
В этом цикле
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
В дополнение к уже данным ответам. Можно обойтись всего одним циклом с двумя индексами. Как только первый индекс достигает конца массива, все элементы между вторым индексом и концом можно заменять 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
Как Вы думаете, что произойдет здесь
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++;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
С помощью каких библиотек можно представить изображение в виде матрицы чисел RGB
Расширяю класс, создаю таймер и слот таймераПри исполнении говорит, что нет слота в классе, который расширяю
У меня проблемы с использованием pthread_create если передавать в аргумент метод класса, потому что компилятор постоянно выдает ошибку: