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

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

Моё решение.

```1c
    &НаКлиенте
    Процедура КНОПКА(Команда)

    Массив=Новый Массив;

    Число=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);

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

    КонецПроцедуры
```
---
Спасибо! Работает. Я бы до такого никогда не допёр.

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

```1c
    &НаКлиенте
    Процедура КНОПКА(Команда)

    Массив=Новый Массив;

    Число=1;

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

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

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

    КонецПроцедуры
```
---
Ну, а че норм вроде.
---
надо было 1000 элементов в массив набивать......
---
Если голова не работает, так может когда руками будет набивать сало в мозгу таять начнет.
---
Сделай цикл от 1 до 100 - проверяй, нужно ли удалять это число из массива.
Если нужно - ИЩИ в массиве элемент с этим значением, и удаляй его.
Удаление по индексу - бред.
---
вся сложность в том, каким образом определить нечетные десятки
---
Если меньше 10.
Если больше 10 и первая цифра четная.
---
30,50,70,90 по условию вроде как должны удаляться.
Но постановка задачи мутная.
---
Да тут по разному можно трактовать.
Я писал условие для замены кода ТС из шапки.
---
Если цел(Массив[к]/10)%2=0 тогда удаляем....
---
только %2=0, но идея такая, да
---
только %2=0 я сначала так и написал,
но потом подумал, что слово "нечетный" я не так представляю, и исправил на "=1"...

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

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

PPPS ну и в догонку.... перечитал ТЗ:
"Заполните массив цифрами от 1 до 100, удалите каждый нечетный десяток цифр"
цифр только 10.... остальное - числа.
---
остаток от деления на 2 для нечетного числа не будет = 1, он будет входить в множество (0, 1), не включая граничные значения.
---
вы в Советской школе учились или уже в Российской?
ответьте на простой вопрос:
```1c
    Число=1
    Пока Число%2=1 Цикл
    Число=Число+2;
    КонецЦикла;
```
когда цикл закончится?
---
это бесконечный цикл
---
а как же
"остаток от деления на 2 для нечетного числа не будет = 1, он будет входить в множество (0, 1), не включая граничные значения."
??????????????????
---
Не правильно представлял себе вычисление остатка от деления.
---
Первый десяток это от 0 до 9, он нечетный. Или какой это десяток?
Ну и если судить по коду ТС, он удаляет именно так, где цифра десятка четная.
Когда говорят пошел 5 десяток - это 40+ =)

Хотя в целом не суть.
---
возьмем шарики из "спортлото 6 из 36"....
они стояли попорядку...

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

вопрос.. шарики с какими номерами мне дали?
---
По идее, с 1 до 10.
---
вот.. а выше вы говорили, что с 0 по 9....
---
Был не прав =)
---
Но если отнять 1, то все будет работать))
---
у кого?

PS если у вас 8 яблок половину вы отдадите другу сколько у вас останется?
Ответ: 7.5
---
у всего, чтобы анализировать числа от 0 до 99.

```1c
    Для Каждого ЭлементМассива Из Массив Цикл
    Если (ЭлементМассива-1)%2=0 Тогда
    //лишний
    ...
```
---
Вот так?

```1c
    &НаКлиенте
    Процедура КНОПКА(Команда)

    Массив=Новый Массив;

    Число=1;

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

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

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

    КонецПроцедуры
```

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

ТЗ: нужно убить всех кто родился в пятницу
Программист пишет код, который убивает только Робинзона, за то что у его друга Пятницей зовут...
---
Уважаемый коллега! Напишите пожалуйста код-решение. А я буду его разбирать и запоминать логику.
---
только после того, как вы ответите на вопрос заданный мной в (7)
---
```1c
    Индекс=Массив.Количество();
    Пока Индекс>0 Цикл
    Индекс=Индекс-1;
    Если Цел((Массив[Индекс]-1)/10)%2=0 Тогда
    Массив.Удалить(Индекс);
    КонецЕсли;
    КонецЦикла;
```
---
Дожимаем:
```1c
    Для Индекс = - Массив.ВГраница() По 0 Цикл
    Если Цел((Массив[- Индекс] - 1) / 10) % 2 = 0 Тогда
    Массив.Удалить(Индекс);
    КонецЕсли;
    КонецЦикла;
```
---
недожал.
удаляешь отрицательный индекс
---
Благодарствую
---
Можно еще короче:

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

- без целочисленного деления.
---
хотел написать такой код, но подумал,
что для человека для которого сложно написать простой цикл,
такой код будет слишком сложно...

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

Я проверил ваш код - он не работает. После нажатия КНОПКИ ничего не происходит.
---
Да тут уже не до тебя и твоей кнопки. Да и не твою задачу вообще решают.
Тут битва теоретических и абстрактных алгоритмов идёт.
---
Вот полный код формы

```1c
    &НаКлиенте
    Перем МассивЧисел;

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

    &НаКлиенте
    Процедура Инициализация(Команда)

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

    ОтобразитьРезультат();

    КонецПроцедуры

    &НаКлиенте
    Процедура Удаление(Команда)

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

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

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

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

    КонецПроцедуры
```

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

Иди лучше, пиши кляузу в 1С о срочной необходимости оконных функций в запросах,
---
может проблема была выше - заполните цифрами от 1 до 100 ?
---
Спасибо! Работает. Я бы до такого никогда не допёр.

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

```1c
    &НаКлиенте
    Процедура КНОПКА(Команда)

    Массив=Новый Массив;

    Число=1;

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

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

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

    КонецПроцедуры
```
---
```1c
    Пока Число<=100 Цикл
    Массив.Добавить(Число);
    Число=Число+1;
    КонецЦикла;
```
цикл FOR ("для .. по ... цикл")
не проходили ещё?

```1c
    Массив.Удалить(89);
    Массив.Удалить(88);
    Массив.Удалить(87);
    Массив.Удалить(86);
    Массив.Удалить(85);
    Массив.Удалить(84);
    Массив.Удалить(83);
    Массив.Удалить(82);
    Массив.Удалить(81);
    Массив.Удалить(80);
```
в ТЗ "удалить элемент массива со значением таким-то",
а вы удаляете "элемент с индексом таким-то".

если я случайно удалю первый элемент массива, то ваш алгоритм удалит совсем не то что просят...
(или перемешаю элементы)
---
цикл FOR ("для .. по ... цикл")
не проходили ещё?

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

Поэтому не знаю как точно ответить на вопрос "не проходили ещё?"... Вроде и проходили, а вроде и нет. Знаю что он есть, но не знаю его всевозможные способы использования.
---
Сегодня на работе меня никто никакими делами не озадачил Очень зря
---
Задание на удаление из массива с нарушением нумерации.
Вариантов обхода несколько:
1) По количеству элементов в массиве в обратном порядке.
2) По количеству элементов в массиве в прямом порядке, но после удаления не наращивать итератор, но уменьшать общее количество элементов.

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

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

Четный или не четный десяток - сначала делите на десять с обрезанием дробной части.
Далее определяете остаток от деления на 2 (Число%2). И тут если четное или ноль, то десяток нечетный, а если нечетное, то десяток четный.
---
В заданиисначала надо придумать сто одну цифру....
---
сначала надо придумать сто одну цифру....
Можно с 5 до 95. Какая разница сколько их... Крайние десятки могут быть не полные.... И не только крайние...
Важно к какому десятку относится значение. Но сами десятки - это должны быть десятками. Т.е. диапазоны в которых определяется число - это должен быть десяток. :-)
---
Уважаемый коллега! Напишите пожалуйста код-решение. А я буду его разбирать и запоминать логику.
---
В постановке задачи ошибка уже до первой запятой:
„Заполните массив цифрами от 1 до 100“
Не бывает цифр больше 9 !
Всё дальнейшее уже можно не читать и не рассматривать, а дать задавшему такое задание хотя-бы ссылку на Википедию
---
Не бывает цифр больше 9 !
---
Не бывает цифр больше 9 !
Знаки 16-ти ричной системы: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.
Задание в (1) могло быть написано своими словами, и какая была точная формулировка - неизвестно.
---
какая была точная формулировка - неизвестноНу десяток - это десять. В шестнадцатеричной системе десять - это "А".
---
Вопрос был в том, что есть цифра и что есть число. Вопрос терминологии.
В 16-ти ричной системе число 10 это 10 - его же никто в другую систему ещё не переводил :-)

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

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