Algo. et prog. 2 en
Logo de Python
Arnaud COUTURIER - Python 3.10

✏️ TP 3 - Calculatrice niv.4 ✔️

Question 1

Permettre de calculer des expressions qui comportent plusieurs opérateurs + - * et /. Respecter l'ordre des priorités des opérations. Un espace au minimum doit être présent entre les opérateurs et les opérandes. Demander à l'utilisateur s'il veut continuer ou pas de faire des calculs à chaque résultat affiché. Afficher un message d'erreur approprié quand une expression est mal formée.

Exemples d'expressions reconnues par cette version de la calculatrice:

  • 5 (résultat 5)

  • 5 + 5 (résultat 10)

  • 5 +     5 (résultat 10)

  • 5 + 5 * 2 (résultat 15)

  • 5 + 5 * 2 - 1 (résultat 14)

Exemples d'expressions NON reconnues:

  • +

  • + 5

  • 5 5

  • 5+5

  • 5 +5

  • 5 + + 5


					def calculer_expression(expr):
						termes = expr.split()
						for i, terme in enumerate(termes):
							try:
								termes[i] = float(terme)
							except ValueError:
								if terme not in "+-*/":
									print("Mauvaise expression:", terme, "n'est pas reconnu comme une opération ou valeur valide.")
									return
						# Première passe avec * et /
						i = 0
						while i < len(termes):
							terme = termes[i]
							if type(terme) is str and terme in "*/":
								try:
									if terme == "*":
										termes[i] = termes[i - 1] * termes[i + 1]
									else:
										termes[i] = termes[i - 1] / termes[i + 1]
									del termes[i + 1]
									del termes[i - 1]
								except:
									print("Mauvaise expression: impossible de calculer", terme)
									return
								i = i - 2
							i += 1
						# Seconde passe avec + et -
						i = 0
						while i < len(termes):
							terme = termes[i]
							if type(terme) is str and terme in "-+":
								try:
									if terme == "+":
										termes[i] = termes[i - 1] + termes[i + 1]
									else:
										termes[i] = termes[i - 1] - termes[i + 1]
									del termes[i + 1]
									del termes[i - 1]
								except:
									print("Mauvaise expression: impossible de calculer", terme)
									return
								i = i - 2
							i += 1
						if len(termes) > 1:
							print("Mauvaise expressions: trop d'opérandes")
							return
						return termes[0]

					doit_continuer_calculs = True
					while doit_continuer_calculs:
						print(calculer_expression(input("Expression: ")))
						doit_continuer_calculs = input("Continuer? (n pour non): ") != "n"
				

Question 2

L'utilisateur doit pouvoir en plus utiliser les fonctions cos, sin et tan du module math, dans ses expressions. Les paramètres des fonctions cos sin et tan doivent être des valeurs simples, pas des sous-expressions.

Exemples d'expressions reconnues par cette version de la calculatrice:

  • cos(1) (résultat 0.5403023058681398)

  • cos(3.1416) + 2 * 3 (résultat 5.000000000026985)

Exemples d'expressions NON reconnues:

  • cos(2 + 3)


					import math

					def calculer_expression(expr):
						termes = expr.split()
						for i, terme in enumerate(termes):
							try:
								termes[i] = float(terme)
							except ValueError:
								if terme not in "+-*/":
									if not terme.startswith("sin(") and not terme.startswith("cos(") and not terme.startswith("tan("):
										print("Mauvaise expression:", terme, "n'est pas reconnu comme une opération ou valeur valide.")
										return
						# passe sin cos tan
						i = 0
						while i < len(termes):
							terme = termes[i]
							if type(terme) is str and (terme.startswith("sin(") or terme.startswith("cos(") or terme.startswith("tan(")):
								try:
									if terme.startswith("sin("):
										termes[i] = math.sin(float(terme[4:-1]))
									elif terme.startswith("cos("):
										termes[i] = math.cos(float(terme[4:-1]))
									else:
										termes[i] = math.tan(float(terme[4:-1]))
								except ValueError:
									print("Mauvaise expression:", terme, "n'est pas reconnu comme une opération ou valeur valide.")
							i += 1
						# passe * et /
						i = 0
						while i < len(termes):
							terme = termes[i]
							if type(terme) is str and terme in "*/":
								try:
									if terme == "*":
										termes[i] = termes[i - 1] * termes[i + 1]
									else:
										termes[i] = termes[i - 1] / termes[i + 1]
									del termes[i + 1]
									del termes[i - 1]
								except:
									print("Mauvaise expression: impossible de calculer", terme)
									return
								i = i - 2
							i += 1
						# passe + et -
						i = 0
						while i < len(termes):
							terme = termes[i]
							if type(terme) is str and terme in "-+":
								try:
									if terme == "+":
										termes[i] = termes[i - 1] + termes[i + 1]
									else:
										termes[i] = termes[i - 1] - termes[i + 1]
									del termes[i + 1]
									del termes[i - 1]
								except:
									print("Mauvaise expression: impossible de calculer", terme)
									return
								i = i - 2
							i += 1
						if len(termes) > 1:
							print("Mauvaise expressions: trop d'opérandes")
							return
						return termes[0]

					doit_continuer_calculs = True
					while doit_continuer_calculs:
						print(calculer_expression(input("Expression: ")))
						doit_continuer_calculs = input("Continuer? (n pour non): ") != "n"