Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2021, 19:52   #1
Narvik
Пользователь
 
Регистрация: 03.03.2021
Сообщений: 21
По умолчанию Проверка скобочного итога.

Здравствуйте. Помогите пожалуйста, мне нужна ввести выражение с клавиатуры и определить является ли она формулой или нет. Если это формула, то нужна найти самую внутреннюю скобку и проверить является ли это скобка формулой, если да, то заменить на любую переменную, потом произвести тоже самое с другой скобкой.
Пример: Допустим (Av(B^C)vB), находим самую внутреннюю скобку это (B^C), если это формула заменяем её переменной, допусти это формула, заменяем на R, получаем скобку (AvRvB) теперь проверяем эту скобку, это формула опять заменяем на R и в итоге получается просто R.
Моя проблема в том, не могу понять как сделать так, чтобы он проверял сначала внутреннюю скобку, т.е находил саму правую "(" и шёл назад.
Narvik вне форума Ответить с цитированием
Старый 09.06.2021, 23:07   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Пишем функцию, в которой:
смотрим строку до тек пор, пока не встретим закрывающуюся скобку.
Если скобочная последовательность правильная, то предыдущая скобка была открывающейся.
"Выкусываем" подстроку, вместе со скобками.
Передаём полученную подстроку в функцию, которая проверяет на формулу и возвращает True или False.
Если вернулось True, то вместо "выкушенной" подстроки вставляем то, что вам нужно, а иначе - делаем то, что у вас не описано.
Строка, полученная, после первой обработки не содержит подстроки с парой "внутренних скобок".
Эту строку вновь передаём в функцию для поиска вложенных подстрок, ограниченных круглыми скобками.
Так повторяем до тех пор, пока в строке не останется скобок.

PS: Есть ли скобки в строке проверяет та же функция, которая, не обнаружив скобок, вернёт соответствующее сообщение.
Думаю, что задачу можно решить через рекурсию.

Добавлено:
Код:
myL = [1,2,3,4,5,6,7]
a = 2; b = 5  # Пусть надо проанализировать этот фрагмент 
newL = myL[a:b+1]  # Получить фрагмент для анализа
del myL[a:b]  # удалили с  a по b]
myL.insert(a,'R') # Вставили после a-го
Как ищем:
В цикле for k in range(len(myL)) ищем открывающуюся скобку. Если находим, то фиксируем её положение (a = k). Просматриваем далее до тех пор, пока не обнаружим закрывающуюся скобку.
Если по пути встречаем открывающуюся скобку, то заменяем сохранённое ранее значение (a = k).
Если встретили закрывающуюся скобку, то фиксируем её позицию (b = k) и выполняем необходимые операции.
Как-то так, ...

Последний раз редактировалось ViktorR; 10.06.2021 в 17:57.
ViktorR вне форума Ответить с цитированием
Старый 10.06.2021, 17:55   #3
Narvik
Пользователь
 
Регистрация: 03.03.2021
Сообщений: 21
По умолчанию

Спасибо
Narvik вне форума Ответить с цитированием
Старый 10.06.2021, 19:11   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Нашлось немного времени. Сделал через строку.
Код:
def test(s):
    # анализ подстроки
# Тут код для анализа
    return True

def myF(s):
    flag = True                               # Скобок нет
    for i in range(len(s)):
        if s[i] == '(':
            a = i
            flag = False                      # Встретилась скобка
            print('pos_left: ', i)
        elif s[i] == ')':
            print('pos_right: ', i)
            flag = False                      # Встретилась скобка
            b = i
            news = s[a + 1:b]                 # Получить фрагмент для анализа
            print('fragment: ', news)
            if test(news):                    # если функция
                s = s[:a] + 'R' + s[b + 1:]   # с заменой фрагмента между a и b
                print('del and insert: ', s)
            else:                             # не функция
                pass                          # Фик знает что делать
            break                             # Обработали один фрагмент
    return flag, s          
            
s = '(Av(B^C)vB)'
flag, ns = myF(s)
print(flag, ns)
while not flag:
    flag, ns = myF(ns)
print(ns)
Тут вставлены проверочные принты, их можно удалить.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.06.2021, 11:54   #5
Narvik
Пользователь
 
Регистрация: 03.03.2021
Сообщений: 21
По умолчанию

Спасибо Огромное !!!)
Narvik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка БД anatoliy1992 Помощь студентам 1 10.08.2015 10:20
Вставка строк (с сохранением формулы) со смещением общего итога вниз DIMONRUS Microsoft Office Excel 10 07.08.2013 16:06
excel.Проверка VBA и проверка функции Будда Помощь студентам 0 14.04.2011 21:10
проверка на IE TDrive JavaScript, Ajax 2 05.03.2010 13:41