Entrer un calcul dans input
Fermé
redetob
-
Modifié le 22 juil. 2021 à 12:05
mamiemando Messages postés 33387 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 - 22 juil. 2021 à 12:29
mamiemando Messages postés 33387 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 - 22 juil. 2021 à 12:29
A voir également:
- Comment entrer des formules dans la calculatrice numworks
- Rechercher ou entrer l'adresse - Guide
- Entrer les informations d'identification reseau - Guide
- Comment calculer la moyenne sur excel - Guide
- Adresse IP locale : comment la trouver facilement - Guide
- Comment entrer des coordonnées gps dans maps - Guide
3 réponses
yg_be
Messages postés
23352
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 novembre 2024
Ambassadeur
1 554
20 juil. 2021 à 15:29
20 juil. 2021 à 15:29
bonjour,
moi j'essaierais avec eval().
moi j'essaierais avec eval().
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
20 juil. 2021 à 17:23
20 juil. 2021 à 17:23
Bonjour,
Et même, eval étant considéré comme dangereux pour des raisons de sécurité (l'utilisateur pourrait entrer un bout de code malveillant), on peut s'amuser à tester l'entrée avec les expressions régulières pour s'assurer que l'on entre bien une formule correcte
Ca n'est pas forcément obligé dans ton cas, mais ça peut faire un bon exercice ...
Par contre, pour entrer une formule de calcul, il faut supprimer le int() :
Et même, eval étant considéré comme dangereux pour des raisons de sécurité (l'utilisateur pourrait entrer un bout de code malveillant), on peut s'amuser à tester l'entrée avec les expressions régulières pour s'assurer que l'on entre bien une formule correcte
Ca n'est pas forcément obligé dans ton cas, mais ça peut faire un bon exercice ...
Par contre, pour entrer une formule de calcul, il faut supprimer le int() :
a = input("Enter a value for a: ")
mamiemando
Messages postés
33387
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
27 novembre 2024
7 803
22 juil. 2021 à 12:29
22 juil. 2021 à 12:29
Bonjour,
Phil a raison, qui dit
Point culture
Cependant, attention. Une expression rationnelle ne permet pas de vérifier si une expression mathématique est bien parenthésée. Si l'on se réfère à la hiérarchie de Chomsky, le langage des expressions mathématiques est un langage algébrique (qui requiert à un automate à pile) et non d'un logiciel régulier (ce que gère les expressions régulières, qui reposent sur des automates déterministes).
Si on voulait vraiment faire les choses de manières très rigoureuses, la validation de l'expression devrait plutôt être réalisée avec l'algorithme de Shunting Yard, qui peut-être notamment utilisé pour analyser une expression algébrique, en particulière impliquant des parenthèse. Ceci dit, cet algorithme requiert quelques adaptations pour faire une bonne "tokenization", notamment gérer des nombres (composés de plusieurs chiffres) ou pour gérer les caractères "-" qui sont ambigus (soit l'opérateur unaire, soit l'opérateur binaire). Bref, c'est assez laborieux, mais la fonction
Retour à ton problème
Donc, personnellement, je propose une approche beaucoup plus simple et plus lisible :
1) On contrôle que la chaîne saisie ne contient que des caractères pouvant être impliqué dans une expression algébrique : des espaces ou des opérations arithmétiques, des points.
2) comme l'expression n'est pas forcément bien . Ensuite un
Phil a raison, qui dit
evaldit prendre un minimum de précaution. Le point qu'il souligne est une faille classique dans les langages qui proposent ce genre de possibilité (python, php, shell).
Point culture
Cependant, attention. Une expression rationnelle ne permet pas de vérifier si une expression mathématique est bien parenthésée. Si l'on se réfère à la hiérarchie de Chomsky, le langage des expressions mathématiques est un langage algébrique (qui requiert à un automate à pile) et non d'un logiciel régulier (ce que gère les expressions régulières, qui reposent sur des automates déterministes).
Si on voulait vraiment faire les choses de manières très rigoureuses, la validation de l'expression devrait plutôt être réalisée avec l'algorithme de Shunting Yard, qui peut-être notamment utilisé pour analyser une expression algébrique, en particulière impliquant des parenthèse. Ceci dit, cet algorithme requiert quelques adaptations pour faire une bonne "tokenization", notamment gérer des nombres (composés de plusieurs chiffres) ou pour gérer les caractères "-" qui sont ambigus (soit l'opérateur unaire, soit l'opérateur binaire). Bref, c'est assez laborieux, mais la fonction
shunting_yard_computeimplémentée dans ce projet gère tout ceci.
Retour à ton problème
Donc, personnellement, je propose une approche beaucoup plus simple et plus lisible :
1) On contrôle que la chaîne saisie ne contient que des caractères pouvant être impliqué dans une expression algébrique : des espaces ou des opérations arithmétiques, des points.
2) comme l'expression n'est pas forcément bien . Ensuite un
try ... catchpermettra de rattraper les erreurs restantes.
#!/usr/bin/env python3 s = input("Entrer un calcul: ") x = None if set(s) <= set(" .+*/1234567890"): try: x = eval(s) except: pass print(f"Résultat: {x}")