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

Catégorie :Maths & Algorithmes Classé sous : expression, math, complexe, evaluer Niveau : Débutant Date de création : 26/12/2006 Date de mise à jour : 25/01/2007 22:41:56 Vu / téléchargé: 9 852 / 154

Note :
6 / 10 - par 5 personnes
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

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

Commentaires et avis

signaler à un administrateur
Commentaire de amezghal le 26/12/2006 21:31:15

demo sur http://abdilah.freehostia.com/math/
et merci à PolyBomb qui m'a bien aider, merci encore

signaler à un administrateur
Commentaire de coucou747 le 28/12/2006 11:33:02

4*(1+2*3) = 36

signaler à un administrateur
Commentaire de amezghal le 28/12/2006 16:24:34

bah wi
4*(1+2*3)
=4*(3*3)
=4*9
=36
!!!!!

signaler à un administrateur
Commentaire de coucou747 le 28/12/2006 16:28:48

la multiplication n'est pas associative avec l'addition...
autrement dit :
la multiplication est prioritaire sur l'addition...

1+(2*3) != (1+2)*3

et par convention 1+2*3=1+(2*3)

signaler à un administrateur
Commentaire de amezghal le 28/12/2006 16:34:40

cela va changer tt l'algorithme

pour calculer 4*(1+2*3)
fo mieux mettre 4*(1+(2*3))
merci pour la remarque comme meme, je vois c que j px faire

signaler à un administrateur
Commentaire de magicvinni le 22/01/2007 20:41:44

-2*5+7=-2 ???

signaler à un administrateur
Commentaire de amezghal le 23/01/2007 23:42:01

salut
c'est réglé ; maintenant -2*5+7= -3;
le premier nombre est négatif, l'algorithme trompe, il croit que c'est un opérateur ,
merci pour la remarque  

signaler à un administrateur
Commentaire de magicvinni le 24/01/2007 08:51:52

Merci, c'est cool, il y a aussi :

(-1+2)(3+4)=24 ou 2(1+2)=23 : Il faudrait que dès le début, quand il rencontre un parenthèse "(", il test, s'il y a un chiffre ou ) avant, il insère un *

2d+4=6 : Il faudrait tester s'il y a des choses interdites

2*[2+1]=1 : Il faudrait remplacer les "[" et "{" par "(" et "]" et "}" par ")" avant le traitement

Voila quelques idées

signaler à un administrateur
Commentaire de amezghal le 24/01/2007 12:23:42

l'algorithme est valable pour les expressions mathématiquement corrects ; basique :p
-ya des techniques pour faire ce genre d'algorithmes(les arbres) ;


amez-abdel@msn.com

signaler à un administrateur
Commentaire de coucou747 le 24/01/2007 13:34:43

basiques, pas complexes... genre priorité entre * et +, ça marche pas ici...

signaler à un administrateur
Commentaire de amezghal le 24/01/2007 17:22:09

salut
coucou747==> voici now la priorité entre * et( + -) est pris en compte:
teste dans la demo (4*(1+2*3) = 28) et nan pas 36
aussi 4*(1-2*3) donne -20 au lieu de -12
donc maintenant j peux dire complexe ?

j'ai pas encore le mis à jour ici

abdilah.freehostia.com/math/

@o@
^ ciao

signaler à un administrateur
Commentaire de coucou747 le 24/01/2007 17:32:33

site offline... et source pas à jours... et même si le site était online, ne pas avoir donné les source justifie que je le qualifie encore de basic...

c'est pas normal que ça n'évolue que maintenant, alors qu'il y a un mois, c'était déjà cencé être complexe

signaler à un administrateur
Commentaire de amezghal le 24/01/2007 17:39:03

désolé c'est en ligne maintenant
l'algo évolue maintenat cause suis free now
aller teste

@o@
*^*

signaler à un administrateur
Commentaire de coucou747 le 24/01/2007 17:46:01

() = 0

(() = 0

/* = 0

* = 0

1+1*2+3*4= ?? il ne le calcule pas

signaler à un administrateur
Commentaire de amezghal le 24/01/2007 17:50:02

tu vois c pour ces raisons que je n'ai pas encore le mis à jour
j vais essayé de resoudre ceci
merci encore
@o@
*^*

signaler à un administrateur
Commentaire de amezghal le 24/01/2007 18:09:43

voici pour 1+1*2+3*4 est réglé
voici gé posté la maj
*+*

signaler à un administrateur
Commentaire de magicvinni le 24/01/2007 18:22:35

Merci pour ces mises à jour...C'est comme cela que l'on fait avancer les choses. D'ailleurs c'est surprenant qu'aucune bibliothèque n'existe encore pour faire cela.

signaler à un administrateur
Commentaire de amezghal le 25/01/2007 22:39:23

salut voici une autre maj

-quand l'algo détecte une division par zéro,il sort du traitement est retourne "null"    

-l'algo now est très performant;

-j'ai amélioré la pris en compte de la priorité ,
3+4^2 = 19;

-le script est mieux présenté

maintenant j vais développé un traceur :p

signaler à un administrateur
Commentaire de coucou747 le 27/01/2007 14:22:26

3*2^3 = 216

l'exposant devrait être calculé avant...

signaler à un administrateur
Commentaire de amezghal le 28/01/2007 00:02:54

moauis j'avais oublié ,
ya aussi 3/2^3  ^^"
merci

signaler à un administrateur
Commentaire de foxbowrnb le 19/02/2007 16:07:15

salut, bravo pour ton calculateur ;)
sinon :
cos(1) = 1
cos(pi) = 1
??

signaler à un administrateur
Commentaire de macromed le 25/02/2007 06:08:01

Wow !! J'adore t'as source et les mises à jours régulières que tu fait.. Bravo !  coucou747, normallement on poste un script pour avoir des commentaires constructifs et que les autres nous aide. Ce n'est qu'une remarque, stp ne le prend pas personnel.

Sinon, bravo, je met dans les favoris :D por pouvoir avoir les derniere MaJ.

8/10, encore en dévellopement.

signaler à un administrateur
Commentaire de coucou747 le 25/02/2007 13:01:31

quand rien ne marche, la source devrait aller dans le forum...

signaler à un administrateur
Commentaire de amezghal le 27/02/2007 15:34:00

merci
@MACOMED les comm de coucou747 sont bien constructifs
pour
cos(1) = 1
cos(pi) = 1
c'est normal les valeurs des angles sont en degré et nan pas en radian

signaler à un administrateur
Commentaire de coucou747 le 18/05/2007 01:20:38

sin(360) = nulle
sin(180) = nulle
lol
tan(90) = 17.633177872838
t'es en degres ??
(1+1)^1000 = 302.07150860719
4=5 = 4

signaler à un administrateur
Commentaire de amezghal le 18/05/2007 01:31:47

tu sais , je vais reglé ça....

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

cette source a six mois...

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Convertir un nombre en expression literrale en PL/SQL [ par ThReM ] bonjour je cherche une source pour convertir un nombre en ce meme nombre mais ecris en toutes lettre (99 ==&gt; quatre vingt dix neuf) en langage PL/S Expression régulière pour retrouver tous les tags php [ par ninatomb ] Je recherche une expression régulière qui me retrouve tous les tags php dans une page html, sans modifier l'htmlEt une qui fonctionne !!!!!Celle ci ne Expression reguliere [ par wonesek ] $mois = array( "01" =&gt; "Janvier", "02" =&gt; "Fevrier", "03" =&gt; "Mars", "04" =&gt; "Avril", "05" =&gt; "Mai", "06" =&gt; "Juin", "07" =&gt expression toute bete avec des ' et des ", qui resiste... [ par sbastian ] bonjour! j'ai ce bout de code (remplacement de l'expression "d' " par "espace") qui me resiste... $ligne=str_replace("d'"," ",$ligne); = marche pas, Nombre Complexe [ par TiotBour ] Bonjour, je voudrai savoir si il est^possible de gerer les nombres complexes via php, et surtout comment ?Sous forme polaire et rectangulaire aussi :) expression reguliere [ par wonesek ] bonsoir tout le monde j'ai actullement un petit probleme avec une expression reguliere PCRE:code source------------------&lt;pre&gt;&lt;?$a = "[a]1[/a utilisation expression reguliere avec tabulation (aide) [ par nunor ] bjr, j'ai un fichier texte avec les données suivantes Code: Date d'activation Date de fin Catégorie Mot clé Position moyenne Impressions T Explications sur mail() complexe [ par romalafrite ] http://www.zend.com/zend/spotlight/sendmimeemailpart1.phpBonjour à tous,J'aimerais avoir des explications (parce que je suis mauvais en anglais) sur l Expression régulière [ par redsungraphics ] Je voudrais remplacer un mot par un lien. J'utilise actuellement str_replace. y-aurait-il une alternative qui fasse que s'il reconnait une racine d'un expression reguliere [ par Rochon ] Avec les expressions regulière je voudrait que tout les mots print et if qui sont entre des balises &lt;php&gt; et &lt;/php&gt; soient surlignés:j'uti


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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,530 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é.