Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 31, 2016 16:45:39

0x01
Зарегистрирован: 2016-10-31
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка парности скобок в файле

Помогите, пожалуйста, разобраться. Нужно чтобы программа проверяла правильность расстановки скобок в файле(у каждой открывающей скобки должна быть закрывающая скобка). И если скобки расставлены неверно, то есть открывающих или закрывающих скобок больше, чем положено, программа должна возвращать номер строки и колонки лишней скобки.

С проверкой на правильность расстановки скобок проблем нет, вот мое решение:

 def isBalanced(file):
    with open(file) as f:
        strInput = f.read()
        if strInput:
            brackets = [ ('(',')'), ('[',']'), ('{','}')]
            kStart = 0
            kEnd = 1
 
            stack = []
 
            for char in strInput:
                for bracketPair in brackets:
                    if char == bracketPair[kStart]:
                        stack.append(char)
                    elif char == bracketPair[kEnd] and len(stack) > 0 and stack.pop() != bracketPair[kStart]:
                        return False
 
            if len(stack) == 0:
                return True
 
        return False

Также я сделала небольшую функцию для поиска символа в тексте, функция возвращает номер колонки и строки искомого символа.

 def line_col(symbol,file):
    with open(file) as myFile:
        for num, line in enumerate(myFile, 1):
            if symbol in line:
                idx = line.index(symbol)
                print ('symbol at line:', num,'symol at column:', idx)

Как объединить все воедино и заставить работать? У меня уже закончились идеи, помогите понять что делать дальше, пожалуйста.

Офлайн

#2 Окт. 31, 2016 20:42:34

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9746
Репутация: +  843  -
Профиль   Отправить e-mail  

Проверка парности скобок в файле

Во-первых, не надо весь файл целиком считывать за один раз. Нужно читать построчно, тогда и строку будет легко найти. (Но тут главное, что файл может оказаться огромным и не поместиться в память.)
Во-вторых, в функцию надо не имя файла подавать, а поток строк, потому что поток строк может быть откуда угодно, хоть по сети прийти.
И вот когда у тебя есть поток строк, тогда ты можешь знать номер текущей строки и номер символа в ней.

0x01
  
brackets = [ ('(',')'), ('[',']'), ('{','}')]
  
brackets = ('()', '[]', '{}')

0x01
  
    if len(stack) == 0:
        return True
  
    if not stack:
        return True



Отредактировано py.user.next (Окт. 31, 2016 20:49:40)

Онлайн

#3 Окт. 31, 2016 23:00:11

0x01
Зарегистрирован: 2016-10-31
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка парности скобок в файле

py.user.next спасибо за идею со чтением построчно.

По поводу параметра, мне нужно именно файл использовать как параметр и эта программа рассчитана на небольшие файлы во избежание трудностей.

По поводу скобок поняла поправку, а вот со стаком не очень. Что принципиально меняет if not stack: return True?

Офлайн

#4 Ноя. 1, 2016 04:17:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9746
Репутация: +  843  -
Профиль   Отправить e-mail  

Проверка парности скобок в файле

0x01
Что принципиально меняет if not stack: return True?
Оно короче, понятнее и меньше операций требует. В логических проверках пустой стек ложный, а непустой - истинный. Вычисление длины может занимать какое-то время. Где-то он возьмёт хранящееся значение длины, а где-то он будет перебирать все элементы, чтобы посчитать. Если эта функция вызывается потом для тысячи файлов каждый день, то тысячу раз каждый день будет иметь значение, как быстро там всё происходит.

0x01
По поводу параметра, мне нужно именно файл использовать как параметр и эта программа рассчитана на небольшие файлы во избежание трудностей.
Значит, нужно сделать две функции. Одна открывает файл и передаёт его во вторую, вторая принимает набор строк и возвращает, например, None, если всё правильно, либо кортеж с номером строки и номером символа, если там ошибка. Дальше первая функция берёт этот кортеж возвращённый и формирует соощение об ошибке.
Тогда вторую функцию можно применить к любому списку строк любого размера и после её выполнения формировать любые сообщения об ошибках.



Отредактировано py.user.next (Ноя. 1, 2016 04:24:49)

Онлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version