Guión práctica 6

Anuncio
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!
Descargar