Kalkulator z trzech funkcji

Projekt: kalkulator wyrażeń w ONP - Informatyka - liceum klasa 3, zakres rozszerzony (Python)

Projekt dzielimy na trzy funkcje, każdą da się sprawdzić osobno: `tokenize` (tekst -> symbole), `to_rpn` (symbole -> ONP), `evaluate_rpn` (ONP -> wynik). Kalkulator to ich złożenie. Liczby mogą mieć część dziesiętną (kropka należy do liczby).

PRIORITY = {"+": 1, "-": 1, "*": 2, "/": 2}

def tokenize(text):
    tokens, number = [], ""
    for ch in text + " ":
        if ch.isdigit() or ch == ".":
            number += ch
            continue
        if number:
            tokens.append(number)
            number = ""
        if ch != " ":
            tokens.append(ch)
    return tokens

def to_rpn(tokens):
    output, ops = [], []
    for t in tokens:
        if t in PRIORITY:
            while ops and ops[-1] != "(" and PRIORITY[ops[-1]] >= PRIORITY[t]:
                output.append(ops.pop())
            ops.append(t)
        elif t == "(":
            ops.append(t)
        elif t == ")":
            while ops[-1] != "(":
                output.append(ops.pop())
            ops.pop()
        else:
            output.append(t)
    return output + ops[::-1]

def evaluate_rpn(rpn):
    stack = []
    for t in rpn:
        if t in PRIORITY:
            b, a = stack.pop(), stack.pop()
            stack.append(a + b if t == "+" else a - b if t == "-" else a * b if t == "*" else a / b)
        else:
            stack.append(float(t))
    return stack[0]

for text in ["2.5 * (4 - 1)", "10 / 4 + 0.5"]:
    rpn = to_rpn(tokenize(text))
    print(text, "=>", " ".join(rpn), "=>", evaluate_rpn(rpn))

Ładowanie interaktywnego edytora... Jeśli się nie pojawi, włącz JavaScript.

Wszystkie lekcje kursu Informatyka - liceum klasa 3, zakres rozszerzony·Zaloguj się, aby zapisać postęp na koncie.