Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 апр 2024, 07:47

Чётные и нечётные символы в строке

Автор Golickoff, 10 фев 2015, 06:48

0 Пользователей и 1 гость просматривают эту тему.

Golickoff

Всем привет.

Есть строка с произвольным двенадцатиразрядным числом, например "123456789012". Необходимо сложить отдельно все чётные разряды и все нечётные. То есть, получить сумму 1+3+5+7+9+1 и 2+4+6+8+0+2. Возможно ли это реализовать средствами встроенного языка 1С без применения ВК? Если да, то подскажите, пожалуйста, каким образом.
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

Golickoff

А всё оказалось очень просто:
ЧётныеСимволы = Сред(Объект.Строка,2,1)
    +Сред(Объект.Строка,4,1)
    +Сред(Объект.Строка,6,1)
    +Сред(Объект.Строка,8,1)
    +Сред(Объект.Строка,10,1)
    +Сред(Объект.Строка,12,1);

Затем таким же образом выбираем нечётные.
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

has

А если строка будет "353746789012"? Посимвольное чтение будет более универсальным

Golickoff

Цитата: has от 10 фев 2015, 08:46
А если строка будет "353746789012"? Посимвольное чтение будет более универсальным
Не могу понять, чем отличаются эти строки. А как реализовать посимвольное чтение?
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

has

Цитата: Golickoff от 10 фев 2015, 09:18
Цитата: has от 10 фев 2015, 08:46
А если строка будет "353746789012"? Посимвольное чтение будет более универсальным
Не могу понять, чем отличаются эти строки. А как реализовать посимвольное чтение?
В данном случае вот эта конструкция вернет нечетное число.
Сред(Объект.Строка,2,1).
Также через Сред, только в цикле от 1 до длины строки, например

СтрокаЧтения = Объект.Строка;
Для к = 1 По СтрДлина(СтрокаЧтения) Цикл
    ТекущийСимвол = Сред(СтрокаЧтения, к, 1);
    //если в строке могут быть только цифры, то проверяете остаток от деления на 2. Если без остатка, то четное, если есть остаток, то нечетное. Ну и про 0 не забываем
    к = к + 1;
КонецЦикла;

Golickoff

Цитата: has от 10 фев 2015, 09:26
Цитата: Golickoff от 10 фев 2015, 09:18
Цитата: has от 10 фев 2015, 08:46
А если строка будет "353746789012"? Посимвольное чтение будет более универсальным
Не могу понять, чем отличаются эти строки. А как реализовать посимвольное чтение?
В данном случае вот эта конструкция вернет нечетное число.
Сред(Объект.Строка,2,1).
Также через Сред, только в цикле от 1 до длины строки, например

СтрокаЧтения = Объект.Строка;
Для к = 1 По СтрДлина(СтрокаЧтения) Цикл
    ТекущийСимвол = Сред(СтрокаЧтения, к, 1);
    //если в строке могут быть только цифры, то проверяете остаток от деления на 2. Если без остатка, то четное, если есть остаток, то нечетное. Ну и про 0 не забываем
    к = к + 1;
КонецЦикла;

Небольшое добавление: строка всегда состоит из цифр и длина строки всегда равна 12ти символам, оба этих условия проверяются в начале работы со строкой. Поэтому код меняем до
СтрокаЧтения = Объект.Строка;
Для к = 1 По 12 Цикл
    ТекущийСимвол = Сред(СтрокаЧтения, к, 1);
    к = к + 1;
КонецЦикла;

Теперь идём этим кодом по строке "353746789012" и получаем при к=1 значение 3, затем "к" становится равным "2" и мы получаем 5 и так далее. В итоге из этой строки получается эта же строка :dfbbdrfb: Наверное, "к" должно быть равно к + 2?
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

has

Видимо Вы не поняли меня. Полностью код будет примерно такой

ЧетныеСимволы = ""; НечетныеСимволы = "";
СтрокаЧтения = Объект.Строка;
Для к = 1 По 12 Цикл
    ТекущийСимвол = Сред(СтрокаЧтения, к, 1);
    ТекущийСимволЧисло = Число(ТекущийСимвол);
    Если Не ТекущийСимволЧисло = 0 Тогда //насчет 0 не знаю куда его записывать
        Если ТекущийСимволЧисло % 2 = 0 Тогда //четное
            ЧетныеСимволы = ЧетныеСимволы + ТекущийСимвол;
        Иначе
            НечетныеСимволы = НечетныеСимволы + ТекущийСимвол;
        КонецЕсли;
    КонецЕсли;
    к = к + 1;
КонецЦикла;

Golickoff

Цитата: has от 10 фев 2015, 09:57
Видимо Вы не поняли меня.
Теперь понял. Безусловно, такой код выглядит красивее. Спасибо :)
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

andante

ЧетныеСимволы = ""; НечетныеСимволы = "";   //  В условии нужны суммы нечетных и четных цифр поэтому ЧетныеСимволы = 0;  НечетныеСимволы = 0;
СтрокаЧтения = Объект.Строка;
Для к = 1 По 12 Цикл
    ТекущийСимвол = Сред(СтрокаЧтения, к, 1);
    ТекущийСимволЧисло = Число(ТекущийСимвол);
    Если Не ТекущийСимволЧисло = 0 Тогда //насчет 0 не знаю куда его записывать  На 0 проверка не нужна, пусть суммируется
        Если ТекущийСимволЧисло % 2 = 0 Тогда //четное     Четность определяет переменная цикла, поэтому  Если к % 2 = 0
            ЧетныеСимволы = ЧетныеСимволы + ТекущийСимвол;  //  ЧетныеСимволы = ЧетныеСимволы + ТекущийСимволЧисло;
        Иначе
            НечетныеСимволы = НечетныеСимволы + ТекущийСимвол;  // НечетныеСимволы = НечетныеСимволы + ТекущийСимволЧисло;
        КонецЕсли;
    КонецЕсли;
    к = к + 1;
КонецЦикла;


    Вот как-то так

has

andante, да, упустил, что там нужна сумма. Именно так.

Похожие темы (5)

Рейтинг@Mail.ru

Поиск