Имя: Пароль:
1C
1С v8
Как правильно сделать рекурсию?
0 breezee
 
30.11.15
17:05
Нужно чтобы в коде ниже после каждого прохода обновлялся массив стркутур. А то он каждый раз проходит по старым данным.
Подскажите, пожалуйста, как это сделать?
МассивВнутриСкобья = ПолучитьМассивВнутрискобья(МояСтрока);            
            Для Каждого Диапазон из ПолучитьМассивВнутрискобья(МояСтрока) цикл
            Если Диапазон.Начало <> Неопределено Тогда
                 ЧислоСимволов = Диапазон.Конец - Диапазон.Начало+1;
                 ЧислоСимволовДоНачала = Диапазон.Начало - 3;
                 СтрокаЗамены = Сред(МояСтрока,Диапазон.Начало, ЧислоСимволов);
                 МояСтрока = Сред(МояСтрока,1,ЧислоСимволовДоНачала) + СтрокаЗамены + Сред(МояСтрока,Диапазон.Конец+2);
                    МассивВнутриСкобья = ПолучитьМассивВнутрискобья(МояСтрока);
             КонецЕсли;
         КонецЦикла;
1 Cyberhawk
 
30.11.15
17:10
На картинке код покажи
2 ejikbeznojek
 
30.11.15
17:11
Ну если бы это был не массив а выборка, тогда можно было бы использовать  следующий()
А так на ум сходу приходит только счётчик какой-нибудь..
А это у тебя точно рекурсия?
3 breezee
 
30.11.15
17:14
(1) Не знаю куда заливать. Залил сюда
http://rghost.ru/6KvryxmW9
(2) Не да. удаляю элементы из строки, потом нахожу элементы на удаления из получившейся строки и так же их удаляю
4 breezee
 
30.11.15
17:14
(3) Ничерта не видно, сейчас найу куда залить
5 breezee
 
30.11.15
17:16
6 Cyberhawk
 
30.11.15
17:16
"Для Каждого Диапазон из ПолучитьМассивВнутрискобья(МояСтрока) цикл " // тебе точно надо на каждой итерации вызывать эту функцию и обрабатывать первый элемент коллекции?
7 Garykom
 
гуру
30.11.15
17:18
(0) мда
8 breezee
 
30.11.15
17:20
(6) Блин, понял что не надо. Массив заново нужно получать, только если строка изменилась. хотя один хрен не работает

Для Каждого Диапазон из МассивВнутриСкобья цикл
            Если Диапазон.Начало <> Неопределено Тогда
                 ЧислоСимволов = Диапазон.Конец - Диапазон.Начало+1;
                 ЧислоСимволовДоНачала = Диапазон.Начало - 3;
                 СтрокаЗамены = Сред(МояСтрока,Диапазон.Начало, ЧислоСимволов);
                 МояСтрока = Сред(МояСтрока,1,ЧислоСимволовДоНачала) + СтрокаЗамены + Сред(МояСтрока,Диапазон.Конец+2);
                    МассивВнутриСкобья = ПолучитьМассивВнутрискобья(МояСтрока);
             КонецЕсли;
         КонецЦикла;
9 ejikbeznojek
 
30.11.15
17:22
Чёт я не пойму что этот код делает...
Ищет номера символов где есть открывающие скобки и закрывающие?
И потом заменяет все "+" внутри скобок минусами? а "-" плюсами?)
10 Garykom
 
гуру
30.11.15
17:22
(7)+

Стр = "ФФФФФ";
Для НомСим = 1 по СтрДлина(Стр) Цикл
  Стр = Стр + "Ф";
КонецЦикла;


ЗЫ когда закончится цикл?
11 ejikbeznojek
 
30.11.15
17:23
Ты бы лучше написал, пример входящей строчки и что должно быть на выходе))
12 breezee
 
30.11.15
17:26
(9) Да, а после раскрытия скобок сами скобки я должен удалить. (10) Ну на 4 проходе же. Получаем строку 1 раз. Я так понял у меня так же. Как тогда чертову рекурсию запхнуть? (11) входящая -(1+2)-(2+3) на выходе 1-22-3. Хотя бы так. В идеале конечно -1-2-2-3
13 Garykom
 
гуру
30.11.15
17:29
(12) "(10) Ну на 4 проходе же." - ???
14 breezee
 
30.11.15
17:31
(13) Цикл (10) закончится на 4 проходе. Специально проверил.
15 Cyberhawk
 
30.11.15
17:31
Пишешь синтаксический анализатор (калькулятор?) на 1С, в универе учишься что ли?
16 breezee
 
30.11.15
17:33
(15) Неа. Стажируюсь. Мне сказали писать запросы. Запросы вида СНК_50+СНК_60 или -(СНК_50+СНК_60), где снк - сальдо начальное кредитовое там конечно много сложных запросов, но хотел бы автоматизировать написание простых запросов.
17 Garykom
 
гуру
30.11.15
17:36
(14) да это фича платформы, но так все равно неправильно, тем более у тебя не "цикл со счетчиком" а "перебор коллекции"
18 ejikbeznojek
 
30.11.15
17:44
НоваяСтрока="";
КусокНовойСтроки="";
СтараяСтрока="-(1+2)-(2+3)";
Пока СтрДлинна(СтараяСтрока)>0 Цикл
СкобкаОткр = Найти(СтараяСтрока,"(");
если СкобкаОткр>1 тогда
ВдругМинус=сред(СтараяСтрока,СкобкаОткр-1,1);
если ВдругМинус = "-" тогда
ЕстьМинус=истина;
иначе
ЕстьМинус=Ложь;
КонецЕсли;
Сч=СкобкаОткр;
Пока ТекСимвол <> ")" цикл

ТекСимвол=Сред(СтараяСтрока,сч,1);
Если ТекСимвол="+" или ТекСимвол="(" и ЕстьМинус тогда
    ТекСимвол="-";
ИначеЕсли ТекСимвол ="-" и ЕстьМинус тогда
    ТекСимвол="+";
КонецЕсли
НоваяСтрока=НоваяСтрока+ТекСимвол;
Сч=Сч+1;

если Сч>=СтрДлина(СтараяСтрока) тогда
прервать;
конецесли

конеццикла

СтараяСтрока=сред(СтараяСтрока,СтрДлина(НоваяСтрока+1),СтрДлина(Строка));
КонецЦикла;

Что-нибудь в этом роде мб сделать?
Только мог ошибиться в длинах строк или ещё какой фигне)
19 breezee
 
30.11.15
17:45
Ок, я выкрутился(код ниже). Однако если мне вдруг понадобиться динамически обновлять массив - это не получится?

       МассивВнутриСкобья = ПолучитьМассивВнутрискобья(МояСтрока);
       РезультирующаяСтрока = "";
             
        Для Каждого Диапазон из МассивВнутриСкобья цикл
            Если Диапазон.Начало <> Неопределено Тогда
                 ЧислоСимволов = Диапазон.Конец - Диапазон.Начало+1;
                 СтрокаЗамены = Сред(МояСтрока,Диапазон.Начало, ЧислоСимволов);
                 СтрокаЗамены = СтрЗаменить(СтрокаЗамены,"+","плюс");
                 СтрокаЗамены = СтрЗаменить(СтрокаЗамены,"-","+");
                 СтрокаЗамены = СтрЗаменить(СтрокаЗамены,"плюс","-");
                 МояСтрока = Сред(МояСтрока,1,Диапазон.Начало-1) + СтрокаЗамены + Сред(МояСтрока,Диапазон.Конец+1);
                 РезультирующаяСтрока = РезультирующаяСтрока + СтрокаЗамены;
            КонецЕсли;    
        КонецЦикла;
    Возврат РезультирующаяСтрока;
(18) Спасибо! Сейчас посмотрю
20 breezee
 
30.11.15
17:48
(18) Спасибо, идею понял. Почерпнул идею проверку на "-" если "("
21 ejikbeznojek
 
30.11.15
17:50
Ну просто отрезай куски от старой строки формируя новую
посимвольно
В идеале цикл закончится когда старая строка станет = ""
Массивы тут пожалуй не очень нужны
22 Garykom
 
гуру
30.11.15
17:52
23 Garykom
 
гуру
30.11.15
17:53
(22)+ это к тому что и без рекурсии можно
Основная теорема систематики: Новые системы плодят новые проблемы.