begin process at 2012 02 15 21:52:21
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > EVALUER LES EXPRESSIONS MATHÉMATIQUES COMPLEXES

EVALUER LES EXPRESSIONS MATHÉMATIQUES COMPLEXES


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :11 622 / 176

Auteur : amezghal

Ecrire un message privé
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@ms n.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

Les Membres Club peuvent 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 du même auteur

Source avec Zip PHPCODE INDENTER
Source avec Zip Source avec une capture MYRSSREADER :: APPLICATION WEB2
Source avec Zip Source avec une capture FORMULAIRE D'ENREGISTREMENT(AJAX+CODE SECURITÉ+STYLÉ)
Source avec Zip Source avec une capture TRACEUR DES FONCTIONS
CONNAITRE SI LE FICHIER UPLOADER N'EST PAS UN FICHIER PHP

 Sources de la même categorie

EXEMPLE D'APPLICATION DE L'ALGORITHME DE DIJKSTRA EN PHP par philtr8
CLEF POUR EAN 13 ET 14 par RaftY
FONCTION DE CALCUL DU NOMBRE DE DUEL UNIQUE POUR UN NOMBRE N... par mtrix000
Source avec Zip Source avec une capture TRIANGLE DE PASCAL ET SON ÉQUATION par vendeeHdLR89
Source avec Zip CONVERTISSEUR LAMBERT2 ÉTENDU EN COORDONNÉE GÉOGRAPHIQUE (LO... par varfendell

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture TRIANGLE DE PASCAL ET SON ÉQUATION par vendeeHdLR89
Source avec Zip EVALUER UNE EXPRESSION À PARTIR D'UNE CHAINE DE CARACTÈRE par TheWeasel47
FONCTION EQUATION LÉGÈRE par ff5
Source avec Zip Source avec une capture TRACEUR DE COURBE EN COORDONNÉES CARTÉSIENNES (MAJ) par fredbonmatin
Source avec Zip CLASS DE VALIDATIONS DE DATE, ENTIER, STRING,... par whiskycoke

Commentaires et avis

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

Commentaire de coucou747 le 28/12/2006 11:33:02 administrateur CS

4*(1+2*3) = 36

Commentaire de amezghal le 28/12/2006 16:24:34

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

Commentaire de coucou747 le 28/12/2006 16:28:48 administrateur CS

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)

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

Commentaire de magicvinni le 22/01/2007 20:41:44

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

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  

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

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

Commentaire de coucou747 le 24/01/2007 13:34:43 administrateur CS

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

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

Commentaire de coucou747 le 24/01/2007 17:32:33 administrateur CS

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

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@
*^*

Commentaire de coucou747 le 24/01/2007 17:46:01 administrateur CS

() = 0

(() = 0

/* = 0

* = 0

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

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@
*^*

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
*+*

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.

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

Commentaire de coucou747 le 27/01/2007 14:22:26 administrateur CS

3*2^3 = 216

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

Commentaire de amezghal le 28/01/2007 00:02:54

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

Commentaire de foxbowrnb le 19/02/2007 16:07:15

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

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.

Commentaire de coucou747 le 25/02/2007 13:01:31 administrateur CS

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

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

Commentaire de coucou747 le 18/05/2007 01:20:38 administrateur CS

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

Commentaire de amezghal le 18/05/2007 01:31:47

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

Commentaire de coucou747 le 18/05/2007 01:39:13 administrateur CS

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

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,903 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales