begin process at 2012 02 12 06:09:38
  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 :2 863

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

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

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 Source avec une capture BMI CALCULATOR par lolosb
Source avec une capture CALCUL DE TVA MARGE AVEC REMISE FOURNISSEUR SPÉCIALE POUR LE... par lcomb
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 mathématique d'exposants [ par domdom52 ] bonsoir voila j'aimerais transformer 2² + 3² = X en pow(2,2) + pow(3,2) = X pour ça je fais [code=php] $equation echo preg_replace('#(.)²#i', 'pow( Aide formulaire calcul tarif [ par fildup ] Bonjour, Je suis vraiment un amateur dans le php et je recherche de l'aide ! Voici mon problème : [img]http://www.othisrugby.fr/images/template/Capt Calcul d'un formulaire avec base de données [ par gizmo26 ] Bonjour, J'ai le niveau "-1" en PHP et je cherche de l'aide pour m'expliquer où se trouve mon erreur ! Je cherche a créer un script qui affiche tous Total Calcul Panier [ par jackdaniel9 ] Bonjour, Il faut que je calcule le prix par rapport à la quantité dans un formulaire pour un panier. Je me demandais si il était possible de faire l Calcul entre 2 dates [ par yoannyop ] Salut @ toutes & @ tous. Je dispose de 2 dates (début et fin) au format aaaa-mm-jj hh:mm. J'aimerai un calcul sur la différence entre ces 2 dates dat Calcul de solde [ par Sinsitrus ] Salut ! Pouvez-vous svp m'aider à corriger ce bout de code ? [code=php]<? $sql = "SELECT SUM(credit - debit) FROM comptes"; //envoi de la requête pou Calcul d'un rang avec 2 tables [ par Alpha911 ] Bonjour, Je me creuse la tête depuis hier et rien n'en sort ... j'ai 2 tables comme ce qui suit : *********** ************ * JOUEUR * * POI CALCUL D'UNE DATE DE FIN D'ECHENCE [ par riahihmida ] Bonjour je veux savoir comment calculer une date de fin d'echeance a partir d'une date de debut. exemple: date de debut 20/10/2011 nombre d'echeanace Calcul du reste issu de 2 variables [ par msi079 ] salut j'ai fait une code qui s'affiche bien mais j'ai un problème au niveau du calcul du reste de la somme. au fait un client a une somme totale a pa


Nos sponsors


Sondage...

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,966 sec (3)

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