begin process at 2010 03 21 09:08:37
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > FONCTION EQUATION LÉGÈRE

FONCTION EQUATION LÉGÈRE


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :math, calculatrice, eval, calcul, equation Niveau :Débutant Date de création :18/05/2009 Date de mise à jour :18/05/2009 01:34:52 Vu :1 481

Auteur : ff5

Ecrire un message privé
Site perso
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 Description

Fonction equation en 50 lignes de code. Prend une équation (string $equation) en paramètre (ex.: 5+5*300/2-50) et renvoie le résultat en prenant en compte les priorités, en analysant la chaîne peu importe sa longueur et peu importe les espacements (ex.: 2  + 2 *4   / 4). Je ne voulais pas utiliser eval(), en contexte web, j'aime mieux ne pas activer la fonction dans PHP. Exemple d'utilisation :

->copier/coller code source<-

echo equation("10+2");

Source

  • <?php
  • function operation($a,$b,$c) {
  • switch($b) {
  • case '+': return $a + $c; break;
  • case '-': return $a - $c; break;
  • case '*': return $a * $c; break;
  • case '/': return $a / $c; break;
  • } }
  • function equation($equation) {
  • $input = str_replace(' ','',trim($equation));
  • $caracteres = preg_split('//',$input,-1,PREG_SPLIT_NO_EMPTY);
  • for($i=0;$i<count($caracteres);$i++) {
  • if(!is_numeric($caracteres[$i])) {
  • $operateurs[].= $caracteres[$i];
  • $nb .= ' ';
  • } else {
  • $nb .= $caracteres[$i];
  • } }
  • $nombres = explode(' ',$nb);
  • for($i=0;$i<count($operateurs);$i++) {
  • if($operateurs[$i] == "*" || $operateurs[$i] == "/") {
  • if($operateurs[$i-1] == "*" || $operateurs[$i-1] == "/") {
  • $last = count($nouv_eq) - 1;
  • $nouv_eq[$last] = operation($nouv_eq[$last],$operateurs[$i],$nombres[$i+1]);
  • } else {
  • $nouv_eq[] .= operation($nombres[$i],$operateurs[$i],$nombres[$i+1]);
  • }
  • } else {
  • if($operateurs[$i-1] != "*" && $operateurs[$i-1] != "/") $nouv_eq[] .= $nombres[$i];
  • $nouv_eq[] .= $operateurs[$i];
  • if($i == count($operateurs)-1) $nouv_eq[] .= $nombres[$i+1];
  • } }
  • for($i=0;$i<count($nouv_eq);$i++) {
  • if(!is_int($i / 2)) $nouv_operateurs[] .= $nouv_eq[$i];
  • else $nouv_nombres[] .= $nouv_eq[$i];
  • }
  • if(count($nouv_operateurs) > 0) {
  • for($i = 0;$i<count($nouv_operateurs);$i++) {
  • if($i == 0) $rslt = operation($nouv_nombres[0],$nouv_operateurs[0],$nouv_nombres[1]);
  • else $rslt = operation($rslt,$nouv_operateurs[$i],$nouv_nombres[$i+1]);
  • } }
  • else {
  • $rslt = $nouv_nombres[0];
  • }
  • return $rslt;
  • }
  • ?>
<?php
function operation($a,$b,$c) {
   switch($b) {
      case '+': return $a + $c; break;
      case '-': return $a - $c; break;
      case '*': return $a * $c; break;
      case '/': return $a / $c; break;
}   }
function equation($equation) {
$input = str_replace(' ','',trim($equation));
$caracteres = preg_split('//',$input,-1,PREG_SPLIT_NO_EMPTY);
for($i=0;$i<count($caracteres);$i++) {
   if(!is_numeric($caracteres[$i])) {
      $operateurs[].= $caracteres[$i];
      $nb .= ' ';
   } else {
      $nb .= $caracteres[$i];
}   } 
$nombres = explode(' ',$nb);
for($i=0;$i<count($operateurs);$i++) {
   if($operateurs[$i] == "*" || $operateurs[$i] == "/") {
      if($operateurs[$i-1] == "*" || $operateurs[$i-1] == "/") {
         $last = count($nouv_eq) - 1;
         $nouv_eq[$last] = operation($nouv_eq[$last],$operateurs[$i],$nombres[$i+1]);
      } else {
         $nouv_eq[] .= operation($nombres[$i],$operateurs[$i],$nombres[$i+1]);
      }
   } else {
      if($operateurs[$i-1] != "*" && $operateurs[$i-1] != "/") $nouv_eq[] .= $nombres[$i];
      $nouv_eq[] .= $operateurs[$i];
      if($i == count($operateurs)-1) $nouv_eq[] .= $nombres[$i+1];
}   }
for($i=0;$i<count($nouv_eq);$i++) {
   if(!is_int($i / 2)) $nouv_operateurs[] .= $nouv_eq[$i];
   else $nouv_nombres[] .= $nouv_eq[$i];
}
if(count($nouv_operateurs) > 0) {
   for($i = 0;$i<count($nouv_operateurs);$i++) {
      if($i == 0) $rslt = operation($nouv_nombres[0],$nouv_operateurs[0],$nouv_nombres[1]);
      else $rslt = operation($rslt,$nouv_operateurs[$i],$nouv_nombres[$i+1]);
}   }
else {
   $rslt = $nouv_nombres[0];
}
return $rslt;
}
?>



 Historique

18 mai 2009 01:23:48 :
rien
18 mai 2009 01:33:11 :
--
18 mai 2009 01:34:52 :
-

 Sources de la même categorie

Source avec une capture CALCUL DE TVA MARGE AVEC REMISE FOURNISSEUR SPÉCIALE POUR LE... par lcomb
Source avec Zip EVALUER UNE EXPRESSION À PARTIR D'UNE CHAINE DE CARACTÈRE par TheWeasel47
Source avec Zip Source avec une capture TRACEUR DE COURBE EN COORDONNÉES CARTÉSIENNES (MAJ) par fredbonmatin
CONVERTIR LES RÉFÉRENCES DE COLONNE EXCEL DE CHIFFRE EN LETT... par computman007
Source avec Zip Source avec une capture CALCULE GÉOMÉTRIQUE par firesamu

 Sources en rapport avec celle ci

Source avec une capture CALCUL DE TVA MARGE AVEC REMISE FOURNISSEUR SPÉCIALE POUR LE... par lcomb
Source avec Zip EVALUER UNE EXPRESSION À PARTIR D'UNE CHAINE DE CARACTÈRE par TheWeasel47
Source avec Zip Source avec une capture TRACEUR DE COURBE EN COORDONNÉES CARTÉSIENNES (MAJ) par fredbonmatin
Source avec une capture CALCULATRICE par Fidji56
Source avec Zip EQUATION V1.0 par le_m3ellem

Commentaires et avis

Commentaire de nhervagault le 18/05/2009 13:59:43 administrateur CS

Des expressions régulières capturantes permettent surement d'alléger ce code.





Commentaire de liptibilly le 25/05/2009 15:25:49

tu met ou les incinnues? et si racine carrée, tu fait koi? ca marche pas

Commentaire de TheWeasel47 le 28/06/2009 19:19:02

Salut à tous.
Je viens de regarder rapidement cette source. Pour répondre aux premiers commentaires je dirai :

Les expression régulière allègeraient peu etre le code mais on y perdrait question performance. Donc après tout dépend de l'utilisation à en faire.

Pour ce qui est des inconnus effectivement cette source porte mal son nom, elle évalu une chaine de caractère mais ne résou en aucun cas des équations.

Sinon elle gère les priorité des opérateurs, elle est rapide. Toutefois elle ne gère pas les divisions par zéros(n'affiche pas d'erreur). Sur le plan programmation il y a deux choses à dire :

1) TU as une variable que tu utilises alors qu'elle n'a pas été définit (Si la configuration du php.ini est bien faite elle t'affichera cette erreur) variable nb ligne 18

2)Au premier tour de boucle tu test une case du tableau non initialisé la case -1. (encore une fois une bonne configuration de php.ini te le diras).

Sinon ta source est pas mal du tout je me suis moi même exercé à faire une fonction de ce type. Elle prend beaucoup plus d'opérateur gére les erreurs mais elle est beaucoup plus lourde. Je t'invite à la regarder : http://www.phpcs.com/codes/EVALUER-EXPRESSION-PARTIR-CHAINE-CARACTERE_50144.aspx

Bonne continuation
Bien Cordialement
TheWeasel47

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Calcul litéral Math [ par piep14 ] Bonjour le forum, je souhaite mettre en place un syst&#232;me de calcul assez simple pour commencer. Exemple, je met 2+5 dans un input, il me renvoie calcul plutôt compliqué... non ? [ par emilyfr ] Bonjour,Je viens vous demander un petit coup de pouce pour un calcul... vu que je suis nulle en maths et que rien qu'à l'imaginer, j'ai mal à la tête. Eval et boucle [ par darkduck ] Bonjour,J'utilise la méthode suivante :$affichage = 'je coute $prix euros';for ($i=1; $i&lt;5; $i++){    $prix = $i;        eval("\$affichage = \"$aff Math de bon niveau [ par rambc ] Bonjour,je souhaite développer des outils permettant de faire des Maths de bon niveau. J'ai entendu parler de BCMath. Existe-t-il une docu complète su Calcul du timeout client [ par callman ] Bonjour à tous,Voila, j'ai un problème avec un soft sur un timeout.En fait, des clients se connectent à un site pour obtenir des états.Beaucoup d'entr Besoin de conseil pour un calcul svp ! [ par demonn ] Bonjour à tous,voilà je voudrais développer un jeux.Un amis fait la section flash et moi je dois m'occuper du calcul du jeux.seulement j'aurais voulu Calcul de durée [ par nono52 ] Je suis débutant et je cherche à réaliser une calcul de durée.Avec un formulaire j'envoie dans une table un numéro de vol et une durée concernant une Accès site avec calcul d'âge [ par Tanaka56 ] Bonjour a tous.Je voudrais trouver un script pour faire un accès sur une page en fonction de l'âge (18) donc demander la date de naissance dans un pet calcul de champs selon coefficient... [ par cyse ] Bonjour,C'est pas evident à expliquer, mais surement assez simple a ecrire en php... J'aimerais, qu'un code php recupere les données (numériques) x y calcul matriciel en php [ par cacoucatatonique ] bonjour à tous,je suis à la recherche d'un code d'exemple pour effectuer des calculs matriciels de dimension variable, j'ai un peut recherche sur le n


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
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 : 0,702 sec (3)

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