Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
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 LES EXPRESSIONS MATHÉMATIQUES COMPLEXES
Information sur la source
Description
eh bon, voici la première version avec ce script vous pouvez calculer des expressions mathématiques complexes genre "cos15+20*sin(3+4)*tan54+(3+(21-4))" ... priorité entre les opérateurs.. mon but c'est d'arriver a faire un traceur des fonctions demo: http://abdilah.freehostia.com/math/ amez-abdel@msn.com
Source
- <?php
- function Calculer($str)
- {
- $tab=array();
- $operateurs=array("+","-","*","/","^","&","%");
- $fonc_math=array("c","s","t");
- $operateurs_prioritaires=array("*","/","&","%","^");
- $cur=0;
- $i=0;
- while($i<strlen($str))
- {
- $char=substr($str,$i,1);
- if(in_array($char,$operateurs) and !$i==0)
- {
- $tab[$cur+1]=$char;
- $cur +=2;
- $i++;
- }else if(in_array($char,$fonc_math))
- {
- switch($char)
- {
- case "c":
- $tab[$cur]=round(cos(deg2rad(doubleval(substr($str,$i+3)))),3);
- break;
- case "s":
- $tab[$cur]=round(sin(deg2rad(doubleval(substr($str,$i+3)))),3);
- break;
- case "t":
- $tab[$cur]=round(tan(deg2rad(doubleval(substr($str,$i+3)))),3);
- break;
- }
- $lng=doubleval(substr($str,$i+3));
- settype($lng,"string");
- $i +=strlen($lng)+3;
- }else{
- if(!array_key_exists($cur,$tab))
- {
- $tab[$cur]=$char;
- }
- else
- {
- $tab[$cur] .=$char;
- }
- $i++;
- }
- }
- unset($i);
- $somme=doubleval($tab[0]);
- $i=1;
- while($i<count($tab))
- {
- switch($tab[$i])
- {
- case "+":
- if((count($tab)-$i > 30) and (in_array($tab[$i+2],$operateurs_prioritaires)))
- {
- switch($tab[$i+2])
- {
- case "*":
- $somme += (doubleval($tab[$i+1])*doubleval($tab[$i+3]));
- break;
- case "/":
- if(doubleval($tab[$i+3]==0))
- {
- return "zero";
- exit;
- }
- $somme += (doubleval($tab[$i+1])/doubleval($tab[$i+3]));
- break;
- case "&":
- $somme -= (doubleval($tab[$i+1])*doubleval($tab[$i+3]));
- break;
- case "%":
- if(doubleval($tab[$i+3]==0))
- {
- return "zero";
- exit;
- }
- $somme -= (doubleval($tab[$i+1])/doubleval($tab[$i+3]));
- break;
- case "^":
- $somme += pow(doubleval($tab[$i+1]),doubleval($tab[$i+3]));
- break;
- }
- $i +=4;
- }
- else
- {
- $somme += doubleval($tab[$i+1]);
- $i +=2;
- }
- break;
- case "-":
- if((count($tab)- $i > 30) and (in_array($tab[$i+2],$operateurs_prioritaires)))
- {
- switch($tab[$i+2])
- {
- case "*":
- $somme -= (doubleval($tab[$i+1])*doubleval($tab[$i+3]));
- break;
- case "/":
- if(doubleval($tab[$i+3]==0))
- {
- return "zero";
- exit;
- }
- $somme -= (doubleval($tab[$i+1])/doubleval($tab[$i+3]));
- break;
- case "&":
- $somme += (doubleval($tab[$i+1])*doubleval($tab[$i+3]));
- break;
- case "%":
- if(doubleval($tab[$i+3]==0))
- {
- return "zero";
- exit;
- }
- $somme += (doubleval($tab[$i+1])/doubleval($tab[$i+3]));
- break;
- case "^":
- $somme -= pow(doubleval($tab[$i+1]),doubleval($tab[$i+3]));
- break;
- }
- $i +=4;
- }
- else
- {
- $somme -= doubleval($tab[$i+1]);
- $i +=2;
- }
- break;
-
- case "*":
- $somme *= doubleval($tab[$i+1]);
- $i+=2;
- break;
-
- case "/":
- if(doubleval($tab[$i+1]==0))
- {
- return "zero";
- exit;
- }
- $somme /= doubleval($tab[$i+1]);
- $i+=2;
- break;
-
- case "&":
- $somme *= -doubleval($tab[$i+1]);
- $i+=2;
- break;
-
- case "%":
- $somme /= -doubleval($tab[$i+1]);
- $i+=2;
- break;
-
- case "^":
- $somme = pow( $somme , doubleval( $tab[$i+1 ] ) );
- $i+=2;
- break;
- }
- }
- return $somme;
- }
-
- /*
- fin de la fonction Calculer
- */
-
- function Evaluer($str)
- {
- $error = strrpos($str, "zero");
- if($error >=0 )
- {
- return "null";
- exit;
- }
- ///////////////////////////////////////////
- $str=str_replace("--","+",$str);
- $str=str_replace("+-","-",$str);
- $str=str_replace("*-","&",$str);
- $str=str_replace("/-","%",$str);
- ///////////////////////////////////////////
- $position1 = strrpos($str, "(");// en cherche la derniere occurence pour "("
- if (is_bool($position1) && !$position1)
- {
- return Calculer($str);
- }
- else
- {
- $position2=strpos(substr($str,$position1),")");
- $valeur=Calculer(substr($str,$position1+1,$position2-1));
- $str=str_replace(substr($str,$position1,$position2+1),$valeur,$str);
- $str=str_replace("--","+",$str);
- $str=str_replace("+-","-",$str);
- $str=str_replace("*-","&",$str);
- $str=str_replace("/-","%",$str);
- return Evaluer($str);
- }
- }
-
- ?>
<?php
function Calculer($str)
{
$tab=array();
$operateurs=array("+","-","*","/","^","&","%");
$fonc_math=array("c","s","t");
$operateurs_prioritaires=array("*","/","&","%","^");
$cur=0;
$i=0;
while($i<strlen($str))
{
$char=substr($str,$i,1);
if(in_array($char,$operateurs) and !$i==0)
{
$tab[$cur+1]=$char;
$cur +=2;
$i++;
}else if(in_array($char,$fonc_math))
{
switch($char)
{
case "c":
$tab[$cur]=round(cos(deg2rad(doubleval(substr($str,$i+3)))),3);
break;
case "s":
$tab[$cur]=round(sin(deg2rad(doubleval(substr($str,$i+3)))),3);
break;
case "t":
$tab[$cur]=round(tan(deg2rad(doubleval(substr($str,$i+3)))),3);
break;
}
$lng=doubleval(substr($str,$i+3));
settype($lng,"string");
$i +=strlen($lng)+3;
}else{
if(!array_key_exists($cur,$tab))
{
$tab[$cur]=$char;
}
else
{
$tab[$cur] .=$char;
}
$i++;
}
}
unset($i);
$somme=doubleval($tab[0]);
$i=1;
while($i<count($tab))
{
switch($tab[$i])
{
case "+":
if((count($tab)-$i > 30) and (in_array($tab[$i+2],$operateurs_prioritaires)))
{
switch($tab[$i+2])
{
case "*":
$somme += (doubleval($tab[$i+1])*doubleval($tab[$i+3]));
break;
case "/":
if(doubleval($tab[$i+3]==0))
{
return "zero";
exit;
}
$somme += (doubleval($tab[$i+1])/doubleval($tab[$i+3]));
break;
case "&":
$somme -= (doubleval($tab[$i+1])*doubleval($tab[$i+3]));
break;
case "%":
if(doubleval($tab[$i+3]==0))
{
return "zero";
exit;
}
$somme -= (doubleval($tab[$i+1])/doubleval($tab[$i+3]));
break;
case "^":
$somme += pow(doubleval($tab[$i+1]),doubleval($tab[$i+3]));
break;
}
$i +=4;
}
else
{
$somme += doubleval($tab[$i+1]);
$i +=2;
}
break;
case "-":
if((count($tab)- $i > 30) and (in_array($tab[$i+2],$operateurs_prioritaires)))
{
switch($tab[$i+2])
{
case "*":
$somme -= (doubleval($tab[$i+1])*doubleval($tab[$i+3]));
break;
case "/":
if(doubleval($tab[$i+3]==0))
{
return "zero";
exit;
}
$somme -= (doubleval($tab[$i+1])/doubleval($tab[$i+3]));
break;
case "&":
$somme += (doubleval($tab[$i+1])*doubleval($tab[$i+3]));
break;
case "%":
if(doubleval($tab[$i+3]==0))
{
return "zero";
exit;
}
$somme += (doubleval($tab[$i+1])/doubleval($tab[$i+3]));
break;
case "^":
$somme -= pow(doubleval($tab[$i+1]),doubleval($tab[$i+3]));
break;
}
$i +=4;
}
else
{
$somme -= doubleval($tab[$i+1]);
$i +=2;
}
break;
case "*":
$somme *= doubleval($tab[$i+1]);
$i+=2;
break;
case "/":
if(doubleval($tab[$i+1]==0))
{
return "zero";
exit;
}
$somme /= doubleval($tab[$i+1]);
$i+=2;
break;
case "&":
$somme *= -doubleval($tab[$i+1]);
$i+=2;
break;
case "%":
$somme /= -doubleval($tab[$i+1]);
$i+=2;
break;
case "^":
$somme = pow( $somme , doubleval( $tab[$i+1 ] ) );
$i+=2;
break;
}
}
return $somme;
}
/*
fin de la fonction Calculer
*/
function Evaluer($str)
{
$error = strrpos($str, "zero");
if($error >=0 )
{
return "null";
exit;
}
///////////////////////////////////////////
$str=str_replace("--","+",$str);
$str=str_replace("+-","-",$str);
$str=str_replace("*-","&",$str);
$str=str_replace("/-","%",$str);
///////////////////////////////////////////
$position1 = strrpos($str, "(");// en cherche la derniere occurence pour "("
if (is_bool($position1) && !$position1)
{
return Calculer($str);
}
else
{
$position2=strpos(substr($str,$position1),")");
$valeur=Calculer(substr($str,$position1+1,$position2-1));
$str=str_replace(substr($str,$position1,$position2+1),$valeur,$str);
$str=str_replace("--","+",$str);
$str=str_replace("+-","-",$str);
$str=str_replace("*-","&",$str);
$str=str_replace("/-","%",$str);
return Evaluer($str);
}
}
?>
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
- 26 décembre 2006 23:39:48 :
- oups, zip...$-)
- 23 janvier 2007 23:44:02 :
- un petit correctif
- 24 janvier 2007 18:08:15 :
- autre correctif
maintenant l'algo pris en compte la priorité entre + et ( + - )
- 24 janvier 2007 23:29:57 :
- mis en forme l'algo ( indentation)
- 25 janvier 2007 22:41:56 :
- autres correctifs
Sources de la même categorie
Commentaires
Discussions en rapport avec ce code source
|
Téléchargements
Logiciels à télécharger sur le même thème :
|