2016-12-14 1 views
0

Je souhaite que l'utilisateur saisisse une équation avec laquelle je peux travailler en Python. Comment puis-je modifier la formule raw_input qui me permet de faire cela?Comment puis-je obtenir une équation que je peux utiliser en python?

Actuellement, j'ai dans mon code:

consts = list() 
nconst = int(input("How many constraints would you like to add? ")) 
for i in range(nconst): 
    const = input("Constraint " + str(i+1) + ": ") 
    consts.append(const) 

Mes contraintes sont les équations que je veux l'utilisateur d'entrer. Je veux que les équations soient au format < =.

J'ai essayé d'utiliser des analyseurs, alors j'ai essayé un cas de test d'utilisation d'un analyseur et j'ai fini avec ce code.

import parser 
formula = "x^2" 
code = parser.expr(formula).compile() 

from math import sin 
x = 10 
print(eval(code)) 

Cependant, quand je courais le code, Python m'a donné une réponse de 8 quand la réponse est censée être 100. Y at-il un problème aussi avec l'analyseur de code que j'ai utilisé?

Toute aide sera appréciée!

+1

Votre équation a abouti à 8 car en python '^' signifie 'bitwise xor'. Vous devriez utiliser '**' – Lafexlos

+0

'parser' est l'analyseur interne de Python. Vous devez écrire * votre propre * analyseur pour analyser les équations, ou en utiliser une que quelqu'un a déjà écrit. –

+0

checkout cette question qui vous aidera à créer votre propre analyseur http://stackoverflow.com/questions/2371436/evaluating-a-mathematical-expression-in-a-string –

Répondre

0

Vous devez analyser la chaîne d'entrée et créer votre formule. Par exemple, disons que nous voulons augmenter 2 à la puissance 4, alors vous pouvez prendre des entrées comme 2 ** 4 ou 2^4. Dans les deux cas, selon vos symboles pour les équations, vous devez analyser la chaîne d'entrée et évaluer l'équation.

Si vous pouvez fournir des cas de test, alors je peux probablement vous aider avec l'analyse de chaîne.

Edit: Python utilise ** pour exponentiation mais si vous voulez utiliser l'utilisateur^comme entrée, vous pouvez essayer ce qui suit:

# say s is input 
[base, exponent] = s.split('^') 
print (float(base)**float(exponent)) 

Cela devrait fonctionner. De cette façon, vous devez construire toutes les formules que vous voulez entrer. Les formules complexes nécessiteront un analyseur plus performant. C'est juste quelque chose pour commencer

+0

Hi Shiv! Je viens d'ajouter le code de l'analyseur que j'ai essayé de tester! –