begin process at 2008 08 20 12:47:26
1 228 823 membres
193 nouveaux aujourd'hui
14 257 membres club

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é: 6 223 / 139

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);
        }
    }

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

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

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

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

Boutique

Boutique de goodies CodeS-SourceS