begin process at 2012 02 09 10:53:07
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > EVALUER UNE EXPRESSION À PARTIR D'UNE CHAINE DE CARACTÈRE

EVALUER UNE EXPRESSION À PARTIR D'UNE CHAINE DE CARACTÈRE


 Information sur la source

Note :
5 / 10 - par 1 personne
5,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :Eval, Expression, mathematique, logique, Evaluer Niveau :Initié Date de création :09/06/2009 Date de mise à jour :28/06/2009 20:16:41 Vu / téléchargé :3 398 / 111

Auteur : TheWeasel47

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


 Description

Cette Source est surtout un exercice de style. Elle permet d'évaluer une expression  par exemple :
2 + 4 ou encore 2*5 = 10. Elle supporte les opérateurs suivants :
+,-,*,/, %(->modulo),^(->Puissance), &(->Concaténation) AINSI QUE LES OPERATEURS DE COMPARAISON SUIVANTS
=, <>,<,>, ||, &&. Elle gère l'ordre des parenthèses({,(,),}) ainsi que l'ordre d'exécution des expressions.

J'ai mis deux versions de la classe. Une qui utilise la fonction EVAL, et l'autre uniquement du PHP. Si vous trouvez une moyen d'optimiser ces class. Merci de me le faire savoir, je les utilise pour un moteur de template dans un de mes projets personels.


Source

  • <?php
  • /*------------------------------------------------------------
  • EXERCICE DE STYLE
  • ------------------------------------------------------------*/
  • function calcul_execution() {
  • list($msec, $sec) = explode(' ', microtime());
  • return ((float) $sec + (float) $msec) * 1000000;
  • }
  • include("Class_Evaluer.php"); //N'utilise pas la méthode Eval
  • //include("Class_EvaluerB.php"); //Utilise la méthode Eval
  • function Evaluer_Chaine($Chaine){
  • $test=new Evaluation();
  • $tab=$test->Evaluer($Chaine);
  • echo "-->Evaluation de la Chaine : <b>".$Chaine."</b><br />\r\n";
  • if(is_bool($tab)){
  • if($tab){
  • echo "---->Résultat : <b>VRAI</b> <br />\r\n&nbsp;<br />\r\n";
  • }else{
  • echo "---->Résultat : <b>FAUX</b> <br />\r\n&nbsp;<br />\r\n";
  • }
  • }else{
  • echo "---->Résultat : <b>".$tab."</b> <br />\r\n&nbsp;<br />\r\n";
  • }
  • }
  • $debut_calcul = calcul_execution();
  • Evaluer_Chaine(" 4^2^3 ");
  • Evaluer_Chaine(" 4^2^3 -42 ");
  • Evaluer_Chaine(" 'Salut' & ' tout le monde c\\'est chouette hein ?'");
  • Evaluer_Chaine(" 1+(3+2)*5 = 26");
  • Evaluer_Chaine(" 6*6 > 35 && 2>3");
  • Evaluer_Chaine(" 6*6 > 35 || 2>3");
  • Evaluer_Chaine(" (9%2) = 1");
  • $fin_calcul = calcul_execution();
  • echo '<br />Temps execution: ',($fin_calcul-$debut_calcul)/1000000,' secondes.<br></span></center>';
  • ?>
<?php
	/*------------------------------------------------------------
						EXERCICE DE STYLE
	------------------------------------------------------------*/
	function calcul_execution() {
		list($msec, $sec) = explode(' ', microtime());
		return ((float) $sec + (float) $msec) * 1000000;
	}
	
	
	include("Class_Evaluer.php"); //N'utilise pas la méthode Eval
	//include("Class_EvaluerB.php"); //Utilise la méthode Eval
	
	
	function Evaluer_Chaine($Chaine){
		$test=new Evaluation();
		$tab=$test->Evaluer($Chaine);
		echo "-->Evaluation de la Chaine : <b>".$Chaine."</b><br />\r\n";
	
		if(is_bool($tab)){
			if($tab){
				echo "---->Résultat : <b>VRAI</b> <br />\r\n&nbsp;<br />\r\n";
			}else{
				echo "---->Résultat : <b>FAUX</b> <br />\r\n&nbsp;<br />\r\n";
			}
		}else{
			echo "---->Résultat : <b>".$tab."</b> <br />\r\n&nbsp;<br />\r\n";
		}
	}

	$debut_calcul = calcul_execution();
	
	 Evaluer_Chaine(" 4^2^3 ");
	 Evaluer_Chaine(" 4^2^3 -42 ");
	 Evaluer_Chaine(" 'Salut' & ' tout le monde c\\'est chouette hein ?'");
	 Evaluer_Chaine(" 1+(3+2)*5 = 26");
	 Evaluer_Chaine(" 6*6 > 35 && 2>3");
	 Evaluer_Chaine(" 6*6 > 35 || 2>3");
	 Evaluer_Chaine(" (9%2) = 1");
	
	$fin_calcul = calcul_execution();	
	echo '<br />Temps execution: ',($fin_calcul-$debut_calcul)/1000000,' secondes.<br></span></center>'; 
?>

 Conclusion

J'attends vos remarques d'amélioration ainsi que tout autre remarques constructive.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

28 juin 2009 20:11:47 :
----Correction de bug et amélioration de la programmation--- En suivant les commentaires données
28 juin 2009 20:16:41 :
--Correction d'un nouveau Bug et de diverses fautes d'orthographes--

 Sources du même auteur

COPIER UN REPERTOIRE OU DEPLACER UN REPERTOIRE
Source avec Zip [POO] - CLASSE D'ACCÈS BDD MULTI SGBD
Source avec Zip GEO-LOCALISATION (CONTINENT)
SECURITÉ PROTECTION AUTOMATIQUE CONTRE MAGICQUOTE ET REGISTE...
Source avec Zip DECOMPOSEUR DE PDF (EXTRACTION DES PAGES) -[PHP-5 ORIENTÉ OB...

 Sources de la même categorie

EXEMPLE D'APPLICATION DE L'ALGORITHME DE DIJKSTRA EN PHP par philtr8
CLEF POUR EAN 13 ET 14 par RaftY
FONCTION DE CALCUL DU NOMBRE DE DUEL UNIQUE POUR UN NOMBRE N... par mtrix000
Source avec Zip Source avec une capture TRIANGLE DE PASCAL ET SON ÉQUATION par vendeeHdLR89
Source avec Zip CONVERTISSEUR LAMBERT2 ÉTENDU EN COORDONNÉE GÉOGRAPHIQUE (LO... par varfendell

 Sources en rapport avec celle ci

FONCTION QUI VÉRIFIE SI L'ARGUMENT EST UN NOMBRE PREMIER par darkelda
FONCTION EQUATION LÉGÈRE par ff5
Source avec Zip CLASS DE VALIDATIONS DE DATE, ENTIER, STRING,... par whiskycoke
SUITE LOGIQUE par Palleas_44
Source avec Zip EVALUER LES EXPRESSIONS MATHÉMATIQUES COMPLEXES par amezghal

Commentaires et avis

Commentaire de GRenard le 12/06/2009 09:32:29

C'est vraiment interessant :) Je me souviens de ça dans mes cours d'université qu'on devait coder.
On devait par contre faire plus de classe qu'une seule. Personnellement, je ne crois pas que tu es la bonne technique pour effectuer ce genre d'opération. Je crois qu'il faut plutôt une grammaire, un parser et un compiler. Fait des recherches sur "math, parser, compiler, technique," etc.
Mais étant donné que tu dis que c'est un exercice de style... je ne sais pas trop quoi te dire. C'est quand même un bon début pour analyser les chaînes simples.

Un des problème est que c'est que je reçois une dizaine de "Notice: Undefined offset". Il serait bien de fixer cela :)

Il y a beaucoup de répétition dans ton code... La variable
$tabSignes semble vraiment être similaire à 2 places.
et Opération ne prend qu'un P :)

Il faudrait aussi supporter les chaînes suivantes:
+5
5*-5

Bonne chance.

Commentaire de TheWeasel47 le 12/06/2009 10:43:54

Excellente idée pour les +5 5*-5 je vais essayer de coder ça !
et de fixer le bug du undefined offset :D mais pour obtenir ce bug as tu une configuration d'affichage des erreurs particulière dans ton php.ini ou bien ce bug se produit sur certaines chaine ?

Quand au parser et au compiler.... je vais voir ce que je peux faire !
Merci de ta remarque en tout cas
Cordialement

Commentaire de GRenard le 12/06/2009 17:26:04 5/10

Oui pour mon PHP.ini...
il faut toujours déveloper ses applications de sorte que ça fonctionne sur tous les autres ordinateurs.

Donc pour ce faire, tu dois activer :
display_error = On
error_reporting = E_ALL
asp_short_tag something = off... par défaut dans les nouvelles versions de PHP, tous les settings sont corrects à l'exception des deux premiers que je viens de mentionner...

Tu verras pour le parser et compiler, il y a beaucoup de connaissance à apprendre, c'est pas en 1 journée que tu vas coder tout ça :)

Commentaire de zorteil07 le 20/06/2009 12:31:07

étant donné le code (dans index.php)
$Using_Eval=true;
if(!$Using_Eval){
  include("Class_Evaluer.php");
}else{
  include("Class_EvaluerB.php");
}

peut-on dire au développeur ignare que je suis, dans quelle circonstance le fichier Class_Evaluer.php sera-t-il inclus?

Il est vrai par ailleurs (commentaire de GRENARD) qu'il y a une façon moins fastidieuse de définir le contenu des variables de type array.

Pour le reste, ne comprenant pas déjà pourquoi on fait un test sur la valeur d'une variable qu'on vient juste d'instancier (comment pourrait-elle valoir autre chose que la valeur donnée?) et pourquoi on a joint au package un fichier qui de mon humble avis ne sera jamais exécuté, je n'ai de ce fait pas d'avis sur la pertinence des algoryhtmes.

Si, une petite suggestion cependant: ne serait-il pas indiqué avant toute évaluation de débarasser les chaînes évaluées des caractères espaces superflus?

L'idée me paraît très bonne, et bien sûr libre à chacun de compléter en créant un formulaire dans lequel on entrera la chaîne à évaluer. Mais je reste un peu perplexe sur le code des classes: mériterait une étude approfondie.... des petites choses comme ça qui me chagrinent. juste des impressions, sans fondement?

Dans les boucles if (condition) { ...}
la condition ($var == "une_certaine_valeur")
gagnerait à être remplacée par ($var === "une_certaine_valeur")
vu qu'on travaille sur des caractères alphanumériques qui seront interprétés par le navigateur, dans la suite logique de ce script qui est d'adjoindre un formulaire de saisie de la chaîne à évaluer. Bien entendu pour un formulaire en ligne sur un site public, va falloir sécuriser contre le XSS.

Commentaire de TheWeasel47 le 20/06/2009 12:37:14

Je vais répondre rapidement par faute de temps !

Alors pour la première condition! En fait il s'agit d'un exercice de style c'est donc au développeur de changer cette valeur !

Tu parles d'une manière moins fastidieuse de remplir un tableau ? je suis prenneur de toute nouvelle méthode !!!

Tu soulèves une intérrogation le === est plus rapide que le simple == ???

Merci de tes remarques.
Bien Cordialement

Commentaire de zorteil07 le 20/06/2009 17:16:50

à la place de
$tabSignes=array();
$tabSignes[0]="=";
$tabSignes[1]="<>";
$tabSignes[2]="&&";
$tabSignes[3]="||";
$tabSignes[4]="<";
$tabSignes[5]=">";
$tabSignes[6]="+";
$tabSignes[7]="-";
$tabSignes[8]="%";
$tabSignes[9]="/";
$tabSignes[10]="^";
$tabSignes[11]="&";
$tabSignes[12]="*";

perso, je mettrai:
$tabSignes=array("=","<>","&&","||","<",">","+","-","%","/","^","&","*");
on s'est évité n fois de rentrer au clavier
$tabSignes[n]="une valeur";

pour un tableau multi dimensionné:
$Montab = array(
"Champ0"=>"valeur0",
"Champ1"=>"valeur1",
"ChampN=>"valeurN"
);

je ne sais pas s'il y a une différence de rapidité d'exécution entre
if($var=="quelque chose")
ou
if($var==="quelque chose")
par contre l'instruction de comparaison == vérifie l'égalité mais ne vérifie pas le type des variables
alors que === vérifie que les deux termes de la condition sont strictement identiques et de même type.
exemple:
$var = 0;
if($var == '0') renvoie true // c'est nul, c'est tout.
if($var==='0') renvoie false // le nombre zéro n'est pas identique au caractère zéro

Dans l'évaluation de chaînes, ça peut avoir son importance.

autre exemple de l'intérêt des comparateurs stricts

$myvar = '0'; // variable avec une valeur non nulle affectée
if(!empty($myvar)) {
// faire ceci
}
else {
// faire cela
}
c'est "faire cela" qui va s'exécuter alors que je considère pour ma part que c'est "faire ceci" qui devrait s'exécuter;

avec les comparateurs stricts il n'y a pas de confusion possible:
if($myvar !==NULL) // si une valeur quelconque affectée
echo" faire ceci";
}
else {
echo "faire cela";
}

Commentaire de zorteil07 le 20/06/2009 18:44:25

correction pour le tableau $tabSignes, j'avais oublié une valeur (ce que c'est de ne pas tester!)
le bon code:
$tabSignes=array("=","<>","&&","||","<",">","+","-","%","/","^","&","*","|");

Commentaire de amezghal le 23/06/2009 13:26:15

L'arbre binaire c'est la méthode la plus viable.
Il y a déjà une source ici qui exploite cette méthode,  

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

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 Delimiteur expression réguliere [ par stanilou ] Salut, mon code: &lt;?php $aaa = "salut ca va ? t cool la?"; if (preg_match("va|kf|allo"',$aaa)) { echo 'ok'; } else { echo 'non'; } ?&gt; Et le test expression reguliere pour balise HTML [ par nezdeboeuf62 ] Bonjour tout le monde,Voila j'aurais voulu savoir si quelqu'un connaissait une regexp pour decrire une balise HTML. En fait plus pr&#233;cis&#233;ment expression régulière : doublement [ par cbyvd ] Bonjour &#224; tous, J'essaie de cr&#233;er une expression r&#233;guli&#232;re qui fasse : - le doublement des @ sauf si cela commence par t et suivi Besoin d''aide sur petite expression réguliére toute simple [ par sky_striker ] Bonjour,J'ai une question extr&#233;mement simple pour les gens qui connaissent les regex voila j'ai une chaine de caract&#233;res jusque l&#224; pas Recherche expression reguliere [ par pioug43 ] Bonjour, Je recherche une expression reguliere qui pourrait me supprimer { /*des espaces ou pas*/ php /*des espaces ou pas*/}&nbsp; &amp;&amp; {/*des probleme avec eval() [ par keaton2000 ] Bonjour,je bidouille mon forum phpbb pour pouvoir ins&#233;rer des scripts php dans le template ce qui s'av&#232;re&nbsp; moins facile que ce que je n Expression reguliere [ par pioug70 ] Bonjour, Je suis null en expression reguliere je cherche a faire simplement cela Dans une variable contenant un fichier html je veux resortir un table problème expression régulière [ par tony4758 ] Bonjour, j'ai un gros probl&#232;me avec mon expression r&#233;guli&#232;re permettant d'extraire les liens d'une page. En fait, d&#232;s qu'il y a qu


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,368 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales