EVALUER UNE EXPRESSION MATHEMATIQUE, UTILISATION D'UN ARBRE BINAIRE

coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 - 18 mai 2007 à 08:48
JaguarK Messages postés 2 Date d'inscription lundi 15 mars 2010 Statut Membre Dernière intervention 6 février 2013 - 6 févr. 2013 à 15:52
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/42732-evaluer-une-expression-mathematique-utilisation-d-un-arbre-binaire

JaguarK Messages postés 2 Date d'inscription lundi 15 mars 2010 Statut Membre Dernière intervention 6 février 2013
6 févr. 2013 à 15:52
Autre résultat étrange : '36^(24/2)' donne le bon résultat : 4,738.10^18.
Mais '36^(24/20)' trouve 36 (à la place de 73,72) !
JaguarK Messages postés 2 Date d'inscription lundi 15 mars 2010 Statut Membre Dernière intervention 6 février 2013
6 févr. 2013 à 15:40
Bonjour,
A priori, cette classe n'arrive pas à évaluer "36^0.5" par exemple (qui devrait donner 6).
$parseur=new Parseur('36^1', array()); fonctionne, comme $parseur=new Parseur('36^2', array()); mais $parseur=new Parseur('36^0.5', array()); ou même $parseur=new Parseur('36^(0.5)', array()); plante la session php.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 mai 2007 à 18:59
mis a jours, ca gere les fonctions, et la conversion vers rpn
amezghal Messages postés 385 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 21 août 2015 5
24 mai 2007 à 22:46
salut
bravo !!
mais faudrai quand meme les: sin,cos,tan
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
23 mai 2007 à 16:25
non rien à redire... .. . ;o)

@ tchaOo°
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
23 mai 2007 à 16:17
pas de commentaires sur la nouvelle mise a jour ?
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
23 mai 2007 à 15:43
coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 4
22 mai 2007 à 18:51
Okay, merci!
Z'avez un lien sympa? :)

@++

R@f
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
21 mai 2007 à 11:31
a premiere vue, on peut penser que faire des fonctions ou une classe disons avec que des methodes static (un namespace...) peut faire l'affaire, mais pour l'heritage ca peut etre preferable de faire un singleton...
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
21 mai 2007 à 10:50
A moins charger la mémoire... à utiliser la même instance d'une classe tout au long de ton script... par ex...

une class sql => une seule instance => une seule connection au serveur => plusieurs objets

@ tchaOo°
coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 4
21 mai 2007 à 10:19
Et ca sert à quoi? :)

@++

R@f
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
20 mai 2007 à 20:57
une classe qui n'a qu'une seule instance...
coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 4
20 mai 2007 à 20:49
Petite question: un "singletons", késsako?

Merci!

@++

R@f
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
19 mai 2007 à 19:49
c'est du parsing pas des maths...
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
19 mai 2007 à 19:19
# public function setval($var, $val){
# $this->vars[$var]=$val;
# if ($this->expra!==null) $this->expra->setval($var, $val);
# if ($this->exprb!==null) $this->exprb->setval($var, $val);
# }

>
public function __set($var, $val) {
$this->$vars[$var] = $val;
if ($this->expra!==null) $this->expra->setval($var, $val);
if ($this->exprb!==null) $this->exprb->setval($var, $val);
}

// Ce qui te permet par la suite de faire :
$parseur->x = 27;


Cela étant, belle classe.
Bien que moi et les maths avancées...... ^^
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
18 mai 2007 à 18:10
voila, c'est corrige normalement, je gere maintenant, les racines n eme pour n impair, les choses sympas de ce genre...
corrige une erreur sur les priorites d'operateurs... hier a 4h, ce m'avait echape...
ajoute aussi la possibilite de mettre une variable, de changer sa valeur et de reevaluer sans se faire tout le parsing
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
18 mai 2007 à 15:51
"et encore à d'autres endroits, pourais se reduire à un switch qui serais bien plus lisible."

Plus lisible... mais moins performant... .. .

Sinon...

for ($i=0; $i<($l=strlen($in));$i++){

je ne vois pas l'interet de recalculer la longueur de $in à chaque itération cette dernière ne changeant pas en cours de boucle (ou alors j'ai pas vu)...

for ( $i=0, $l=strlen($in); $i<$l; ++$i){

sinon c'est du détail mais...

else if ($p==0...

ligne 19 et

if ($p!=0)

ligne 33 ==>

elseif ($p === 0

ou

elseif(empty($p)

et

if($p !== 0)

ou

if(!empty($p))

A part ça rien à redire... hormis que tu pourrais peut être garder dans un attribut l'expression originale dans l'optique d'un affichage... genre...

public function getResult()
{
return $this->exp.' = '.$this->getVal();
}

enfin... c'est pas pour ce que ça change... .. . ;o)

@ tchaOo°
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
18 mai 2007 à 12:41
t'as pas besoin de singletons ici... ce qui peut etre utilise pour les perfs, c'est ecouper l'arbre avec des variables et les evaluer ensuite plus rapidement, je veux dire pouvoir utiliser des variables a la place des nombres...
juki_webmaster Messages postés 947 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 5 avril 2008 3
18 mai 2007 à 12:31
Pas mal :)


}else if ($this->operateur==='+'){
}else if ($this->operateur==='-'){

et encore à d'autres endroits, pourais se reduire à un switch qui serais bien plus lisible.

for ($i=0; $i<($l=strlen($in));$i++){

il ne serais pas possible de traduire en : for ($i 0, $l strlen($in); $i < $l; $i++) ?

function __construct($in){

il est passer où sa visibilité ?
En utilisant les singletons ont doit pouvoir ameliorer les performances du code.


9/10
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
18 mai 2007 à 12:25
a^b peut avoir plusieurs sens ca peut etre
pour b entier
b>0 le produit de a quand i varie i de 0 a b
b<0 1/le produit de a quand i varie i de 0 a -b
1 si b=0
pout b non entier
e^(b*ln(a))
la, a doit etre positif
la condition est :
if ($b!=intval($b) && $a<0)

le message est mal formule, desole, d'ailleur c'est <=0...
coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 4
18 mai 2007 à 08:48
Salut!
Sympa! :)

Juste une petite remarque: "On ne peut pas prendre un exposant non entier sur un nombre negatif"
Que dire de (-8) ^(-1/3) ?

@++

R@f
Rejoignez-nous