Estructuras No Acotadas: Ficheros y Variables
Estructuras de datos no acotadas
Disponemos de estructuras de datos que no tuvieran un tamaño fijado de antemano, sino que pudieran ir creciendo o reduciendo su tamaño en función de los datos particulares que se estén manejando en cada ejecución del programa.
Estas estructuras de datos se denominan estructuras dinámicas y poseen la cualidad de que su tamaño es potencialmente ilimitado, aunque no podrá exceder la capacidad física del PC.
La estructura secuencia
Puede definirse como un esquema de datos del tipo iteración, pero con un numero variable de componentes.
Es parecida a una formación con numero variable de elementos.
Existen distintas alternativas
- Operaciones de acceso
- Acceso secuencial: Componentes son tratadas 1 por 1 en el orden que aparecen en la secuencia.
- Acceso directo: Se puede acceder a cualquier componente directamente indicando su posición, como en una formación o vector.
- Operaciones de construcción: Podemos modificar u obtener
el valor de las componentes que existen en un momento.- Añadir o retirar componente al principio de la secuencia
- Añadir o retirar componente al final de la secuencia
- Añadir o retirar componente en posiciones intermedias de la secuencia
- Cuando el acceso es secuencial, el tratamiento de una secuencia se realiza empleando un cursor.
- Cursos: Variable que señala a un elemento de la secuencia.
Para actuar sobre se plantean las siguientes operaciones:- Iniciar: Cursor señala el primer elemento
- Avanzar: Cursos pasa a señalar siguiente elemento
- Fin: Función que indica si el cursor ha llegado al final de la secuencia.
Variables dinámicas
Una variable dinámica no se declara como tal, sino que se crea en el momento necesario y se destruye cuando no se necesita
No tienen nombre, sino que se designan mediante otras variables
llamadas puntero o referencias.
Punteros
- Son variables simples cuyo contenido es precisamente una
referencia a otra variable - Usaremos una flecha para representarla.
- Los punteros están tipados. El tipo de un puntero especifica en realidad el tipo de variable a la que puede apuntar.
TYPE tipo_puntero = POINTER TO Tipo_de_variable; - Una variable puntero se usa para designar la variable apuntada: puntero^
- Para detectar si un puntero señala realmente o no a otra variable, existe el valor NIL que es compatible con cualquier tipo de puntero e indica que el puntero no señala a ninguna parte.
Uso de variables dinámicas
- Una variable de un programa se corresponde con un a pequeña zona de memoria que el compilador reserva para almacenar el valor
- Las variables normales de un programa tienen esa zona de memoria reservada al empezar a ejecutarse el programa o subprograma en que se declara
- Las variables declaradas en un subprograma solo existen mientras se ejecutan las sentencias de un subprograma.
- La forma mas sencilla de crear una variable dinámica es la operación: NEW (puntero)
- Una variable dinámica puede estar referenciada por mas de un puntero
- Cuando una variable dinámica no es necesaria se puede liberar el espacio que ocupaba, se utiliza: DISPOSE (puntero)
- Los procedimientos que realmente están disponibles en cualquier compilador: ALLOCATE (puntero,tamaño), DEALLOCATE (puntero,tamaño)
- Estos procedimientos no son predefinidos, están en el modulo STORAGE, debiendo hacer la importación.
- NEW DISPOSE esta definido así
TYPE Tipo_puntero = POINTER TO Tipo_de_dato;
VAR pun : Tipo_puntero;
NEW (pu) = ALLOCATE (pun,size (Tipo_dato))
DISPOSE (pun) = DEALLOCATE (pun, size(Tipo_dato))
Realización de secuencias mediante punteros
Al utilizar los punteros, debes tener cuidado y emplearlo
de manera precisa, traduciendo a punteros los mecanismos de definición de alto nivel que deberían estar disponibles.
Una definición recursiva es aquella en que se hace referencia
a si misma.
Operaciones con secuencias enlazadas
Describimos la manera de realizar algunas operaciones típicas sobre secuencias enlazadas con punteros
Recorrido: El recorrido de toda secuencia se consigue mediante un bucle de acceso a elementos y avance del cursor
Como la secuencia tiene un numero indefinido de elementos, no se usara un bucle con contador.
Cursor := secuencia;(*iniciar cursor*)
WHILE cursor <> NIL DO (* NOT fin*)
WriteInt (cursor^.valor,10)
cursor := cursor^.siguiente(* avanzar cursor *)
END
Datos persistentes
Son aquellos que conservan su valor entre ejecuciones sucesivas de los programas que operan con ellos.
Intervienen la memoria interna y la externa (CD´s, Diskettes,...)
Este tipo de datos esta ligado a las operaciones de entrada y salida de información
Para manejar datos persistentes hay que declarar variables en las que serán copiados temporalmente (durante el funcionamiento del programa) y ademas se necesitan operaciones adicionales para establecer la conexión entre dichas variables en memoria interna y los datos en memoria externa.
Ficheros
La forma clásica de usar datos persistentes es mediante el
empleo de ficheros
Los ficheros son estructuras de datos en memoria externa,
que pueden ser manipulados desde un programa, estableciendo una conexión entre dichos ficheros en memoria externa y las variables fichero definidas por el programa en memoria interna.
- Abrir: Establece la asociación entre una variable fichero
interna y fichero externo, designado mediante un nombre.}} - Cerrar: Elimina la conexión anterior, garantizando que los
datos almacenados en la memoria externa quedan debidamente actualizados.
Los ficheros son estructuras de datos no acotadas, que pueden
almacenar tanta información como se desee, dentro de la capacidad real disponible en cada soporte.
Los mas sencillos son un esquema de datos del tipo secuencia
Un sistema de ficheros permite tener almacenados en un mismo soporte diferentes ficheros que se reparte entre ellos la capacidad de almacenamiento disponibles.
Cada fichero ocupa en un momento dado el espacio que necesita, en funciona de la cantidad de información que contiene, ya que los ficheros son estructuras dinámicas de datos
Los nombres de los distintos ficheros han de ser usados como parámetros en las operaciones de apertura de ficheros.
Ficheros secuenciales
Son estructuras de tipo secuencia:
- Acceso a los elementos ha de ser secuencial
- El fichero ha de ser usado en uno de dos modos: Lectura o escritura
- En modo lectura se usa la información contenida en el fichero, sin modificarlo
- En modo escritura el fichero se graba desde el comienzo. La información anterior se pierde.
Si es necesario modificar parte del fichero, hay que generar
otro nuevo con la información actualizada a partir del antiguo.
Si el proceso termina con éxito puedes borrar el antiguo y quedarte con el nuevo
Los ficheros de entrada y salida principales son manejados por el modulo estándar InOut.
Cada fichero se utiliza mediante un curso implícito, que se maneja indirectamente mediante los procedimientos de lectura y escritura.
Operaciones básicas:
- Iniciar cursor: Se realiza automáticamente al comienzo del programa, al tiempo que se abre un fichero. Solo se hace una vez.
- Avanzar: Se realiza con los procedimientos READ y WRITE, al tiempo que se toma el siguiente carácter de la secuencia de entrada o se añade el siguiente carácter a la secuencia de salida.
- Fin: No existe esta función como tal, en su lugar hay una variable DONE que puede ser consultada tras cada operación de lectura, y que indica si dicha lectura se realizo con éxito o no se pudo realizar por encontrarse el cursor al final de la secuencia de entrada.
El modulo InOut permite cambiar durante la ejecución del programa los ficheros asignados como entrada y salida principales.
Para ello existen unos procedimientos predefinidos llamados 'OpenInput' y 'OpenOutput', que provocan la lectura por el terminal de los nombres de los ficheros correspondientes.
También existen los procedimientos 'Closeinput' y 'CloseOutput'
que finalizan el trabajo con dichos ficheros y vuelven a emplear la entrada y salida principal establecida al comienzo del programa.
Ficheros de texto
Es en realidad un fichero secuencial de caracteres
La única diferencia esta en el modelo lógico de esa secuencia
de caracteres, que se considera dividida en lineas de texto, separadas unas de otras por caracteres especiales de fin de linea.
La organización del texto en lineas permite estructurar los datos de entrara y salida, aprovechando los separadores de lineas para marcar la separación de los grupos de datos.
Para detectar los cambios de linea en el fichero de entrada del modulo InOut exporta una constante EOL (End Of line) de tipo carácter.
Si el carácter leído es igual a 'EOL' es que se ha saltado de linea
Lectura y escritura con conversión
Los ficheros de texto son el medio principal de combinación
entre el usuario y la maquina aplicamos este termino a cualquier medio de entrada o salida de secuencias de caracteres, incluyendo los terminales con pantalla y teclado...
La ventaja de los ficheros de texto es que prácticamente cualquier elemento de información puede representarse en forma legible mediante ristras de caracteres.
La lectura o escritura de estos valores a partir de ficheros de texto exige la conversión entre el valor interno, en el código de la maquina y su representación externa en forma de secuencia de caracteres.
Los procedimientos de lectura standard ReadInt', 'ReadCard'
y 'ReadReal'. Tienen el siguiente comportamiento:
- Al comenzar la lectura, se ignoran los caracteres de espacio en blanco que se vayan leyendo inicialmente.
- A continuación se leen tantos caracteres como sea posible hasta encontrar algún espacio en blanco o salto de linea. Este carácter terminal queda ya leído, de manera que las operaciones de lectura que se ejecutan a continuación no lo volverán a leer. Los caracteres leídos se convierten a valor numérico.
- Si los primeros caracteres no blancos que se encuentran no constituyen una representación valida de un valor numerico, el valor devuelto es arbitrario, y se asigna falso a la variable global 'DONE' exportada por el modulo InOut.
- Para evitar perder información en el caso de que el carácter que termina la lectura sea significativo, el modulo InOut exporta una variable global TERMCH, en que queda almacenado dicho carácter de terminación al finalizar la operación de lectura (la lectura de valores reales puede no actualizar esta variable)
Estas operaciones no son procedimientos predefinidos
Ficheros de acceso directo
Se denominan ficheros de acceso directo aquellos en que se puede acceder directamente a un elemento de información contenido en el fichero, sin necesidad de acceder a los anteriores.
Existen varios modelos lógicos diferentes de ficheros de acceso directo:
- Ficheros con organización relativa: Se especifica la componente a la que se accede mediante su posición relativa en el fichero.
- Ficheros indexado: Se especifica la componente mediante el valor de un campo clave contenido en ella.
Solo estudiamos ficheros con organización relativa, también llamados 'Ficheros de acceso directo'
Las características de las operaciones desde acceso son:
- Se puede acceder directamente a una componente del fichero conociendo su posición relativa
- El fichero puede ser usado simultáneamente en lectura y en escritura
- Una operación de lectura obtiene la información contenida en una componente de la secuencia, sin modificarla.
- Una operación de escritura permite grabar un nuevo valor en una componente de la secuencia, o añadir una nueva componente al final
- Se puede truncar el fichero, eliminando las componentes finales, a partir de una cierta posición.
El manejo de ficheros de acceso directo en Modula-2 no esta del todo normalizado. Existe un modulo estándar llamado FileSystem, que contiene las operaciones adecuadas para estos ficheros.

Live in Blogs
Blog Bellezza
Butaca Diez
City Guides Blog
Cyfuss
Que Cocino
Solo Libros Blog
Apuntes para Vagos
Blog Boda
Urubamba




Enviar un comentario nuevo