Evaluer les expressions mathématiques complexes

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 / Exemple :


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

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.