jueves, 9 de febrero de 2012

UNIDAD III Control de flujo de programa

Control de flujo de programa



odo lenguaje de programación dispone de órdenes de control de flujo, que permite al programatomar decisiones lógicas segun reciba unos parámetros o otros: si llueve coge el paraguas; pero si hace sol vete a la playa.

Las posibilidades que ofrece php son:
  • if/else
  • if/elseif/else
  • switch
  • do/while
  • while
  • for

if else

Es la estructura de control mas corriente: La declaración if obliga a evaluar la expresión entre paréntesis; si se evalua como verdadera, se ejecuta un bloque de código; si se evalua como falsa, el bloque de código es ignorado. De esta forma nuestro script puede tomar decisiones:

<?php
$edad 
"";
if (
$edad >= 18
  {
  echo 
"puedes sacar el coche";
  } 
else
  {
  echo 
"ve en autobús";
  }
?>
Opcionalmente podemos usar una declaración else, que indicará el código que debe ejecutarse si la condición no es cumplida. La declaración else no es obligatoria, y no puede estar a su vez condicionada: else (otra condición) {...} sería inválido.

<?php if ($user == "pepe")

  {
  
// código especial para el usuario pepe
  
}
// código para todos los usuarios, sean o no pepe  
   
?>
El código condicionado a la cláusula if solo se evalua si la condición (que siempre debe estar entre paréntesis) se evalua como verdadera. Si no se cumple, la ejecución pasa al siguiente bloque de código.

Solo es estrictamente necesario el uso de llaves {} encerrando el código sujeto a la condición cuando ocupa mas de una línea.

Condiciones complejas

Mediante el uso de operadores podemos introducir condiciones complejas, agrupándolas con parentesis: 
<?php if (($edad >= 18)&& ($carnet_conducir == 1))
 {
 } 
  
?>

if elseif else

Exactamente igual que la anterior, solo que evaluando mas de una condición:

<?php if ($user == "pepe")
  {
  
// codigo para pepe
  
}
elseif (
$user == "juan")
  {
  
// codigo para juan
  
}
  
else 
  {
  
// codigo para quienes no son juan ni pepe
  
}  
?>
A efectos prácticos podemos considerar que elseif y else if son lo mismo.

Operador ternario

Podemos incluir clausulas condicionales simples con una sintaxis abreviada:

(condición) ? (código a ejecutar si se da la condición) : (se ejecuta si no se da)
El primer parentesis contiene la condición; el segundo el código a ejecutar si verdadera; el tercero el código a ejecutar si falsa.

<?php

$num 
1;
(
$num == 1) ? (echo "$num es igual a 1") : (echo "$num no es igual a 1");
?>
equivale a :

<?php
$num 
"1";

if (
$num == "1")
  {
  echo 
"$num es igual a 1";
  }
else 
  {
  echo 
"$num no es igual a 1"
  
}  
?>

switch

switch es una alternativa quizas mas legible cuando necesitamos evaluar una variable frente a multiples valores posibles:

<?php

$op 
"a";

switch (
$op) {
    case 
"a":
     
// código que se ejecuta si $op vale "a"
    
break;

    case 
"b":
     
// código que se ejecuta si $op vale "b"
    
break;
    case 
"c":
     
// código que se ejecuta si $op vale "c"
    
break;
    default:
    
// código a ejecutar por defecto si no se cumple ninguna condición }
?>
El uso de break; es necesario, ya que en la estructura switch una vez cumplida una condición se ejecutan el resto de declaraciones (incluso las comprendidas en los casos que siguen). La ordenbreak evita esto saltando fuera del switch y continuando la ejecución del resto del script. Si en lugar de break usamos exit, el resto del script no se ejecutará.

Otra sintaxis alternativa

En las clausulas if-else podemos sustituir la llave de apertura { por dos puntos, y la llave de cierre por endif:

<?php
if ($user == "pepe"):
  
  
// codigo para pepe
elseif ($user == "juan"):
  
  
// codigo para juan
   
else: 
  
  
// codigo para quienes no son juan ni pepe endif;  
?>

bucles. While

A diferencia de los controles condicionales simples vistos hasta ahora, los bucles toman otro tipo de decisiones: si se da la condición, ¿cuantas veces he de ejecutar esta parte de código ?

<?php
$i
=1;

while (
$i <=10) {
   echo 
"$i<br>";
   
$i++;
}
?>
Lo que traducido a lenguaje llano, viene a querer decir: mientras la variable $i tenga un valor menor de 10 ($i<=10), imprime $i y una nueva línea.

Para que el bucle funcione correctamente necesitamos cumplir dos condiciones. La primera, obvia, que $i sea inicialmente menor de 10. Si es inicialmente mayor, la condición no se cumple, y el bucle no se ejecuta.

La segunda, que a cada ejecución del código $i aumente de valor ($i++), lo que es imprescindible, ya que en caso contrario (si $i valiese siempre 1) la condición sería siempre cierta y no podríamos salir nunca del bucle.
while tiene también una sintaxis alternativa:

while (expr): sentencia ... endwhile;

Do while

La única diferencia que existe con el anterior es que aqui la condición se evalúa despues de ejecutar el código, por lo que el bucle será efectivo al menos una vez:

<?php
$i
=11;
 do 
  {
  echo 
"$i<br>";
  
$i++;
  }

while (
$i <=10);
?>

For


<?php for($i=1$i<=10$i++) {
echo 
"$i<br>";
}
?>
Similar en su funcionalidad a while, el bucle for toma tres parámetros, separados los dos primeros por punto y coma: valor inicial de la variable de control, valor final y incremento de la misma.

3.1. Control secuencial
3.2. Control selectivo

Estructuras de Control Selectivas

En lo que sigue, denominaremos BLOQUE DE SENTENCIAS al conjunto de sentencias individuales incluídas dentro un par de llaves. Por ejemplo :
{
sentencia 1 ;
sentencia 2 ;
.............
sentencia n ;
}
Este conjunto se comportará sintacticamente como una sentencia simple y la llave de cierre del bloque NO debe ir seguida de punto y coma .
Un ejemplo de bloque ya visto , es el cuerpo del programa principal de la función main() .
main()
{
bloque de sentencias
}
En las proposiciones de control de flujo de programa , trabajaremos alternativamente con sentencias simples y bloques de ellas .

IF - ELSE


Esta proposición sirve para ejecutar ciertas sentencias de programa , si una expresión resulta CIERTA ú otro grupo de sentencias, si aquella resulta FALSA. Su interpretación literal sería : SI es CIERTA tal cosa , haga tal otra , si no lo es salteéla .
El caso más sencillo sería :
if(expresión)
 sentencia ;

ó

if(expresión)  sentencia ;
Cuando la sentencia que sigue al IF es única, las dos formas de escritura expresadas arriba son equivalentes . La sentencia sólo se ejecutará si el resultado de "expresión" es distinto de cero (CIERTO) , en caso contrario el programa salteará dicha sentencia , realizando la siguiente en su flujo.

Veamos unos ejemplos de las distintas formas que puede adoptar la "expresión" dentro de un IF :

if( a > b )if( (a > b) != 0 )las dos expresiones son idénticas, aunque a veces resulta más claro expresarla de la segunda manera, sobre todo en los primeros contactos con el lenguaje.
if(a)if(a != 0)
if(!a)if(a == 0 )Las dos superiores son idénticas entre sí , al igual que las dos inferiores Obsérvese que (!a) dará un valor CIERTO sólo cuando a sea FALSO. (ver operador NEGACION )
if( a == b )
if( a = b )/* Error */La primera es una expresión correcta , el IF se realizará sólo si a es igual a b. En cambio la segunda es un error , ya que no se está comparando a con b , sino ASIGNANDO el valor de esta a aquella . Sin embargo, a veces puede usarse como un truco (un poco sucio) de programacion , ya que primero se realiza la asignación y luego se evalúa el resultado de esta para realizar el IF , es entonces equivalente a escribir :
a = b ;
if(a)....................con el ahorro de una linea de programa ( a costa de la legibilidad del mismo ).

En casos más complejos que los anteriores , la proposición IF puede estar seguida por un bloque de sentencias :

if(expresión)                        if(expresión) {

{                                          sentencia 1 ;

sentencia 1 ;                        sentencia 2 ;

sentencia 2 ;                        ...............

.............                        }

}
Las dos maneras son equivalentes , por lo que la posición de la llave de apertura del bloque queda librada al gusto del programador . El indentado de las sentencias (sangría) es también optativo , pero sumamente recomendable ,sobre todo para permitir la lectura de proposiciones muy complejas ó anidadas , como se verá luego. El bloque se ejecutará en su conjunto si la expresion resulta CIERTA. El uso del ELSE es optativo , y su aplicación resulta en la ejecución de una , ó una serie de sentencias en el caso de que la expresión del IF resulta FALSA.

Su aplicación puede verse en el ejemplo siguiente :
   if(expresión)                 if(expresión)

   {                             {

   sentencia 1 ;                 sentencia 1 ;

   sentencia 2 ;                 sentencia 2 ;

   }                             }

   sentencia 3 ;                 else

   sentencia 4 ;                 {

   sentencia 5 ;                 sentencia 3 ;

                                 sentencia 4 ;

                                 }

                                 sentencia 5 ;
En el ejemplo de la izquierda no se usa el ELSE y por lo tanto las sentencias 3 , 4 y 5 se ejecutan siempre . En el segundo caso , las sentencias 1 y 2 se ejecutan solo si la expresión es CIERTA , en ese caso las 3 y 4 NO se ejecutarán para saltarse directamente a la 5 , en el caso de que la expresión resulte FALSA se realizarán las 3 y 4 en lugar de las dos primeras y finalmente la 5 .
La proposición ELSE queda siempre asociada al IF más cercano , arriba de él .
Es común también , en caso de decisiones múltiples , el uso de anidamientos ELSE-IF de la forma indicada abajo:
if(exp.1)                        if(exp.1)

 sentencia1 ;                     sentencia1 ;

else  if(exp.2)                  else  if(exp.2)

 sentencia2 ;                          sentencia2 ;

else if(exp.3)                         else if(exp.3)

 sentencia3 ;                                sentencia3 ;

else                                   else

 sentencia5 ;                                sentencia5 ;
Si bién se suele escribir según la modalidad de la izquierda , a la derecha hemos expresado las asociaciones entre los distintos ELSE é IF por medio del tabulado del texto.
3.3. Control repetitivo.

No hay comentarios:

Publicar un comentario