Member 13814092 Ответов: 1

Как заставить этот калькулятор работать со скобками?


Я написал этот калькулятор для +,-,/,* и пытаюсь применить к нему функцию ().
например: 5+(3*2(2+3))


Это калькулятор, который я написал, который отлично работает без скобок:
class Node(object):
    def __init__(self, kappa):
        i = -1
        if kappa.rfind("+") != -1:
            i = kappa.rfind("+")
        elif kappa.rfind("-") != -1:
            i = kappa.rfind("-")
        elif kappa.rfind("*") != -1:
            i = kappa.rfind("*")
        elif kappa.rfind("/") != -1:
            i = kappa.rfind("/")
        
        if i != -1:
            self.data = kappa[i]
            self.left = Node(kappa[:i])
            self.right = Node(kappa[i + 1:])
        else:
            self.data = float(kappa)
            self.left = None
            self.right = None
            
    def calculate(self):
        if self.data == "+":
            return self.left.calculate() + self.right.calculate()
        elif self.data == "-":
            return self.left.calculate() - self.right.calculate()
        elif self.data == "*":
            return self.left.calculate() * self.right.calculate()
        elif self.data == "/":
            return self.left.calculate() / self.right.calculate()
        else:
            return self.data


Что я уже пробовал:

Я не совсем уверен, где находится идеальное место для реализации скобки здесь, должен ли я создать новый метод или добавить его в часть __init__ method?

Я написал эту функцию, которая изменяет значения, ограниченные скобками, на $:

<pre>def parenthesis_replace(kappa):
    s = ""
    level = 0
    for c in kappa:
        if c == "(":
            level += 1
        if level > 0:
            s += "$"
        else:
            s += c
        if c == ")":
            level -= 1
    return s
    

print parenthesis_replace("(1-2)-3")  


Я получаю :
$$$$$-3

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

Кроме того, мне пришло в голову, что таким образом, если скобки находятся между всеми входными данными, то он ничего не вычисляет.

Любые намеки или советы очень ценятся

Member 13814092

Вот как вы вызываете эту функцию :

калькулятор дефа(узел):
обратный узел.вычислить()
калькулятор печати(узел("5+(3*2(2+3))"))

1 Ответов

Рейтинг:
7

Thomas Daniels

Я не буду писать полный код для этого, но вот шаги, которые вы должны предпринять:

Если ваши входные данные содержат круглые скобки, вы должны найти круглые скобки, которые не имеют круглых скобок внутри них. Вы можете сделать это с помощью re модуль, с re.search:

# re.search example
import re

expression = "(6+(7+8))"
match = re.search("\\(([^()]+)\\)", expression)
print(match.group(0)) # prints (7+8)
print(match.group(1)) # prints 7+8

Таким образом, вы выполняете это на своем фактическом входе. .group(1) приведу вам простое выражение без скобок, .group(0) даст вам выражение с его скобками. Затем вам нужно оценить выражение .group(1) (что нетрудно, у вас уже есть функция для этого), а затем в исходной строке вы должны заменить значение .group(0) с результатом оценки .group(1), используя .replace метод на струнах.

Но в одном выражении может быть больше пар скобок, поэтому вам придется повторять описанный выше процесс до тех пор, пока в выражении не останется больше скобок.