|
Задачка. Определить знак. (разложение строки) | ☑ | ||
---|---|---|---|---|
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) это и предлагалось.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |