Удаление элементов массива. Решение задачи.
Всем доброго дня! Это снова - я, начинающий 1С-ник потихоньку решающий задачи. Спасибо за активность в прошлом посте, я все ответы разобрал, в мозге новые знания зафиксировал и с их помощью решил следующие 7 задач про многомерные массивы. И вот опять встрял. Задачу я решил, но мне кажется слишком топорным способом. Прошу подсказать решение более изящное. Сегодня на работе меня никто никакими делами не озадачил и я просидел над ней часа 4...
Задача.
Заполните массив цифрами от 1 до 100, удалите каждый нечетный десяток цифр. Т.е.
цифры от 1 до 10 удаляем, потом от 20 до 30, потом от 40 до 50 и т.д. Выведите элементы
массива в окно сообщений.
Моё решение.
Задача.
Заполните массив цифрами от 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);
Для Каждого Число ИЗ Массив Цикл
Сообщить(Число);
КонецЦикла;
КонецПроцедуры
ПоказатьПо теме из базы знаний
Найденные решения
(37) Спасибо! Работает. Я бы до такого никогда не допёр.
Оставлю тут решение для потомков.
Оставлю тут решение для потомков.
&НаКлиенте
Процедура КНОПКА(Команда)
Массив=Новый Массив;
Число=1;
Пока Число<=100 Цикл
Массив.Добавить(Число);
Число=Число+1;
КонецЦикла;
Индекс=Массив.Количество();
Пока Индекс>0 Цикл
Индекс=Индекс-1;
Если Цел((Массив[Индекс]-1)/10)%2=0 Тогда
Массив.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
Для Каждого Число ИЗ Массив Цикл
Сообщить(Число);
КонецЦикла;
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(10)
но потом подумал, что слово "нечетный" я не так представляю, и исправил на "=1"...
PS исправил обратно на "=0"
PPS ещё числа с 1 до 100...
число 10 это первый десяток или уже второй? если ещё первый, то надо цел((Массив[к]-1)/10)%2
PPPS ну и в догонку.... перечитал ТЗ:
"Заполните массив цифрами от 1 до 100, удалите каждый нечетный десяток цифр"
цифр только 10.... остальное - числа.
только %2=0
я сначала так и написал,
но потом подумал, что слово "нечетный" я не так представляю, и исправил на "=1"...
PS исправил обратно на "=0"
PPS ещё числа с 1 до 100...
число 10 это первый десяток или уже второй? если ещё первый, то надо цел((Массив[к]-1)/10)%2
PPPS ну и в догонку.... перечитал ТЗ:
"Заполните массив цифрами от 1 до 100, удалите каждый нечетный десяток цифр"
цифр только 10.... остальное - числа.
(9) Вот так?
Не работает. Ошибка - Значение индекса выходит за границы диапазона.
&НаКлиенте
Процедура КНОПКА(Команда)
Массив=Новый Массив;
Число=1;
Пока Число<=100 Цикл
Массив.Добавить(Число);
Число=Число+1;
КонецЦикла;
Для Каждого Число Из Массив Цикл
Если Цел(Массив[Число-1]/10)%2=0 Тогда
Массив.Удалить(Число);
КонецЕсли;
КонецЦикла;
Для Каждого Число ИЗ Массив Цикл
Сообщить(Число);
КонецЦикла;
КонецПроцедуры
ПоказатьНе работает. Ошибка - Значение индекса выходит за границы диапазона.
(27)
ТЗ: нужно убить всех кто родился в пятницу
Программист пишет код, который убивает только Робинзона, за то что у его друга Пятницей зовут...
Для Каждого Число Из Массив Цикл
Если Цел(Массив[Число-1]/10)%2=0 Тогда
Массив.Удалить(Число);
КонецЕсли;
КонецЦикла;
мда....
Если Цел(Массив[Число-1]/10)%2=0 Тогда
Массив.Удалить(Число);
КонецЕсли;
КонецЦикла;
ТЗ: нужно убить всех кто родился в пятницу
Программист пишет код, который убивает только Робинзона, за то что у его друга Пятницей зовут...
(54) Вот полный код формы
Результат работы после последовательного нажатия кнопок "Инициализация" и "Удаление" - в прикрепленном файле.
&НаКлиенте
Перем МассивЧисел;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
МассивЧисел = Новый Массив;
КонецПроцедуры
&НаКлиенте
Процедура Инициализация(Команда)
МассивЧисел.Очистить();
Для Число = 1 По 100 Цикл
МассивЧисел.Добавить(Число);
КонецЦикла;
ОтобразитьРезультат();
КонецПроцедуры
&НаКлиенте
Процедура Удаление(Команда)
ПоследнийИндекс = МассивЧисел.ВГраница();
Для Индекс = -ПоследнийИндекс По 0 Цикл
Если (МассивЧисел.Получить(-Индекс) - 1) % 20 < 10 Тогда
МассивЧисел.Удалить(-Индекс);
КонецЕсли;
КонецЦикла;
ОтобразитьРезультат();
КонецПроцедуры
&НаКлиенте
Процедура ОтобразитьРезультат()
Результат.Очистить();
Для Индекс = 0 По МассивЧисел.ВГраница() Цикл
Результат.ДобавитьСтроку("МассивЧисел[" + Формат(Индекс,"ЧН=0; ЧГ=") + "] = " + Формат(МассивЧисел.Получить(Индекс),"ЧН=0; ЧГ="));
КонецЦикла;
КонецПроцедуры
ПоказатьРезультат работы после последовательного нажатия кнопок "Инициализация" и "Удаление" - в прикрепленном файле.
Прикрепленные файлы:
(37) Спасибо! Работает. Я бы до такого никогда не допёр.
Оставлю тут решение для потомков.
Оставлю тут решение для потомков.
&НаКлиенте
Процедура КНОПКА(Команда)
Массив=Новый Массив;
Число=1;
Пока Число<=100 Цикл
Массив.Добавить(Число);
Число=Число+1;
КонецЦикла;
Индекс=Массив.Количество();
Пока Индекс>0 Цикл
Индекс=Индекс-1;
Если Цел((Массив[Индекс]-1)/10)%2=0 Тогда
Массив.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
Для Каждого Число ИЗ Массив Цикл
Сообщить(Число);
КонецЦикла;
КонецПроцедуры
Показать
(1) цикл FOR ("для .. по ... цикл")
не проходили ещё?
в ТЗ "удалить элемент массива со значением таким-то",
а вы удаляете "элемент с индексом таким-то".
если я случайно удалю первый элемент массива, то ваш алгоритм удалит совсем не то что просят...
(или перемешаю элементы)
Пока Число<=100 Цикл
Массив.Добавить(Число);
Число=Число+1;
КонецЦикла;
не проходили ещё?
Массив.Удалить(89);
Массив.Удалить(88);
Массив.Удалить(87);
Массив.Удалить(86);
Массив.Удалить(85);
Массив.Удалить(84);
Массив.Удалить(83);
Массив.Удалить(82);
Массив.Удалить(81);
Массив.Удалить(80);
Показатьа вы удаляете "элемент с индексом таким-то".
если я случайно удалю первый элемент массива, то ваш алгоритм удалит совсем не то что просят...
(или перемешаю элементы)
(7)
Пошарился сейчас по внешним обработкам в которых решал задачи. Этот цикл я не использовал... Но пару дней назад я тут, на форуме, попросил помощи в решении задачи по многомерным массивам и один великодушный юзер сразу выдал код-решение, в котором был этот цикл.
Поэтому не знаю как точно ответить на вопрос "не проходили ещё?"... Вроде и проходили, а вроде и нет. Знаю что он есть, но не знаю его всевозможные способы использования.
цикл FOR ("для .. по ... цикл")
не проходили ещё?
не проходили ещё?
Пошарился сейчас по внешним обработкам в которых решал задачи. Этот цикл я не использовал... Но пару дней назад я тут, на форуме, попросил помощи в решении задачи по многомерным массивам и один великодушный юзер сразу выдал код-решение, в котором был этот цикл.
Поэтому не знаю как точно ответить на вопрос "не проходили ещё?"... Вроде и проходили, а вроде и нет. Знаю что он есть, но не знаю его всевозможные способы использования.
(1) Задание на удаление из массива с нарушением нумерации.
Вариантов обхода несколько:
1) По количеству элементов в массиве в обратном порядке.
2) По количеству элементов в массиве в прямом порядке, но после удаления не наращивать итератор, но уменьшать общее количество элементов.
В задании нет условия, что сначала надо заполнить массив, потом удалить и только потом вывести.
Можно сразу добавить, и сразу или удалить или вывести :-)
Одним циклом. Как задание составлено, так его и выполнить. :-)
В следующий раз пусть правильно задание составляют :-)
И да наверное удалять хотели: 1-10, 21-30, 41-50... ИЛИ 1-9, 20-29, 40-49...
В первом варианте сравнение (Значение-1), во втором само (Значение).
Оба варианта одинаковые, но оба не, то что в (1). У вас в (1) получается, что в четных и не четных десятках количество разное и не рано 10. Т.е. какие же это тогда десятки? :-) Какие-то 9-ки и 11-ки :-)
Четный или не четный десяток - сначала делите на десять с обрезанием дробной части.
Далее определяете остаток от деления на 2 (Число%2). И тут если четное или ноль, то десяток нечетный, а если нечетное, то десяток четный.
Вариантов обхода несколько:
1) По количеству элементов в массиве в обратном порядке.
2) По количеству элементов в массиве в прямом порядке, но после удаления не наращивать итератор, но уменьшать общее количество элементов.
В задании нет условия, что сначала надо заполнить массив, потом удалить и только потом вывести.
Можно сразу добавить, и сразу или удалить или вывести :-)
Одним циклом. Как задание составлено, так его и выполнить. :-)
В следующий раз пусть правильно задание составляют :-)
И да наверное удалять хотели: 1-10, 21-30, 41-50... ИЛИ 1-9, 20-29, 40-49...
В первом варианте сравнение (Значение-1), во втором само (Значение).
Оба варианта одинаковые, но оба не, то что в (1). У вас в (1) получается, что в четных и не четных десятках количество разное и не рано 10. Т.е. какие же это тогда десятки? :-) Какие-то 9-ки и 11-ки :-)
Четный или не четный десяток - сначала делите на десять с обрезанием дробной части.
Далее определяете остаток от деления на 2 (Число%2). И тут если четное или ноль, то десяток нечетный, а если нечетное, то десяток четный.
(25)
Можно с 5 до 95. Какая разница сколько их... Крайние десятки могут быть не полные.... И не только крайние...
Важно к какому десятку относится значение. Но сами десятки - это должны быть десятками. Т.е. диапазоны в которых определяется число - это должен быть десяток. :-)
сначала надо придумать сто одну цифру....
Можно с 5 до 95. Какая разница сколько их... Крайние десятки могут быть не полные.... И не только крайние...
Важно к какому десятку относится значение. Но сами десятки - это должны быть десятками. Т.е. диапазоны в которых определяется число - это должен быть десяток. :-)
В постановке задачи ошибка уже до первой запятой:
„Заполните массив цифрами от 1 до 100“
Не бывает цифр больше 9 !
Всё дальнейшее уже можно не читать и не рассматривать, а дать задавшему такое задание хотя-бы ссылку на Википедию
„Заполните массив цифрами от 1 до 100“
Не бывает цифр больше 9 !
Всё дальнейшее уже можно не читать и не рассматривать, а дать задавшему такое задание хотя-бы ссылку на Википедию
(49) Вопрос был в том, что есть цифра и что есть число. Вопрос терминологии.
В 16-ти ричной системе число 10 это 10 - его же никто в другую систему ещё не переводил :-)
(1) P.S.
Число состоит из цифр. Цифра это всегда один знак. Цифр столько сколько их в системе счисления. Человечество на сейчас в большинстве (не 100%) живет в десятичной системе счисления. Цифр в десятичной системе счисления десять от 0 до 9. В десятичной системе счисления нельзя цифрой записать количество равное ста. А числом можно.
В формулировке вопроса в (1) использовался термин цифра, а не термин число.
Но опять же - это если душнить :-)
В 16-ти ричной системе число 10 это 10 - его же никто в другую систему ещё не переводил :-)
(1) P.S.
Число состоит из цифр. Цифра это всегда один знак. Цифр столько сколько их в системе счисления. Человечество на сейчас в большинстве (не 100%) живет в десятичной системе счисления. Цифр в десятичной системе счисления десять от 0 до 9. В десятичной системе счисления нельзя цифрой записать количество равное ста. А числом можно.
В формулировке вопроса в (1) использовался термин цифра, а не термин число.
Но опять же - это если душнить :-)
(47) Схватка якодзун... Оно ж проверяется элементарно: И дальше больше тебе скажу:
Для Индекс = 1 По РезультатФункции() Цикл
Сообщить("Итерация " + Индекс);
КонецЦикла;
Функция РезультатФункции()
Сообщить("Вызов функции");
Возврат 5;
КонецФункции
КоличествоИтераций = 5;
Для Индекс = 1 По КоличествоИтераций Цикл
Сообщить("Итерация " + Индекс);
КоличествоИтераций = 3;
КонецЦикла;
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот