5. Sentencias de control de flujo

Contents of this section

Las sentencias de control de flujo como `if', `while' aceptan `end' como sentencia de finalización, igual que Matlab. Eisten además sentencias de finalización específicas como `endif', `endwhile'. Ambas posibilidades son equivalentes pero el uso de la versión "larga" facilita la detección y diagnóstico de errores por el "parser".

5.1 Sentencia `if'

if (CONDITION)
  THEN-BODY
elseif (CONDITION)
  ELSEIF-BODY
else
  ELSE-BODY
endif

La parte `elseif' y `else' son opcionales. Puede haber varias secciones `elseif' pero sólo una `else'. Notar que `elseif' va todo junto, no debe ir separado como en `else if'.

Ejemplo:

if (rem (x, 2) == 0)
  printf ("x es par\n");
elseif (rem (x, 3) == 0)
  printf ("x es impar y divisible por 3\n");
else
  printf ("x es impar pero no divisible por 3\n");
endif

Para verificar condiciones sobre matrices es importante saber que si una matriz de aparece en una condición esta es tomada como verdad si todos loe elmentos son verdad:

octave> x
x =
  3  5  1
  3  2  7
  3  8  4
octave> if x>2 ; disp("verdad") ; endif
octave> if x>0 ; disp("verdad") ; endif
verdad
octave> 

Esto también se puede lograr con la función `all()'. para vectores fila o columna `all(X)' da 1 o 0 si todos los elementos son "verdaderos" (diferentes de 0). Para una matriz `X' de `n x m ' la expresión `Y=all(X)' retorna un vector de `1 x m' donde `Y(k)=all(X(:,k))'. Una función similar es `any(X)' que retorna 1 si alguno de los elementos es verdadero.

octave> x
x =
  3  5  1
  3  2  7
  3  8  4
octave> all(x==3)
ans =
  1  0  0
octave> all(x>1)
ans =
  1  1  0
octave> any(x==1)
ans =
  0  0  1
octave> any(x>7)
ans =
  0  1  0
octave> 

5.2 Sentencia 'while'

Es el operador más simple de repetición. Repite un cierto grupo de sentencias hasta que se cumpla una cierta condición:

while (CONDITION)
  BODY
endwhile

Por ejemplo el ejemplo siguiente calcula el factorial de un entero `n':

p=1;
while (n >1)
  p=p*n--;
endwhile

5.3 Sentencia `for'

Esta es la sentencia más conveniente cuando se deben contar iteraciones en un lazo. Corresponde a la sentencia `do' de Fortran y la forma general es:

for VAR = EXPRESSION
  BODY
endfor

En general `EXPRESSION' puede ser una matriz y `VAR' va tomando dentro del lazo cada uno de las columnas de `EXPRESSION''. Por ejemplo:

octave> for k=[3 5 4 7 6]
> k
> endfor
k = 3
k = 5
k = 4
k = 7
k = 6
octave> 

El uso más frecuente es para hacer un lazo sobre un índice que se incrementa constantemente en cada iteración, esto se puede hacer en forma muy compacta con un "rango": `for k=1:n'. En una versión más sofisticada la variable va tomando como valor cada una de las columnas de la expresión:

octave> a
a =
   3   2   1   8   1
   6   6  10   5   4
octave> for col=a
> col'
> endfor
ans =
  3  6
ans =
  2  6
ans =
  1  10
ans =
  8  5
ans =
  1  4
octave> 

5.4 La sentencia `break'

Esta sentencia permite "salir" de un lazo `while' o `for', el siguiente ejemplo encuentra el mínimo divisor de un entero y también identifica si el número es primo

     num = 103;
     div = 2;
     while (div*div <= num)
       if (rem (num, div) == 0)
         break;
       endif
       div++;
     endwhile
     if (rem (num, div) == 0)
       printf ("Smallest divisor of %d is %d\n", num, div)
     else
       printf ("%d is prime\n", num);
     endif

5.5 La sentencia `continue'

Es similar a `break' pero pasa a la siguiente iteración del lazo. El siguiente ejemplo muestra por pantalla sólo los elementos elementos pares de un vector `vec':

vec = round (rand (1, 10) * 100);

# imprime solo los elementos pares

for x = vec
  if (rem (x, 2) != 0)
    continue;
  endif
  printf ("%d\n", x);
endfor

5.6 Continuación de lineas

Octave soporta la continuación de líneas de Matlab (`...') y también la forma más usual en la mayoría de los lenguajes de script de Unix (`\'):

x= variable_demasiado_larga + ...
>    otra_variable_demasiado_larga \
>    + 1


Next Chapter, Previous Chapter

Table of contents of this chapter, General table of contents

Top of the document, Beginning of this Chapter