Files
cours/elouan_fare_v2/tp6_self/npi.py
2024-11-23 13:38:17 +01:00

45 lines
1.4 KiB
Python

def npi(exp: str) -> float:
"""Calcule une expression arithmétique en NPI (notation polonaise inverse).
Args:
exp (str): L'expression arithmétique à calculer.
Returns:
float: Le résultat de l'expression.
"""
assert exp, "L'expression est vide."
pile = []
for token in exp.split():
if token in "+-*/":
if len(pile) < 2:
print("Erreure : Pas assez d'opérandes.")
return None
b, a = pile.pop(), pile.pop()
match token:
case '+': pile.append(a + b)
case '-': pile.append(a - b)
case '*': pile.append(a * b)
case '/':
if b == 0:
print("Erreur : Division par zéro.")
return None
pile.append(a / b)
elif token.replace('.', '', 1).isdigit(): # isdigit verifie si 'token' est un nombre ou un chiffre
pile.append(float(token))
else:
print(f"erreur : '{token}' n'est pas un opérande valide.")
return None
if len(pile) != 1:
print("erreur : Expression mal formée.")
return None
return pile[0] # On aurait pu mettre pile[-1]
if __name__ == "__main__":
# Test
exp = "3 4 + 5 * 2 /" # correspond a (3+4)(5/2) soit 7 * 2.5 = 17.5
print(npi(exp))