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.