Удаление элементов массива. Решение задачи.

1. I_am_Alpharius 10.12.24 15:35 Сейчас в теме
Всем доброго дня! Это снова - я, начинающий 1С-ник потихоньку решающий задачи. Спасибо за активность в прошлом посте, я все ответы разобрал, в мозге новые знания зафиксировал и с их помощью решил следующие 7 задач про многомерные массивы. И вот опять встрял. Задачу я решил, но мне кажется слишком топорным способом. Прошу подсказать решение более изящное. Сегодня на работе меня никто никакими делами не озадачил и я просидел над ней часа 4...

Задача.
Заполните массив цифрами от 1 до 100, удалите каждый нечетный десяток цифр. Т.е.
цифры от 1 до 10 удаляем, потом от 20 до 30, потом от 40 до 50 и т.д. Выведите элементы
массива в окно сообщений.

Моё решение.

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

Число=1;

Пока Число<=100 Цикл
	Массив.Добавить(Число);
	Число=Число+1;
КонецЦикла;

Массив.Удалить(89);
Массив.Удалить(88);
Массив.Удалить(87);
Массив.Удалить(86);
Массив.Удалить(85);
Массив.Удалить(84);
Массив.Удалить(83);
Массив.Удалить(82);
Массив.Удалить(81);
Массив.Удалить(80);

Массив.Удалить(69);
Массив.Удалить(68);
Массив.Удалить(67);
Массив.Удалить(66);
Массив.Удалить(65);
Массив.Удалить(64);
Массив.Удалить(63);
Массив.Удалить(62);
Массив.Удалить(61);
Массив.Удалить(60);

Массив.Удалить(49);
Массив.Удалить(48);
Массив.Удалить(47);
Массив.Удалить(46);
Массив.Удалить(45);
Массив.Удалить(44);
Массив.Удалить(43);
Массив.Удалить(42);
Массив.Удалить(41);
Массив.Удалить(40);

Массив.Удалить(29);
Массив.Удалить(28);
Массив.Удалить(27);
Массив.Удалить(26);
Массив.Удалить(25);
Массив.Удалить(24);
Массив.Удалить(23);
Массив.Удалить(22);
Массив.Удалить(21);
Массив.Удалить(20);

Массив.Удалить(9);
Массив.Удалить(8);
Массив.Удалить(7);
Массив.Удалить(6);
Массив.Удалить(5);
Массив.Удалить(4);
Массив.Удалить(3);
Массив.Удалить(2);
Массив.Удалить(1);
Массив.Удалить(0);


Для Каждого Число ИЗ Массив Цикл
	Сообщить(Число);
КонецЦикла;

КонецПроцедуры
Показать
По теме из базы знаний
Найденные решения
53. I_am_Alpharius 12.12.24 09:56 Сейчас в теме
(37) Спасибо! Работает. Я бы до такого никогда не допёр.

Оставлю тут решение для потомков.

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

Число=1;

Пока Число<=100 Цикл
	Массив.Добавить(Число);
	Число=Число+1;
КонецЦикла;

Индекс=Массив.Количество();
Пока Индекс>0 Цикл
    Индекс=Индекс-1;
    Если Цел((Массив[Индекс]-1)/10)%2=0 Тогда
        Массив.Удалить(Индекс);
    КонецЕсли;
КонецЦикла;


Для Каждого Число ИЗ Массив Цикл
	Сообщить(Число);
КонецЦикла;

КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 10.12.24 15:38 Сейчас в теме
3. nomad_irk 80 10.12.24 15:45 Сейчас в теме
(2) надо было 1000 элементов в массив набивать......
4. RustamZz 10.12.24 15:48 Сейчас в теме
(3) Если голова не работает, так может когда руками будет набивать сало в мозгу таять начнет.
5. Sashares 35 10.12.24 15:57 Сейчас в теме
(1) Сделай цикл от 1 до 100 - проверяй, нужно ли удалять это число из массива.
Если нужно - ИЩИ в массиве элемент с этим значением, и удаляй его.
Удаление по индексу - бред.
6. nomad_irk 80 10.12.24 16:03 Сейчас в теме
(5) вся сложность в том, каким образом определить нечетные десятки
8. Sashares 35 10.12.24 16:08 Сейчас в теме
(6) Если меньше 10.
Если больше 10 и первая цифра четная.
11. spacecraft 10.12.24 16:19 Сейчас в теме
(8) 30,50,70,90 по условию вроде как должны удаляться.
Но постановка задачи мутная.
16. Sashares 35 10.12.24 16:46 Сейчас в теме
(11) Да тут по разному можно трактовать.
Я писал условие для замены кода ТС из шапки.
9. -AI- 10.12.24 16:14 Сейчас в теме
(6) Если цел(Массив[к]/10)%2=0 тогда удаляем....
nomad_irk; Sashares; +2 Ответить
10. Sashares 35 10.12.24 16:17 Сейчас в теме
(9) только %2=0, но идея такая, да
12. -AI- 10.12.24 16:25 Сейчас в теме
(10)
только %2=0
я сначала так и написал,
но потом подумал, что слово "нечетный" я не так представляю, и исправил на "=1"...

PS исправил обратно на "=0"

PPS ещё числа с 1 до 100...
число 10 это первый десяток или уже второй? если ещё первый, то надо цел((Массив[к]-1)/10)%2

PPPS ну и в догонку.... перечитал ТЗ:
"Заполните массив цифрами от 1 до 100, удалите каждый нечетный десяток цифр"
цифр только 10.... остальное - числа.
13. nomad_irk 80 10.12.24 16:30 Сейчас в теме
(12) остаток от деления на 2 для нечетного числа не будет = 1, он будет входить в множество (0, 1), не включая граничные значения.
14. -AI- 10.12.24 16:32 Сейчас в теме
(13) вы в Советской школе учились или уже в Российской?
ответьте на простой вопрос:
Число=1
Пока Число%2=1 Цикл
    Число=Число+2;
КонецЦикла;
когда цикл закончится?
18. nomad_irk 80 10.12.24 16:50 Сейчас в теме
(14) это бесконечный цикл
21. -AI- 10.12.24 16:56 Сейчас в теме
(18) а как же
"остаток от деления на 2 для нечетного числа не будет = 1, он будет входить в множество (0, 1), не включая граничные значения."
??????????????????
23. nomad_irk 80 10.12.24 17:02 Сейчас в теме
(21) Не правильно представлял себе вычисление остатка от деления.
15. Sashares 35 10.12.24 16:41 Сейчас в теме
(12)
Первый десяток это от 0 до 9, он нечетный. Или какой это десяток?
Ну и если судить по коду ТС, он удаляет именно так, где цифра десятка четная.
Когда говорят пошел 5 десяток - это 40+ =)

Хотя в целом не суть.
17. -AI- 10.12.24 16:47 Сейчас в теме
(15) возьмем шарики из "спортлото 6 из 36"....
они стояли попорядку...

вы мне дали первый десяток шариков отнести в новую студию,
а остальные отнесли сами....

вопрос.. шарики с какими номерами мне дали?
19. Sashares 35 10.12.24 16:50 Сейчас в теме
20. -AI- 10.12.24 16:54 Сейчас в теме
(19) вот.. а выше вы говорили, что с 0 по 9....
22. Sashares 35 10.12.24 17:01 Сейчас в теме
32. Sashares 35 10.12.24 19:07 Сейчас в теме
(20) Но если отнять 1, то все будет работать))
33. -AI- 10.12.24 19:10 Сейчас в теме
(32) у кого?

PS если у вас 8 яблок половину вы отдадите другу сколько у вас останется?
Ответ: 7.5
34. Sashares 35 10.12.24 19:13 Сейчас в теме
(33) у всего, чтобы анализировать числа от 0 до 99.
Для Каждого ЭлементМассива Из Массив Цикл
Если (ЭлементМассива-1)%2=0 Тогда
//лишний
...
27. I_am_Alpharius 10.12.24 18:51 Сейчас в теме
(9) Вот так?

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

Число=1;

Пока Число<=100 Цикл
	Массив.Добавить(Число);
	Число=Число+1;
КонецЦикла;

Для Каждого Число Из Массив Цикл
	Если Цел(Массив[Число-1]/10)%2=0 Тогда
		Массив.Удалить(Число);
    КонецЕсли;
КонецЦикла;

Для Каждого Число ИЗ Массив Цикл
	Сообщить(Число);
КонецЦикла;

КонецПроцедуры
Показать


Не работает. Ошибка - Значение индекса выходит за границы диапазона.
28. -AI- 10.12.24 18:58 Сейчас в теме
(27)
Для Каждого Число Из Массив Цикл
Если Цел(Массив[Число-1]/10)%2=0 Тогда
Массив.Удалить(Число);
КонецЕсли;
КонецЦикла;
мда....

ТЗ: нужно убить всех кто родился в пятницу
Программист пишет код, который убивает только Робинзона, за то что у его друга Пятницей зовут...
29. I_am_Alpharius 10.12.24 19:04 Сейчас в теме
(28) Уважаемый коллега! Напишите пожалуйста код-решение. А я буду его разбирать и запоминать логику.
31. -AI- 10.12.24 19:05 Сейчас в теме
(29) только после того, как вы ответите на вопрос заданный мной в (7)
37. -AI- 10.12.24 21:08 Сейчас в теме
(28)
Индекс=Массив.Количество();
Пока Индекс>0 Цикл
    Индекс=Индекс-1;
    Если Цел((Массив[Индекс]-1)/10)%2=0 Тогда
        Массив.Удалить(Индекс);
    КонецЕсли;
КонецЦикла;
40. user1936660 11.12.24 07:49 Сейчас в теме
(37) Дожимаем:
Для Индекс = - Массив.ВГраница() По 0 Цикл
	Если Цел((Массив[- Индекс] - 1) / 10) % 2 = 0 Тогда
		Массив.Удалить(Индекс);
	КонецЕсли;
КонецЦикла;
41. -AI- 11.12.24 08:31 Сейчас в теме
(40) недожал.
удаляешь отрицательный индекс
43. user1936660 11.12.24 08:50 Сейчас в теме
51. gml 11.12.24 22:02 Сейчас в теме
(43)Можно еще короче:
	Для Индекс = -МассивЧисел.ВГраница() По 0 Цикл
		Если (МассивЧисел.Получить(-Индекс) - 1) % 20  < 10 Тогда
			МассивЧисел.Удалить(-Индекс);
		КонецЕсли;	
	КонецЦикла;	

- без целочисленного деления.
CratosX; starik-2005; +2 Ответить
52. -AI- 12.12.24 07:52 Сейчас в теме
(51) хотел написать такой код, но подумал,
что для человека для которого сложно написать простой цикл,
такой код будет слишком сложно...

PS цикл "для .. по" не использовал по этой же причине.
54. I_am_Alpharius 12.12.24 09:59 Сейчас в теме
(51)
Для Индекс = -МассивЧисел.ВГраница() По 0 Цикл
Если (МассивЧисел.Получить(-Индекс) - 1) % 20 < 10 Тогда
МассивЧисел.Удалить(-Индекс);
КонецЕсли;
КонецЦикла;


Я проверил ваш код - он не работает. После нажатия КНОПКИ ничего не происходит.
55. user2107191 12.12.24 10:02 Сейчас в теме
(54) Да тут уже не до тебя и твоей кнопки. Да и не твою задачу вообще решают.
Тут битва теоретических и абстрактных алгоритмов идёт.
gml; starik-2005; +2 Ответить
56. gml 12.12.24 21:24 Сейчас в теме
(54) Вот полный код формы
&НаКлиенте 
Перем МассивЧисел;

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	МассивЧисел = Новый Массив;
КонецПроцедуры


&НаКлиенте
Процедура Инициализация(Команда)
	
	МассивЧисел.Очистить();
	Для Число = 1 По 100 Цикл
		МассивЧисел.Добавить(Число);
	КонецЦикла;	
	
	ОтобразитьРезультат();
	
КонецПроцедуры

&НаКлиенте
Процедура Удаление(Команда)  
		
	ПоследнийИндекс = МассивЧисел.ВГраница();
	Для Индекс = -ПоследнийИндекс По 0 Цикл
		Если (МассивЧисел.Получить(-Индекс) - 1) % 20  < 10 Тогда
			МассивЧисел.Удалить(-Индекс);
		КонецЕсли;	
	КонецЦикла;	

	
	ОтобразитьРезультат();
КонецПроцедуры

&НаКлиенте
Процедура ОтобразитьРезультат()  

	Результат.Очистить();
	Для Индекс = 0 По МассивЧисел.ВГраница() Цикл
		Результат.ДобавитьСтроку("МассивЧисел[" + Формат(Индекс,"ЧН=0; ЧГ=") + "] = " + Формат(МассивЧисел.Получить(Индекс),"ЧН=0; ЧГ="));
	КонецЦикла;	
	
КонецПроцедуры	

Показать


Результат работы после последовательного нажатия кнопок "Инициализация" и "Удаление" - в прикрепленном файле.
Прикрепленные файлы:
45. Said-We 11.12.24 12:15 Сейчас в теме
(41) И "- Массив.ВГраница()" - это функция (стековая память, вызов), каждый раз вычисление чего-то. Можно один раз вычислить и далее простая арифметика с вычитанием 1.
46. user1936660 11.12.24 12:18 Сейчас в теме
(45) Совсем ты 1С не знаешь... В цикле Пока - да, будет вызов на каждой итерации. В цикле Для - не будет, там границы сразу однократно рассчитываются.

Иди лучше, пиши кляузу в 1С о срочной необходимости оконных функций в запросах,
42. puzo50 11.12.24 08:39 Сейчас в теме
(40) может проблема была выше - заполните цифрами от 1 до 100 ?
53. I_am_Alpharius 12.12.24 09:56 Сейчас в теме
(37) Спасибо! Работает. Я бы до такого никогда не допёр.

Оставлю тут решение для потомков.

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

Число=1;

Пока Число<=100 Цикл
	Массив.Добавить(Число);
	Число=Число+1;
КонецЦикла;

Индекс=Массив.Количество();
Пока Индекс>0 Цикл
    Индекс=Индекс-1;
    Если Цел((Массив[Индекс]-1)/10)%2=0 Тогда
        Массив.Удалить(Индекс);
    КонецЕсли;
КонецЦикла;


Для Каждого Число ИЗ Массив Цикл
	Сообщить(Число);
КонецЦикла;

КонецПроцедуры
Показать
7. -AI- 10.12.24 16:06 Сейчас в теме
(1)
Пока Число<=100 Цикл
    Массив.Добавить(Число);
    Число=Число+1;
КонецЦикла;
цикл FOR ("для .. по ... цикл")
не проходили ещё?
Массив.Удалить(89);
Массив.Удалить(88);
Массив.Удалить(87);
Массив.Удалить(86);
Массив.Удалить(85);
Массив.Удалить(84);
Массив.Удалить(83);
Массив.Удалить(82);
Массив.Удалить(81);
Массив.Удалить(80);
Показать
в ТЗ "удалить элемент массива со значением таким-то",
а вы удаляете "элемент с индексом таким-то".

если я случайно удалю первый элемент массива, то ваш алгоритм удалит совсем не то что просят...
(или перемешаю элементы)
35. I_am_Alpharius 10.12.24 19:18 Сейчас в теме
(7)
цикл FOR ("для .. по ... цикл")
не проходили ещё?


Пошарился сейчас по внешним обработкам в которых решал задачи. Этот цикл я не использовал... Но пару дней назад я тут, на форуме, попросил помощи в решении задачи по многомерным массивам и один великодушный юзер сразу выдал код-решение, в котором был этот цикл.

Поэтому не знаю как точно ответить на вопрос "не проходили ещё?"... Вроде и проходили, а вроде и нет. Знаю что он есть, но не знаю его всевозможные способы использования.
36. user1863362 10.12.24 19:24 Сейчас в теме
(1)
Сегодня на работе меня никто никакими делами не озадачил
Очень зря
I_am_Alpharius; +1 Ответить
24. Said-We 10.12.24 17:17 Сейчас в теме
(1) Задание на удаление из массива с нарушением нумерации.
Вариантов обхода несколько:
1) По количеству элементов в массиве в обратном порядке.
2) По количеству элементов в массиве в прямом порядке, но после удаления не наращивать итератор, но уменьшать общее количество элементов.

В задании нет условия, что сначала надо заполнить массив, потом удалить и только потом вывести.
Можно сразу добавить, и сразу или удалить или вывести :-)
Одним циклом. Как задание составлено, так его и выполнить. :-)
В следующий раз пусть правильно задание составляют :-)

И да наверное удалять хотели: 1-10, 21-30, 41-50... ИЛИ 1-9, 20-29, 40-49...
В первом варианте сравнение (Значение-1), во втором само (Значение).
Оба варианта одинаковые, но оба не, то что в (1). У вас в (1) получается, что в четных и не четных десятках количество разное и не рано 10. Т.е. какие же это тогда десятки? :-) Какие-то 9-ки и 11-ки :-)

Четный или не четный десяток - сначала делите на десять с обрезанием дробной части.
Далее определяете остаток от деления на 2 (Число%2). И тут если четное или ноль, то десяток нечетный, а если нечетное, то десяток четный.
25. -AI- 10.12.24 17:29 Сейчас в теме
(24)
В задании
сначала надо придумать сто одну цифру....
26. Said-We 10.12.24 17:32 Сейчас в теме
(25)
сначала надо придумать сто одну цифру....

Можно с 5 до 95. Какая разница сколько их... Крайние десятки могут быть не полные.... И не только крайние...
Важно к какому десятку относится значение. Но сами десятки - это должны быть десятками. Т.е. диапазоны в которых определяется число - это должен быть десяток. :-)
30. I_am_Alpharius 10.12.24 19:04 Сейчас в теме
(24) Уважаемый коллега! Напишите пожалуйста код-решение. А я буду его разбирать и запоминать логику.
38. jmw 61 11.12.24 04:44 Сейчас в теме
В постановке задачи ошибка уже до первой запятой:
Заполните массив цифрами от 1 до 100
Не бывает цифр больше 9 !
Всё дальнейшее уже можно не читать и не рассматривать, а дать задавшему такое задание хотя-бы ссылку на Википедию
39. user1863362 11.12.24 07:36 Сейчас в теме
(38)
Не бывает цифр больше 9 !
Прикрепленные файлы:
Vlan; Raskad; user1619761; nomad_irk; Sashares; +5 Ответить
44. Said-We 11.12.24 12:11 Сейчас в теме
(38)
Не бывает цифр больше 9 !

Знаки 16-ти ричной системы: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.
Задание в (1) могло быть написано своими словами, и какая была точная формулировка - неизвестно.
49. starik-2005 3098 11.12.24 17:14 Сейчас в теме
(44)
какая была точная формулировка - неизвестно
Ну десяток - это десять. В шестнадцатеричной системе десять - это "А".
50. Said-We 11.12.24 17:46 Сейчас в теме
(49) Вопрос был в том, что есть цифра и что есть число. Вопрос терминологии.
В 16-ти ричной системе число 10 это 10 - его же никто в другую систему ещё не переводил :-)

(1) P.S.
Число состоит из цифр. Цифра это всегда один знак. Цифр столько сколько их в системе счисления. Человечество на сейчас в большинстве (не 100%) живет в десятичной системе счисления. Цифр в десятичной системе счисления десять от 0 до 9. В десятичной системе счисления нельзя цифрой записать количество равное ста. А числом можно.
В формулировке вопроса в (1) использовался термин цифра, а не термин число.
Но опять же - это если душнить :-)
47. Said-We 11.12.24 13:05 Сейчас в теме
(1) https://www.cyberforum.ru/1c/thread948452.html
Тут тоже много чего копали и разбирали.... :-)
48. user1936660 11.12.24 13:37 Сейчас в теме
(47) Схватка якодзун... Оно ж проверяется элементарно:
Для Индекс = 1 По РезультатФункции() Цикл
    Сообщить("Итерация " + Индекс);
КонецЦикла;

Функция РезультатФункции() 
	Сообщить("Вызов функции");
	Возврат 5;
КонецФункции
И дальше больше тебе скажу:
    КоличествоИтераций = 5;
    Для Индекс = 1 По КоличествоИтераций Цикл
        Сообщить("Итерация " + Индекс);
        КоличествоИтераций = 3;
    КонецЦикла;
Sashares; +1 Ответить
Оставьте свое сообщение

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