You are on page 1of 57

Manual de Fortran 77

v0.7 Las Palmas, Octubre 2000

Autores : Jesus Garc Quesada a

Reservados todos los derechos. La reproduccin total o parcial de esta obra por cualquier medio o proceo dimiento comprendidos la reprograf y el tratamiento informtico, y la distribucin de ejemplares de ella a a o mediante alquiler o prstamos pblicos, queda rigurosamente prohibida sin la autorizacin escrita de los e u o titulares del copyright, bajo las sanciones establecidas por las leyes. Sin perjuicio de lo anterior, queda expresamente autorizada la reproduccin reprogrca total o parcial de o a esta obra por miembros de la comunidad universitaria de la Universidad de Las Palmas de Gran Canaria para uso docente en el mbito de la misma. a

Edicio de Informtica y Matemticas a a Campus Universitario de Tara 35017 Las Palmas de Gran Canaria ISBN-84-699-4379-0 No Registro: 762501

El FORTRAN es uno de los lenguajes de programacin ms ampliamente utilizados, especialmente entre la comunidad o a cient ca. Fu el primer lenguaje de alto nivel que fu aceptado. Su nombre deriva de FORmula TRANslation e e (traduccin de frmulas) y ha tenido varias o o acciones del programa. describen la Las de revisiones.... Las sentencias ejecutables describen las no ejecutables los datos y macin o datos.

distribucin o

sus caracter sticas, o dan inforsobre la edicin y conversin de o o Una sentencia PROGRAM puede aparecer solo como de la un primera programa

instruccin o

principal. La primera sentencia de un subprograma ha de ser una FUNCTION, SUBROUTINE o

BLOCK DATA.... Los caracteres alfabticos en minsculas, el signo e u de admiracin(!), el subrayado( ) o y las comillas () son extensiones al standard ANSI FORTRAN 77. Se tercalar para legibilidad cdigo fuente. o compilador hace tre min sculas u to en constantes carcter).... a Condistincin o no eny cepde tipo El mejorar del pueden espacios la in-

maysculas u (ex-

sisten en un por una coma y encerradas entre parntesis. La primera e Se representan por un nombre simblico asociado o El tipo Cuando

par de constantes enteras o reales separadas cte.

representa la parte real y la segunda la parte imaginaria....

a determinadas posiciones de memoria.

Se clasican, al igual que las constantes, por su tipo de datos....

de datos de una variable indica el tipo de datos que representa, su precisin y sus requerimientos de memoria. o

se asigna cualquier tipo de datos a una variable, estos son convertidos, si es necesario, al tipo de datos de la variable.

ii

Indice General
1 Introduccin o 1.1 Elementos de un programa fuente FORTRAN 1.1.1 Nombres simblicos . . . . . . . . . . . o 1.1.2 Comentarios . . . . . . . . . . . . . . . 1.1.3 Conjunto de caracteres FORTRAN . . 1.1.4 Estructura de las l neas de cdigo . . . o 1.1.5 Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 2 2 3 3 4 4 5 5 7 7 7 8 8 9 9 9 10 12 12 13 13 15 15 16 18 18 18 19 19

2 Datos 2.1 CONSTANTES . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 ENTERAS . . . . . . . . . . . . . . . . . . . . . . 2.1.2 CONSTANTES REALES . . . . . . . . . . . . . . 2.1.3 CONSTANTES COMPLEJAS . . . . . . . . . . . . 2.1.4 CONSTANTES OCTALES Y HEXADECIMALES 2.1.5 CONSTANTES LOGICAS . . . . . . . . . . . . . . 2.1.6 CONSTANTES TIPO CARACTER . . . . . . . . 2.2 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1 Declaradores de array . . . . . . . . . . . . . . . . . 2.3.2 Almacenamiento en memoria . . . . . . . . . . . . 2.3.3 Subcadenas . . . . . . . . . . . . . . . . . . . . . . 3 EXPRESIONES 3.1 Expresiones aritmticas . e 3.1.1 Uso de parntesis e 3.1.2 Tipos de datos en 3.2 Expresiones de carcter . a 3.3 Expresiones relacionales 3.4 Expresiones lgicas . . . o

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . . . . . . una expresin o . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . aritmtica e . . . . . . . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

4 INSTRUCCIONES DE ASIGNACION 4.1 Asignacin aritmtica . . . . . . . . . . o e 4.2 Asignacin lgica . . . . . . . . . . . . o o 4.3 Asignacin de carcter . . . . . . . . . o a 4.4 Instruccin ASSIGN . . . . . . . . . . . o iii

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

5 INSTRUCCIONES DE ESPECIFICACION 5.1 BLOCK DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 COMMON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 SENTENCIAS DE DECLARACION DE TIPO DE DATOS 5.4.1 DECLARACIONES TIPO NUMERICO . . . . . . . 5.4.2 DECLARACIONES TIPO CARACTER . . . . . . . 5.5 5.6 DIMENSION . . . . . . . . . . . . . EQUIVALENCE . . . . . . . . . . . 5.6.1 ARRAYS EQUIVALENTES . 5.6.2 CADENAS EQUIVALENTES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

20 20 21 22 23 23 24 24 25 25 28 28 28 28 32 32 32 33 33 33 34 34 35 36 36 38 39 39 40 40 42 42 43

6 INSTRUCCIONES DE CONTROL 6.1 DO . . . . . . . . . . . . . . . . . . 6.1.1 DO indexado . . . . . . . . 6.1.2 DO WHILE . . . . . . . . . 6.1.3 END DO . . . . . . . . . . 6.2 END . . . . . . . . . . . . . . . . . 6.3 GO TO . . . . . . . . . . . . . . . 6.3.1 GOTO incondicional . . . . . 6.3.2 GOTO calculado . . . . . . . 6.3.3 GOTO asignado . . . . . . . 6.4 Sentencias IF . . . . . . . . . . . . 6.4.1 IF aritmtico . . . . . . . . e 6.4.2 IF lgico . . . . . . . . . . . o 6.4.3 Bloques IF . . . . . . . . . . 6.5 PAUSE . . . . . . . . . . . . . . . 6.6 RETURN . . . . . . . . . . . . . . 6.7 STOP . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

7 PROCEDIMIENTOS 7.1 INTR INSECAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Nombres Espec cos de las Funciones Genricas e 8.1 FUNCIONES SENTENCIA . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2 SUBPROGRAMAS FUNCTION . . . . . . . . . . . . . . . . . . . . . . .

iv

8.3

SUBRUTINAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44 44 45 46 47 49

9 ENTRADA/SALIDA 9.1 Especicaciones de formato . . . 9.2 Descriptores de formato . . . . . 9.2.1 Descriptores A,E,F,G,I,L 9.3 Descriptores de control . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Introduccin o

El FORTRAN es uno de los lenguajes de programacin ms ampliamente utilizados, eso a pecialmente entre la comunidad cient ca. Fu el primer lenguaje de alto nivel que fu e e aceptado. o o Su nombre deriva de FORmula TRANslation (traduccin de frmulas) y ha tenido varias revisiones.

1.1

Elementos de un programa fuente FORTRAN

Una unidad de programa es una secuencia de instrucciones que terminan con una sentencia END. Puede ser un programa principal o un subprograma FUNCTION (8.2), subrutina (8.3) o BLOCK DATA (5.1). En FORTRAN las sentencias se dividen en dos clases : ejecutables y no ejecutables. Las sentencias ejecutables describen las acciones del programa . Las no ejecutables describen la distribucin de los datos y sus caracter o sticas, o dan informacin sobre la o edicin y conversin de datos. o o La siguiente gura muestra el orden en el que han de aparecer las instrucciones en una unidad de programa FORTRAN : PROGRAM, FUNCTION, SUBROUTINE, BLOCK DATA IMPLICIT Instrucciones de tipo: INTEGER, REAL, DOUBLE PRECISION, PARAMETER COMPLEX, LOGICAL, CHARACTER FORMAT Otras instrucciones de especicacin: o L neas COMMON, DIMENSION, EQUIVALENCE, de y EXTERNAL, INTRINSIC, SAVE comentario Denicin funciones sentencia o ENTRY Instrucciones ejecutables: BACKSPACE, CALL, CLOSE, CONTINUE, DO, DATA ELSE, ELSE IF, END IF, GO TO, IF, INQUIRE, OPEN, READ, RETURN, REWIND, STOP, WRITE, instrucciones asignacin. o END En sta gura, las l e neas verticales separan tipos de instrucciones que se pueden mezclar. Por ejemplo, las DATA se pueden mezclar con las sentencias ejecutables. Sin embargo, las 1

lineas horizontales indican tipos de sentencias que no pueden aparecer mezcladas. Por ejemplo, las instrucciones de declaracin no se pueden solapar con las ejecutables. o Una sentencia PROGRAM puede aparecer solo como la primera instruccin de un programa o principal. La primera sentencia de un subprograma ha de ser una FUNCTION, SUBROUTINE o BLOCK DATA. As por ejemplo, dentro de una unidad de programa: , 1. las FORMAT pueden aparecer en cualquier sitio. 2. todas las funciones sentencia han de preceder a todas las sentencias ejecutables. 3. las DATA pueden aparecer en cualquier parte despus de las sentencias de especie cacin. o 4. la ultima l nea de una unidad de programa ha de ser una END . 1.1.1 Nombres simblicos o

Identican entidades dentro de una unidad de programa. Es una string de letras,d gitos y subrayado ( ). El primer carcter ha de ser una letra. a Una gran parte de los compiladores permite una longitud de 32 caracteres para un nombre simblico. o 1.1.2 Comentarios

Se pueden introducir en el fuente poniendo la letra C o un asterisco * en la columna 1 de la linea. Una linea conteniendo solo espacios es tambin considerada una linea de comentario. e 1.1.3 Conjunto de caracteres FORTRAN

El conjunto de caracteres admisible para FORTRAN es el siguiente : Las letras A B C D E F G H I J K L M N O P Q R S T U V W X Y Z los d gitos 0 1 2 3 4 5 6 7 8 9 los caracteres especiales

Carcter Nombre a Espacio en blanco = Igual + Ms a Menos * Asterisco / Divisin (slash) o ( Parntesis izquierdo e ) Parntesis derecho e , Coma . Punto decimal $ S mbolo dlar o : Dos puntos Apstrofe o Los caracteres alfabticos en minsculas, el signo de admiracin(!), el subrayado( ) y las e u o comillas () son extensiones al standard ANSI FORTRAN 77. Se pueden intercalar espacios para mejorar la legibilidad del cdigo fuente. o El compilador no hace distincin entre maysculas y minsculas (excepto en constantes de o u u tipo carcter). a 1.1.4 Estructura de las l neas de cdigo o

Una linea de una unidad de programa es una secuencia de 72 caracteres Columnas 15 6 772 7380 1.1.5 Campo Etiqueta numricas, cuando existan. De 1 a 99999 e Indicador de continuacin. Carcter no blanco o espacio o a Cuerpo de la sentencia No en secuencia. Se ignoran

Tipos de datos

El tipo de datos puede ser inherente a su construccin, puede venir dado impl o citamente por convencin o ser expl o citamente declarado. Pueden ser

Tipo BYTE LOGICAL LOGICAL*1 LOGICAL*2 LOGICAL*4 INTEGER INTEGER*1 INTEGER*2 INTEGER*4 REAL REAL*4 REAL*8 DOUBLE PRECISION REAL*16 (cudruple precisin) a o COMPLEX COMPLEX*8 COMPLEX*16 DOUBLE COMPLEX CHARACTER*len CHARACTER*(*)

Bytes 1 2, 4 1 2 4 2,4 1 2 4 4 4 8 8 16 8 8 16 16 len

Si no se declara expl citamente (la variable, array, funcin, etc.), el compilador supone que o es entero o real simple segn sea la primera letra del identicador o nombre simblico: u o Si comienza por I, J, K, L, M, N supone que es de tipo entero en otro caso, letras A--H, O--Z supone que es real

Datos

Pueden ser constantes, variables, arrays y subcadenas.

2.1

CONSTANTES

Existen ocho tipos :

Enteras, Reales, Doble precisin, Complejas, Octales, Hexadecimales, Lgicas, Tipo carcter o o a y Tipo Hollerith. Las de tipo octal, hexadecimal y Hollerith no tienen tipo de datos. Asumen el tipo conforme al contexto en que aparecen. 2.1.1 ENTERAS

Son nmeros enteros sin punto decimal. Forma : u sn donde s es un signo opcional y n es una cadena de d gitos decimales. Su valor est en el a rango 2147483648 a 2147483647. Ejemplo 1. 0, 127, +32123 Si su valor est en el rango 32768 a 32767 es tratada como tipo de datos INTEGER*2 y si a est fuera de ste rango como INTEGER*4. a e Las constantes enteras tambin se pueden especicar de forma octal. e 2.1.2 CONSTANTES REALES

Es un nmero con un punto decimal o exponente o ambos. Puede ser positiva, cero o u negativa y puede tener precisin simple (REAL*4), doble precisin (REAL*8) o cudruple o o a precisin (REAL*16). Con mayor detalle : o Precisin simple (REAL*4) puede ser cualquiera de o una constante bsica real a una constante bsica real seguida por un exponente decimal a una constante entera seguida por un exponente decimal Una constante bsica real es una string de d a gitos decimales con una de las formas : s.n sn.n sn.

donde s es un signo opcional y n una cadena de d gitos decimales. El exponente tiene la forma Esn, donde n es una constante entera. El exponente representa una potencia de 10 por la que se ha de multiplicar. Por tanto, una constante en simple precisin puede adoptar una de la siguientes o formas 5

sn.nEsn

s.nEsn

sn.Esn

snEsn

Ejemplo 2. 1.0E6 = 1.0 10 6 = 106 Ocupa 4 bytes y representa un nmero real con un grado de precisin de siete u ocho u o d gitos decimales. El signo menos (-) puede aparecer delante de la mantisa y entre la letra E y el exponente. La magnitud ha de estar en el rango 1.175494 1038 y 3.402823 10+38 Ejemplo 3. 3.14159, Doble precisin (REAL*8, o 6217. , -.00127, +5.0E3, 2E-3

DOUBLE PRECISION)

Es una constante bsica real o una constante entera seguida por un exponente decimal a de la forma: Dsn donde s es un signo opcional y n una cadena de d gitos decimales. Ocupa 8 bytes y el grado de precisin es de 14 a 17 d o gitos decimales. La magnitud ha de estar entre 1.79769 10+308 y 2.22507 10308 . Por tanto, una constante en doble precisin adoptar una de la siguientes formas o a sn.nDsn s.nDsn sn.Dsn snDsn -72.5D-15,

Ejemplo 4. 1234567890D+5, +2.71828182846182D00 , 1D0, 123456789.D0 +2.34567890123D-7, -1D+300 Cudruple precisin (REAL*16) a o

Es una constante bsica real o una constante entera seguida por un exponente decimal a de la forma : Qsn donde s es un signo opcional y n una cadena de d gitos decimales. Ocupa 16 bytes y el grado de precisin es de 32 a 34 d o gitos decimales. La magnitud ha de estar entre 3.362103 104932 y 1.189731 104932 . Por tanto, una constante en doble precisin tendr una de la siguientes formas o a sn.nQsn s.nQsn sn.Qsn snQsn Ejemplo 5. 123456789Q4000, -1.23Q-400 , 6 +2.72Q0

2.1.3

CONSTANTES COMPLEJAS

Consisten en un par de constantes enteras o reales separadas por una coma y encerradas entre parntesis. La primera cte. representa la parte real y la segunda la parte imaginaria. e Complejo simple (COMPLEX*8) Tiene la forma (c,c) donde c es una constante entera (2 4 bytes) o REAL*4. Ocupa 8 bytes o Ejemplo 6. (1.7039, -1.70391), (+12739E3,0.), (1,2), (45.9,12)

Complejo doble (COMPLEX*16, DOUBLE COMPLEX) Tiene la forma (c,c) donde c es una constante entera (2 4 bytes) , REAL*4 o REAL*8 y al menos una de o las constantes del par ser REAL*8. Ocupa 16 bytes a Ejemplo 7. (1.7039D0, -1.7039D0), 2.1.4 (+12739D3,0.D0)

CONSTANTES OCTALES Y HEXADECIMALES

Representan una alternativa a la representacin de constantes numricas. o e Una constante octal es una cadena de d gitos octales encerrados entre apstrofes y seguidos o por el carcter alfabtico O. a e Tiene la forma: oc1 c2 . . . cn donde 0 ci 7, para 1 i n. Una constante hexadecimal es una cadena de d gitos hexadecimales encerrados entre apstrofes o y seguidos por el carcter alfabtico X. a e Tiene la forma: $c1 c2 . . . cn donde ci {0, 1, . . . , 9, A, . . . , F}, para 1 i n. Tanto en las constante octales como en las hexadecimales se ignoran los ceros iniciales si los hubiera. Se puede especicar hasta 128 bits (43 d gitos octales, 32 hexadecimales). 2.1.5 CONSTANTES LOGICAS

Especica un valor lgico, verdadero o falso. Por tanto, solo son posibles las dos constantes o lgicas : o 7

.TRUE. Los puntos delimitadores son necesarios. 2.1.6

.FALSE.

CONSTANTES TIPO CARACTER

Es una cadena de caracteres ASCII imprimibles encerrados entre apstrofes. Tiene la o forma: c1 c2 . . . cn donde ci es un carcter imprimible. a Los apstrofes se puede sustituir por comillas (). o Dentro de la constante tipo carcter, el carcter apstrofe se representa por dos apstrofes a a o o consecutivos (sin espacios entre ambos). La longitud de una constante tipo carcter es a el nmero de caracteres existentes entre los dos apstrofes delimitadores, salvo los dos u o apstrofes consecutivos que representan un apstrofe. o o

2.2

Variables

Se representan por un nombre simblico asociado a determinadas posiciones de memoria. o Se clasican, al igual que las constantes, por su tipo de datos. El tipo de datos de una variable indica el tipo de datos que representa, su precisin y sus o requeriminetos de memoria. Cuando se asigna cualquier tipo de datos a una variable, estos son convertidos, si es necesario, al tipo de datos de la variable. Se puede establecer el tipo de datos de una variable mediante una instruccin de declaracin o o de tipo, por una IMPLICIT o por implicacin segn reglas predenidas. Pueden ser denidas o u antes de la ejecucin del programa por una instruccin DATA o durante la ejecucin por o o o una sentencia de asignacin o de entrada de datos. o Por especicacin, indicando expl o citamente el tipo de datos, mediante una sentencia del tipo INTEGER{*2, *4}, REAL{*4, *8}, DOUBLE PRECISION, etc. Un declaracin expl o cita tiene prioridad sobre el tipo denido por una sentencia IMPLICIT, y tambin sobre una declaracin por implicacin. e o o Por implicacin. En ausencia de declaraciones expl o citas o de sentencias IMPLICIT, todas las variables con nombres que comiencen con las letras I,J,K,L,M N se suponen o enteras. Y las variables que empiecen con cualquier otra letra se suponen REAL*4.

2.3

Arrays

Es un grupo de posiciones de memoria contiguas asociadas a un solo nombre simblico, el o nombre del array. Pueden tener de una a siete dimensiones. Se pueden declarar por sentencias expl citas o por instrucciones DIMENSION, COMMON. Estas instrucciones contienen declaradores de array que denen el nombre, no de dimensiones y no de elementos de cada dimensin del array en cuestin. o o La denicin, igual que para variables. La unica salvedad es que se puede leer un array o entero con una sola instruccin de lectura. o 2.3.1 Declaradores de array

Especica el nombre simblico que identica al array e indica las propiedades de ste array. o e Tiene la forma : a(d[,d]. . . ) donde a es el nombre simblico del array o d es un declarador de dimensin, pudiendo especicar el l o mite inferior y superior del sub ndice en la forma [di :]ds donde di = l mite inferior de la dimensin y o ds =l mite superior de la dimensin especicada. o El nmero de declaradores de dimensin indica el no de dimensiones del array. El valor u o del l mite inferior puede ser negativo, cero o positivo. Y el valor del limite superior ser a mayor o igual al del limite superior. El nmero de elemntos en la dimensin es de ds di + 1. u o Si no se especica l mite inferior, se supone igual a 1. El l mite superior de la ultima dimensin puede ser un asterisco(*) indicando que tomar o a un valor que ser pasado en una lista de parmetros de un subprograma. a a Cada l mite de una dimensin ha de ser una expresin aritmtica entera. o o e Limites que no son constantes solo se pueden utilizar en un subprograma para denir arrays ajustables. El no de elementos de un array es el producto del nmero de elementos en cada dimensin. u o Ejemplo 8. nombre(4,-5:5,6), lista(10), m(0:0) 2.3.2 Almacenamiento en memoria

El FORTRAN siempre almacena un array en memoria como una secuencia lineal de valores. 9

Un array unidimensional se almacena con su primer elemento en la primera posicin de o lamacenamiento y el ultimo elemento en la ultima posicin de almacenamiento de la se o cuencia. Un array multidimensional se almacena de forma que los primeros sub ndices var ms an a rpidamente que los siguientes. Esto se llama orden de progresin de sub a o ndices. Vase e gura 1. El tipo de datos de un array se especica igual que en las variables. Todos los elementos de un array tienen el mismo tipo de datos . Cualquier valor asignado a un elemento de array ser convertido al tipo de datos del array. a En las instrucciones COMMON, DATA, EQUIVALENCE, NAMELIST, SAVE de entrada/salida y de declaracin de tipo se puede especicar el nombre del array sin subindices, indicando o que se va a usar ( o denir) la totalidad del array. Anlogamente ocurre si se usa como argumentos formales de las sentencias FUNCTION, a SUBROUTINE y ENTRY. En cualquir otro tipo de instrucciones no est permitido. a 2.3.3 Subcadenas

Es un segmento contiguo de una variable tipo carcter o de un elemento de un array tipo a carcter. Una referencia de subcadena tiene una de las siguientes formas : a v([e1 ] : [e2 ]) o a(s[, s] . . . )([e1 ] : [e2 ]) donde v es un nombre de una variable tipo carcter a a es un nombre de un array tipo carcter a s es una expresin de sub o ndice e1 es una expresin numrica que especica la posicin del primer carcter o e o a e2 es una expresin numrica que especica la posicin del ultimo carcter o e o a Ejemplo 9. si LABEL=XVERSUSY entonces LABEL(2:7) ser VERSUS a Si los valores de las expresiones numricas e1 o e2 no son de tipo entero se truncan sus e partes fraccionarias antes de su uso, a efectos de convertirlos en un valor entero. Los valores de e1 y e2 cumplirn las condiciones : a 1 e1 e2 long 10

Array unidimensional COEF(5) 1 COEF(1) 2 COEF(2) 3 COEF(3) 4 COEF(4) 5 COEF(5)

Posiciones de memoria

Array bidimensional A(3,4) 1 2 3 A(1,1) A(2,1) A(3,1) 4 5 6 A(1,2) A(2,2) A(3,2) 7 8 9 A(1,3) A(2,3) A(3,3) 10 11 12 A(1,4) A(2,4) A(3,4)

Posiciones de memoria

Array tridimensional P(3,3,3) 19 P(1,1,3) 22 P(1,2,3) 25 P(1,3,3) 20 P(2,1,3) 23 P(2,2,3) 26 P(2,3,3) 21 P(3,1,3) 24 P(3,2,3) 27 P(3,3,3) 10 P(1,1,2) 13 P(1,2,2) 16 P(1,3,2) 11 P(2,1,2) 14 P(2,2,2) 17 P(2,3,2) 1 2 3 12 P(3,1,2) 15 P(3,2,2) 18 P(3,3,2) P(1,1,1) 4 P(1,2,1) 7 P(1,3,1) P(2,1,1) P(3,1,1) 5 6 P(2,2,1) P(3,2,1) 8 9 P(2,3,1) P(3,3,1)

Posiciones de memoria

Figura 1: Almacenamiento de arrays

11

donde long es la longitud de la variable tipo carcter o elemento de array. a Si se omite e1 , el compilador supone que es 1. Y si se omite e2 , supone que e2 es igual a long. Ejemplo 10. NAME(1,3)(:7) especica la subcadena que comienza en la posicin 1 y o a termina en la 7 del elemento de array tipo carcter NAME(1,3). a

EXPRESIONES

Consiste en una combinacin de operadores con constantes,variables y/o referencias a funo cin. o Pueden ser aritmticas, de carcter, relacionales o lgicas, produciendo respectivamente e a o valores aritmticos, de carcter, o lgicos. e a o

3.1

Expresiones aritmticas e

Se forman con elementos aritmticos y operadores aritmticos. Su evaluacin produce un e e o unico valor numrico. Un elemento aritmtico puede ser : e e una referencia numrica escalar e una expresin atimtica entre parntesis o e e una referencia a funcin numrica o e El trmino numrico incluye datos lgicos ya que estos son tratados como enteros cuando e e o se usan en un contexto aritmtico. Los operadores numricos son : e e ** exponenciacin o * multiplicacin o / divisin o + suma (o ms unario) a - resta (o menos unario) Cualquier variable o elemento de array tendr un valor denido antes de ser usado en a una expresin. Las expresiones aritmticas son evaluadas en un orden determinado por la o e prioridad asignada a cada operador. Estas son :

12

OPERADOR PRECEDENCIA ** primera *,/ segunda +,tercera Cuando dos o ms operadores de igual prioridad (tales como + y -) aparecen en una a expresin, la evaluacin se realiza de izquierda a derecha, salvo la exponenciacin, que se o o o realiza de derecha a izquierda. A**B**C se evala como A**(B**C). u Normalmente no se permite que dos operadores aparezcan en sucesin. Cuando el segundo o operador es unario (+ -), el FORTRAN lo permite. o 3.1.1 Uso de parntesis e

Se pueden usar parntesis para cambiar el orden de evaluacin. Cuando aparecen, la parte e o encerrada entre parntesis se evala primero, y su valor es usado en la evaluacin del resto e u o de la expresin. o As A*B+C+D**(E*(F-6.25+G))**SIN(H) se evala en el siguiente orden: , u A*B +C + D**( E*( F-6.25 +G ) )** SIN(H)
7 8 3 5 6 9 1 2 4

3.1.2

Tipos de datos en una expresin aritmtica o e

Si cada elemento de una expresin aritmtica es del mismo tipo de datos, el valor de o e la expresin ser del mismo tipo. Sin embargo, si se combinan diferentes tipos, el valor o a resultante tendr un tipo que depende del rango asociado a cada tipo de datos, siendo del a tipo de datos de mayor rango que aparece en al expresin. o As p.e., el tipo de datos resultante de una expresin entre un entero y un real ser real. , o a Si eun tipo es COMPLEX*8 y otro REAL*8 o REAL*16 su resultado ser COMPLEX*16. a

13

Tipo de datos LOGICAL*1 LOGICAL*2 LOGICAL*4 INTEGER*1 INTEGER*2 INTEGER*4 REAL*4 (REAL) REAL*8 (DOUBLE PRECISION) REAL*16 COMPLEX*8 COMPLEX*16 (DOUBLE COMPLEX)

Rango 1 (Menor) 2 3 4 5 6 7 8 9 10 11 (Mayor)

El tipo de datos de una expresin ser del tipo de datos del resultado de la ultima operacin o a o en dicha expresin. El tipo de datos se determina de acuerdo con las siguientes convenciones o : operaciones enteras se realizan solo con elementos enteros (las entidades lgicas se o tratan como enteros). En aritmtica entera se trunca la parte fraccionaria de la e divisin : o Ejemplo: El valor de 1/4+1/4+1/4+1/4 es 0. Para ser exactos, en el caso de la divisin entera, su valor es un entero, que se obtiene o as : 1. si la magnitud del cociente matemtico es menor que uno (1), entonces el coa ciente entero es cero. Por ejemplo, el valor de 11/12 es cero. 2. si la magnitud del cociente matemtico es mayor o igual a 1, el cociente entero a es el mayor entero que no excede la magnitud del cociente matemtico y cuyo a signo es el mismo que el del cociente matemtico. Por ejemplo, el valor de 7/2 a es 3. operaciones reales se realizan solo con elementos reales o combinaciones de reales, enteros y lgicos. Los elementos enteros se convierten a reales y la expresin se evala o o u entonces usando aritmtica real. e operaciones con REAL*8 y REAL*16 los otros elementos de la expresin se convierten al o tipo correspondiente de alta precisin, haciendo su valor a la parte ms signicativa o a 14

de la nueva representacin y haciendo cero su parte menos signicativa. La expresin o o se evala en aritmtica de alta precisin. u e o convertir un elemento real a alta precisin no incrementa su precisin. P.e., una variable o o real con valor 0.3333333 se convierte a 0.3333333432674408 y no a 0.3333333000000000D0 o a 0.3333333333333333D0. operaciones complejas los elementos enteros se convierten a reales. El elemento REAL o REAL*8 as obtenido ser la parte real de un nmero complejo, con parte imaginaria a u cero. La expresin se evala entonces usando aritmtica compleja siendo entonces el o u e resultado de tipo complejo.

3.2

Expresiones de carcter a

Consisten en elementos de carcter y operadores de carcter. Su evaluacin conduce a un a a o unico valor de tipo carcter. a Un elemento de carcter puede ser : a una referencia escalar de carcter a una subcadena una expresin tipo carcter, opcionalmente entre parntesis o a e una referencia a una funcin de carcter o a El unico operador tipo carcter es el operador de concatenacin (//) a o Los parntesis no afectan al valor de una expresin de carcter. e o a Si los elementos contienen espacios, estos son incluidos en el valor de la expresin de o carcter. P.e. : a ABC //D E//F tiene el valor ABC D EF

3.3

Expresiones relacionales

Consiste en dos expresiones aritmticas o dos expresiones de carcter separadas por un e a operador relacional. El valor de la expresin es verdadera o falsa. o Los operadores relacionales son :

15

operador .LT. .LE. .EQ. .NE. .GT. .GE.

signicado Menor que (Less than) Menor o igual (Less than or equal to) Igual a (Equal to) Distinto a (Not equal to) Mayor que (Greater than) Mayor o igual (Greater than or equal to)

En expresiones complejas pueden intervenir solo los operadores .EQ. y .NE.. En expresiones relacionales aritmticas, las expresiones aritmticas se evaluan primero. e e Anlogamente ocurre con la expresiones de carcter. a a En las expresiones tipo carcter menor quey mayor que signican precede y sucede a en la tabla de caracteres ASCII respectivamente. Si dos expresiones de carcter no tienen la misma longitud, la ms pequea se rellena a a a n espacios por la derecha. Todos los operadores relacionales tienen la misma prioridad. Si se comparan dos expresiones numricas de diferente tipo de datos, la expresin de menor e o rango se convierte antes de la comparacin a la de rango superior. o

3.4

Expresiones lgicas o

Puede ser un unico elemnto lgico o una combinacin de elementos lgicos y operadores o o o lgicos. Una expresin lgica produce un unico valor lgico, verdadero o falso. o o o o Un elemento lgico puede ser : o una referencia escalar lgica o entera o una expresin relacional o una expresin lgica o entera entre parntesis o o e una referencia a funcin lgica o entera o o Los operadores lgicos son : o

16

operador .AND. .OR. .NEQV. .XOR. .EQV. .NOT.

signicado conjuncin lgica o o disyuncin inclusiva o disyuncin exclusiva o disyuncin exclusiva (extensin al ANSI) o o equivalencia lgica o negacin lgica (unario) o o

Cuando un operador lgico acta con elementos lgicos, el tipo de datos resultante es lgico o u o o (es lgico). o Cuando opera con elementos enteros, la operacin lgica se realiza bit a bit en las correo o spondientes representaciones binarias y el tipo de datos resultante es entero. Una expresin lgica se evala de acuerdo al orden de precedencia de sus operadores, que o o u aparece en la siguiente lista. Esta lista relaciona los operadores que pueden aparecer en una expresin, y el orden en o que son evaluados : Operadores Precedencia ** (mayor) *,/ +,// operadores relacionales .NOT. .AND. .OR. .XOR.,.EQV.,.NEQV. (menor) Los operadores de igual rango se evaluan de izquierda a derecha, salvo la exponenciacin, o que se evala de derecha a izquierda. u Como en la expresiones aritmticas, se pueden usar los parntesis para alterar la secuencia e e normal de evaluacin. o Dos operadores lgicos no pueden aparecer consecutivamente, salvo que el segundo sea un o .NOT.. Ejemplo 11. La expresin o A*B +C*ABC .EQ. X*Y+OM/ZZ .AND. .NOT. X+8 .GT. TT se evala en el siguiente orden: u (((A*B)+(C*ABC)) .EQ. ((X*Y)*(OM/ZZ))) .AND. (.NOT. ((X+8) .GT. TT)) 17

INSTRUCCIONES DE ASIGNACION

Denen el valor de una variable, elemento de array,registro, elemnto de registro o subcadena.

4.1

Asignacin aritmtica o e
v=e

Tiene la forma donde v es una referencia numrica escalar (variable, elemento de array, etc. ). e e es una expresin aritmtica o e Ejemplos : PI=3.14159, CONT=CONT+1, ALFA=-1./(2.*X)+A Si v tiene el mismo tipo de datos que la expresin aritmtica de la derecha, se asigna el o e valor directamente. Si los tipos de datos son diferentes, el valor de la expresin se convierte al tipo de datos de o la entidad de la izquierda.

4.2

Asignacin lgica o o

Asigna el valor de la expresin lgica de la derecha a la referencia lgica escalar que est o o o a a la izquierda. Vase la tabla anatrior para las reglas de conversin. e o Tiene la forma v=e donde v es una referencia lgica escalar o e es una expresin lgica o o Ejemplos : FINPAG=.FALSE. AGORDO=A.GT.B .AND. A.GT.C .AND. A.GT.D IMPRIME=LINEA.LE.65 .AND. .NOT. FINPAG

18

4.3

Asignacin de carcter o a
v=e

Tiene la forma donde v es una referencia de carcter escalar a e es una expresin de carcter o a Si LEN(e) > LEN(v) = e se trunca por la derecha Si LEN(e) < LEN(v) = e se rellena a blancos por la derecha Ejemplos : FILE=NEWTON NOMBRE81)=X// RODRIGUEZ TEXTO(I,J+1)(2:N-1)=LINEA(I)//A

4.4

Instruccin ASSIGN o

Asigna una etiqueta de instruccin a una variable entera. La variable puede ser usada o entonces para bifurcar con una instruccin GOTO asignado o para asignar un especicador o de formato a una instruccin de E/S. o Tiene la forma ASSIGN s TO v donde s es la etiqueta de una instruccin ejecutable o una FORMAT. o v es una variable entera La instruccin ASSIGN asigna el nmero de instruccin a una variable. Es similar a una o u o expresin aritmtica, con una excepcin: la variable queda indenida como variable entera, o e o no pudiendo entrar en operaciones aritmticas. e Ejemplos : ASSIGN 10 TO NSTART ASSIGN 99999 TO KSTOP ASSIGN 250 TO ERROR 19

INSTRUCCIONES DE ESPECIFICACION

Son instrucciones no ejecutables que se usan para reservar memoria, e inicializar variables, arrays, records y estructuras, y tambin para denir otras caracter e sticas de los nombres simblicos usados en el programa. Son las siguientes: o

5.1

BLOCK DATA

Esta instruccin, seguida por una serie de instrucciones de especicacin, asigna valores o o iniciales a entidades de bloques comunes con nombre y a la vez, establece y dene estos bloques. Tiene la forma BLOCK DATA nomb donde nomb es un nombre simblico. o En una BLOCK DATA se pueden usar COMMON, DATA, DIMENSION, EQUIVALENCE, IMPLICIT, PARAMETER, RECORD, SAVE, declaraciones de estructuras y sentencias de declaracin de o tipo. Las instrucciones de especicacin que siguen a la BLOCK DATA establecen y denen bloques o comunes, asignan variables, arrays y records a estos bloques, y asignan valores iniciales a las variables, arrays y records. Constituye una clase especial de subprograma, en el que no pueden haber instrucciones ejecutables y ha de nalizar con una END. Se usa principalmente para inicializar las entidades de una o varias COMMON con nombre. BLOCK DATA BLOQUE1 INTEGER S,X LOGICAL T,W DOUBLE PRECISION U DIMENSION R(3) COMMON /AREA1/R,S,T,U/ AREA2/W,X,Y DATA R/1.0,2*2.0/,T/.FALSE./, U/0.21D-7/,W/.TRUE./, Y/3.5/ END

20

5.2

COMMON

Dene una o ms reas contiguas de memoria, o bloques. Tambin dene el orden en el a a e que las variables, arrays y records aparecen en un bloque comn. u Dentro de un programa, puede haber un bloque COMMON sin nombre, pero si existen ms, a se les ha de asignar un nombre. Esta instruccin, seguida por una serie de instrucciones o de especicacin, asigna valores iniciales a entidades de bloques comunes con nombre y a o la vez, establece y dene estos bloques. Proporciona un medio de asociar entidades en diferentes unidades de programa. Esto permite a difrentes unidades denir y referenciar los mismos datos sin tener que pasarlos como argumentos en llamadas subrutinas, y tambin compartir unidades de alamacenamiento. e La sintaxis es: COMMON [/nomb/] list [[,]/[nomb1]/list1] . . . donde nomb es un nombre simblico. Pueden ser blancos, en cuyo caso se omiten el par de /s. o list es una lista de nombres de variables, nombres de arrays y declaradores de array. Cuando se declaran bloques comunes con el mismo nombre en diferentes unidades de programa, estos comparten la misma rea de memoria cuando se combinan en un programa a ejecutable. Las entidades que aparecen en una COMMON de una unidad de programa han de coincidir en tipo y nmero con las que aparezcan en una COMMON con el mismo nombre de otra unidad u de programa. Ejemplo: Programa principal Subprograma

COMMON COLOR,X/BLOQUE1/KILO,Q . . . CALL FIGURA

SUBROUTINE FIGURA COMMON /BLOQUE1/LIMA,2/ /ALFA,BETA . . RETURN END

en el que hay dos bloques, uno sin nombre que asociar las variables COLOR,X a ALFA,BETA y otro con nombre BLOQUE1 que asociar KILO,Q LIMA,R. a 21

5.3

DATA

Asigna valores iniciales a variables, arrays, elementos de array y subcadenas antes de la ejecucin del programa. o Sintaxis: DATA nlista/clista/[[,]nlista/clista/] . . . donde nlista es una lista de nombres de variables, arrays, elementos de array, nombres de substrings, o DO impl citos, separados por comas. La forma de un DO inpl cito en una DATA es (dlista, i=n1,n2[,n3]) donde dlista es una lista de uno o ms nombres de elementos de array, nombres de suba strings o DO impl citos, separados por comas. i es el nombre de una variable entera. n1,n2,n3 son expresiones enteras constantes, salvo que contenga variables de un DO impl cito. (Ejemplo: DATA (((ELEM(I,J,K), I=1,5), J=1,5), K=1,5)/125*0.0/) clista es una lista de constantes, con una de las formas c, n c, donde c es una constante o nombre de una constante n dene el nmero de veces que se va a asignar el mismo valor a las sucesivas entiu dades en la nlista asociada. Ha de ser una constante entera (= 0) o nombre de constante entera. En una DATA , los valores son asignados uno a uno en el orden en que aparecen, de izquierda a derecha. Puede aparecer nombres de array sin sub ndices. En ste caso, habr el nmero suciente e a u de valores en la lista asociada de constantes. Los elementos del array son inicializados en el orden de sus posiciones de memoria. Ejemplos:

22

DATA A,B,C,D/3*5.0,7.2/ DATA ((X(J,I), I=1,J), J=1,5) /15*0./

DIMENSION SUM(20) LOGICAL A,B DATA SUM/20*0.0/,I,J,K,L/4*5,2/ DATA A,B/2*.TRUE./

5.4

SENTENCIAS DE DECLARACION DE TIPO DE DATOS

Denen expl citamente el tipo de datos de los nombres simblicos especicados. Existen o dos formas: declaraciones de tipo numrico y declaraciones de tipo carcter. e a Se pueden inicializar datos en el momento de la declaracin de tipo poniendo el valor o entre barras (/) inmediatamente despus del nombre de la variable o array que se quiere e inicializar. La asignacin es igual que en DATA . o Las sentencias de declaracin siguen las siguientes reglas de sentido comn: o u precedern a cualquier instruccin ejecutable a o el tipo de datos se declara una sola vez una declaracin d tipo no puede cambiar el tipo de un nombre simblico que ha sido o o usado en un contexto que impl citamente supone un tipo diferente. 5.4.1 DECLARACIONES TIPO NUMERICO

Tienen la forma: tipo v[/clista/][,v[/clista/]] . . . donde tipo es cualquiera de BYTE,LOGICAL,INTEGER,REAL,DOUBLE PRECISION,COMPLEX,DOUBLE COMPLEX. v es el nombre simblico de una constante, variable, array, funcin sentencia, subprograma o o FUNCTION o declarador de array. clista es una lista de constantes, como en DATA . El nombre simblico puede ser seguido por un especicador de longitud de la forma s, o donde s es una de las longitudes aceptables del tipo de datos declarado. INTEGER CONTAD,MATRIZ(4,4),SUMA REAL INTEGR,NDERIV 23

LOGICAL SWITCH INTEGER*2 I,J,K, M12*4, Q, IVEC*4(10) REAL*8 WX1,WXZ,WX3*4,WX5,WX6*8 REAL*16 PI/3.14159Q0/, E/2.72Q0/, QARRAY(10)/5*0.0,5*1.0/ 5.4.2 DECLARACIONES TIPO CARACTER

Son de la forma: CHARACTER[*long[,]] v[*long][/clista/][,v[*long][/clista/]] . . . donde v es el nombre de una constante, variable, array, funcin sentencia, subprograma FUNCTION o o declarador de array. long es una constante entera sin signo, una expresin entera constante entre parntesis o o e un asterisco (*) entre parntesis. Su valor especica la longitud. e CHARACTER SOC(100)*9, NOMB*4/PEPE/ PARAMETER(LONGIT=4) CHARACTER*(4+LONGIT) A,B

5.5

DIMENSION

Dene el nmero de dimensiones de un array y el nmero de elementos de cada dimensin. u u o Tiene la forma: DIMENSION a(d)[,a(d)] . . . donde a(d) es un declarador de array. Ejemplo: DIMENSION ARRAY(4,-4:4), MATRIX(5,0:5,5) Se pueden utilizar declaradores de array en las sentencias de declaracin de tipo y las o COMMON. Ejemplos: DIMENSION X(5,5), Y(4,85), Z(100) DIMENSION MARCA(4,4,4,4) subroutine aproc(a1,a2,n1,n2,n3) dimension a1(n1:n2), a2(n3:*)

24

5.6

EQUIVALENCE

Dadas dos o ms entidades de la misma unidad de programa, sta instruccin las asocia a e o total o parcialmente a las mismas posiciones de memoria. Tiene la forma: EQUIVALENCE (lista)[,(lista)] . . . donde lista es una lista de variables, nombres de array, elementos de array o referencias a subcadenas, separadas por comas. Se han de especicar al menos dos entidades en cada lista. Se pueden hacer equivalentes variables de diferente tipo de datos. Por ejemplo, si se hace a una variable entera equivalente a una variable compleja, la entera comparte las mismas posiciones de memoria con la parte real de la variable compleja. Ejemplos: 1. DOUBLE PRECISION DVAR INTEGER*2 IARR(4) EQUIVALENCE (DVAR,IARR(1)) hace que los cuatro elementos del array entero IARR ocupen las mismas posiciones que DVAR (doble precisin). o 2. CHARACTER CLAVE*16, DNI*10 EQUIVALENCE (CLAVE,DNI) hace que el primer carcter de las variables CLAVE y DNI tengan las mismas posiciones a de memoria. DNI es equivalente a CLAVE(1:10).

5.6.1

ARRAYS EQUIVALENTES

Cuando se hacen equivalentes un determinado elemento de un array con otro determinado de otro array, EQUIVALENCE tambin hace equivalentes los otros elemntos de los dos arrays. e As si el tercer elemento de un array con siete elementos se hace equivalente al primer , elemento de otro array, los ultimos cinco elementos del primer array se solapan con los primeros cinco elementos del segundo array ( si los elementos de ambos arrays tienen igual tamao). n Por ejemplo: 25

Subndice

100

VEC1

Posicin del carcter

Posicin del carcter

2
5

VEC2
1 Subndice 2 3 4

Figura 2: Almacenamiento de arrays

DIMENSION DOBLE(2,2), TRIPLE(2,2,2) EQUIVALENCE (DOBLE(2,2),TRIPLE(1,2,2)) origina la siguiente equivalencia: Array TRIPLE Elemento Nmero de u array elemento TRIPLE(1,1,1) 1 TRIPLE(2,1,1) 2 TRIPLE(1,2,1) 3 TRIPLE(2,2,1) 4 TRIPLE(1,1,2) 5 TRIPLE(2,1,2) 6 TRIPLE(1,2,2) 7 TRIPLE(2,2,2) Hacen lo mismo: EQUIVALENCE(DOBLE,TRIPLE(2,2,1) EQUIVALENCE(TRIPLE(1,1,2),DOBLE(2,1)) Anlogamente, se pueden hacer equivalentes a arrays que no tengan la unidad como a sub ndice ms pequeo. Por ejemplo, un array A(2:3,4) se puede hacer equivalente a a n B(2:4,4) con EQUIVALENCE (a(3,4),b(2,4)). Array DOBLE Elemento Nmero u array elemento

DOBLE(1,1) DOBLE(2,1) DOBLE(1,2) DOBLE(2,2)

1 2 3 4

26

Array B Elemento Nmero de u array elemento B(2,1) 1 B(3,1) 2 B(4,1) 3 B(2,2) 4 B(3,2) 5 B(4,2) 6 B(2,3) 7 B(3,3) 8 B(4,3) 9 B(2,4) 10 B(3,4) 11 B(4,4) 12

Array A Elemento Nmero u array elemento

A(2,1) A(3,1) A(2,2) A(3,2) A(2,3) A(3,3) A(2,4) A(3,4)

1 2 3 4 5 6 7 8

Unicamente en una EQUIVALENCE se pueden referenciar un elemento de array con un solo sub ndice, incluso si ste array es multidimensional. e Por ejemplo, la instruccin EQUIVALENCE (DOBLE(4), TRIPLE(7)) hace lo mismo que en o la primera tabla.

27

5.6.2

CADENAS EQUIVALENTES

NOMB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CLAVE 1 2 3 4 5 6 7 8 9

Anlogamente al caso anterior, cuando se hacen equivalentes a dos subcadenas, asociando un carcter de una con otro de la a segunda, EQUIVALENCE tambin asocia los otros caracteres de e las entidades correspondientes. Por ejemplo, CHARACTER NOMB*16, CLAVE*9 EQUIVALENCE (NOMB(10:13), CLAVE(2:5)) o tambin EQUIVALENCE (NOMB(9:9), CLAVE(1:1)). e Si las referencias a subcadenas son elementos de array, EQUIVALENCE tambin establece equivalencias en todo el array. e Por ejemplo, CHARACTER VEC1(100)*4, VEC2(5)*5 EQUIVALENCE (VEC1(1)(2:4), VEC2(2)(3:5)) No se puede usar EQUIVALENCE para asignar las mismas posiciones a dos o ms subcadenas que comienzan en difrentes posia ciones de carcter dentro de una misma variable ipo carcter o a a array tipo carcter. a

INSTRUCCIONES DE CONTROL

Se utilizan para transferir el control a un punto de la misma unidad de programa o a otra unidad de programa. Tambin controlan el procesamiento iterativo, la suspensin de la e o ejecucin del programa y la terminacin del mismo. o o

6.1
6.1.1

DO
DO indexado

Controla el procesamiento iterativo, o sea, las instrucciones de su rango se ejecutan un nmero especicado de veces. Tiene la forma: u DO [s[,]] v = e1 , e2 [,e3 ] donde

28

s es la etiqueta de una instruccin ejecutable, que ha de estar en la misma unidad de o programa. v es una variable entera o real, que controla el bucle ( ndice). e1 ,e2 ,e3 son expresiones aritmticas e La variable v es la variable de control, e1 es el valor inicial que toma v, e2 es el valor nal y e3 es el incremento o paso, que no puede ser cero. Si se omite e3 , su valor por defecto es 1. El rango de una DO incluye todas las instrucciones que siguen a la misma DO hasta la instruccin terminal, la ultima del rango. o La instruccin terminal no puede ser: o una GOTO incondicional o asignada un IF aritmtico e un bloque IF ELSE , ELSE IF , END IF , RETURN , STOP, END , otra DO . El nmero de ejecuciones del rango de una DO, llamado contador de iteraciones viene dado u por : MAX(INT((e2 e1 + e3 )/e3 )), 0) donde INT(x) representa la funcin parte entera de x. o Y las etapas seguidas en la ejecucin son las siguientes : o 1. Se evala contador = INT((e2 e1 + e3 )/e3 ) u 2. Se hace v = e1 3. Si contador es mayor que cero, entonces: (a) Ejecutar las instrucciones del rango del bucle (b) Asignar v = v + e3 (c) Decrementar el contador (contador=contador-1). Si contador es mayor que cero, repetir el bucle. No se puede alterar el valor de la variable de control dentro del rango de la DO. 29

Se pueden modicar los valores inicial, nal e incremento dentro del bucle sin que quede afectado el contador de iteraciones ( no afecta al no de iteraciones del bucle, ya que son establecidas al inicio). El rango de una DO puede contener otras instrucciones DO, existiendo algunas reglas de anidacin. o Se puede transferir el control hacia afuera de un bucle DO, pero no al revs. e Ejemplo 12. DO 100 K=1,50,2 N=0 D0 100 I=1,10 J=I DO 100 K=1,5 L=K N=N*1 CONTINUE DO 350 J=50,-2,-2 DO 25 IVAR=1,5 N=0 DO 200 I=1,100 J=I DO 200 K=5,1 L=K N=N+1 CONTINUE

100 101

200 201

en el primer caso,los valores que quedan, despus de la ejecucin, son : I=11, K=6, e o J=10, L=5, N=50. Y en el segundo caso, I=11, K=5, J=10, N=0, L queda no denida. DO anidados Una DO puede contener en su rango uno o ms bucles DO completos. El rango de una DO a ms interna ha de estar totalmente incluido en el rango de cualquier otra DO ms externa. a a Las DO anidadas pueden compartir la misma instruccin nal (etiquetada numricamente) o e pero no una ENDDO . Algunos ejemplos de anidacin correcta e incorrecta son: o
CORRECTAMENTE ANIDADOS
DO I=1,20
. .

INCORRECTAMENTE ANIDADOS
DO 35 K=1,10
. .

DO 15 K=1,10
. . . .

DO 20 I=1,10
. .

DO J=1,5 .
.

DO K=1,10 .
. . . .

DO 25 L=2,50,2
. .

DO 25 L=1,20 .
. . . 15 CONTINUE . . .

DO J=50,2,2
. .

ENDDO
. .

25 CONTINUE
. .

20 CONTINUE
. . . .

. .

ENDDO
. . .

DO 35 M=1,20
. . .

DO 30 N=1,15 .
. . . .

25 CONTINUE
. .

ENDDO

35 CONTINUE

30 CONTINUE

ENDDO

30

TRANSFERENCIAS DE CONTROL
DO 35 K=1,10 GO TO 20 DO 50 I=1,20
. . . .

DO 25 L=2,50,2 .
.

20 A=B*C
. .

GO TO 20
. .

DO J=1,5 . 30 D=EF .
. . .

25 CONTINUE
.

20

X=X+1
. .

45 CONTINUE .
.

DO 35 K=1,20
. . GO TO 60 . .

GO TO 40 . DO 45 K=1,10
. . . . .

30 A=B+C
. . . . .

40 Y=A+D . 45 CONTINUE 50 CONTINUE


. . .

35 CONTINUE 60 D=E/F
. .

GO TO 30

GO TO 60

Figura 3: Transferencias y rangos

En una anidacin de DO s, se puede transferir el control desde uno ms interno a otro ms o a a externo. pero en ningn caso se puede bifurcar hacia el rango de una DO desde fuera de u ste rango. e Si dos o mas DO s anidados comparten la misma instruccin terminal, se puede bifurcar o a sta instruccin solo desde el rango del bucle ms interno. e o a Rango extendido Un bucle DO tiene un rango extendido si contiene una instruccin de control que bifurca o a un parte fuera de su rango, y despus de la ejecucin de una o varias instrucciones, e o otra instruccin ( de control) retorna el control al bucle. De sta forma, el rango del o e DO se extiende para incluir las instrucciones ejecutables que estn entre la de destino de la a primera transferencia y la que retorna el control al bucle. Existen un par de reglas que gobiernan su uso : 1. Una transferencia hacia el rango de una instruccin DO est permitida solo si la o a transfrencia se hace desde el rango extendido de sta DO . e 2. El rango extendido de una DO no debe cambiar el valor de la variable de control de la DO .

31

6.1.2

DO WHILE

Es similar al DO indexado, pero mientras que ste se ejecuta un nmero jo de veces, el e u DO WHILEse ejecuta mientras sea verdadera la expresin lgica contenida en la instruccin. o o o Tiene la forma: DO [s[,]] WHILE (e) donde s es la etiqueta de una instruccin ejecutable que est en la misma unidad de programa. o a e es una expresin lgica o o Si no se pone etiqueta en la DO WHILE, ha de terminar con una ENDDO . Se puede bifurcar hacia afuera del bucle, pero no al revs (desde el exterior hacia el inetrior e del bucle). 6.1.3 END DO

Finaliza el rango de una DO o una DO WHILE, si stas no contienen una etiqueta que indique e la instruccin nal del bucle. Tiene la forma: o END DO

DO WHILE (I.GT.J) ARRAY(I,J)=1.0 I=I-1 ENDDO

DO 10 WHILE (I.GT.J) ARRAY(I,J)=1.0 I=I-1 10 END DO

6.2

END

Determina el n de una unidad de programa. Ha de ser la ultima linea fuente de cada unidad de programa. Tiene la forma: END Puede tener etiqueta, pero no puede continuarse la ejecucin. o En un programa principal, la END provoca la nalizacin de la ejecucin. o o En un subprograma, se ejecuta impl citamente una RETURN . 32

6.3

GO TO

Las instrucciones GOTO transeren el control dentro de una unidad de programa. Dependiendo del valor de una expresin, el control se transere, bien a la misma instruccin o o siempre, o bien a una de un determinado conjunto de instrucciones. Los tres tipos de instrucciones GOTO son: GOTO incondicional GOTO calculado GOTO asignado 6.3.1 GOTO incondicional

Transere el control a la misma instruccin cada vez que se ejecuta. Tiene la forma: o GOTO s donde s es la etiqueta de una instruccin ejecutable que est en la misma unidad de o a programa de la GOTO . GOTO 99999 GOTO 100 6.3.2 GOTO calculado

Transere el control a la misma instruccin segn sea el valor de la expresin que aparece o u o en la GOTO . Tiene la forma: GOTO (lista) [,] e donde lista es una lista de una o ms etiquetas de instrucciones ejecutables separadas por comas. a Se le llama lista de transferencia. e es un aexpresin aritmtica cuyo valor cae en el rango de 1 a n ( siendo n el nmero de o e u etiquetas de la lista de transferencia). Por ejemplo, si la lista es (30,20,30,40) y el valor de e es 2, se transre el control a la primera sentencia ejecutable despus de la GOTO . e GOTO (12,24,36), INDEX GOTO (320,330,340,350,360), V(J,K)+2*B

33

6.3.3

GOTO asignado

Transere el control a una etiqueta representada por una variable. Dicha variable ha intervenido previamente en uns instruccin ASSIGN asignndole un valor a la variable. o a De sta forma, se puede cambiar el destino de la transfrencia dependiendo de la sentencia e ASSIGN que se ha ejecutado ms recientemente. Tiene la forma: a GOTO v[[,] (lista) ] donde v es una variable entera lista es una lista de una o ms etiquetas de sentencias ejecutables separadas por comas a que la variable v podr tener como valor. No afecta a la ejecucin de la GOTO y se a o puede omitir. Si se usa, el compilador podr generar cdigo ms eciente. a o a La GOTO y su ASSIGN asociada han de estar en la misma unidad de programa. Si el valor de la variable no es ninguna de los de la lista, el resultado es indefnido, salvo que se haya puesto la directiva RANGE a ON en fase de compilacin, la cual dar o a error. ASSIGN 450 TO IG . . GOTO IG que ser equivalente a GOTO 450. a ASSIGN 200 TO IB . . GOTO IB, (300,200,100,25) que ser equivalente a GOTO 200 a

6.4

Sentencias IF

Transeren el control condicionalmente, o bien ejecutan condicionalmente una instruccin o o bloque de instrucciones. Existen tres tipos : 34

IF aritmtico e IF lgico o bloque IF ( IF THEN , ELSE IF THEN , ELSE , END IF ) Para cada tipo, la decisin de transferir el control o ejecutar la sentencia o bloque de o sentencias est basada en la evaluacin de una expresin en la IF . a o o 6.4.1 IF aritmtico e

Transere el control condicionalmente a una de tres sentencias, segn sea el valor de la u expresin que aparece en la IF . Tiene la forma o IF (e) s1 ,s2 ,s3 donde: e es una expresin aritmtica (de cualquier tipo salvo compleja, lgica o carcter). o e o a s1 ,s2 ,s3 son etiquetas de instrucciones ejecutables de la misma unidad de programa. las tres etiquetas s1 ,s2 ,s3 son obligatorias, aunque no tienen que ser distintas. se evala la expresin e y se transere el control a una de las tres etiquetas: u o si el valor de e es el control pasa a menor que cero etiqueta s1 igual a cero etiqueta s2 mayor que cero etiqueta s3 Ejemplo 13. IF (THETA-CHI) 50,50,100 el control pasa a la sentencia 50 si la variable real THETA la variable real CHI, y pasa a la 100 si THETA > CHI. IF (NUMERO/2*2-NUMERO) 20,40,20 transere el control a la sentencia 40 si el valor de la variable entera NUMERO es par, y a la de la sentencia 20 si su valor es un nmero impar. u

35

6.4.2

IF lgico o

Ejecuta condicionalmente una unica sentencia dependiendo del valor de la expresin lgica o o que aparce en la misma IF. Tiene la forma IF (e) sentencia donde: e es una expresin lgica. o o sentencia es una sentencia FORTRAN completa, ejecutable, excepto una DO , ENDDO , bloque IF u otro IF lgico. o se evala la expresin lgica e . Si su valor es verdadero,se ejecuta sentencia. u o o Si es falso, se transere el control a la siguiente instruccin ejecutable despus del o e IF , sin ejecutarse sentencia. Ejemplo 14. IF (J.GT.4 .OR. J.LT.1) GO TO 250 IF (REF(J,K) .NE. HOLD) REF(J,K)=REF(J,K)+(-1.5D0) IF (ENDRUN) CALL EXIT 6.4.3 Bloques IF

Ejecutan condicionalmente bloques completos de sentencias. Las cuatro sentencias que se usan en la construccin de los bloques IF son : o IF THEN ELSE IF THEN ELSE END IF Un bloque IF tiene la forma:

36

IF (e1 ) THEN bloque 1 ELSE IF (e2 ) THEN bloque 2 . . . ELSE IF (en ) THEN bloque n ELSE bloque n+1 ENDIF donde: ei es una expresin lgica o o bloque i es una secuencia de cero o ms sentencias FORTRAN completas. a la sentencia IF THEN inicia una construccin de bloque IF . El bloque que sigue se o ejecuta si es verdadero el valor de la expresin lgica en la IF THEN . o o la ELSE IF THEN es opcional, y una construccin de bloque IF puede tener varias o ELSE IF THEN . la ELSE es tambin opcional y especica un bloque de sentencias a ejecutar si no e se ha ejecutado previamente ningn bloque de sentencias del bloque IF . Si est u a presente, ha de seguirle inmediatamente una END IF . la END IF termina una construccin de bloque IF . o despus de que se ha ejecutado la ultima sentencia de un bloque de instrucciones, el e control pasa a la siguiente sentencia ejecutable que sigue a la END IF . Por tanto, solo un bloque de sentencias se ejecuta cuando una IF THEN es ejecutada. un bloque de instrucciones puede contener a su vez otro bloque IF , permitiendo construcciones de la complejidad que se requiera. ELSE IF THEN y ELSE pueden tener etiquetas, pero stas no pueden ser referencie adas. 37

la END IF puede tener etiqueta a la que se puede bifurcar, pero solo desde el bloque inmediatamente precedente. Ejemplo 15. IF (ABS(ADJ).GE. 1.0E-5) THEN TOT=TOT+ABS(ADJ) Q=ADJ/VAL END IF IF (NAME.LT.N) THEN IFR=IFR+1 FRL(IFR)=NAME(1:2) ELSE IB=IB-1 END IF

if (a.gt.b) then d=b f=a-b else if (a.gt.b/2.) then d=b/2. end if

if (a.ge.b) then if (c.gt.d) then x=c else x=d endif x=x+a else x=b+max(c,d) endif

6.5

PAUSE

Visualiza un mensaje en la terminal y suspende temporalmente la ejecucin del programa. o Tiene la forma: PAUSE [mensaje] donde mensaje es una constante tipo carcter o una cadena de nmeros decimales de 1 a a u 5 d gitos. Es opcional.

38

Si el programa se est ejecutando en modo interactivo, el contenido de mensaje se a visualiza en la terminal, seguido por el prompt usual, indicando que se ha suspendido el programa y espera un comando. Ejemplo 16. PAUSE 777 PAUSE Preparar impresora

6.6

RETURN

Transere el control desde un subprograma a la unidad de programa que le llam. Se usa o solo en unidades de subprograma.Tiene la forma: RETURN [i] donde i indica un retorno alternativo desde el subprograma y se puede especicar unicamente en subprogramas tipo subrutina (??), no en subprogramas tipo funcin (??). o Cuando se especica, indica que se ha de tomar el isimo retorno alternativo en la lista e actual de argumentos de la subrutina. Cuando una sentencia RETURN se ejecuta en un subprograma de funcin, el control o se devualve al programa que lo llam, en la instruccin que contiene la referencia a o o funcin. o Cuando una RETURN se ejecuta en una subrutina, el control se devuelve a la primera sentencia ejecutable posterior a la CALL que origin la llamada, o bien a la etiqueta o que se especic como isimo retorno alternativo en la CALL . o e Ejemplo 17. SUBROUTINE CONVERT(N,ALFA,DATOS,K) INTEGER ALFA(*),... . . RETURN END

6.7

STOP

Finaliza la ejecucin del programa. Tiene la forma: o STOP [mensaje] 39

donde mensaje es una constante tipo carcter o una cadena de nmeros decimales de 1 a a u 5 d gitos. Es opcional. Si se especica mensaje,su contenido se visualiza en la terminal, termina la ejecucin o y devuelve el control al sistema operativo. Si no se especica, el programa termina sin ningn mensaje. u Ejemplo 18. STOP 100 STOP Fin ejecucin! o

PROCEDIMIENTOS

Permite encapsular cualquier conjunto de clculos . a Existen cuatro tipos: 1. Funciones intr nsecas 2. Funciones sentencia 3. Subprogramas FUNCTION 4. Subrutinas

7.1

INTR INSECAS

Son las funciones de biblioteca, librer as. Algunas funciones tienen nombres genricos: segn sea el tipo de argumento el compilador e u selecciona la apropiada. Sus nombres no son globales, ni son palabras reservadas. Una relacin de funciones intr o nsecas viene dada por la tabla que viene a continuacin. o En la tabla aparece el nmero de argumentos para cada funcin y qu tipos de datos u o e permite. Los cdigos de los tipos son: I = Entero, R = Real, D = Doble precisin, X = o o Complejo, C = Carcter, L = Lgico, * signica que el resultado tiene el mismo tipo que a o su(s) argumento(s). Cuando exista ms de un argumento, han de ser todos del mismo tipo. a

40

Funcin o R = ABS(X) * = ACOS(RD) R = AIMAG(X) * * C X X * D D * = = = = = = = = = ANINT(RD) ATAN2(RD,RD) CHAR(I) CMPLX(IRDX,IRD) CONJG(X) COS(RDX) DBLE(IRDX) DPROD(R,R) EXP(RDX)

Explicacin o Calcula el mdulo de un nmero complejo. o u Arco-coseno; el resultado est en el intervalo 0 to + a Extrae la parte imaginaria de un nmero complejo. Usar REAL u para obtener la parte real. Redondea al entero ms prximo. a o Arco tangente de arg1 /arg2 , el resultado en el rango a +. Retorna el I-simo carcter ASCII. e a Convierte a complejo, segundo argumento opcional. Complejo conjugado de un nmero complejo. u Coseno del ngulo en radianes. a Convierte a doble precisin. o Calcula el producto de dos valores reales en doble precisin . o Retorna la exponencial, o sea, e elevado a la potencia del argumento. Es la funcin inversa del logaritmo natural. o Retorna la posicin del carcter en la tabla ASCII . o a Busca en la primera cadena y retorna la posicin de la primera o ocurrencia de la segunda cadena, cero si no est presente. a Convierte a entero truncando. Retorna la longitud de la cadena. Comparacin lxica mayor o igual, verdadero si arg1 >= o e arg2 . Comparacin lxica mayor que, verdadero si arg1 > arg2 . o e Comparacin lxica menor o igual, verdadero si arg1 <= o e arg2 . Comparacin lxica menor que, verdadero si arg1 < arg2 . o e Logaritmo en base e (donde e=2.71828182845904...). Logaritmo en base 10. Retorna el mayor de sus argumentos. Retorna el menor de sus argumentos. Retorna arg1 mdulo arg2 , o sea el resto de dividir arg1 por o arg2 . Convierte a real. Realiza una transferencia de signo: si arg2 es negativo el resultado es arg1 , si arg2 es cero o positivo el resultado es +arg1 . Ra cuadrada (error si arg es negativo). z Tangente del 41 a ngulo en radianes.

I = ICHAR(C) I = INDEX(C,C) I = INT(IRDX) I = LEN(C) L = LGE(C,C) L = LGT(C,C) L = LLE(C,C) L * * * * * = = = = = = LLT(C,C) LOG(RDX) LOG10(RD) MAX(IRD,IRD,...) MIN(IRD,IRD,...) MOD(IRD,IRD)

R = REAL(IRDX) * = SIGN(IRD,IRD) * = SQRT(RDX) * = TAN(RD)

Nombres Espec cos de las Funciones Genricas e

Son necesarios cuando el nombre de la funcin intr o nseca se usa como argumento real de otro procedimiento. En ste caso, el nombre espec e co se ha de declarar en una instruccin INTRINSIC. La siguiente tabla lista los nombres espec o cos en Fortran77 de algunas funciones comunes. EL resto de funciones o no tienen nombres genricos o no se pueden e pasar como argumentos reales. Nombre genrico e ABS ACOS AINT ANINT ASIN ATAN ATAN2 COS COSH DIM EXP LOG LOG10 MOD NINT SIGN SIN SINH SQRT TAN TANH Nombres espec cos REAL DOUBLE PRECISION ABS DABS ACOS DACOS AINT DINT ANINT DNINT ASIN DASIN ATAN DATAN ATAN2 DATAN2 COS DCOS COSH DCOSH DIM DDIM EXP DEXP ALOG DLOG ALOG10 DLOG10 AMOD DMOD NINT IDNINT SIGN DSIGN SIN DSIN SINH DSINH SQRT DSQRT TAN DTAN TANH DTANH

INTEGER IABS

COMPLEX CABS

CCOS

IDIM

CEXP CLOG

MOD ISIGN

CSIN CSQRT

8.1

FUNCIONES SENTENCIA

Se denen por una unica sentencia Pueden tener cualquier nmero de argumentos formales, y todos han de aparecer en la u parte derecha de la denicin. o 42

REAL M1,M2,G,R NEWTON(M1,M2,R)=G*M1*M2/R**2 y la invocacin ser por ejemplo FUERZA=NEWTON(X,Y,DIST) o a, Las siguientes funciones calcular el seno, coseno y tangente de ngulos expresados en an a grados sexagesimales: PARAMETER(PI=3.14159265, GAR=PI/180.0) SING(ALFA)=SIN(ALFA*GAR) COSG(ALFA)=COS(ALFA*GAR) TANG(ALFA)=SING(ALFA)/COSG(ALFA) LOGICAL MAT,DIGITO,DOM CHARACTER C*1 DIGITO(C)=LGE(C,0).AND.LLE(C,9) MAT(C)=INDEX(+-*/,C).NE.0 DOM(C)=DIGITO(C).OR.MAT(C) la sintaxis general es la siguiente: func(arg1,arg2,. . . ,argn)=expresin o donde func y expresin tendrn normalmente el mismo tipo de datos. o a

8.2

SUBPROGRAMAS FUNCTION

la sintaxis general es la siguiente: (tipo) FUNCTION nombre(arg1,arg2,. . . ,argn) . . . END Pueden retornar un solo valor REAL FUNCTION TSEGS(NHORAS,MINS,SEGS) INTEGER NHORAS,MINS REAL TSEGS TSEGS=((NHORAS*60)+MINS)*60+SEGS Invocacion : TSEGS(12,30,0.0) Los argumentos reales se transeren a los argumentos formales

43

8.3

SUBRUTINAS

la sintaxis general es la siguiente: SUBROUTINE nombre(arg1,arg2,. . . ,argn) . . . END o bien SUBROUTINE nombre . . . END pueden retornar cualquier numero de valores, controlado por el programador (cualquier argumento puede ser de entrada, salida o de entrada/salida). SUBROUTINE HMS(HORA,NHORAS,MINS,SEGS) REAL HORA,SEGS INTEGER NHORAS,MINS NHORAS=INT(HORA/3600.0) SEGS=HORA-3600.0*NHORAS MINS=INT(SEGS/60.0) SEGS=HORA-60.0*MINS END La invocacin podr ser o a CALL HMS(45000.0,NHORAS,MINS,SEGS) WRITE(UNIT=*,FMT=*)NHORAS,MINS,SEGS Es importante tener en cuenta que el paso de parmetros es siempre por referencia por lo a que estamos pasando los punteros a las direcciones de memoria de las variables que estamos pasando por parmetros, y si modicamos en la subrutina los valores de dichas variables, a quedarn con esos valores despus de salir de la subrutina. a e La recursividad no est permitida por el estndar, pero la mayor de los compiladores a a a la permite. Aunque hay que tener en cuenta que el principal objetivo de los programas Fortran es ser veloces, ya que se trata de problemas de clculo, y si bien la formulacin a o recursiva de un algoritmo puede ser ms clara y elegante que su formulacin iterativa, en a o ultimo trmino la ejecucin se ha de transformar en iterativa por parte del compilador. e o Por tanto, a efectos de clculo, siempre es preferible la versin iterativa del algoritmo. a o

ENTRADA/SALIDA
En Fortran el trmino chero se usa para cualquier cosa que se pueda manejar con e READ o WRITE: el trmino cubre no solo los cheros de datos alamacenados en disco e o cinta sii tambin perifricos tales como impresoras o terminales. e e 44

Antes de que pueda usar un chero externo se ha de conectar via una OPEN a una unidad de I/O ( entre 1 y 99). Los cheros son referenciados via sus nmeros de unidad. u OPEN(UNIT=1, FILE=B:INPUT.DAT, STATUS=OLD) OPEN(UNIT=9, FILE=PRINTOUT, STATUS=NEW) Las unidades de E/S son un recurso global que puede ser utilizado por cualquier unidad de programa, que usarn todas el mismo nmero de unidad ( se le puede a u pasar a un procedimiento como un argumento). La conexin entre un chero y una unidad persiste hasta que: o el programa termina (STOP,END). otra OPEN conecta otro chero a la misma unidad. se ejecuta una CLOSE para esa unidad. Todos los perifricos se han de procesar secuencialmente (terminales e impresoras e sern tratadas siempre como cheros secuenciales con formato) a Unidades preconectadas: 5=teclado, 6=pantalla) Manejo de errores: se realiza via IOSTAT o bien ERR. Fin de chero: END=etiqueta para tratarlo cuando se alcance y prara ponerlo : END FILE.

9.1

Especicaciones de formato

Toda READ o WRITE que use un chero con formato interno o externo ha de incluir un identicador de formato: FMT=* Especica un atransferencia dirigida por listas y est permitida solo a cheros sea cuenciales externos. FMT=etiqueta la etiqueta ha de ser una FORMAT en la misma unidad deprograma. FMT=expresin tipo carcter el valor de la expresin tipo carcter es una especicacin o a o a o de formato completa. 45

FMT=array tipo carcter los elementos del array carcter contienen la especicacin de a a o formato, que puede ocupar tantos elementos del array como sea necesario. Es tambin posible calcular un formato en tiempo de ejecucin: salida de un nmero e o u real en formato de punto jo(F10.2) cuando es pequeo, cambiarlo a formato exponencial n (E18.6) cuando es mayor (de un milln) o

CHARACTER F1*(*), F2*12, F3*(*) PARAMETER(F1=(1X,MAGNITUD=,) PARAMETER(F3=)) IF (PESO .LT. 1.0E6) THEN F2=F10.2 ELSE F2=E18.6 ENDIF WRITE(UNIT=*,FMT=F1//F2//F3) PESO La senetencia FORMAT es no ejecutable y puede continuarse hasta ocupar 20 lineas como mximo. a La misma FORMAT se puede utilizar por varias READ o WRITE, pero como es fcil equivocarse a con el matching de la lista de datos tiene lgica poner la FORMAT lo ms cerca posible de o a la READ o WRITE

9.2

Descriptores de formato

Existen dos tipos de descriptores de edicin: descriptores de datos y descriptores de o control. Un descriptor de datos ha de existir por cada item de datos transferido; comienzan con una letra que indica el tipo de datos seguido por un entero sin signo que denota el ancho del campo(Ej.: I5, F9.2) un descriptor de control se usa para varios propsitos, tales como tabulacin a columo o nas concretas, etc.

46

9.2.1

Descriptores A,E,F,G,I,L

Los descriptores ELSE ,F,G se pueden utilizar por reales, doble precisin y complejos; en o cualquier otro caso el tipo de datos ha de coincidir (para cada complejo se necesitan dos descriptores de coma otante) Tipo Descriptores Enteros Iw, Iw.m Real, Doble precisin, o complejo Ew.d, Ew.dEe, Fw.d, Gw.d, Gw.dEe o Lgico o Lw Carcter a A, Aw Las letras w, m, d, y e representan constantes enteras sin signo y han de vericar w > 0, e > 0. w m d e ancho total del campo. nmero minimo de digitos a producir en la salida. u nmero de digitos despus del punto decimal. u e nmero de digitos usados por el exponente. u

Cualquier descriptor puede estar precedido de un entero sin signo que indica el nmero de u repeticiones: 3F6.0 es equivalente a F6.0,F6.0,F6.0 que es de utilidad en el manejo de arrays. Enteros (Iw, Iw.m) En salida, un entero con Iw aparece justicado a la derecha con blancos a la izquierda, los que sean necesarios. Ej.: NHORAS = 8 MINUTOS = 6 WRITE(UNIT=*, FMT=(I4.2, I2.2)) NHORAS, MINUTOS tendr por salida: a 0806 47

En entrada Iw y Iw.m son iguales. Ntese que un campo entero no puede contener punto decimal, exponente o cualquier otro o simbolo de puntuacin como una coma. o Ejs.: A=+425.25 B=+6234 C=-11.92 D=3 WRITE(UNIT=*, FMT=(I4,I2,I3,I6.3)) A,B,C,D tendr por salida: a 452**-12 003

Punto otante(Ew.d, Ew.dEe, Fw.d, Gw.d, Gw.dEe) En la salida, los nmeros son redondeados al nmero especicado de digitos. u u La salida con Ew.d produce un nmero en notacin exponencial o cientica. La mantisa u o estar entre 0.1 1. a Gw.d es el descriptor de propsito general: si el valor es mayor que 0.1 pero no demasiado o largo, el campo ser escrito usando un formato de punto jo con d digitos en total y con a 4 blancos al nal del campo; en otro caso es equivalente al formato Ew.d. Exactamente la cosa es asi : Si la magnitud es menor que 0.1 o mayor o igual que 10d (despus de redondear a d digitos) se usa Ew.d; en otro caso se usa Fw.d. e La forma Ew.dEe especica que habrn exactamente e digitos en el exponente. a La forma Gw.dEe permite especicar tambin la longitud del exponente, si se elige el e formato de punto jo existen e + 2 blancos al nal. En los casos Ew.dEe y Gw.dEe se ha de vericar w d + e + 5,donde el 5 surge de sumar el blanco inicial, el signo del valor, el punto decimal, la letra E y el signo del exponente. Ejemplo: X = 123.456789 Y = 0.09876543 WRITE(UNIT=*, FMT=(E12.5, F12.5, G12.5)) X,X,X, Y,Y,Y produce dos registros (con para representar el blanco):

48

0.12346E+03 0.98766E-01

123.45679 123.46 0.09877 0.98766E-01

En entrada todos los descriptores E, F, y G tienen efectos idnticos : si el campo de entrada e contiene explicitamente un punto decimal, ste siempre toma precedencia, en otro casop e los ultimos d digitos se toman como la fraccin decimal. Si se usa un exponente puede o estar precedido de E o D (la letra del exponente es opcional si el exponente tiene signo). Si el campo de entrada proporciona ms digitos que los que puede utilizar el almacenamiena to interno, la precisin extra se ignora. Es mejor usar Fw.d que encaja con todas las formas o de punto otante o incluso enteros. Lgicos (Lw) o Cuando se escribe un valor lgico con Lw el campo contendr la letra T o F precedida por o a un punto decimal y cualquier nmero de blancos. caracteres despus de T o F se ignoran. u e Por tanto las formas .TRUE. y .FALSE. son aceptables. Tipo Carcter (A y Aw) a Si se usa A (sin especicar w) entonces la longitud del item de carcteren la lista de a transferencia de datos lo determina. Ntese que la posicin del resto de os items en el o o registro cambiar. a Es importante usar diseos con columnas jas de la forma Aw: siempre usar un campo n a con ancho w. en salida si la longitud real es menor que w se justica a la derecha, con w long blancos a la izquierda; en otro caso, solo se imprimen w caracteres. En entrada si la longitud es menor que w, solo se utilizan los caracteres ms a la derecha; a en otro caso se leen w caracteres y se le aaden long w blancos a la derecha. n

9.3

Descriptores de control

No se corresponden con ningn item de la lista y son los siguientes: u A format specication consisting of nothing but control descriptors is valid only if the READ or WRITE statement has an empty data-transfer list.

49

Funcin o Saltar al siguiente registro/linea Moverese a un columna (salida) Imprimir una constante tipo carcter a Parar si la lista es vacia Controlar signo + antes de nmeros positivos u Tratar blancos como nullos/ceros Poner un factor de escala para nmeros u

Descriptor / Tn, TLn, TRn, nX cualquier cadena : SP, SS, S BN, BZ kP

donde n and k son constantes enteras, k puede tener signo. Los descriptores SP, BN, kP aectan a todos los nmeros tratados a partir de ese momento, u pero los defaults del sistema se restauran al comienzo de la siguiente READ o WRITE. Cualquier lista puede ir precedida por una constante entera, p.e. 2(I2.2, -),I2.2 es equivalente a I2.2, -, I2.2, -, I2.2 Ejemplo de /: WRITE(UNIT=LP, FMT=95) (NYEAR(I), POP(I), I=1,NYEARS) FORMAT(1X,Year Population, //, 100(1X, I4, F12.0, /))

95

Tn la salida comienza en la columna n TRn desplazamiento de n columnas a la derecha TLn desplazamiento de n columnas a la izquierda nX equivalente a TRn SP todo nmero ser escrito con un + delante (a partir de cuando se use) u a SS todo nmero ser escrito sin un + delante (a partir de cuando se use) u a S restaura el default, que es dependiente del sistema BN todos los blancos son tratados como nulos, o sea, ignorados (despus de que se use) e BZ todos los blancos son tratados como ceros (despus de que se use) e

50

El default inicial (que depende de BLANK= en la OPEN) es restablecido al comienzo de cada nueva transferencia con formato. El factor de escala (kP) se utiliza para introducir una escala por una potencia de 10 entre valores internos y externos cuando se usan E,F,G. En principio podria ser util cuando se manejan datos demasiado grandes o demasiado pequeos. n El factor de escala inicial en cada transferencia ( entrada o salida) es cero. valor interno= valor externo / 10k valor externo= valor interno 10k

Referencias
[Bez89] H.C. Bezner. Fortran 77. Prentice-Hall International, Englewood Clis, New Jersey, 1989. [Bor89] G.J. Borse. Programacin en FORTRAN 77, con Aplicaciones de Clculo o a Numrico en Ciencias e Ingeniera. Anaya Multimedia, 1989. e [CS90] I.D. Chivers and J. Sleighthome. Interactive Fortran 77. Ellis Horwood Limited, New York, second edition, 1990. [Hewa] HewlettPackard. HP FORTRAN 77HP-UX Programmers. [Hewb] HewlettPackard. HP FORTRAN 77HP-UX Reference Volume 1. [Hewc] HewlettPackard. HP FORTRAN 77HP-UX Reference Volume 2. [JC88] R.K. Jones and T. Crabtree. Fortran Tools. John Wiley & Sons, New York, 1988. [Lig88] P. Lignelet. Les Fichiers en Fortran 77. Masson, Paris, 1988. [Mer86] F. Garc Merayo. Programacin en Fortran 77. Ed. Paraninfo, Madrid, 1986. a o [Met85] M. Metcalf. Fortran Optimization. Academic Press, London, 1985. [MS88] D.D. McCracken and W.I. Salmon. Computing for Engineers and Scientists with Fortran 77. John Wiley & Sons, New York, second edition, 1988. [Ter87] P.D. Terry. FORTRAN from Pascal. Addison-Wesley Publishing Co., Wokingham, England, 1987.

51

You might also like