Evaluer les expressions mathématiques complexes

Soyez le premier à donner votre avis sur cette source.

Vue 13 405 fois - Téléchargée 307 fois

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

Ajouter un commentaire Commentaires
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
38
cette source a six mois...
Messages postés
385
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
21 août 2015
3
tu sais , je vais reglé ça....
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
38
sin(360) = nulle
sin(180) = nulle
lol
tan(90) = 17.633177872838
t'es en degres ??
(1+1)^1000 = 302.07150860719
4=5 = 4
Messages postés
385
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
21 août 2015
3
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
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
38
quand rien ne marche, la source devrait aller dans le forum...
Afficher les 27 commentaires

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.