EVALUATION D'UNE FORMULE DANS UNE CHAINE EX:"2+9*51-25/5"
Saros
Messages postés921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 septembre 2010
-
26 juin 2003 à 14:23
k_wa
Messages postés32Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention20 septembre 2006
-
5 avril 2005 à 13:02
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
k_wa
Messages postés32Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention20 septembre 2006 5 avril 2005 à 13:02
tu inséère le composant control script
et tu tape result=controlscript1.eval("5+3*2/9-2")
ce contrôle fonctionne très bien et n'a pas besoin d'être réinventé...
Saros
Messages postés921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 septembre 2010 1 juil. 2003 à 13:52
>Tu peux me dire la différence que tu trouves entre les 2?
Non justement il n'y en a pas (x / y = x * (y ^ -1)) mais tu dis qu'il faut une boucle pour les quotients et une autre pour les multiplications...
squalyl
Messages postés26Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention30 décembre 2003 1 juil. 2003 à 00:49
>À propos, les quotients etles divisions ont la même priorité, non ?
Tu peux me dire la différence que tu trouves entre les 2?
Allez,un indice: au lieu d'un automate, tu mets une fonction récursive qui s'apelle quand elle trouve des parenthèses à traiter...
cs_revivall
Messages postés24Date d'inscriptionmercredi 5 septembre 2001StatutMembreDernière intervention 7 août 2003 30 juin 2003 à 22:17
la méthode optimale est je pense de faire une analyse lexicale avec génération d'automate à état fini déterministe puis le transformer en algo
c ce que fait vb ou tt autre langage de programmation pour lire le code source
mais j'ai pas dit que c simple, loin de là ... ;)
Saros
Messages postés921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 septembre 2010 30 juin 2003 à 21:25
Le mieux est de convertir la chaîne en RPN (ce que tu disais avec les TI 89/92(II)(+))... Et là c'est encore autrement plus dur.
À propos, les quotients etles divisions ont la même priorité, non ? Alors pourquoi faire quotient PUIS multiplication PUIS addtion (soustraction) ?
squalyl
Messages postés26Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention30 décembre 2003 30 juin 2003 à 18:44
Il faut gérer la priorité des opérations dans 3 boucles séparées: une pour les quotients, une pour les produits et une pour les sommes/différences. J'ai fait ca en info cet année, à part que c'était en C, mais l'algo est le même.
En plus cet algo n'a d'intérêt que s'il gère les parenthèses et les sin/cos/tan/exp/log/sqrt/etc..., ce qui est autrement plus difficile. Bon quand l'un est fait, ils sont tous faits.
Et t'as oublié de sortir une erreur dans les cas où:
- tu divises par zéro;
- t'as deux opérateurs qui se suivent.
Finalement si on met un espace dans ta chaine, c'est mort.
Note: la TI89/92+ ne gère pas ca direct.
2+9*51-25/5
devient:
"5 25 / 51 9 * - 2 +"
soit:
[ [ [5 25]/ [51 9]* ]- 2]+
ou []x représente l'opération x appliquée aux deux args précédents.
Les priorités ne posent plus de pb.
Il suffit alors de parser ta formule (parenthèses comprises) pour aboutir à cette forme[chiant] puis de calculer le résultat numérique [facile].
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 26 juin 2003 à 16:54
cs_orisa
Messages postés38Date d'inscriptionlundi 18 mars 2002StatutMembreDernière intervention29 octobre 2003 26 juin 2003 à 15:37
Oui pour moi non plus ça ne marche pas. en plus dès qu'il y a des virgules le résultat passe du marant au navrant, mais c'est pas grave, persévère !
Saros
Messages postés921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 septembre 2010 26 juin 2003 à 14:23
Pourquoi ne pas mettre puissance ? C'est aussi un opérateur binairee de base...
De plus il traite mal la chaine : 25*2/4 = 0.5 ???
Il y a pas mal de choses à corriger.
5 avril 2005 à 13:02
et tu tape result=controlscript1.eval("5+3*2/9-2")
ce contrôle fonctionne très bien et n'a pas besoin d'être réinventé...
1 juil. 2003 à 13:52
Non justement il n'y en a pas (x / y = x * (y ^ -1)) mais tu dis qu'il faut une boucle pour les quotients et une autre pour les multiplications...
1 juil. 2003 à 00:49
Tu peux me dire la différence que tu trouves entre les 2?
Allez,un indice: au lieu d'un automate, tu mets une fonction récursive qui s'apelle quand elle trouve des parenthèses à traiter...
30 juin 2003 à 22:17
c ce que fait vb ou tt autre langage de programmation pour lire le code source
mais j'ai pas dit que c simple, loin de là ... ;)
30 juin 2003 à 21:25
À propos, les quotients etles divisions ont la même priorité, non ? Alors pourquoi faire quotient PUIS multiplication PUIS addtion (soustraction) ?
30 juin 2003 à 18:44
En plus cet algo n'a d'intérêt que s'il gère les parenthèses et les sin/cos/tan/exp/log/sqrt/etc..., ce qui est autrement plus difficile. Bon quand l'un est fait, ils sont tous faits.
Et t'as oublié de sortir une erreur dans les cas où:
- tu divises par zéro;
- t'as deux opérateurs qui se suivent.
Finalement si on met un espace dans ta chaine, c'est mort.
Note: la TI89/92+ ne gère pas ca direct.
2+9*51-25/5
devient:
"5 25 / 51 9 * - 2 +"
soit:
[ [ [5 25]/ [51 9]* ]- 2]+
ou []x représente l'opération x appliquée aux deux args précédents.
Les priorités ne posent plus de pb.
Il suffit alors de parser ta formule (parenthèses comprises) pour aboutir à cette forme[chiant] puis de calculer le résultat numérique [facile].
26 juin 2003 à 16:54
http://www.vbfrance.com/article.aspx?Val=3728
http://www.vbfrance.com/article.aspx?Val=7310
by@
26 juin 2003 à 15:37
26 juin 2003 à 14:23
De plus il traite mal la chaine : 25*2/4 = 0.5 ???
Il y a pas mal de choses à corriger.