You are on page 1of 10

FORTRAN

El FORTRAN (Formula Translator) es un lenguaje de programacin muy potente. Es el primer lenguaje cientfico, siendo desarrollado a ltimos de la dcada de los 50, pero es aun ampliamente utilizado en aplicaciones cientficas y de ingeniera. La ltima versin de FORTRAN actualmente es la versin FORTRAN 90, que reemplaz a la versin FORTRAN 77 a comienzos de la dcada de los 90. El FORTRAN 90 incorpora nuevas estructuras y caractersticas en su sintxis, si bien an es compatible con la anterior versin. Por ello, en este breve curso se pasa revista a los elementos bsicos del FORTRAN 77. Se trata de un curso muy introductorio; para una exposicin ms detallada habr que consultar algn manual de FORTRAN. En los primeros tiempos de la informtica cualquier clculo que implicara la evaluacin de frmulas matemticas haba de hacerse mediante complicados programas, que traducan esas frmulas al lenguaje del ordenador, muy primitivo. EL FORTRAN es un lenguaje de alto nivel, orientado a facilitar las cosas al usuario, y que permite escribir el programa de manera casi idntica a como se escriben las frmulas en un papel. En FORTRAN las instrucciones que el usuario transmite al ordenador se encuentran en un fichero de texto (en cdigo ASCII), que es necesario escribir (utilizando un editor de textos cualesquiera). El nombre del fichero sigue las convenciones del sistema operativo del ordenador. En DOS un programa FORTRAN suele tener la extensin '.FOR', por ejemplo, 'CALCULO.FOR'; en Unix es tradicional que la extensin sea '.f', por ejemplo, 'clculo'. Los nombres de los programas son libres (salvo ciertas limitaciones de longitud y tipos especiales de caracteres que no pueden aparecer en el nombre del fichero). Al contrario que el BASIC, que es un lenguaje interpretado, el FORTRAN es un lenguaje compilado. Esto significa que, una vez escrito el programa, ste ha de ser traducido en bloque al lenguaje mquina, o sea, el lenguaje que entiende el procesador del ordenador, mediante un proceso llamado compilacin; por contra, en un lenguaje interpretado las lneas de programa se van traduciendo segn el flujo va pasando por ellas, con lo que el proceso de ejecucin se enlentece. Escritura del programa Las instrucciones del programa se escriben en el fichero dispuestas en lneas. En FORTRAN 77 las columnas de la 1 a la 5 se reservan para que se puedan incluir etiquetas, en forma de nmeros, que hagan de sealizacin con vistas a la posibilidad de que el flujo del programa vuelva a esa lnea desde otra parte del programa. La columna 6 se reserva para incluir un smbolo que le indique al compilador que esa lnea es la continuacin de la lnea anterior. Por tanto, las instrucciones del programa en s comienzan a partir de la columna 6 (es decir, de la 7 a la 80). Un ejemplo de programa sencillo es: PROGRAM EJEMPLO REAL A, B, C A=1 B=A+1 PRINT *, A,B

C=A+B+1 PRINT *,'C es igual a=',C END En este programa se introduce un 1 en la variable A (ahora veremos qu son las variables); a continuacin se define la variable B como A ms 1, y se escriben las dos variables en la pantalla. Luego se define la variable C como la suma de A, B y 1 y, finalmente, se escribe un letrero y el valor de C en la pantalla. Es imprescindible acabar los programas con la instruccin END. Por contra, la instruccin que indica el comienzo del programa, PROGRAM, no es imprescindible, aunque su presencia es recomendable para hacer ms clara la estructura en caso de que existan subrutinas y funciones definidas en el programa. Conceptos bsicos del lenguaje VARIABLES

El primer concepto importante es el de variable. Una variable es una zona reservada en la memoria del ordenador, a la que se asigna un nombre. En esta zona podemos guardar un nmero, o bien una secuencia o cadena de caracteres. Las variables en las que se pueden almacenar nmeros se llaman numricas, y pueden tener como nombres una combinacin de caracteres, si bien el primero no puede ser un nmero; el nmero de caracteres vara segn el compilador. En el programa-ejemplo anterior, A, B y C son variables. Otros ejemplos pueden ser SUMA, RESTO, RESUL1, etc. Las variables se definen al comienzo del programa (es conveniente de hecho, aunque no obligatorio en FORTRAN 77, definir todas las variables de un programa al comienzo del mismo). Las variables numricas pueden ser enteras, reales o complejas. Nos referiremos aqu a las enteras y a las reales. Las variables enteras contienen nmeros enteros (es decir, sin parte fraccionaria), p. ej., -5, y se definen al comienzo del programa mediante la instruccin INTEGER. Las variables reales contienen nmeros reales, ya sea con notacin decimal (p.ej. 3.14159) o exponencial (p.ej.1.457E5, que quiere decir 1,457.10^5), y se definen al comienzo del programa mediante la instruccin REAL. Dependiendo de la precisin con la que queramos representar los nmeros que va a contener la variable, las variables enteras y reales pueden ser de simple precisin (cuatro bytes) o de doble precisin (ocho bytes). Este hecho se indica en la definicin de la variable REAL*4 SUMA REAL*8 RESTO Define SUMA como una variable real de simple precisin, y RESTO como una variable real de doble precisin. Si no se indica la precisin, el compilador entiende que se trata de variables reales en simple precisin, p. ej., REAL SUMA es equivalente a REAL*4 SUMA. Algunos compiladores permiten el uso de variables reales de cudruple precisin, definidas con REAL*16. En notacin exponencial las variables reales de simple, doble y cudruple precisin se definen con la letra E, D y Q, para el exponente; p. ej., -3.14159E0, 5.67899876478E4, -1.276238978673524678Q-3. Para las variables enteras, tenemos INTEGER*4 PRIMER

INTEGER*8 SEGUN Si no se especifica la precisin, el compilador entiende que la variable entera es de simple precisin. Algunos compiladores permiten definir variables enteras de slo dos bytes. Recurdese que n bits permiten representar nmeros enteros (negativos y positivos, incluyendo el cero) entre 2n-1+1 y 2n-1. As, dos bytes (es decir, 2.8=16 bits) permiten representar nmeros slo entre 32767 y +32768. Las variables en las que se pueden almacenar caracteres se llaman alfanumricas; su nombre sigue las mismas convenciones que el de las variables numricas, pero se definen mediante la instruccin CHARACTER, seguida de *n, siendo n el nmero de caracteres que puede almacenar la variable define una variable llamada NOMBRE que puede contener hasta diez caracteres. Los caracteres almacenados en las variables alfanumricas pueden ser cualesquiera y han de estar incluidos entre comillas simples, p. ej., '1', 'El resultado es:', etc. CHARACTER*10 NOMBRE Se pueden definir conjuntos de variables, a modo de componentes de un vector o matriz. Estas variables tienen un nombre y un ndice. Por ejemplo, A(I) es una componente del vector A; la variable I contiene un nmero entero y es un ndice. Tambin podemos tener matrices, p. ej., B(I,J), con dos ndices, I y J. Las variables vectores y matrices tambin han de declararse al principio del programa, con la instruccin DIMENSION; As, podemos escribirlo que indica que el vector A tiene diez componentes, A(1), A(2), ..., A(10). DIMENSION A(10)

ENTRADAS Y SALIDAS

Las entradas de datos a un programa y las salidas de datos producidos por ste se realizan en FORTRAN por medio de las instrucciones READ y WRITE. Para escribir tambin se utiliza la instruccin PRINT. La sintxis de las instrucciones READ y WRITE es: READ (unidad, formato) lista de variables WRITE (unidad, formato) lista de variables Para una explicacin de las unidades de lectura y escritura y los formatos es FORTRAN se recomienda acudir a un manual de FORTRAN. La situacin ms sencilla es aqulla en la que los datos se introducen mediante el teclado, y los datos salen en la pantalla, con formato libre. En estos casos se utiliza la sintxis READ (*,*) lista de variables WRITE (*,*) lista de variables Para la escritura en la pantalla con formato libre existe tambin la instruccin PRINT *,(la coma es parte de la instruccin).

Por ejemplo, el siguiente programa lee desde el teclado dos variables, A y B, las suma y enva el resultado a la pantalla: PROGRAM SUMA REAL A, B, C READ (*,*) A, B C=A+B WRITE (*,*) 'La suma es: ', C END OPERADORES MATEMTICOS Y FUNCIONES INTRNSECAS

Los nmeros y variables numricas se pueden combinar utilizando operadores matemticos, como + (suma), - (resta), * (multiplicacin) y / (divisin; en el caso de divisin entre enteros la divisin es la divisin entera, p. ej., 3/2 = 1). Otra operacin matemtica de inters es la exponenciacin, que se representa mediante ** ; p. ej., 2**3 es dos elevado al cubo. Algunas funciones estn incluidas en el FORTRAN. Son las funciones intrnsecas, cuyo argumentos (o argumentos) se incluyen entre parntesis. Funciones intrnsecas son la raiz cuadrada, SQRT, la funciones trigonomtricas seno, SIN, coseno, COS, tangente, TAN, arcoseno, ASIN, arcocoseno ACOS, arcotangente, ATAN, la funcin exponencial, EXP y algunas otras. La sintxis de estas funciones es, p. ej., SQRT(3.0), SIN(2.3), EXP(-1.0). Obsrvese que los argumentos de estas funciones son nmeros reales en simple precisin. Si los argumentos son en doble precisin hay que colocar la letra D delante del nombre de la funcin. As, p. ej., tendramos DSQRT(3.0D0), DSIN(2.3D0), DEXP(-1D0). SALTO INCONDICIONAL

Un salto incondicional es un cambio del flujo de un programa a otra lnea de ste. Esta lnea de destino ha de estar identificada con un nmero de lnea, que debe situarse en las columnas 1-5. El salto se produce cuando el control del flujo encuentra la instruccin GO TO, seguida del nmero de la lnea de destino. Un ejemplo de programa con salto incondicional sera A = 2.0 B = SQRT(A) ... GO TO 1 ... 1 C = B**2

... donde ... indica un nmero indeterminado de lneas de programa. Obsrvese cmo el flujo del programa cambiara a la lnea identificada con el nmero 1 cuando el flujo pase por la instruccin GO TO 1 y que, por tanto, las lneas de programa desde esa instruccin hasta la lnea 1 no se ejecutaran. Al identificar las lneas de programa mediante nmeros, tngase en cuenta que los nmeros son simples etiquetas, y que no tiene por qu mantenerse una numeracin creciente. BUCLES

El bucle es una estructura que permite efectuar repeticiones de un conjunto de instrucciones. Las instrucciones de control de un bucle son DO-END DO. Asociada al bucle existe una variable de control, normalmente entera, que hace de ndice. La sintxis general de la estructura en bucle es DO ndice = valor inicial, valor final, incremento ... END DO En cada iteracin la variable ndice va cambiando, desde valor inicial hasta su valor final, aumentando cada vez su valor en incremento. ste ltimo puede no aparecer, en cuyo caso se considera implcitamente que su valor es la unidad. El siguiente ejemplo resuelve la ecuacin implcita x=cos x mediante el mtodo de las iteraciones: PROGRAM TRASCEND REAL X INTEGER N READ (*,*) X, N DO I = 1, N X = COS(X) END DO WRITE(*,*) X END La instruccin READ lee un valor inicial aproximado, X, para la solucin de la ecuacin (que es 0,739085), y el nmero de iteraciones que se desea, N. Una vez efectuadas las N iteraciones, el bucle acaba y se escribe el resultado con WRITE. El modo en que la estructura DO-END DO funciona es el siguiente. En la primera iteracin la variable de control, en este caso I, asume el valor inicial, 1. Se ejecuta la instruccin del bucle, y cuando el control llega a la instruccin END DO se vuelve a transferir el flujo al comienzo del bucle. El ndice I toma ahora el valor 2, y as se repite el bucle hasta que el valor de I es N, en cuyo caso se efecta la iteracin por ltima vez y el flujo contina con las instrucciones que vienen despus del END DO. En el ejemplo, el total de iteraciones realizadas es N. Como prueba de este programa, se pueden ensayar valores iniciales para X de 1, y un nmero de iteraciones N variable entre 10 y 40.

Una aplicacin interesante de la estructura DO-END DO es la suma de series infinitas de nmeros. Consideremos la serie 1/1 + 1/2 + 1/3 + 1/4 + ... cuya suma es pi/6. Un simple programa permite calcular las sumas parciales de esta serie: SUM = 0.0 READ (*,*) N DO I = 1, N SUM = SUM + 1.0/I**2 END DO PRINT *, SUM END Este programa calcula la suma parcial con N trminos, SN. Aumentando el valor N se puede valorar si la serie converge o no, y en su caso la cantidad a la que converge. La siguiente tabla ha sido producida con el programa anterior.

N 10 100 1000 10000 20000 30000 40000

SN 1.54976773 1.63498390 1.64393457 1.64483407 1.64488407 1.64490073 1.64490907

Cambiando la lnea interior del bucle, obviamente, se pueden sumar otras series. ESTRUCTURAS CONDICIONALES

Una condicin es una situacin en la que dos variables se comparan y, dependiendo del resultado de esa comparacin, se ejecuta una instruccin o conjunto de instrucciones. El tipo ms sencillo de estructura que involucra una condicin es, por ejemplo, AMIN = A IF (A .GT. B) AMIN = B ... Esta estructura determina el mnimo de los valores de dos variables, A y B, y lo almacena en la variable AMIN. La instruccin IF efecta la comparacin entre A y B, utilizando el operador .GT.

(del ingls Greater Than). Si A>B, se ejecuta la instruccin AMIN = B. Si no se cumpliese esa condicin, el control pasara directamente a las lneas que siguen a la lnea, representadas por ..., sin que la instruccin AMIN = B se ejecutara. Los operadores matemticos condicionales son: .EQ. : igual a (EQual to) .LT. : menor que (Less Than) .GT. : mayor que (Greater Than) .LE. : menor o igual que (Less to or Equal than) .GE. : mayor o igual que (Greater to or Equal than) Una estructura condicional ms sofisticada es la estructura IF-THEN-ELSE-END IF. Esta estructura permite ejecutar un bloque de instrucciones u otro dependiendo del resultado de la condicin. La estructura se utiliza de la forma IF (condicin) THEN ... ELSE ... END IF Si el resultado de la condicin es verdadero, se ejecutara el primer bloque de instrucciones (antes del ELSE), mientras que si es falso, se ejecutara el segundo bloque de instrucciones (despus del ELSE). La segunda parte se puede tambin eliminar, quedando la estructura ms simple IF (condicin) THEN ... END IF Slo en el caso en que la condicin sea verdadera se ejecutara el bloque de instrucciones ... Si la condicin resultara falsa, se continuara con las instrucciones situadas a continuacin del END IF sin que se ejecuten las instrucciones situadas dentro de la estructura IF-THEN-END IF. La ltima estructura condicional interesante es el salto condicional. Un salto condicional es un cambio del flujo de un programa a otra lnea de ste, pero siempre que se cumpla una determinada condicin. Al igual que en los saltos incondicionales, la lnea de destino ha de estar identificada con un nmero de lnea, que debe situarse en las columnas 1-5. El salto se puede producir cuando el control del flujo encuentra una instruccin IF: IF (condicin) GO TO nmero de lnea Como ejemplo de las estructuras condicionales, vamos a efectuar la suma de la serie

1/1+1/2+1/3+1/4+1/5+... cuyo trmino general es 1/n. El programa, obviamente, no puede calcular la suma infinita, pero s sumas parciales de la serie. Supongamos que queremos sumar los M primeros trminos de la serie, es decir, calcular la suma parcial SM). El siguiente programa resuelve este problema con ayuda de un salto condicional: PROGRAM SERIE REAL SUM INTEGER M, N M = 10 SUM = 0.0 N=0 N=N+1 IF (N .LE. M) THEN SUM = SUM + 1/N**2 GO TO 1 END IF PRINT *, SUM END SUBRUTINAS Y FUNCIONES EXTRNSECAS

Muchas veces es necesario en un programa efectuar un conjunto de instrucciones de una manera reiterativa. Las subrutinas y funciones evitan tener que escribir el mismo trozo de cdigo varias veces. Adems, ayudan a hacer el programa ms ordenado e inteligible. Las subrutinas y funciones extrnsecas son trozos de programa que se definen separadamente del programa principal, y sus variables necesitan ser definidas en la subrutina ya que son variables locales, no compartidas con el programa principal o con las de otras subrutinas. Subrutinas Se definen mediante la instruccin SUBROUTINE. La subrutina ha de acabar con un END. La sintxis completa es SUBROUTINE nombre (lista de argumentos) ... END

La subrutina se invoca con la instruccin CALL. Un ejemplo de utilizacin de subrutinas es la transformacin entre coordenadas polares y cartesianas: PROGRAM POLAR_CARTES REAL X, Y, RHO, THETA READ (*,*) RHO, THETA CALL POLARES (X, Y, RHO, THETA) PRINT *, X, Y END SUBROUTINE POLARES (X, Y, RHO, THETA) REAL X, Y, RHO, THETA X = RHO * COS (THETA) Y = RHO * SIN (THETA) END Funciones extrnseca La sintxis es muy parecida a la de las subrutinas pero, al contrario que en stas, en las que puede haber cualquier nmero de argumentos de entrada y salida, en las funciones slo hay una variable de salida, que es el propio nombre de la funcin. Se definen mediante la instruccin FUNCTION, y acaba tambin con END. La estructura general es FUNCTION nombre (lista de argumentos) ... END Un ejemplo es el clculo de la funcin factorial: PROGRAM CALCULO_FACT INTEGER N REAL FACT, FACTORIAL READ (*,*) N FACT = FACTORIAL (N) PRINT *, FACT END FUNCTION FACTORIAL (N)

INTEGER I, N REAL FACTORIAL, PROD PROD = 1.0 DO I = 2, N PROD = PROD * I END DO END Obsrvese que el nombre de la funcin ha de ser declarado como si fuera una variable ms, tanto en el programa principal de llamada como en la propia funcin.

You might also like