Ficheros y Formatos 1 Recuerda En esta practica retrata de mejorar la ejecución de programas, aprendiendo a manejar ficheros y a leer y escribir con formato. Lo que hemos usado hasta ahora, es una versión particular de las sentencias de entrada y salida de datos. F90 trata la impresora y pantalla como un caso particular de ficheros de datos. Por eso, primero abordaremos el manejo de ficheros. Los Ficheros en F90 son ficheros de texto, cuyos registros son las líneas del fichero, y los campos son los valores almacenados en el mismo, separados por blancos (a veces por comas), de acuerdo con formatos definidos. Abrir y cerrar un fichero OPEN (Unit = u, File = ’nombre’, IOStat=S1, Status= ’est’, Acces=’frm’, Action=’acc’, Position=’pos’, Blank=’bla’) CLOSE (u, Iostat=S1, Status=’est’). Sentencias generales de Entrada y Salida de datos READ (Unit =I, Format=J, Iostat = S1, Advance = ’av’, Size = t ) Lista variables WRITE (I, J, Iostat = S1, Advance = ’av’) Lista expresiones La sentencia Format etq FORMAT (lista especificaciones de descriptores) Los descriptores más importantes I: Enteros, Iw (Iw.v ; v < w): v (num mínimo dígitos) ; w (anchura total) F: Real sin exponente, Fw.d ; E:con exponente, Ew.d (Ew.dEe) (d decimales) A: Cadenas, Aw . [w] es la longitud de la cadena. Al leer con este Formato, no es necesario poner la cadena entre comillas, pero hay que rellenar w espacios X : Saltar espacios, nX (salta n espacios) / : Salta a columna 1 de línea siguiente T(Tabulador): Tn lleva a columna n. TRn (TLn) salta n posiciones a drcha (izqda) 2 Toma de contacto: Ficheros y Formatos en Fortran 1) Observa, compila y ejecuta el siguiente programa, analizando con él todo lo aprendido en el tema. Observa bien los formatos definidos, y compara con la impresión que realiza el programa de los datos Subprogramas Después, abre el fichero de datos para comprobar como se escriben los datos en el mismo. Vuelve a ejecutar el programa y vuelve a ver el fichero de datos. 1 PROGRAM FicheNotas 2 IMPLICIT NONE 3 type notas 4 character (40):: nom ; real, dimension(5):: cali 5 end type notas 6 type (notas), dimension (100):: alum 7 character(8), dimension (5):: asig ; integer:: i, j =1 8 asig=(/'mates', 'fisica','informat', 'arte', 'quimica'/) 9 open (5, file= 'NOTAS.txt', access= 'APPEND') 10 print*, 'Introduce el nombre del alumno', j, ' (000 para finalizar)' 11 read*, alum(j)%nom 12 Do while (alum(j)%nom(1:3) /='000') 13 Do I=1, 5 14 print*, 'Introduce la nota de ', trim(alum(j)%nom), ' en la asignatura ',& &asig (i) 15 Read*, alum(j)%cali(i) 16 EndDo 17 write(5, 10) alum(j)%nom, (alum(j)%cali(i), i=1,5) 18 print*, alum(j)%nom, (alum(j)%cali(i), i=1,5) ; j = j+1 19 print*, 'Introduce el nombre del alumno', j, '("000" para fin)' 20 read*, alum(j)%nom 21 EndDo 22 rewind(5) ; j = 1 23 Do while (.not.eof(5)) 24 read(5, 10) alum(j)%nom, (alum(j)%cali(i), i=1,5) ; j=j+1 25 EndDo 26 Print*, ' ALUMNO NOTAS: MAT FIS INF ART QUI' 27 Print 12 28 Print 10, alum(1:j-1) 29 10 Format (1X, A40, 5F6.2) 30 12 Format (1X, 71('=') ) 31 END 3 Corrige los errores 2) A continuación tienes un programa que imprime con formato y en un fichero, los nombres y temperaturas de varias ciudades en un determinado día. Corrige los errores. Observa que al leer con formato, las cadenas han de tener exactamente el numero de caracteres que se indica, y los números deben tener las cifras decimales correspondientes. Por ello, se debería avisar de los formatos en los Print previos a los Read. 1 PROGRAM Temperaturas !Nom ciudad hasta 15 caracteres. 2 IMPLICIT NONE 3 CHARACTER (15), Dimension(20):: Ciudad; Character(12):: Cad 4 INTEGER:: I, NC = 20 ; REAL, Dimension(20):: Temp 5 DO I = 1, nc !! Para Probar el programa poner 4 ciudades 6 write(*,*) 'escribe la ciudad y temperatura numero ', I ; 7 read (*, FMT =16) ciudad(i), temp(i) 8 EndDo 9 OPEN (10, FICH = 'Ciudades.Tem') 10 Print *, ' Num CIUDAD TEMPERATURA OBSERVACIONES‘ 11 Print ‘(50(’=‘))’, !! Alternativa: Print 19, ; 19 format (50(‘=’)) 12 Do I = 1, nc 13 Cad = ' ' 14 IF (Temp .GT. 30.0) THEN 15 CAD = 'Mucho CALOR' 16 ELSEIF (TEMP(I) .LT. 5.0) THEN 17 Cad = 'FRIO' 18 ENDIF 19 Write(*,17) I, Ciudad(I), Temp(I), Cad 20 Write(UNIT = 20, 18) Ciudad(I), Temp(I) 21 EndDo 22 16 FORMAT (A15, F6.1) 23 17 FORMAT (2X, I2, 5X, A15, 3X, F6.1, 5X, A12) 24 18 FORMAT (4X, A15, 10X, F6.1 25 END PROGRAM TEMPERATURAS 4 El problema 3) El paso siguiente es almacenar en un fichero los resultados de nuestro juego, cuando varios jugadores realizan varias partidas seguidas. Los resultados de cada partida, y para cada jugador, se almacenan en el fichero. Al terminar todas las partidas, el Programa debe leer esos datos almacenados, e imprimir en pantalla, quien ha sido el ganador final de todas las partidas ((suponer que en cada partida se juegan 5 puntos), es decir, el que más puntos gano 5 Ejercicios opcionales 4) Elabora un programa en F90 que, a partir de los datos contenidos en dos ficheros fich1.dat y fich2.dat (nombres propios simples de personas con formato A10, 3 nombres por registro: Pepe María Rosa ), escriba en un tercer fichero, fichtot.dat, todos los nombres, sin repetir ninguno (es decir, los repetidos en ambos ficheros solo se escriben una vez). Además, después de cada nombre debe escribirse un número entero, 1, 2 o 3, según que el nombre esté en el fichero 1, en el 2, o en ambos. 5) Haz un programa que lea una serie de números enteros de un fichero (ya estarán almacenados en el, 5 números por registro) y vuelva a imprimir en el mismo fichero (y en el mismo orden) los que sean primos. Al final, el fichero debe contener los números originales, después, la frase “Estos son los números primos” y a continuación los números primos encontrados (5 números por registro). Apéndice B: Mejorando el juego 1 Una estrategia para ganar Buena parte de nuestro esfuerzo a lo largo de este cuaderno de prácticas ha estado orientado a construir una versión del juego de las siete y media. Sin embargo, pese a este esfuerzo, el ordenador es un oponente previsible, con una técnica de juego bastante sencilla (por encima del 5 no arriesga). Vamos a dedicar este apartado a presentar algunas ideas que nos pueden permitir implementar un comportamiento más “inteligente” por parte de la computadora. Lo que tenemos que discutir es una estrategia o regla de decisión que permita determinar la forma de actuar del ordenador en función de las cartas que tenemos (las nuestras y las que podemos ver de los demás). Una regla de decisión podría ser tan simple como la que ya hemos implementado (seguir mientras no superemos un cinco) o puede ser más sofisticada teniendo en cuenta, por ejemplo, la teoría de la probabilidad (seguir mientras la probabilidad de ganar sea superior a 0.7). Una conocida regla de decisión para este juego basada precisamente en el uso de probabilidades es la siguiente: Sea p1 la probabilidad de ganar si no se pide otra carta y p2 la probabilidad de pasarse de siete y media si se pide otra carta. Se define la siguiente función f(p1,p2) por casos: donde A, B y C son valores entre 0 y 1. Esta regla de decisión quiere decir básicamente que pararemos de pedir cartas si nuestra probabilidad de ganar es suficientemente alta (p1 ≥ A) o si la probabilidad de pasarse es demasiado alta (p2≥B) y la probabilidad de ganar está en un intervalo controlado (p1 ∈ [C, A). El riesgo que toma la máquina depende de los valores A, B y C elegidos. Si queremos jugar a las “Siete y media”, utilizando la regla de decisión anterior tenemos que calcular algunas probabilidades. Estas probabilidades son p1 y p2 y las calculamos usando las herramientas básicas del cálculo de probabilidades y la información que tenemos en cada momento del juego: 1) o Las cartas que nuestros oponentes tienen boca arriba. o Las cartas que nuestros oponentes tienen boca abajo. Como ejercicio final de estas prácticas, puedes completar la implementación del juego de las siete y media incorporando este tipo de estrategias para adoptar la decisión que toma el ordenador a la hora de pedir carta o no pedirla. ¡Refresca tus conocimientos de estadística y atrévete con el reto!