Download Práctica 5: Ficheros Secuenciales
Document related concepts
Transcript
Prácticas de Programación Pascal Práctica 5: Ficheros Secuenciales Objetivos de la práctica El objetivo de esta práctica es comprender las peculiaridades de este tipo de estructuras de datos, aprendiendo a utilizarlas de forma adecuada y eficiente. Para ello será preciso dominar la notación y la semántica de sus operadores en PASCAL. Se hace un énfasis especial en una clase particular de ficheros secuenciales: los ficheros de texto, pues constituyen una de las estructuras de datos más utilizadas en programación. La realización de estos ejercicios servirá, además, para repasar los conceptos aplicados en las prácticas anteriores, especialmente la composición iterativa y el tratamiento de secuencias. Para lograr estos objetivos, se recomienda comenzar a practicar con ejercicios muy sencillos (como algunos de los hechos en clase) y después modificar los ejercicios hechos en la práctica anterior para usar ficheros en vez del teclado y la pantalla. En alguno de los ejercicios propuestos puede ser conveniente/necesario el uso de estructuras de datos de tipo vector y/o registro. Si todavía no has aprendido a utilizar estas estructuras, puedes dejarlos para más adelante. Ejercicios básicos 1) Escriba un programa PASCAL que lea los números reales que hay en el fichero de texto ’numeros.txt’ y los almacene en el fichero secuencial de reales ’numeros.dat’. Para comprobar que funciona el programa, construya otro programa PASCAL que muestre por pantalla los números almacenados en el fichero ’numeros.dat’. Para que la información sea más legible, deberán mostrarse, mientras sea posible, 6 números en cada línea. 2) Escriba un programa que, dado un valor para la variable x, evalúe la función polinómica de la forma: f(x) = anxn+ an-1xn-1+ ··· + a0 , cuyos coeficientes (an, an-1,···, a0) están almacenados en un fichero secuencial de reales. Tanto el valor de x, como el nombre del fichero con los coeficientes se suministrarán de forma interactiva. Nota: utilice el programa desarrollado en el ejercicio anterior (o uno similar) para crear el fichero secuencial de reales con los coeficientes del polinomio. Ejercicios principales 3) Escriba un programa PASCAL denominado 'informe.p', que analice el fichero de texto, cuyo nombre se especifica interactivamente, y muestre por pantalla la siguiente información: a) para cada línea del fichero: • El número total de caracteres y de palabras, y la longitud media de una palabra. • La letra con que termina la primera palabra y el número de palabras que terminan con esa letra. b) para el fichero completo: • el número total de caracteres, palabras y líneas del fichero, y la longitud media de una palabra. • el número de la línea en la que hay más palabras, junto con el número de palabras en esa línea. Depto. Informática e Ingeniería de Sistemas pag. 32 Prácticas de Programación Pascal • el número de la línea en la que hay más palabras que acaban como la primera, junto con el número de dichas palabras. Para ello, se diseñarán dos procedimientos (adecuadamente parametrizados): uno para procesar una línea del fichero de texto, y otro para procesar una palabra. Nota: Se tomará como palabra cualquier secuencia de caracteres formada exclusivamente por letras y/o números que están en la misma línea. Contenido del fichero ‘texto.txt’ la casa de Sara es un poco más grande que la mía. merlin$ informe nombre del fichero ? texto.txt linea tot.car. tot.Palabras long.media term.1ªPal. igualTermin. 1 16 4 3.000 a 2 2 33 8 3.125 s 1 total: 2 líneas, 49 caracteres y 12 palabras. Long. media palabra = 3.083 Linea con más palabras: la nº 2 con 8 palabras La línea nº 1 tiene el mayor nº de palabras que terminan como la primera: 2. 4) En la resolución de diversos problemas de ingeniería se utilizan matrices cuasivacías, que son aquellas que contienen un pequeño número de elementos no nulos. Un modo muy simple de describirlas, de forma condensada, consiste en indicar sus dimensiones y, a continuación, todos los valores no nulos junto con su posición relativa. Para numerar las posiciones, supondremos que se comienza en el primer elemento (1,1) y se recorre la matriz por filas (véase la Fig. 1). Para almacenar de forma permanente la matriz se puede utilizar un fichero de texto. fichero 3.6 0 0 0 0 0 0 0 0 0 0 6.7 0 0 0 0 0 -3.0 0 0 4 1 15 18 5 3.6 -3.0 6.7 significado matriz de 4 filas y 5 columnas en posición 1 (fila 1, columna 1) valor 3.6 en posición 15 (fila 3, columna 4) valor –3.0 en posición 18 (fila 4, columna 3) valor 6.7 Fig.1 matriz de números reales de 4×5 y su representación de forma condensada en un fichero de texto Se pide desarrollar en PASCAL los siguientes procedimientos (previamente se realizarán todas las declaraciones de los tipos de datos que sean necesarias). procedure SumarMatricesFtxt(var f1, f2, fSuma: tpMatrizFtxt); { devuelve en fSuma la suma de las matrices (de igual dimensión) fichero almacenadas, de forma condensada, en los ficheros de texto f1 y matriz 1 4 5 f2. Los elementos están ordenados por posición } procedure MostrarMatrizFtxt(var f: tpMatrizFtxt); { muestra en pantalla (por filas y con el formato habitual) la matriz almacenada, de forma condensada, en el fichero de texto f. Los elementos están ordenados por posición } Depto. Informática e Ingeniería de Sistemas fichero matriz 2 4 5 fichero matriz suma 4 5 1 3.6 + 4 6 = 1 3.6 15 -3.0 15 2.0 4 6.0 18 6.7 18 -6.7 15 -1.0 Fig.2 ejemplo de suma de matrices almacenadas en fichero de texto pag. 33 Prácticas de Programación Pascal Ejercicios adicionales (opcionales, aunque muy recomendable su realización) 5) La Organización Nacional de Loterías, con motivo del sorteo extraordinario de Navidad del 22 de Diciembre de 2003, ha decido publicar a la finalización del sorteo un fichero secuencial de enteros, 'sorteo.dat', con todos los números premiados que han sido extraídos del bombo y el importe del premio correspondiente a cada peseta jugada. Es decir, este fichero tendrá los números correspondientes a: • • • • • • un primer premio de 300.000.000 de pesetas (10.000 ptas. por pta. jugada) un segundo premio de 144.000.000 de pesetas (4.800 ptas. por pta. jugada ) un tercer premio de 72.000.000 de pesetas (2.400 ptas. por pta. jugada) dos cuartos premios de 30.000.000 de pesetas (1.000 ptas. por pta. jugada) cuatro quintos premios de 7.200.000 pesetas (240 ptas. por pta. jugada), y los 1.531 números premiados con 150.000 pesetas (5 ptas. por pta. jugada). A continuación se muestra el fichero secuencial de enteros, 'sorteo.dat', donde se han escrito secuencialmente el número extraído del bombo y el premio por peseta jugada. <nº 1er premio> 10.000 <nº 2º premio> 4.800 <nº 3er premio> 2.400 <1er nº 4º premio> 1.000 <2ºnº 4º premio> 1.000 <1er nº 5º premio> 240 <2º nº 5º premio> 240 <3er nº 5º premio> 240 <4ºnº 5º premio> 240 <1er nº de premio 150.000> 5 <2º nº de premio 150.000> 5 ... <último nº de premio 150.000> 5 Se pide escribir un programa en Pascal que pregunte el número de una participación de lotería y la cantidad jugada, y nos informe del premio que se ha obtenido, tanto en euros como en pesetas. Es importante señalar que, adicionalmente a los números extraídos del bombo, también se premian (de forma acumulativa): • los números anteriores y posteriores al primer premio (100 ptas. por pta. jugada) • los números anteriores y posteriores al segundo premio (60 ptas. por pta. jugada) • los números anteriores y posteriores al tercer premio (48 ptas. por pta. jugada) • el resto de los números pertenecientes a la centena del primero, segundo y tercer premio, excepto para el propio premio, (5 ptas. por pta. jugada) • los números cuyas 2 últimas cifras coinciden con las del primer premio, segundo y tercer premio, excepto para el propio premio, (5 ptas. por pta. jugada) • reintegro para los números cuya última cifra coincide con la del primer premio, excepto él mismo. Para probar el programa se facilita un fichero de prueba similar al que se facilitaría el día del sorteo: /users2/PROGRAMACION/pascal/practicas/sorteo.dat Comprueba que los resultados que proporciona tu programa coinciden con los del fichero de ejemplo: /users2/PROGRAMACION/pascal/practicas/ejemplos.txt 6) Escribe un programa PASCAL que genere el fichero de enteros 'sorteo.dat' del ejercicio anterior, a partir del fichero de texto 'sorteo.txt' que hay en el mismo directorio. El formato de dicho fichero de texto es el siguiente: • para cada importe de premio diferente figuran la cantidad de números agraciados con ese premio, el importe del premio y, a continuación, la lista de números correspondiente. • Todos los números pueden estar separados por cualquier nº de espacios y/o saltos de línea. • Los premios están ordenados por orden de mayor a menor cuantía. Depto. Informática e Ingeniería de Sistemas pag. 34