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".
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>
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
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>
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
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
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