Ver Mensaje Individual
  #8 (permalink)  
Antiguo 13/05/2014, 07:14
Avatar de dashtrash
dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Algoritmo en PHP

Cita:
Iniciado por Vanessita Ver Mensaje
Hola a todos,

Quisiera que por favor me ayudaran a entender qué hace realmente la siguiente función en PHP, ya que me salió e un examen y no supe qué responder:

Código PHP:
public static function is_valid($str
{
  if (!
ctype_digit($str)) return FALSE;
  
$len strlen($str);
  if (
$len != 15) return FALSE;
  
$odd = !strlen($str)%2;
  
$sum 0;
  for (
$i=0$i<$len; ++$i) {
    
$n $str[$i];
    
$odd = !odd;
    if (
$odd) {
      
$sum += $n;
    } else {
      
$x=2*$n;
      
$sum += $x>9?$x-9:$x;
    }
  }
  return ((
$sum%10)==0);

Muchas gracias por su tiempo.
Esta funcion tiene código que no es necesario, para forzar a que se esté atento a lo que hace.

Código PHP:
Ver original
  1. if ($len != 15) return FALSE;
  2.   $odd = !strlen($str)%2;
Si la longitud no es 15, la segunda línea no se ejecutará.Así que la segunda linea es equivalente a $odd=!15%2, que equivale a $odd=!1.En definitiva, $odd=0

Ahora, el bucle:
Código PHP:
Ver original
  1. for ($i=0; $i<$len; ++$i) {
  2.     $n = 0 + $str[$i];
  3.     $odd = !odd;
  4.     if ($odd) {
  5.       $sum += $n;
  6.     } else {
  7.       $x=2*$n;
  8.       $sum += $x>9?$x-9:$x;
  9.     }
  10.   }
A $n se le asigna el valor entero del caracter $i.Al ser 1 solo carácter, su valor sólo puede ser entre 0 y 9.Por lo tanto, la condicion $x>9 nunca se va a cumplir.Esto hace que el bucle quede en:
Código PHP:
Ver original
  1. for ($i=0; $i<$len; ++$i) {
  2.     $n = 0 + $str[$i];
  3.     $odd = !odd;
  4.     if ($odd) {
  5.       $sum += $n;
  6.     } else {
  7.       $x=2*$n;
  8.       $sum += $x;
  9.     }
  10.   }

Hay que tener en cuenta que $odd se inicializó a 0.En la primera iteración del blucle, $i = 0, pero $odd= !$odd, con lo que $odd pasa a ser 1.
Asi que, $sum es la suma de los numeros colocados en una posicion par, más el doble de la suma de los numeros colocados en una posicion impar. (Las posiciones se cuentan de izquierda a derecha).

La función retorna true si $sum es múltiplo de 10.