Lección 2 – Declaración de variables. Sentencias de entrada/salida Declaración de variables. Sentencias de entrada/salida Introducción En los capítulos anteriores se introdujo la notación algorítmica y unas nociones básicas del lenguaje de programación FORTRAN; se describió el concepto de tipo de datos, variable y constante, así como las sentencias de asignación y entrada/salida. En el caso de la notación algorítmica se describió la estructura fundamental de un algoritmo, no así en el caso de FORTRAN; en este capítulo se profundizará en el lenguaje explicando conceptos como la declaración de variables o los distintos formatos aceptados por las sentencias de entrada/salida. Declaración de variables Estructura de un programa FORTRAN y declaración implícita de variables Sabemos que tanto la notación algorítmica como FORTRAN disponen de una serie de tipos de datos, cada variable utilizada en un algoritmo pertenecerá obligatoriamente a uno de tales tipos; para indicar el tipo de una variable ésta debe ser “declarada”. En el primer capítulo se mostró la forma en que se declaraban variables en nuestra notación algorítmica: variables v1 ∈ tipo1 v2 ∈ tipo2 ... Existía una sección especial del algoritmo, antes de que se proporcionase ninguna instrucción, donde se declaraban los tipos de todas las variables a utilizar en el algoritmo; el lenguaje FORTRAN funciona de manera similar aunque con algunas diferencias que es necesario tener en cuenta. Todo programa FORTRAN presenta la siguiente estructura: program nombre_programa sentencia 1 sentencia 2 ... end Como se puede apreciar, un programa FORTRAN comienza siempre por la palabra reservada program y termina en la palabra reservada end; siguiendo siempre a program el nombre del programa que debe ser un identificador válido (ver capítulo anterior). Entre ambos extremos se colocan las sentencias que componen el programa en sí; pudiendo ser tales sentencias: • Declaraciones de variables. • Definiciones de constantes. • Instrucciones. Una característica muy importante es que cualquier declaración de variable o definición de constante debe preceder obligatoriamente a todas las instrucciones del programa; es decir, no se pueden declarar variables o definir constantes en mitad de un algoritmo descrito en FORTRAN. De esta manera, la estructura de un programa FORTRAN es la siguiente: program nombre_programa declaración de variable o definición de constante 1 declaración de variable o definición de constante 2 ... sentencia 1 sentencia 2 ... end Otra peculiaridad que hay que tener en cuenta es debida a una característica (muy desafortunada, por cierto) del lenguaje FORTRAN 77; en este lenguaje no era estrictamente necesario declarar el tipo de las variables que iba a utilizar el programa, existían una serie de reglas mnemotécnicas que definían de manera implícita el tipo de cada variable. Así, cualquier variable cuyo identificador comenzase por I, J, K, L, M o N era de tipo integer, y las que empezasen por otro carácter de tipo real. Obviamente, las variables de tipos distintos a los dos mencionados debían declararse de manera explícita; esta característica aunque puede parecer interesante puede resultar muy peligrosa puesto que un simple error en la escritura del nombre de una variable pasaría desapercibido con consecuencias difíciles de determinar. FORTRAN 90 conserva muchas de las peculiaridades de las versiones anteriores del lenguaje por lo que también admite declaraciones implícitas; dado que es una característica muy desaconsejable es necesario utilizar la 1 Lección 2 – Declaración de variables. Sentencias de entrada/salida sentencia IMPLICIT NONE en todos los programas de tal manera que se indique al compilador que todas las variables deben ser declaradas para su uso. De esta forma la estructura de un programa FORTRAN sería la siguiente: program nombre_programa implicit none declaración de variable o definición de constante 1 declaración de variable o definición de constante 2 ... sentencia 1 sentencia 2 ... end Declaración explícita de variables en FORTRAN La sintáxis de las sentencias de declaración de variables es la siguiente: tipo variable1 [, variable2]* Donde tipo puede ser integer, real, character o logical. Como se puede ver en la expresión anterior se emplea una notación con corchetes y asteriscos; el significado de la misma es el siguiente: los corchetes indican que su contenido es opcional mientras que el asterisco indica que la expresión puede repetirse cero o más veces; es decir, las siguientes sentencias son declaraciones de variables válidas: integer velocidad real a, b, c logical entrada, salida character cadena Declaración de cadenas de caracteres Como ya sabemos, existe un tipo peculiar que es el character; mientras que en la notación algorítmica existe un tipo caracter que permite almacenar secuencias de caracteres de longitud arbitraria, en FORTRAN hay que indicar de manera específica la longitud de cada cadena puesto que, por defecto, una variable de tipo character tiene una longitud de un único carácter. A continuación se muestran declaraciones de variables para almacenar cadenas de caracteres de diferentes longitudes: character a, b, c character*8 dni character*9 telefono, nif Las tres primeras variables pueden almacenar un único carácter cada una, la segunda cadenas de 8 caracteres y las dos últimas, cadenas de 9 caracteres. Vectores y matrices (FORTRAN y notación algorítmica) Una característica de todas las declaraciones de variables anteriores es que sólo pueden almacenar un único dato del tipo declarado: un integer, un real o una secuencia de caracteres; sin embargo, en muchas ocasiones es necesario manejar datos no puntuales sino multidimensionales como vectores y matrices. Para trabajar con vectores y matrices en la notación algorítmica se dispone de la palabra reservada vector con la sintáxis siguiente: vector (n [,m]*) de tipo Así, las siguientes serían sentencias válidas que permiten declarar un vector de tres coordenadas y una matriz cuadrada de lado 3: coordenadas ∈ vector (3) de real tres_en_raya ∈ vector (3,3) de logico Por lo que respecta a la declaración de vectores y matrices en FORTRAN difiere un poco respecto a la notación algorítmica y puede hacerse de dos formas distintas: tipo variable (n [,m]*) o bien tipo variable dimension variable (n [,m]*) Ambas formas son igualmente válidas, aunque la primera es más breve y se aproxima más a la forma en que se trabaja en la notación algorítmica. Para declarar en FORTRAN las variables anteriores se procedería de la forma siguiente: real coordenadas (3) logical tres_en_raya (3,3) Hay que señalar que aunque existen lenguajes de programación que permiten trabajar con vectores y matrices como tipos de datos elementales no es éste el caso de FORTRAN (y tampoco de nuestra notación algorítmica); los operadores existentes sólo pueden manejar tipos de datos simples por lo que siempre será necesario acceder a las componentes individuales de un vector o matriz. La forma de realizar este acceso es la siguiente tanto en FORTRAN como en la notación algorítmica: variable (i [,j]*) 2 Lección 2 – Declaración de variables. Sentencias de entrada/salida Así, para acceder a la segunda coordenada del vector anterior o a una de las “esquinas” de la matriz se procedería como sigue: coordenadas(2) tres_en_raya(3,3) Sentencias de entrada/salida Tanto en la notación algorítmica como en FORTRAN existen dos sentencias para llevar a cabo operaciones de entrada/salida, se trata de las sentencias leer y escribir y sus equivalentes read y print. Como se recordará, el formato de las primeras era: leer variable1 [, variableN]* escribir expresión1 [, expresiónN]* Sus equivalentes en FORTRAN son similares aunque tienen como característica no existente en la notación algorítmica el empleo de formatos: read formato, variable1 [, variableN]* print formato, expresión1 [, expresiónN]* Los formatos permiten especificar las características de presentación de la información (tipo de dato, posiciones ocupadas, número de decimales, etc.) En caso de que el programador no desee especificar información sobre formato, es decir, emplear un formato libre debe emplear el carácter asterisco (*); a continuación se muestran algunas sentencias de entrada/salida en notación algorítmica y su traducción a FORTRAN: leer temperatura leer velocidad, aceleracion escribir longitud escribir ‘hola’, nombre read *, temperatura read *, velocidad, aceleracion print *, longitud print *, ‘hola’, nombre Sin embargo, aún cuando la utilización del formato libre es muy cómoda hay ocasiones en las que resulta necesario fijar un formato determinado para los datos, especialmente, al producir salidas. A continuación se describirán los códigos de formato más habituales y su forma de utilización. Códigos de formato Por cada tipo de dato FORTRAN existe al menos un código de formato; así, los más comunes son I para integer, F y E para real (sin exponente y con exponente), L para logical y A para character. Cada código de formato va acompañado de una serie de cifras que permiten controlar con mayor precisión la forma en que se representa la información. A continuación se presentará cada código de formato junto con las formas en que puede aparecer, proporcionando una descripción del mismo y algunos ejemplos. Tipo de dato integer Código de formato I Forma In In.d cIn.d Descripción Ejemplos n es un entero sin signo distinto de cero. Esta forma indica que se va a leer/escribir una expresión de tipo entero empleando n posiciones para la misma contando el signo si existe. n es un entero sin signo distinto de cero. d es un entero sin signo distinto de cero. Esta forma indica que se va a leer/escribir una expresión de tipo entero empleando n posiciones para la misma (contando el signo) de las cuales se utilizarán, al menos, d. En lectura In.d equivale a In c es un entero sin signo distinto de cero. n es un entero sin signo distinto de cero. d es un entero sin signo distinto de cero. Esta forma indica que se van a leer/escribir c expresiones de tipo entero empleando n posiciones para cada una (contando el signo) de las cuales se utilizarán, al menos, d. print '(I5)', 2 print '(I1,I1,I2)', 2, 3, -1 2 23-1 print '(I5.5)', 2 print '(I1,I1,I5.3)', 2, 3, -1 00002 23 -001 print '(3I5.3)',2,2,2 3 Resultado de los ejemplos 002 002 002 Lección 2 – Declaración de variables. Sentencias de entrada/salida real F Fn.d n es un entero sin signo print '(F5.1,F5.3)',3.142, 3.142 distinto de cero. d es un entero sin signo distinto de cero. Esta forma indica que se va a leer/escribir una expresión de tipo real empleando n posiciones para la misma (contando el signo y el punto decimal) de las cuales se utilizarán d para posiciones decimales. cFn.d c es un entero sin signo print '(2F5.3)',3.142, 3.142 distinto de cero. n es un entero sin signo distinto de cero. d es un entero sin signo distinto de cero. Esta forma indica que se van a leer/escribir c expresiones de tipo real empleando n posiciones para cada una (contando el signo y el punto decimal) de las cuales se utilizarán d para posiciones decimales. n es un entero sin signo print '(E6.1,E8.3)',3.142, 3.142 distinto de cero. d es un entero sin signo distinto de cero. Esta forma indica que se va a leer/escribir una expresión de tipo real con exponente empleando n posiciones para la misma (contando el signo de mantisa y exponente y el punto decimal) de las cuales se utilizarán d para la mantisa. cEn.d c es un entero sin signo print '(2E6.1)',3.142, 3.142 distinto de cero. n es un entero sin signo distinto de cero. d es un entero sin signo distinto de cero. Esta forma indica que se van a leer/escribir c expresiones de tipo real con exponente empleando n posiciones para cada una (contando el signo de mantisa y exponente y el punto decimal) de las cuales se utilizarán d para la mantisa. cEn.dEe c es un entero sin signo print '(2E7.1E3)',3.142, 3.142 distinto de cero. n es un entero sin signo distinto de cero. d es un entero sin signo distinto de cero. e es un entero sin signo distinto de cero. Esta forma indica que se van a leer/escribir c expresiones de tipo real con exponente empleando n posiciones para cada una (contando el signo de mantisa y exponente y el punto decimal) de las cuales se utilizarán d para la mantisa y e para el exponente. En.d 4 3.13.142 3.1423.142 .3E+01.314E+01 .3E+01.3E+01 .3E+001.3E+001 Lección 2 – Declaración de variables. Sentencias de entrada/salida logical L Ln character A An cAn n es un entero sin signo print '(L1,L5)', .true., .true. distinto de cero. Esta forma indica que se va a leer/escribir una expresión de tipo lógico empleando n posiciones para la misma. n es un entero sin signo print '(A2,A4)', 'hola', 'hola' distinto de cero. Esta forma indica que se va a leer/escribir una expresión de tipo cadena de caracteres empleando n posiciones para la misma. c es un entero sin signo print '(2A3)', 'hola', 'adios' distinto de cero. n es un entero sin signo distinto de cero. Esta forma indica que se van a leer/escribir c expresiones de tipo cadena de caracteres empleando n posiciones para cada una. T T hohola holadi Para terminar con los códigos de formato tan sólo resta decir que en el caso de que una expresión no pudiera encuadrarse dentro del formato solicitado en una sentencia de salida el resultado que se obtendría sería una secuencia de n asteriscos donde n sería el ancho de formato especificado. Resumen 1. Tanto en la notación algorítmica como en FORTRAN existe una zona donde se pueden declarar variables y definir constantes. 2. En FORTRAN las variables y constantes deben declararse y definirse antes de ninguna instrucción ejecutable. 3. FORTRAN posee declaración implícita de variables enteras y reales, es decir, en caso de que una variable no sea declarada de forma específica se le asigna un tipo entero o real en base a la primera letra del identificador. Para evitar esta característica indeseable es necesario utilizar la sentencia IMPLICIT NONE antes de ninguna declaración de variables. 4. La estructura de un programa FORTRAN es la siguiente: program nombre_programa implicit none declaración de variable o definición de constante 1 declaración de variable o definición de constante 2 ... sentencia 1 sentencia 2 ... end 5. La sintáxis de las sentencias de declaración en FORTRAN es la siguiente: tipo variable1 [, variable2]* 6. En el caso de que se deseen declarar cadenas de caracteres la sintáxis es: 7. Tanto en FORTRAN como en la notación algorítmica es posible declarar vectores y matrices; en el caso de la notación algorítmica la sintáxis es: character*longitud variable1 [, variable2]* variable ∈ vector (n [, m]*) de tipo mientras que en FORTRAN es: tipo variable (n [, m]*) 8. Para acceder a un componente de un vector o matriz tanto en la notación algorítmica con en FORTRAN se emplea la sintáxis siguiente: variable (i [, j]*) 9. FORTRAN tiene dos sentencias de entrada salida: read y print; a diferencia de la notación algorítmica estas sentencias incluyen un parámetro para “formatear” la entrada o la salida de los datos siendo su sintáxis la siguiente: read formato, variable1 [, variableN]* print formato, expresión1 [, expresiónN]* 10. Existe la posibilidad de utilizar ambas sentencias con el denominado formato libre, para ello basta con indicar como formato un asterisco *. 5