Ver Mensaje Individual
  #5 (permalink)  
Antiguo 26/02/2015, 17:45
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Mi calculadora no resuelve

Una calculadora que sume, reste, multiplique y divida puede ser implementada de forma simple y segura así:
Código PHP:
Ver original
  1. <?php
  2.     // La operación a resolver.
  3.     $op = "7 + 5 - 4 / 2 + 3 * 2";
  4.  
  5.     // Eliminar espacios y caracteres @ existentes, luego agregar un @ antes de cada signo y al final de la formula.
  6.     $op = str_replace(["@", " ", "+", "-", "*", "/"], ["", "", "@+", "@-", "@*", "@/"], $op)."@";
  7.  
  8.     // Variables a usar.
  9.     $final = 0; // Acumulador, almacena el resultado final.
  10.     $parcial = 0; // Acumulador, almacena el resultado parcial de cada termino.
  11.     $signo = "+"; // Indicador, almacena el ultimo signo empleado, por defecto suma.
  12.  
  13.     // Recorrer cada numero y operación de la formula de forma implicita.
  14.     // Se usa la variable original como iteradora para ahorrar memoria.
  15.     foreach(explode("@", $op) as $op)
  16.     {
  17.         // Si es una operación de alta prioridad se procesa dentro del termino parcial.
  18.         if($op[0] == "*" || $op[0] == "/") // El primer carácter es la operación.
  19.             $parcial *= ($op[0] == "*" ? substr($op, 1) : 1/substr($op, 1)); // Multiplicar o dividir.
  20.         else
  21.         {
  22.             // Si es una operacion de baja prioridad se procesa dentro del resultado final.
  23.             $final += $parcial * ($signo == "+" ? 1 : -1); // Sumar o restar.
  24.  
  25.             // Si el numero tiene un signo.
  26.             if($op[0] == "+" || $op[0] == "-")
  27.             {
  28.                 $parcial = substr($op, 1); // Guardar el numero sin signo.
  29.                 $signo = $op[0]; // Guardar el signo.
  30.             }
  31.             else // Es un numero sin signo, Ej: el primer numero de la formula.
  32.                 $parcial = $op;
  33.         }
  34.     }
  35.     unset($parcial, $signo, $op); // Liberar la memoria.
  36.     echo $final; // Mostrar el resultado.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 26/02/2015 a las 17:56