Autor Tema: Reto #2 - Operaciones matemáticas y estructuras de control  (Leído 3231 veces)

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #15 en: 22 de Octubre de 2009, 21:03:59 pm »
Perfecto.

Enhorabuena, has sido la primera persona en resolver el reto :)
Si no te importa colocaré también mi propia explicación del código para aportar algo más al tema.

SOLUCIÓN:
Citar

<?php

$num = (!$_GET['valor']) ? -42 : -47;
/** El codigo comienza aquí, dijimos que entrariamos al archivo con ?valor=TRUE, así que la variable $_GET['valor'] será true, sin embargo, el ! de delante cambia el valor por false, así que la variable $num queda definida como -47 **/

if($num % 3 == 0) $num -= 3;
else $num += 8;
/** Para empezar, % es un operador que realiza la operación y devuelve el resto, por lo tanto, el condicional quiere decir: Si el resto al dividir $num entre 3 da como resultado es 0... Nuestro numero es -47. Si conoces las reglas de divisibilidad matemáticas sabrás que 47 no es divisible entre 3 porque 7 + 4 no es multiplo de 3, y por lo tanto el resto es distinto de 0, y a la variable se le suma 8. Por lo tanto $num ahora vale -39 **/

/** Comenzamos con el bucle, esta es la única parte mas complicada de todo el código. Para empezar observamos que definimos $i como 0, y el condicional que lo opera es $i < abs($num). abs() es una función que halla el valor absoluto del numero. Por lo tanto, si el numero es -45, quedará como 45. También podemos observar que en cada iteración del bucle a la variable $i se le suma 1 unidad **/
for($i=0;$i<abs($num);$i++) {
    /** Como bien ha dicho Tope, este while es de pega, pues siempre se va a ejecutar una única vez, si eliminamos esta línea, la línea de break y el } de justo debajo, el
    resultado del código sería el mismo **/
   while(TRUE) {   
      $num -= -2; // Observamos que en cada iteración se le SUMAN (Ten en cuenta que menos por menos es mas) 2 unidades a la variable $num.
      break;
   }
}
/** Bien, como sabemos, en cada iteración se le suma una unidad a la variable $i, y dos unidades a la variable $num, por lo tanto, deducimos que nuestro condicional esta 3 unidades mas cerca de ser cumplido en cada iteración del bucle. Antes de comenzar el bucle la variable $i vale 0 y la variable $num -39 (Quedando como valor absoluto 39). Vamos a suponer que la linea que suma 2 unidades a la variable $num no existe, y la variable $i se sigue incrementando en 1 unidad cada iteracion ¿Cuantas iteraciones deberia dar el bucle para ser terminado? Exactamente, 39 iteraciones. Pero no es así, esa linea existe y por lo tanto ademas de añadir una unidad a $i, añade otras dos mas a $num. Esto es equivalente a añadir 3 unidades a $i, por lo tanto, el numero de iteraciones que tiene que realizar es: 39/3 = 13 iteraciones.

Si el bucle tiene que hacer 13 iteraciones para terminar, y en cada iteracion se le suma a la variable $num 2 unidades: 13*2 = 26 unidades sumadas en total, así que el numero que buscamos será -39+26=-13.
**/

echo $num;

?>

Espero que se entienda,
Saludos
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Comunidad PHPeros

Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #15 en: 22 de Octubre de 2009, 21:03:59 pm »