Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

EVALUER UNE EXPRESSION MATHEMATIQUE, UTILISATION D'UN ARBRE BINAIRE


Information sur la source

Catégorie :Chaîne de caratère Classé sous : parsing, arbre, binaire, expressions, eval Niveau : Expert Date de création : 18/05/2007 Date de mise à jour : 28/05/2007 18:57:22 Vu / téléchargé: 5 839 / 173

Note :
Aucune note

Commentaire sur cette source (19)
Ajouter un commentaire et/ou une note


Description

Suite a de nombreuses sources sur ce sujet, j'ai ete attriste de voir sur sur phpcs, on ne trouvait pas de source qui presente un arbre binaire, methode disons conseillee...

J'ai fait comme je l'aurais fait dans un autre langage : une classe... ca utilise un arbre binaire, une valeur etant un operateur, et les deux autres valeurs etant les deux membres...

Les expressions qui manquent de parentheses avec des signes moins ou des exposans peuvent porter des erreurs

Pour ne pas bloquer un script, et ne pas renvoyer NaN, (Not a Number), j'ai decide d'utiliser des exceptions, pardonnez moi si je n'ai pas fait une classe qui herite d'Exception, mais je ne fais pas un framework, juste une classe pour montrer la methode...
 

Source

  • try{
  • $parseur=new Parseur('sin((-x)^(1/3)*100)', array('x'=>2));
  • echo $parseur->ToRpn();
  • }catch (Exception $e){
  • echo $e;
  • }
try{
	$parseur=new Parseur('sin((-x)^(1/3)*100)', array('x'=>2));
	echo $parseur->ToRpn();
}catch (Exception $e){
	echo $e;
}

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

18 mai 2007 18:05:59 :
corrections diverses, sur les priorites d'operateurs, les racines n emes de nombres negatifs, pour un n impair, ajout de variables...
28 mai 2007 18:57:22 :
gestion des fonctions methode pour transformer en ecriture RPN

Commentaires et avis

signaler à un administrateur
Commentaire de coockiesch le 18/05/2007 08:48:17

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

signaler à un administrateur
Commentaire de coucou747 le 18/05/2007 12:25:11

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...

signaler à un administrateur
Commentaire de juki_webmaster le 18/05/2007 12:31:46

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  

signaler à un administrateur
Commentaire de coucou747 le 18/05/2007 12:41:10

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...

signaler à un administrateur
Commentaire de kankrelune le 18/05/2007 15:51:06

"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°

signaler à un administrateur
Commentaire de coucou747 le 18/05/2007 18:10:39

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

signaler à un administrateur
Commentaire de FhX le 19/05/2007 19:19:13

#  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...... ^^

signaler à un administrateur
Commentaire de coucou747 le 19/05/2007 19:49:03

c'est du parsing pas des maths...

signaler à un administrateur
Commentaire de coockiesch le 20/05/2007 20:49:10

Petite question: un "singletons", késsako?

Merci!

@++

R@f

signaler à un administrateur
Commentaire de coucou747 le 20/05/2007 20:57:54

une classe qui n'a qu'une seule instance...

signaler à un administrateur
Commentaire de coockiesch le 21/05/2007 10:19:08

Et ca sert à quoi? :)

@++

R@f

signaler à un administrateur
Commentaire de kankrelune le 21/05/2007 10:50:08

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°

signaler à un administrateur
Commentaire de coucou747 le 21/05/2007 11:31:17

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...

signaler à un administrateur
Commentaire de coockiesch le 22/05/2007 18:51:51

Okay, merci!
Z'avez un lien sympa? :)

@++

R@f

signaler à un administrateur
Commentaire de kankrelune le 23/05/2007 15:43:51

http://qwix.media-box.net/index.php/2004/09/29/24-LeSingletonEnPhp5

@ tchaOo°

signaler à un administrateur
Commentaire de coucou747 le 23/05/2007 16:17:52

pas de commentaires sur la nouvelle mise a jour ?

signaler à un administrateur
Commentaire de kankrelune le 23/05/2007 16:25:00

non rien à redire... .. . ;o)

@ tchaOo°

signaler à un administrateur
Commentaire de amezghal le 24/05/2007 22:46:54

salut
bravo !!
mais faudrai quand meme les: sin,cos,tan

signaler à un administrateur
Commentaire de coucou747 le 28/05/2007 18:59:23

mis a jours, ca gere les fonctions, et la conversion vers rpn

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Expressions Rationnelles et Parsing [ par Erkethan ] Salut à tous. :)J'ai un petit problème que je n'arrive pas à résoudre seul, j'en appelle donc à cette charmante communauté. ^^La ligne qui ne marche p un probléme de parsing [ par reflexinfo ] bonjour ,je suis débutant en phpje suis actuellement sur un développement dun peit moteur de recherche (tout est ok)mais je chercher à faire du parsin Evaluer le contenu d'une variable [ par joye ] Bonjour,Je suis d&#233;butant en PHP et je suis &#224; la recherche d'une fonction qui me permettrait d'&#233;valuer une variable :exemple : (la fonct eval me prend la tete [ par neo090 ] bonjour Je d&#233;sir remplacer le code : $login =$_POST["login"];$_SESSION["login"]="$login"; par une fonction : function addvar ($variable) { $t encodage mime64 binaire [ par mageonyme ] salut,j'aimerai savoir s'il existe une fonction qui encode une chaine en binaire type mime64 (javascript oblige)genre une fonction comme la fonction p Expressions régulières.. [ par syndrael ] Bonjour, J'ai un texte dans lequel je retrouve des balises &lt; et &gt;. Je tourne en rond pour &#233;crire un reg_replace qui me les supprime toutes. Possible de faire un comparateur d image ?? [ par morpheus262 ] Salut,C'est encore moi et mon explorateur "surpuissant" lol.Alors je me demander suite a mon post sur les fichier video (au faite ca marche pas trop b Fichier et binaire [ par kangoo75 ] Bonjour , J'ai cr&#233;&#233; cette fonction&nbsp; : function VisuBin($chemin_fichier){ &nbsp; $id_fichier = fopen($chemin_fichier, "rb"); &nbsp; [BLOB->GD] Redimensionner un "flux image binaire"... [ par arnal69130 ] Bonjour &#224; tous,Je cherche &#224; faire une page pour afficher la carte d'identit&#233; d'un "agent", pour simplifier disons juste son nom et sa p Expressions regulières [ par greyswandir ] Bonjour J'ai un soucis lors de la lecture d'un fichier csv separateur ",": voici une ligne type : xxx,yyy,zzz,"plop,plop,plop","toto vnspotnpoirt,pl


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,484 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.