Fortran
Control de ejecución
Buscar..
Si construir
El constructo if
(llamado una instrucción IF de bloque en FORTRAN 77) es común en muchos lenguajes de programación. Se ejecuta condicionalmente un bloque de código cuando una expresión lógica se evalúa como verdadera.
[name:] IF (expr) THEN
block
[ELSE IF (expr) THEN [name]
block]
[ELSE [name]
block]
END IF [name]
dónde,
- nombre - el nombre de la construcción if (opcional)
- expr - una expresión lógica escalar entre paréntesis
- bloque - una secuencia de cero o más declaraciones o construcciones
Un nombre de construcción al comienzo de una instrucción if then
debe tener el mismo valor que el nombre de construcción al end if
instrucción end if
, y debe ser único para la unidad de alcance actual.
En las sentencias if
, las ecuaciones (in) y las expresiones lógicas que evalúan una sentencia se pueden utilizar con los siguientes operadores:
.LT. which is < ! less than
.LE. <= ! less than or equal
.GT. > ! greater than
.GE. >= ! greater than or equal
.EQ. = ! equal
.NE. /= ! not equal
.AND. ! logical and
.OR. ! logical or
.NOT. ! negation
Ejemplos:
! simplest form of if construct
if (a > b) then
c = b / 2
end if
!equivalent example with alternate syntax
if(a.gt.b)then
c=b/2
endif
! named if construct
circle: if (r >= 0) then
l = 2 * pi * r
end if circle
! complex example with nested if construct
block: if (a < e) then
if (abs(c - e) <= d) then
a = a * c
else
a = a * d
end if
else
a = a * e
end if block
Un uso histórico de la construcción if
encuentra en lo que se denomina una declaración "aritmética if". Sin embargo, dado que esto puede ser reemplazado por construcciones más modernas, no se trata aquí. Más detalles se pueden encontrar aquí .
SELECCIONAR CASO de construcción
Una construcción de select case
condicionalmente ejecuta un bloque de construcciones o declaraciones según el valor de una expresión escalar en una declaración de select case
. Este constructo de control puede considerarse como un reemplazo para el goto
computado.
[name:] SELECT CASE (expr)
[CASE (case-value [, case-value] ...) [name]
block]...
[CASE DEFAULT [name]
block]
END SELECT [name]
dónde,
- nombre : el nombre de la construcción de
select case
(opcional) - expr - una expresión escalar de tipo entero, lógico o carácter (entre paréntesis)
- valor-caso : una o más expresiones de inicialización escalar de enteros, lógicas o caracteres encerradas entre paréntesis
- bloque - una secuencia de cero o más declaraciones o construcciones
Ejemplos:
! simplest form of select case construct
select case(i)
case(:-1)
s = -1
case(0)
s = 0
case(1:)
s = 1
case default
print "Something strange is happened"
end select
En este ejemplo, (:-1)
valor de un caso es un rango de valores que coincide con todos los valores menores que cero, (0)
coincide con los ceros, y (1:)
coincide con todos los valores por encima de cero, la sección default
incluye si otras secciones lo hicieron sin ejecutar.
Construcción de bloques DO
Una construcción do
es una construcción de bucle que tiene una serie de iteraciones gobernadas por un control de bucle
integer i
do i=1, 5
print *, i
end do
print *, i
En la forma anterior, la variable de bucle i
pasa a través del bucle 5 veces, tomando los valores de 1 a 5 por turno. Una vez que la construcción ha completado, la variable de bucle tiene el valor 6, es decir, la variable de bucle se incrementa una vez más después de completar el bucle .
Más generalmente, la construcción de bucle do
se puede entender de la siguiente manera
integer i, first, last, step
do i=first, last, step
end do
El bucle comienza con i
con el valor first
, incrementando cada iteración por step
hasta que i
sea mayor que la last
(o menor que la last
si el tamaño del paso es negativo).
Es importante tener en cuenta que desde Fortran 95, la variable de bucle y las expresiones de control de bucle deben ser enteras.
Una iteración se puede finalizar de manera prematura con la instrucción de cycle
do i=1, 5
if (i==4) cycle
end do
y toda la construcción puede cesar la ejecución con la declaración de exit
do i=1, 5
if (i==4) exit
end do
print *, i
do
construcciones pueden ser nombradas:
do_name: do i=1, 5
end do do_name
Lo cual es particularmente útil cuando hay construcciones anidadas do
do1: do i=1, 5
do j=1,6
if (j==3) cycle ! This cycles the j construct
if (j==4) cycle ! This cycles the j construct
if (i+j==7) cycle do1 ! This cycles the i construct
if (i*j==15) exit do1 ! This exits the i construct
end do
end do1
do
construcciones do
también pueden tener un control de bucle indeterminado, ya sea "para siempre" o hasta que se cumpla una condición determinada
integer :: i=0
do
i=i+1
if (i==5) exit
end do
o
integer :: i=0
do while (i<6)
i=i+1
end do
Esto también permite un infinito do
bucle a través de un .true.
declaración
print *,'forever'
do while(.true.)
print *,'and ever'
end do
Un constructo do
también puede dejar el orden de iteraciones indeterminado.
do concurrent (i=1:5)
end do
teniendo en cuenta que la forma de control de bucle es la misma que en un control forall
.
Hay varias restricciones en las declaraciones que pueden ejecutarse dentro del rango de una construcción do concurrent
que están diseñadas para garantizar que no haya dependencias de datos entre las iteraciones de la construcción. Esta indicación explícita por parte del programador puede permitir una mayor optimización (incluida la paralelización) por parte del compilador, lo que puede ser difícil de determinar de otro modo.
Las variables "privadas" dentro de una interacción se pueden realizar mediante el uso de una construcción de block
dentro del do concurrent
:
do concurrent (i=1:5, j=2:7)
block
real tempval ! This is independent across iterations
end block
end do
Otra forma del bloque do
constructivo utiliza una instrucción continue
etiquetada en lugar de un end do
:
do 100, i=1, 5
100 continue
Incluso es posible anidar tales construcciones con una declaración de terminación compartida
do 100, i=1,5
do 100, j=1,5
100 continue
Ambas formas, y especialmente la segunda (que es obsolescente), generalmente deben evitarse en aras de la claridad.
Finalmente, también es un no-bloque do
construir. Esto también se considera que es obsoleto y se describe en otra parte , junto con los métodos para reestructurar como un bloque do
construir.
Donde construir
El where
constructo, disponible en Fortran90 representa en adelante un enmascarado do
construir. La declaración de enmascaramiento sigue las mismas reglas de la instrucción if
, pero se aplica a todos los elementos de la matriz dada. Usando where
permite que las operaciones se lleven a cabo en una matriz (o múltiples matrices del mismo tamaño), cuyos elementos satisfacen una regla determinada. Esto se puede usar para simplificar operaciones simultáneas en varias variables.
Sintaxis:
[name]: where (mask)
block
[elsewhere (mask)
block]
[elsewhere
block]
end where [name]
Aquí,
- nombre - es el nombre dado al bloque (si es nombrado)
- máscara - es una expresión lógica aplicada a todos los elementos
- bloque - serie de comandos a ejecutar
Ejemplos:
! Example variables
real:: A(5),B(5),C(5)
A = 0.0
B = 1.0
C = [0.0, 4.0, 5.0, 10.0, 0.0]
! Simple where construct use
where (C/=0)
A=B/C
elsewhere
A=0.0
end
! Named where construct
Block: where (C/=0)
A=B/C
elsewhere
A=0.0
end where Block