Имя: Пароль:
1C
 
Задачка. Определить знак. (разложение строки)
, ,
0 gp42
 
04.06.15
04:32
Стоит нетривиальная задача.

Необходимо определить с каким знаком участвует аргумент в формуле.

Формула: "[П(1)]-[П(2)]-([П(3)]-[П(4)]+[П(5)])"
Необходимо написать функцию определения знака аргумента.
Т.е для "[П(1)]"  нужно вернуть 1
"[П(2)]"  нужно вернуть -1
"[П(3)]"  нужно вернуть -1
"[П(4)]"  нужно вернуть 1
"[П(5)]"  нужно вернуть -1

Бьюсь над реализацией такой функции, но пока безрезультатно.
1 Лодырь
 
04.06.15
04:38
Имхо, рекурсивная функция должна работать и быть достаточно элементарной. В чем сложность, коллега?
2 Лодырь
 
04.06.15
04:49
А самое эффективное имхо будет: составить список параметров распарсив вхождения [ИмяПараметра], а потом в цикле позадавать их поочередно единичке, а остальные - нули и выполнить формулу. Соответственно получившийся знак даст тебе искомый результат.
3 DJ Anthon
 
04.06.15
07:52
тебе надо изучить стек. если, конечно, вложенность может быть больше единицы
4 sda553
 
04.06.15
08:37
([+|-]?)\[П\((\d)\)\]
5 Fedor-1971
 
04.06.15
08:43
(0) П1+ П2- П3+ П4- П5+  скобку забыл?
(1) как я понимаю, сложность в том, что любой из параметров может отсутствовать, а ТС необходимо определиться "на каком собственно месте стоит переданный параметр. Как выглядит переданная строка при отсутствии П1 так: -[П(2)]-([П(3)]-[П(4)]+[П(5)]) или 0-[П(2)]-([П(3)]-[П(4)]+[П(5)]) где 0 - отсутствующий параметр.
6 Fedor-1971
 
04.06.15
08:53
5+ Можешь построить разбор строки через конечный автомат:
нашли скобку "(", перед ней что-нить есть? ...ищем скобку ")" передней что-то есть кроме "("...
  Опираемся на скобки т.к. они всегда есть в твоей формуле, даже если внутри ничего нет.
7 Asmody
 
04.06.15
08:54
напиши конечный автомат
8 ДенисЧ
 
04.06.15
08:55
(6) (7) вы такими грубыми словами-то не ругайтеся... Он сейчас пойдёт читать и....
Это практически статья доведение до самоубийства...
9 FIXXXL
 
04.06.15
09:36
хм...
а формула это строка?
если строка:
разбить на массив подстрок
первая итерация - разделитель "-", если в строке массива только аргумент - "-1"
потом обходим массив и ищем "+", такая строка будет иметь "-1" слева и "1" справа
10 Windyhead
 
04.06.15
09:37
(0) Могу ошибаться, но мне кажется "обратная польская запись" тут в помощь. Что то подобное писали лет 15 назад на лабораторных по интерпретаторам.
11 gp42
 
04.06.15
12:44
Думаю буду делать следующее.
Разложение строки на массив под строк.
"[П(1)]-[П(2)]-([П(3)]-[П(4)]+[П(5)])"
"[П(1)]"
"[П(1)]"
"[П(3)]-[П(4)]+[П(5)]"
{1,-1,-1}

при необходимости на Массив подстрок еще раз применять разложение на массив подстрок.

"[П(1)]"
"[П(2)]"
"[П(3)]"
"[П(4)]"
"[П(5)]"
{1,-1,-1,1,-1}

И вести соответствие определения знака для элементов массива
12 Широкий
 
04.06.15
13:02
Мой скромный гений (работае ессно с оговорками):

ФормулаШаблон="[П(1)]-[П(2)]-([П(3)]-[П(4)]+[П(5)])";
    КоличествоПеременных=СтрЧислоВхождений(ФормулаШаблон,"П");
    Для Переменная=1 По КоличествоПеременных Цикл
        РассчитываемаяФормула=ФормулаШаблон;
        
        Для сч=1 По КоличествоПеременных Цикл
            РассчитываемаяФормула=СтрЗаменить(РассчитываемаяФормула,"[П("+сч+")]",?(сч=Переменная,1,0));
        КонецЦикла;    
        
        Попытка
            Результат=Вычислить(РассчитываемаяФормула);
        Исключение
            Сообщить("Формула некорректна ",СтатусСообщения.Важное);
            Возврат;
        КонецПопытки;  
        
        Сообщить("Переменная "+сч+" знак: "+?(Результат>0,"+","-"));
    КонецЦикла;
13 gp42
 
04.06.15
15:28
(12) Гениально.
"Обратная польская запись" рядом не стояля
14 gp42
 
04.06.15
15:30
Оговорки есть но это уже мелочи.
Такая реализация меня вполне устроит.
Ларчик просто открывался: Волшебный метод.

Вычислить("0+1-(0-0+0)")
15 gp42
 
04.06.15
15:32
Клааассс работает, уже проверил.
16 Лодырь
 
04.06.15
17:39
Собственно в (2) это и предлагалось.
Закон Брукера: Даже маленькая практика стоит большой теории.