Está en la página 1de 18

UNIVERSIDAD AUSTRAL DE CHILE FACULTAD DE CIENCIAS DE LA INGENIERÍA INSTITUTO DE OBRAS CIVILES ESCUELA DE INGENIERÍA CIVIL EN OBRAS CIVILES.

CIVILES ESCUELA DE INGENIERÍA CIVIL EN OBRAS CIVILES. Conceptos Introductorios sobre el Lengua je FORTRAN.

Conceptos Introductorios sobre el Lenguaje FORTRAN.

Informativo Nº2

Estos apuntes son entregados a los alumnos que cursan la asignatura de Computación para Ingeniería Estructural (IOCC 281), para la Carrera de Ingeniería Civil en Obras Civiles de la Universidad Austral de Chile. Su confección se ha hecho con el fin de entregar a los alumnos una guía de comandos básicos y sencillos ejemplos que les facilite el aprendizaje del lenguaje FORTRAN. Lógicamente la presente guía puede quedar supeditada a limitaciones y errores, los cuales debieran sortearse con información complementaria y correcciones, respectivamente, en virtud de la correcta elaboración de apuntes para fines educativos de vuestra Escuela.

Pablo E. Oyarzún H. Ing. Civil en Obras Civiles Universidad Austral de Chile

1.

Estructuras de control de ejecución de los programas.

Estas estructuras permiten alterar el flujo de ejecución de los programas y, en relación a sus roles dentro de la programación estructurada, éstas pueden clasificarse como estructuras de secuencia, selección e iteración (repetición).

1.1. Estructuras de selección.

Bloque IF.

Forma general:

IF (condición 1) THEN

[bloque 1]

ELSE IF (condición 2) THEN

[bloque 2]

ELSE IF (condición 3) THEN

[bloque 3]

ELSE

[bloque 4]

ENDIF

en la que

(condición):

Observaciones:

Se expresa siempre a través de una expresión lógica, como las que serán vistas a continuación.

Los bloques 1 al 4 pueden estar constituidos por cualquier combinación de comandos (inclusive por nuevos bloques “IF”);

El comando ENDIF es obligatorio para cada IF utilizado;

Las instrucciones ELSE IF, así como sus bloques asociados, son opcionales;

El comando ELSE también es opcional y el [bloque 4] se ejecutaría únicamente si no son satisfechas ninguna de las condiciones anteriores (de la 1 a la 3). Así, en el caso más simple la estructura de un “bloque IF” quedaría

IF (condición 1) THEN

[bloque 1]

END

No se permite la transferencia del control de ejecución del programa desde afuera hacia el interior de alguno de los “bloques IF”.

Bloque SELECTCASE.

La estructura SELECTCASE permite efectuar selección de entre varias alternativas de bloque de la siguiente forma.

en la que

Forma general:

SELECTCASE (VAR1)

CASE (condición 1)

[bloque 1]

CASE (condición 2)

[bloque 2]

CASE (condición 3)

[bloque 3]

CASE DEFAULT

[bloque defecto]

ENDSELECT

(VAR1): Variable que será testeada para que el compilador escoja el bloque a ser rodado (ejecutado); (condición 1), etc.: Condiciones directamente relacionadas a la variable “VAR1”. Por ejemplo si “VAR1” cumple con la condición “condición 1” entonces [bloque 1] es aquel que será rodado durante la ejecución;

[bloque 1], etc.: Consisten en conjuntos de comandos, de entre los cuales uno de estos conjuntos será rodado de acuerdo a si su condición asociada es cumplida; [bloque defecto]: Aquel conjunto de comandos que serán ejecutados en caso que no se cumpla ninguna de las condiciones listadas junto a los comandos CASE previos.

Observaciones:

Las condiciones, tales como (condición 1), caso adoptaren un valor puntual simplemente se escribe dicho valor, por ejemplo (VAR1=1):

SELECTCASE (VAR1)

CASE (1)

[bloque 1]

Si por acaso la condición consiste en que VAR1 sea mayor que un determinado valor, entonces aquello puede implementarse de la siguiente forma ( VAR1 2 ):

SELECTCASE (VAR1)

CASE (2:)

[bloque 1]

De forma general, para incluir rangos de valores, a modo de condición, se procede de la siguiente forma (para -3 VAR  1 o 4 VAR 8 ):

SELECTCASE (VAR1)

CASE (-3: -1, 4: 8)

[bloque 1]

La variable VAR1 puede ser entera o cadena de caracteres. En este último caso los valores que pueda adoptar dicha cadena, dentro de cada una de las condiciones, se escribe entre comillas dobles, o sea

CHARACTER*5 (VAR1)

SELECTCASE (VAR1)

CASE (“xyz12”)

[bloque 1]

Por otro lado las expresiones lógicas también constituyen estructuras de selección por lo que serán vistas en lo que sigue.

1.2. Expresiones lógicas.

Las expresiones lógicas son aquellas que al ser evaluadas resulta un valor lógico: verdadero o falso. Se constituyen mediante operadores lógicos. Los operandos lógicos pueden ser constantes lógicas, variables lógicas, funciones lógicas, expresiones relacionadas o expresiones lógicas entre paréntesis. Estos operandos constituyen la forma básica para componer expresiones lógicas; cabe mencionar también que una expresión lógica no contiene necesariamente un operador lógico. Algunas entidades que constituyen una expresión lógica se verán a continuación.

1.2.1. Constantes lógicas.

Especifican un valor lógico; verdadero o falso:

.TRUE.

.FALSE.

Una constante lógica puede ser atribuida a una variable del tipo lógico.

1.2.2.

Expresiones relacionales.

Constituyen una forma particular de expresiones lógicas, y viabilizan el establecimiento de relaciones entre entidades del programa.

en la que

Forma general:

E 1 op E 2

E i :

Expresión aritmética o expresión del tipo cadena de

op :

caracteres. Consiste en un operador relacional.

Operadores relacionales

Significado

.EQ.

igual

.NE.

.GT.

>

.GE.

.LT.

<

.LE.

Observaciones:

El

valor de la expresión relacional es siempre .TRUE. o .FALSE.;

Las expresiones aritméticas comparadas pueden ser de tipos diferentes (real o entero);

Sólo se pueden comparar dos expresiones aritméticas por vez.

Ejemplos:

A .LT. I

X**2.7 .LE. (5*RA+4)

K .NE. 27.3E+05

1.2.3.

Operadores lógicos.

Se utilizan para combinar valores lógicos; el lenguaje FORTRAN dispone de los siguientes operadores lógicos:

Operadores lógicos

Significado

Ejemplo

.NOT.

negación

.NOT. A

.AND.

“y” lógico

A .AND. B

.OR.

“o” lógico

A .OR. B

.EQV.

equivalencia lógica

A .EQV. B

.NEQV.

no equivalencia

A .NEQV. B

En esta tabla los operadores aparecen descritos de arriba hacia abajo, de mayor a menor jerarquía (los operadores .EQV. y .NEQV. poseen la misma jerarquía). En resumen, una forma más completa de escribir una expresión lógica sería la siguiente.

en la que

E 1 op 1 E 2 op 2 E 3 op 3 E 4

E i :

es un operando lógico.

op i :

es un operador lógico.

Ejemplos:

(A

.GT. R) .AND. (I .GT. F)

(S

.EQ. TE)

.AND.

.NOT. (X1 .LE. PI)

FLAG .OR. ACHOU

A .GT. R FLAG

En estos ejemplos A, F, PI, R, S, TE Y X1 son variables de tipo real, mientras que I es una variable de tipo entera y las variables FLAG y ACHOU son de tipo lógico.

Observaciones:

Una expresión lógica, cuando es evaluada, produce siempre un valor de tipo lógico (.TRUE. o .FALSE.);

En la ausencia de paréntesis, el orden de cálculo para las expresiones lógicas sigue la siguiente regla de precedencia, de mayor a menor prioridad:

Jerarquía de operadores lógicos. Operadores relacionales. Jerarquía de los operadores aritméticos.

1.3.

Estructuras de iteración.

Ciclo DO.

Forma general:

DO n , i = m 1 , m 2 , m 3

[bloque 1]

 

n

CONTINUE

en la cual

 

n:

Número de línea de comando que acota el accionar de la

i:

instrucción DO; Variable de testeo para el ciclo “DO” (también conocido como “contador”), y puede ser de tipo real o entero;

m

1 :

Valor inicial de “i”;

m

2 :

Valor final de “i”;

m

3 :

Incremento; si se omite se asume igual a 1;

[bloque 1]:

Conjunto de comandos a ser ejecutados en forma repetitiva,

Funcionamiento:

 

para diferentes valores del contador.

Como punto de partida “i” recibe el valor dado por “m 1 ”; las acciones especificadas por [bloque 1] se ejecutan repetitivamente mientras se cumpla

m

1

m

1

im

im si m 0

si

0 o

23

23

m

Luego de cada ejecución del [bloque 1], la variable “i” es actualizada con el valor “i + m 3 ”, o sea

i im

3

La ejecución reiterada del [bloque 1] finaliza cuando

im

im

2

2

si

si

m 0 m 0

3

3

o

y se ejecuta apenas una vez en caso que

mmsi

si

mm

12

12

Observaciones:

m

m

3

3

0

0

o

La sentencia que finalice la ejecución del “ciclo DO” puede ser cualquier comando ejecutable, (excepto GO TO, IF, END, RETURN o DO). Preferentemente puede utilizarse el comando CONTINUE, instrucción que

no

realiza acción alguna;

valor de la variable “i” no puede ser alterado dentro de [bloque 1];

El

No se permite el salto desde una línea de comando localizada fuera de un “ciclo DO” hacia otra línea ubicada dentro del mismo;

No puede entrelazarse un “ciclo DO” con otro, mientras que sí puede un “ciclo DO” estar completamente comprendido dentro de otro;

Tampoco se permite el cruce de “ciclos DO” con algún “bloque IF”.

Cualquiera de estas estructuras puede estar completamente incluida dentro

de otra;

Una forma muy recurrente de representar “ciclos DO” en la actualidad consiste en la inclusión del comando ENDDO, omitiendo así la necesidad de

representar el final de dicho ciclo mediante la incorporación de una línea numerada. Asimismo el comando EXIT permite parar la ejecución del ciclo

y salir de éste. A continuación se ilustra un ejemplo de fragmento de programa:

REAL MOD_VAR1(12)

DO i = m 1 , m 2 , m 3

READ (*,*) VAR1(i)

IF (VAR1. LT. 0) THEN

MOD_VAR = - VAR1(i)

ELSE

EXIT

ENDIF

ENDDO

El fragmento anterior lee la “i”-ésima componente de la variable vectorial “VAR1”, desde la pantalla, y almacena su valor (en módulo o valor absoluto) dentro de la variable “MOD_VAR” únicamente si el valor almacenado en “VAR1(i)” es menor que cero. Apenas detecte una componente mayor a cero, la ejecución se sale de dicho “ciclo DO” mediante uso del comando EXIT.

Ejemplos:

Un fragmento de programa que calcula el factorial de un número “N”:

INTEGER M, N REAL FACT

….

READ(*,*) N FACT = 1 DO 20 M = N, 2, -1 FACT = FACT * M

20

CONTINUE WRITE(*,30) N, FACT

30

FORMAT (1X, ‘FACTORIAL DE’, I4, “=”, F5.0)

….

SUMA

N

i 1

Esta vez se muestra, a continuación, un fragmento de programa que calcula

x i , siendo los x i leídos por pantalla. El valor de N (número de datos), es el

primer valor que se lee por pantalla.

INTEGER N REAL SUMA, X

….

READ (*,*) N SUMA = 0 DO 10 I = 1, N READ (*,*) X SUMA = SUMA + X

10 CONTINUE WRITE (*,*) ‘SUMA = ’, SUMA

….

Comando GO TO.

acompañado

incondicional hacia la línea de comandos “n”:

Suele

utilizarse

en la cual

Forma general:

GO TO n

de

un

“bloque

IF”,

y

realiza

un

salto

n:

Ejemplos:

Número de línea de comando ejecutable hacia la cual el control es transferido.

Un fragmento de programa que calcula el factorial de un número “N” puede quedar, en forma alternativa, de la siguiente forma:

INTEGER M, N REAL FACT

….

READ (*,*) N FACT = 1 M = N

10 IF (M. GE. 2) THEN

C

INICIO ESTRUCTURA “EN CUANTO FACT = FACT * M M = M – 1 GO TO 10

- HAGA

C

FIN ESTRUCTURA “EN CUANTO

- HAGA

ENDIF WRITE (*,*) ‘FACTORIAL DE ’, N, ‘ = ’, FACT

….

1.4.

Otras formas de estructuras de control.

Los compiladores antiguos de lenguaje FORTRAN no incluían estructuras como los “bloque IF”, por lo que se utilizaban estructuras similares, aunque más rudimentarias, para controlar el flujo de ejecución de los programas. Algunos de estas estructuras se señalan dentro de lo que sigue.

IF aritmético:

Forma general:

IF (<a>) n 1 , n 2 , n 3

en la que

<a>:

Es una expresión aritmética (entera o real);

n 1 , n 2 , n 3 :

Son números de líneas de comandos (pueden ser repetidos).

Funcionamiento:

El valor de la expresión <a> es obtenido y así el control es transferido a la línea de comandos señalada con el número siguiente:

Ejemplo:

n 1 si <a> < 0 n 2 si <a> = 0 n 3 si <a> > 0

INTEGER I, J, N

….

15

J = I ** 2

….

….

IF (I – N) 15, 15, 30

30

STOP END

IF lógico:

Forma general:

IF (<a>) <sentencia>

en la que

<a>:

Es una expresión lógica;

<sentencia>:

Conjunto de comandos excepto DO, IF, END, etc.

Funcionamiento:

La expresión lógica <a> es evaluada y <sentencia> será ejecutada si <a> es verdadera; en caso que <a> sea falsa, <sentencia> será ignorada.

Ejemplo:

INTEGER I, J, N

….

15 J = I ** 2

….

….

IF (I. LE. N) GO TO 15 STOP END

Este ejemplo es equivalente al anterior.

GO TO computado:

en la que

Forma general:

GO TO ( n 1 , n 2 ,

, n k ) , i

n k :

i:

Son números de líneas de comandos ejecutables (pueden ser repetidas); Consiste de una expresión entera; la coma antes de “i” es opcional.

de comandos ejecutables (pueden ser repetidas); Consiste de una expresión entera; la coma antes de “

Funcionamiento:

La expresión “i” es evaluada y el control de ejecución del programa es transferido hacia la línea de comando “n m ” cuando el valor de “i” es igual a “m”; si el valor de “i” estuviese fuera del intervalo [ 1 , k ] , el GO TO computado es ignorado.

Ejemplo:

 

GO TO ( 10 , 20 , 30 , 40 ) j

Significa que para

j

= 1 desvía el control hacia la línea de comando número 10,

j

= 2 desvía el control hacia la línea de comando número 20,

j

= 3 desvía el control hacia la línea de comando número 30,

j

= 4 desvía el control hacia la línea de comando número 40.

Para cualquier otro valor de “j” el comando GO TO es ignorado.

Ejemplo:

El siguiente programa, dados los números de orden de los días de la semana, entrega por extenso tales nombres.

INTEGER DIA

….

READ (*,*) DIA GO TO (10, 20, 30, 40, 50, 60, 70) DIA GO TO 80

C

INICIO “CASE”

 

10

WRITE (*,*) ‘LUNES’ GO TO 80

20

WRITE (*,*) ‘MARTES’ GO TO 80

30

WRITE (*,*) ‘MIERCOLES’ GO TO 80

40

WRITE (*,*) ‘JUEVES’ GO TO 80

50

WRITE (*,*) ‘VIERNES’ GO TO 80

60

WRITE (*,*) ‘SABADO’ GO TO 80

70

WRITE (*,*) ‘DOMINGO’ GO TO 80

C

FIN “CASE”

 

80

….

2. Variables compuestas.

Las variables compuestas homogéneas (conjuntos de variables del mismo tipo) permiten la implementación de estructuras de datos algo más complejas que aquellas permitidas por el uso de variables simples, sin embargo se tornan extremadamente útiles, por ejemplo al representar y realizar operaciones sobre conjuntos de ecuaciones. Tales conjuntos homogéneos son representados por secuencias de variables identificadas mediante uno o varios índices.

2.1. Formas de representación para vectores y matrices; generalidades.

Los vectores

corresponden

a conjuntos unidimensionales de variables,

mientras que las matrices a conjuntos de más de una dimensión.

Observaciones:

La dimensión de variables compuestas se representa mediante índices; así dichas variables pueden tener hasta 7 índices;

El

índice de una variable puede asumir valores enteros cualesquiera;

Todos los elementos de un vector deben ser del mismo tipo, el cual es definido como en el caso de variables simples (INTEGER, REAL, CHARACTER, LOGICAL, COMPLEX, etc.);

En caso que el tipo de variable no se haya declarado, para la variable compuesta, se hace obligatoria la declaración por medio del comando DIMENSION;

Un determinado elemento de un vector o matriz puede utilizarse como una variable cualquiera en FORTRAN, por ejemplo

A (I + 1) = 2 * A (I) + B (I – 1)

 

B (3) = 0

 

A (I + 1) = A (I)

Los elementos de un vector son almacenados en posiciones consecutivas de

la memoria del computador.

2.2.

Declaración DIMENSION para vectores.

en la cual

Forma general:

DIMENSION a 1 (e 11 : e 12 ) , a 2 (e 21 : e 22 ) ,

, a k (e k1 : e k2 )

a i :

Nombres de variables de tipo vector;

e i1 :

Límite inferior del índice correspondiente (opcional);

e i2 :

Límite superior del índice.

Los límites e i1 y e i2 deben ser constantes enteras tal que

Observaciones:

e

i2

e

i1

.

DIMENSION es una declaración, y debe ir antes del primer comando ejecutable del programa y después de las declaraciones de tipo y de constantes simbólicas;

Si no se especifica el límite inferior e i1 , se asume igual a 1;

Las declaraciones de tipo de variable pueden substituir completamente la aparición de la declaración DIMENSION, como será visto a continuación.

Ejemplos:

a) DIMENSION VECTOR1(100), VECTOR2(50)

Esta declaración informa al compilador que VECTOR1 y VECTOR2 son vectores; VECTOR1 está constituido por 100 elementos y VECTOR2 por 50 elementos. Dichos elementos o componentes quedan identificados a partir de los subíndices, los cuales de 1 a 100 y de 1 a 50, respectivamente.

b) DIMENSION VECTOR3(0:9) , VECTOR4(-3:1)

En este ejemplo los subíndices varían de 0 a 9 para VECTOR3 (o sea, se trata de un vector de 10 componentes), y de -3 a 1 para VECTOR4 (vector de 4 componentes).

2.3.

Declaraciones de tipo para vectores.

en la que

Forma general:

<Tipo> a 1 (e 11 : e 12 ) , a 2 (e 21 : e 22 ) ,

, a k (e k1 : e k2 )

<Tipo> :

a i , e i1 , e i2 :

INTEGER, REAL, LOGICAL, etc.;

Tienen

declaración DIMENSION.

el

mismo

significado

antes

2.4. Declaración DIMENSION para matrices.

definido

para

la

Las matrices corresponden a conjuntos con más de una dimensión, no obstante la declaración DIMENSION se utiliza en forma absolutamente análoga respecto a los vectores.

Ejemplos:

DIMENSION MATRIZ (3, 4), CUBO (5, 10, 17) DIMENSION EXOTIC (0:3, -1:1, 2:10)

2.5. Declaración de tipo para matrices.

Al igual que los vectores, para conjuntos multidimensionales; sus nombres, cardinalidad y límites para los subíndices pueden especificarse en declaraciones de tipo, omitiendo así la necesidad de acudir al uso de la declaración DIMENSION.

Ejemplos:

INTEGER MATRIZ ( 3 , 4 ) , CUBO ( 5 , 10 , 17 ) REAL EXOTIC ( 0 : 3 , -1 : 1 , 2 : 10 )

2.6.

Entrada y salida de conjuntos – DO implícito.

En FORTRAN existe un recurso muy característico en lo que respecta a la entrada y salida de datos pertenecientes a variables compuestas, normalmente conocida como DO implícito. Esta estructura se utiliza, por ejemplo, para leer una secuencia de componentes de un vector o matriz a lo largo de una sola línea, dentro de un archivo de datos.

Forma general:

(<Lista de variables> , i = m 1 , m 2 , m 3 )

en la cual

i , m 1 , m 2 , m 3 tienen el mismo significado ya visto para la utilización del

comando DO.

El DO implícito debe ir siempre asociado a un comando de entrada o salida de datos, y su funcionamiento es similar al del comando DO.

Ejemplos:

Este ejemplo imprime las diez componentes del vector X a lo largo de una

misma línea:

 

WRITE (*, 20) (X(I), I = 1, 10)

20

FORMAT (1X, 10F5.2)

Este otro ejemplo escribe cinco componentes del vector A cada valor en una

línea:

 

WRITE (*, 20) (A(J), J = 1, 5)

20

FORMAT (1X, F5.2)

Este último ejemplo lee consecutivamente en una línea los valores de A(1) , B(1) , A(2) , B(2) , A(3) , B(3):

READ (*, 20) (A(K), B(K), K = 1, 3)

20

FORMAT (6F5.2)