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