SALIDAS LÓGICAS Descriptor L Las salidas lógicas : rLw Los valores de una variable lógica son .TRUE. o .FALSE. La salida de estas opciones son T y F, que se escriben justificadas a la derecha. Ej: LOGICAL : : salida = .TRUE. , opcion = .FALSE. WRITE(*,”(“ “,2L5)” salida, opcion IMPRESIÓN 5 10 ----|----|----| T F SALIDAS CHARACTER Descriptor A En general : rA o rAw rA → el ancho del campo es igual al número de caracteres de los datos rA w → el ancho del campo es igual a w, si w es mayor que los caracteres a imprimir estos quedan justificados a la derecha. Si w es menor que los caracteres a imprimir, solo los primeros w caracteres de la variable son impresos. Ej CHARACTER(len=17) : : tex=“este es el texto” WRITE(*,10 ) tex WRITE(*,11 ) tex WRITE(*,12) tex 10 FORMAT(“ “, A) 11 FORMAT(“ “, A20) 12 FORMAT(“ “, A6) IMPRESIÓN este es el texto este es el texto este e ----|----|----|----|----| Posicionamiento horizontal Descriptores X y T X → inserta blanco entre valores T → tabula a una columna En general : nX Inserta n blancos Tc c → es el número de columna en la que se tiene que posicionar CHARACTER(len=8) : : nombre = ‘José ’ CHARACTER(len=2) : : inicial = ‘J.’ CHARACTER(len=10) : : apellido = ‘García ’ CHARACTER :: curso = ‘Climatología’ INTEGER : : anio = ‘2004’ WRITE(*,100) nombre, inicial, apellido, anio, curso 100 FORMAT(1X, A8, 1X, A2, 1X, A10, 1X, I4, T33, A13) Ej 5 J o s e 1 0 J . 1 5 Ga r c í a 2 0 2 5 2 0 0 4 3 0 3 5 4 0 C l i ma t o l o g í a Observar que el curso se escribe en la columna 32 y no en la 33 como indica el descriptor T. Esto sucede porque 1X es tomado como carácter control . (en la memoria es el lugar 33 en la impresión es el lugar 32) Lo mismo imprime WRITE(*,100) nombre, inicial, apellido, anio, curso 100 FORMAT(1X, A8, T11, A2, T14, A10, T33, A13 , T25, I4) En este ejemplo se salta hacia atrás. 5 J o s e 1 0 J . 1 5 2 0 Ga r c í a 2 5 3 0 2 0 0 4 3 5 4 0 C l i ma t o l o g í a ! De esta forma se puede sobreimprimir Ej WRITE(*,100) nombre, inicial, apellido, anio, curso 100 FORMAT(1X, A8, T11, A2, T14, A10, T33, A13 , T15, I4) 5 J o s e 1 0 J . 1 5 G2 0 0 4 a 2 0 2 5 3 0 3 5 4 0 C l i ma t o l o g í a REPITIENDO GRUPOS Ej 100 FORMAT( 1X, I6, I6, F10.2, F10.2, I6 , F10.2, F10.2) 100 FORMAT( 1X, I6, 2(I6, F10.2, F10.2)) 100 FORMAT( 1X, I6, 2(I6, 2(F10.2))) SALTANDO LÍNEAS Descriptor / / → Salta al comienzo de la línea siguiente. Varias / se usan para saltear varios renglones. No es necesario que estén separadas por comas. Ej WRITE(*, 100) indice, tiempo, profundidad, amplitud, fase 100 FORMAT(‘1’, T20, ‘Resultado de la prueba número’, I3, ///,& 1X, ‘tiempo = ‘ , F10.0/, & 1X, ‘profundidad = ‘ , F7.1, ‘ metros ‘, /, & 1X, ‘amplitud = ‘, F8.2/ & 1X, ‘fase =‘, F7.1) Ej ! WRITE(*, 100) indice, tiempo, profundidad, amplitud, fase 100 FORMAT(‘1’, T20, ‘Resultado de la prueba número’, I3, ///,& 1X, ‘tiempo = ‘ , F7.0/, & 1X, ‘profundidad = ‘ , F7.1, ‘ metros ‘, /, & 1X, ‘amplitud = ‘, F8.2/ & 1X, ‘fase = ‘, F7.1) Notar que cada nueva línea tiene (necesita) un control de carro Resultado de la prueba numero 10 tiempo = profundidad = amplitud = fase = 300. 330.0 metros 850.65 30.2 Los FORMAT en el WRITE se exploran de la siguiente manera: 1. De izquierda a derecha. La primera variable se le asigna el primer descriptor, a la segunda variable el segundo y así sucesivamente. WRITE(*,10) i, j, k, a 10 FORMAT(1X, I5, I10, I15, f10.2) ⇒ i → I5, j → I10 k → I15 a → f10.2 2. Si un factor de repetición está asociado a un descriptor ese descriptor es usado el número de veces que indica el factor de repetición y luego sigue con el siguiente descriptor. WRITE(*,10) i, j, k, a 10 FORMAT(1X, 2I5, I10, f10.2) ⇒ i → I5, j → I5 k → I10 a → f10.2 3. Si un factor de repetición está asociado a un grupo de descriptores entre paréntesis ese grupo de descriptores es usado el número de veces que indica el factor de repetición y luego sigue con el siguiente descriptor o grupo de descriptores. WRITE(*,30) a, i, b, j, c, d 30 FORMAT(1X, F10.2, 2(I5, E14.6), f10.2) ⇒ a→ F10.2 i → I5 b → E14.6 j → I5 c → E14.6 d→ f10.2 4. La impresión para cuando el descriptor no corresponde a la variable o al fin del FORMAT, lo que ocurre primero. a) INTEGER : : m = 1 WRITE(*,40) m 40 FORMAT(1X, ‘ m = ‘, I3, ‘ n = ‘, I4, ‘ O = ‘ F7.2) Impresión: 5 m = 1 0 1 n 1 5 2 0 1 5 2 0 1 3 . 8 k V = b) REAL : : voltaje = 13800. WRITE(*, 50) voltaje / 1000. 50 FORMAT(1X, ‘voltaje = ‘, F8.1, ‘ kV’) Impresión: 5 v o l t a j 1 0 e = 5. Cuando los descriptores del formato finalizan antes que los datos incluidos en el WRITE, el programa envía la salida de la memoria a la impresora y retorna al paréntesis abierto que se encuentra a la derecha y no está precedido por un factor de repetición. a) INTEGER : : j = 1, k = 2, l = 3, m = 4, n = 5 WRITE (*, 60) j, k , l, m, n 60 FORMAT(1X, ‘ Valor = ‘, I3) 5 1 0 1 5 V a l o r = 1 V a l o r = 2 V a l o r = 3 V a l o r = 4 V a l o r = 5 2 0 En este caso paréntesis abierto que se encuentra a la derecha y no está precedido por un factor de repetición es el de la apertura del FORMAT b) INTEGER : : j = 1, k = 2, l = 3, m = 4, n = 5 WRITE (*, 60) j, k , l, m, n 60 FORMAT(1X, ‘ Valor = ‘, /, (1X, ‘Nueva línea ‘, 2(3X, I3)) 5 1 0 1 5 2 0 V a l o r = N u e v a l Í n e a 1 2 N u e v a l Í n e a 3 4 N u e v a l í n e a 5 En este caso paréntesis abierto que se encuentra a la derecha y no está precedido por un factor de repetición es el se encuentra después de la / LECTURA CON FORMATO Los descriptores de la sentencia READ, son básicamente los de la sentencia WRITE, aunque el READ presenta algunas particularidades. REALES Los números con punto decimal o con notación exponencial serán leídos correctamente a) READ (*, (3F10.4) ) a, b, c 5 1 0 1 5 1 . 5 2 0 2 5 0 . 1 5 E+ 0 1 3 0 1 5 . 0 E- 0 1 Los tres datos son leidos como 1.5 Si se escribe un número decimal sin puntos entonces el punto decimal es supuesto con el número d indicado en el formato. b) READ(*, 3F10.4) a, b, c 5 1 0 1 5 a → 0.0015 b → 0.0150 1 5 1 5 0 c → 1.5000 2 0 2 5 1 5 0 0 0 3 0 CHARACTER CHARACTER (len=10) : : texto1, texto2 CHARACTER (len=5 ) : : texto3 CHARACTER (len=15) : : texto4, texto5 READ (*,’(A)’) texto1 READ (*,’(A10)’) texto2 READ (*,’(A10)’) texto3 READ (*,’(A10)’) texto4 READ (*,’(A)’) texto5 5 1 0 1 5 2 0 2 5 3 0 A B C D E F GH I J K L MN O A B C D E F GH I J K L MN O A B C D E F GH I J K L MN O A B C D E F GH I J K L MN O A B C D E F GH I J K L MN O texto1 → ABCDEFGHIJ Porque el texto1 tiene 10 caracteres en su definición. texto2 → ABCDEFGHIJ Porque el texto2 tiene 10 caracteres en su definición y en su descriptor texto3 → FGHIJ Porque el texto3 tiene 5 caracteres por definición y 10 por el descriptor. Toma 5 caracteres a la derecha de los 10 asignados. texto4 → ‘ABCDEFGHIJ-----’ (- → blancos) Porque el texto4 tiene 15 caracteres en su definición y en su descriptor texto5 → ABCDEFGHIJKLMNO Porque el texto5 tiene 15 caracteres en su definición y su descriptor es variable( según la longitud de la variable) Posición Horizontal T Se puede utilizar para leer el mismo dato de 2 maneras: CHARACTER(len=6) : : var Integer : : ientra READ (*, ‘(I6, T1, A6)’) ientra, var Posición Vertical / Es una forma de no leer datos y saltar registros REAL : : a, b, c, d READ (*, 300) a, b, c, d 300 FORMAT(2F10.2, //,2F10.2) 5 1 0 1 5 2 0 2 5 3 0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 . 0 9 . 0 a → 1.0 b → 2.0 c → 7.0 d → 8.0