Удалить каждый четный элемент массива

1. G_107108283491272370458 12.11.20 22:18 Сейчас в теме
Добрый день! Подскажите пожалуйста как удалить все четные числа массива? Заранее благодарю!

Дело в том, что мы сами создаем массив и должны потом удалить из него четные числа. При этом размер массива должен уменьшиться. После соответственно вывести что получится. Написал я вот так, выводятся четные числа, хотя надо нечетное.

Процедура УдалитьЧетныеЧисла(Команда)
Массив = Новый Массив;


Массив.Добавить(1000);
Массив.Добавить(2300);
Массив.Добавить(2501);

Количество = Массив.Количество();
Смещение = 0;
Для Сч = 1 По Массив.Количество() Цикл
Если Сч%2 = 0 Тогда
Массив.Удалить(Сч-Смещение);
Смещение = Смещение + 1;
КонецЕсли;
КонецЦикла;

Для Каждого ЭлементМассива из Массив Цикл
Сообщить(ЭлементМассива);

КонецЦикла;
КонецПроцедуры
Показать
По теме из базы знаний
Найденные решения
12. FatPanzer 12.11.20 22:55 Сейчас в теме
(11)
Индекс = 0;
Пока Индекс < Массив.Количество() Цикл
    Если Массив[Индекс] %2 = 0 Тогда
        Массив.Удалить(Индекс );
    Иначе
        Индекс = Индекс + 1;
    КонецЕсли;
КонецЦикла;
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. tetraren 35 12.11.20 22:30 Сейчас в теме
	Смещение = 1;
	Для Сч = 1 По Массив.Количество() Цикл
		Если Сч%2 = 0 Тогда
			Массив.Удалить(Сч-Смещение);
			Смещение = Смещение + 1;
		КонецЕсли;
	КонецЦикла;
4. FatPanzer 12.11.20 22:32 Сейчас в теме
(2) После удаления элемента индексы же все сдвинутся - это раз ))) И ошибка выскочит, когда их количество станет меньше чем итераций в цикле - это два...
ipoloskov; +1 Ответить
5. tetraren 35 12.11.20 22:37 Сейчас в теме
(4) Поэтому сделано смещение, смотри внимательней. Код рабочий. Но твой вариант конечно лучше.

Количество = Массив.Количество();
	Сч = 1;
	Пока Сч < Количество Цикл
		Массив.Удалить(Сч);
		Количество = Количество - 1;
		Сч = Сч + 1;
	КонецЦикла;
7. FatPanzer 12.11.20 22:46 Сейчас в теме
(5)
Количество = Окр(Массив.Количество()/2, 0) - 1;
Для Индекс = 0 По Количество Цикл
    Массив.Удалить(Индекс);
КонецЦикла;
tetraren; +1 Ответить
8. tetraren 35 12.11.20 22:47 Сейчас в теме
3. FatPanzer 12.11.20 22:30 Сейчас в теме
Сначала удаляешь нулевой, потом первый, потом второй... Нулевой - это же четный, да?

И не спеши ругаться - это правильное решение.
6. G_107108283491272370458 12.11.20 22:42 Сейчас в теме
Дело в том, что мы сами создаем массив и должны потом удалить из него четные числа. При этом размер массива должен уменьшиться. После соответственно вывести что получится. Написал я вот так, выводятся четные числа, хотя надо нечетное.

Процедура УдалитьЧетныеЭлементы(Команда)
		   Массив = Новый Массив;
 
    
    Массив.Добавить(1000); 
    Массив.Добавить(2300); 
    Массив.Добавить(2501); 
	
	Количество = Массив.Количество();
    Смещение = 0;
    Для Сч = 1 По Массив.Количество() Цикл
        Если Сч%2 = 0 Тогда
            Массив.Удалить(Сч-Смещение);
            Смещение = Смещение + 1;
        КонецЕсли;
    КонецЦикла;
                
Для Каждого ЭлементМассива из Массив Цикл
        Сообщить(ЭлементМассива);

	КонецЦикла;
	КонецПроцедуры
Показать
9. FatPanzer 12.11.20 22:48 Сейчас в теме
(6)
Дело в том, что мы сами создаем массив и должны потом удалить из него четные числа.
СТОПЭ! Так все-таки четные числа, или четные элементы??? Четные элементы - это элементы с четными индексами, и там внутри могут хоть картинки лежать!

Ставь задачу аккуратнее!
10. G_107108283491272370458 12.11.20 22:51 Сейчас в теме
(9)Виноват, не заметил, что написал элементы. Нужно четные числа удалить.
11. tetraren 35 12.11.20 22:52 Сейчас в теме
То же самое, с минимальными доработками

Смещение = 0;
Для Сч = 1 По Массив.Количество() Цикл
	Если Массив[Сч] %2 = 0 Тогда
		Массив.Удалить(Сч-Смещение);
		Смещение = Смещение + 1;
	КонецЕсли;
КонецЦикла;
12. FatPanzer 12.11.20 22:55 Сейчас в теме
(11)
Индекс = 0;
Пока Индекс < Массив.Количество() Цикл
    Если Массив[Индекс] %2 = 0 Тогда
        Массив.Удалить(Индекс );
    Иначе
        Индекс = Индекс + 1;
    КонецЕсли;
КонецЦикла;
13. tetraren 35 12.11.20 22:57 Сейчас в теме
(12) Это уже не так идеально, как твой первый вариант, т.к. тут надо каждый раз дергать метод Количество().
15. FatPanzer 12.11.20 23:02 Сейчас в теме
(13) Да, согласен - это явная потеря процессорного времени на вычисление (машинные итерации), но зато для чтения более наглядно.
Сам всегда ругаю за такие вещи, когда вычислительные методы в цикле дергают без необходимости...

Но это уже вопрос к оптимальности прикладного решения. Для решения теоретической задачи - так намного лучше, показывает ширину мысли.
Это как вычисление факториала. Если мне на собеседовании соискатель напишет рекурсию из одной строчки - это будет ему плюс за мышление. Но в реальной работе он за такую рекурсию люлей получит, без сомнения.
14. viplelik 34 12.11.20 23:00 Сейчас в теме
Если я правильно понял, то лучше использовать второй массив для сохранения результата условия Массив[Индекс] %2 = 0 имхо.
16. FatPanzer 12.11.20 23:04 Сейчас в теме
(14) Задача стояла удалить из текущего, а не скопировать в другой массив.
17. viplelik 34 12.11.20 23:10 Сейчас в теме
(16) Если дело не в результате тогда да.
18. FatPanzer 12.11.20 23:12 Сейчас в теме
(17) Да, это классическая теоретическая задача на умение строить алгоритмы. Здесь важен процесс и соблюдение установленных ограничений..
19. viplelik 34 13.11.20 00:29 Сейчас в теме
20. viplelik 34 13.11.20 00:56 Сейчас в теме
(19) Удалил пост, была ошибка, так как использовался во 2-м алгоритме тот же массив. Данные не корректны. Результаты примерно одинаковые.
21. KontoraB 13.11.20 10:46 Сейчас в теме
Случайно не с codewars.com задачка ?
22. ipoloskov 164 13.11.20 10:52 Сейчас в теме
Любые работы по удалению элементов массива нужно проводить с конца массива. Иначе это индусский код.
нмакс - Массив.Количество()-1;
Для к = 0 по нмакс Цикл
    Индекс = нмакс - к;
    Если Индекс % 2 = 0 Тогда
        Массив.Удалить(Индекс);
    КонецЕсли;
КонецЦикла;
23. FatPanzer 13.11.20 10:57 Сейчас в теме
(22) Кто такую чушь сказал? Все зависит от задачи, от умения оперировать индексами, и понимания того, что происходит с индексами при удалении элемента... Но никто не устанавливал "удаление с конца" как единственную панацею.

Да и сам-то ты в своем коде удаляешь начиная с начала массива.
24. ipoloskov 164 13.11.20 10:58 Сейчас в теме
(23) потому что это поведение неочевидно.
Я в своем коде удаляю с конца, посмотрите внимательнее.
25. FatPanzer 13.11.20 11:00 Сейчас в теме
(24) Да, сорян. Не заметил, что индекс и итератор у тебя - разные переменные.

Поведение как раз таки абсолютно очевидно. И именно этой очевидностью можно с успехом пользоваться при умении.
26. SlavaKron 13.11.20 11:03 Сейчас в теме
(22) А что этот код должен делать?
27. ipoloskov 164 13.11.20 11:11 Сейчас в теме
29. spacecraft 13.11.20 11:15 Сейчас в теме
(27) а прочитать условие задачи ТП, посмотреть свой код и понять, что он не для решения этой задачи.
30. 1ctalik 13.11.20 11:20 Сейчас в теме
(29) Прочти название темы и сравни с условием задачи. Не соответствие названия и содержания - проблема того, кто создал тему, а не того, кто решает задачу. Принцип решения - верный, а удаление четных элементов или четных чисел в элементах массива - это уже лирика
31. spacecraft 13.11.20 11:22 Сейчас в теме
(30) а вы все ТЗ делаете по названию не читая?
33. 1ctalik 13.11.20 11:31 Сейчас в теме
(31) А это не ТЗ все-таки, а оказание помощи в вопросе. Так что это тот, кто спрашивает заинтересован, чтобы его правильно поняли, а не наоборот.
32. spacecraft 13.11.20 11:27 Сейчас в теме
(30) и да, вы наверно спутали с четным индексом элемента массива. Бывает.
34. 1ctalik 13.11.20 11:33 Сейчас в теме
(32) Каждый четный элемент массива - может быть понять по разному. Либо каждый второй элемент, либо каждый элемент, имеющий четный индекс, либо каждый элемент, являющийся четным числом. Если бы тема была "Удалить все четные числа из массива чисел", то вопросов бы не возникало.
Автор сам запутался, что ему нужно было сделать. Посмотри код, который написал автор и какую задачу обрисовал.
36. spacecraft 13.11.20 11:37 Сейчас в теме
(34)
Каждый четный элемент массива - может быть понять по разному

Уже прогресс. Значит не однозначно для вас оказалось определение. Но сам вопрос игнорируем. Однако.
38. 1ctalik 13.11.20 11:52 Сейчас в теме
(36) Какой ты нудный)
Возможно я имел ввиду каждый второй элемент массива, а не каждый элемент с четным индексом, а возможно каждый элемент с четным индексом, какая разница-то?
Вопрос в том, зачем докапываться до решения, если задающий вопрос в заголовке пишет "Помогите удалить каждый четный элемент массива", в задаче пишет, что нужно удалить четные числа из массива, а в коде пытается удалить элементы, имеющие четный индекс?
35. ipoloskov 164 13.11.20 11:34 Сейчас в теме
(29) сорри, посмотрел на заголовок и не посмотрел текст темы
37. spacecraft 13.11.20 11:40 Сейчас в теме
(35) да все с кодом нормально. Я просто объяснил что в данном случае он не совсем подходит. Чтобы другие кто будет смотреть не пытались его копипастить не думая.
ipoloskov; +1 Ответить
28. spacecraft 13.11.20 11:14 Сейчас в теме
(22)
Любые работы по удалению элементов массива нужно проводить с конца массива. Иначе это индусский код.

Не всегда это возможно. Например удалять нужно по мере вычислений с начала массива. Т.е. если сумма n первых элементов превысила определенной число, то удалить текущий элемент. И такое бывает.
Так что не надо делать такие громкие заявление.
Все зависит от задач и умений пользоваться программным кодом.
EVKash; FatPanzer; +2 Ответить
40. spacecraft 13.11.20 12:34 Сейчас в теме
(22) кстати, для просто удаления четных индексов элементов массива можно совсем просто, но не очевидно )
КоличествоУдаляемых = Цел(Массив.Количество()/2);
Для Индекс = 0 По КоличествоУдаляемых Цикл
	Массив.Удалить(Индекс);
КонецЦикла;
41. FatPanzer 13.11.20 12:35 Сейчас в теме
(40) См. самые первые ответы - (3) и (7).
42. spacecraft 13.11.20 12:37 Сейчас в теме
(41) тема большая не увидел (7). Только не понял зачем там Окр?
43. FatPanzer 13.11.20 12:40 Сейчас в теме
(42) Чтобы увеличить например 9/2 = 4,5 до 5.
39. starik-2005 3082 13.11.20 12:04 Сейчас в теме
Если это тестовое задание, то нужно сдвигать массив влево.

  Инд1  = 1; Инд2 = 2;
  Пока Инд2 < Мас.ВГраница() Цикл
    Мас[Инд1] = Мас[Инд2];
    Инд1 += 1; Инд2 += 2;
  КонецЦикла;

  Пока Инд2 > Инд1 Цикл
    Мас.Удалить(Инд2--);
  КонецЦикла;
Показать
ЗЫ: в коде есть неточности, сами их исправьте.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот