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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow