trabajo dprogramacion

18
República Bolivariana de Venezuela Ministerio del Poder Popular para la Defensa Universidad Nacional Experimental Politécnica de la Fuerza Armada Nacional Bolivariana Núcleo Sucre - Cumaná ARREGLOS, DATOS COMPLEJOS, SISTEMA DE ARCHIVOS Y ARCHIVOS ALEATORIOS Realizado por: José L. Zabala Jelexys Castillo Ana Fuentes José M. Solórzano Andreina Figueroa Profesora: Rosanna Surga Materia: Programación

Upload: leozab

Post on 07-Feb-2016

221 views

Category:

Documents


0 download

DESCRIPTION

Lista, arreglos, apuntador

TRANSCRIPT

Page 1: Trabajo dprogramacion

República Bolivariana de VenezuelaMinisterio del Poder Popular para la Defensa

Universidad Nacional Experimental Politécnica de la Fuerza Armada Nacional Bolivariana

Núcleo Sucre - Cumaná

ARREGLOS, DATOS COMPLEJOS, SISTEMA DE ARCHIVOS Y ARCHIVOS ALEATORIOS

Realizado por: José L. Zabala Jelexys Castillo

Ana Fuentes José M. Solórzano Andreina Figueroa

Ingeniería de telecomunicacionesSección “01”

Profesora:Rosanna SurgaMateria:Programación

Page 2: Trabajo dprogramacion

Cumaná, julio de 2013LISTA

En Ciencias de la Computación, una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los que se guardan campos de datos arbitrarios y una o dos referencias, enlaces o punteros al nodo anterior o posterior. El principal beneficio de las listas enlazadas respecto a los vectores convencionales es que el orden de los elementos enlazados puede ser diferente al orden de almacenamiento en la memoria o el disco, permitiendo que el orden de recorrido de la lista sea diferente al de almacenamiento.

Una lista enlazada es un tipo de dato autorreferenciado porque contienen un puntero o enlace (en inglés link, del mismo significado) a otro dato del mismo tipo. Las listas enlazadas permiten inserciones y eliminación de nodos en cualquier punto de la lista en tiempo constante (suponiendo que dicho punto está previamente identificado o localizado), pero no permiten un acceso aleatorio. Existen diferentes tipos de listas enlazadas: listas enlazadas simples, listas doblemente enlazadas, listas enlazadas circulares y listas enlazadas doblemente circulares.

Las listas enlazadas pueden ser implementadas en muchos lenguajes. Lenguajes tales como Lisp y Scheme tiene estructuras de datos ya construidas, junto con operaciones para acceder a las listas enlazadas. Lenguajes imperativos u orientados a objetos tales como C o C++ y Java, respectivamente, disponen de referencias para crear listas enlazadas.

Listas contiguas: los elementos son adyacentes en la memoria del ordenador y tienen unos límites (izquierdo y derecho o inferior y superior) que no pueden ser rebasados cuando se añade un nuevo elemento. Se implementan a través de arrays y la inserción o eliminación de un elemento necesitará una traslación por parte de los elementos de la lista, excepto para la cabecera y el final de la lista.

Listas enlazadas: los elementos se almacenan en posiciones de memoria que no son adyacentes o contiguas, por lo que cada elemento necesita almacenar la posición del siguiente elemento de la lista. Son bastante más flexibles y potentes que las listas contiguas y la inserción o el borrado de un elemento no requiere el desplazamiento de los demás elementos de la lista. Se implementan, normalmente, de forma dinámica, pero si el lenguaje de programación no lo permite se utilizaran arrays, con lo cual tendremos limitaciones en cuanto al número de elementos que pueda contener la lista y además establece una ocupación de memoria constante.

Listas circulares: son una modificación de las listas enlazadas en las que el puntero del ultimo elemento apunta al primero de la listas.

Listas doblemente enlazadas: Se pueden recorrer tanto del final al principio como de principio a fin. Cada nodo de las listas de este tipo consta de

4

Page 3: Trabajo dprogramacion

un campo con información y de otros dos campos que son de tipo puntero y que podríamos denominar anterior y siguiente, uno desde su nodo anterior y otro de su nodo sucesor.

Listas doblemente encadenadas circulares: en este tipo de listas el campo anterior del primer nodo apunta al último nodo y el campo siguiente del último nodo apunta al primero.

NODO

En programación, concretamente en estructuras de datos, un nodo es uno de los elementos de una lista enlazada, de un árbol o de un grafo. Cada nodo será una estructura o registro que dispondrá de varios campos, y al menos uno de esos campos será un puntero o referencia a otro nodo, de forma que, conocido un nodo, a partir de esa referencia, será posible en teoría tener acceso a otros nodos de la estructura. Los nodos son herramientas esenciales para la construcción de estructuras de datos dinámicas.

APUNTADOR

Los apuntadores son de amplia utilización en programación y muchos lenguajes permiten la manipulación directa o indirecta de los mismos. La principal razón de ser de los apuntadores es la de manejar datos alojados en la zona de memoria dinámica o heap (aunque también se pueden manipular objetos en la zona estática), bien sean datos elementales, estructuras u objetos pertenecientes a una clase (en lenguajes Orientados a Objetos).

Un puntero o apuntador es una variable que da referencia a una región de memoria; en otras palabras es una variable cuyo valor es una dirección de memoria. Si se tiene una variable ' p ' de tipo puntero que contiene una dirección de memoria en la que se encuentra almacenado un valor '  v ' se dice que ' p ' apunta a ' v’. El programador utilizará punteros para guardar datos en memoria en muchas ocasiones, de la forma que se describe a continuación.

[Memoria] | . | | . | | . |----- |---------|| p |---->| v |----- |---------| | . | | . | | . |

Trabajar con punteros no implica la manipulación de los datos en sí, sino manejar las direcciones de memoria en la cuales estos residen.

5

Page 4: Trabajo dprogramacion

GRAFOS

Un grafo es un conjunto de puntos (vértices) en el espacio, que están conectados por un conjunto de líneas (aristas).

Los grafos son estructuras de datos dinámicas no lineales, utilizadas comúnmente en el análisis de redes, en diseño de circuitos eléctricos, en estrategias de mercados, cartografía, mapas conceptuales, matemáticas, planificación de procesos y muchas área del conocimiento.

EJEMPLO

CAMINO

El método del camino crítico, es un proceso administrativo de planeación, programación, ejecución y control de todas y cada una de las actividades componentes de un proyecto que debe desarrollarse dentro de un tiempo crítico y al costo óptimo.

Sean x, y " V, se dice que hay un camino en G de x a y si existe una sucesión finita no vacía de aristas {x,v1}, {v1,v2},..., {vn,y}. En este caso

x e y se llaman los extremos del camino El número de aristas del camino se llama la longitud del camino. Si los vértices no se repiten el camino se dice propio o simple. Si hay un camino no simple entre 2 vértices, también habrá un camino

simple entre ellos. Cuando los dos extremos de un camino son iguales, el camino se llama

circuito o camino cerrado. Llamaremos ciclo a un circuito simple Un vértice a se dice accesible desde el vértice b si existe un camino

entre ellos. Todo vértice es accesible respecto a si mismo

6

Page 5: Trabajo dprogramacion

ARCHIVO SECUENCIAL INDEXADO

Los registros se organizan en una secuencia basada en un campo clave presentando dos características, un índice del archivo para soportar los accesos aleatorios y un archivo de desbordamiento. El índice proporciona una capacidad de búsqueda para llagar rápidamente al registro deseado y el archivo de desbordamiento es similar al archivo de registros usado en un archivo secuencial, pero está integrado de forma que los archivos de desbordamiento se ubiquen siguiendo un puntero desde su registro predecesor. 

La estructura más simple tiene como índice un archivo secuencial simple, cada registro del archivo índice tiene dos campos, un campo clave igual al del archivo principal y un puntero al archivo principal. Para encontrar un campo especifico se busca en el índice hasta encontrar el valor mayor de la clave que es iguale o precede al valor deseado de la clave, la búsqueda continua en el archivo principal a partir de la posición que indique el puntero.

Cada registro del archivo principal tiene un campo adicional que es un puntero al archivo de desbordamiento. Cuando se inserta un nuevo registro al archivo, también se añade al archivo de desbordamiento. El registro del archivo principal que precede inmediatamente al nuevo registro según la secuencia lógica se actualiza con un puntero del registro nuevo en el archivo de desbordamiento, si el registro inmediatamente anterior está también en el archivo de desbordamiento se actualizará el puntero en el registro. 

Para procesar secuencialmente un archivo completo los registros del archivo principal se procesarán en secuencia hasta encontrar un puntero al archivo de desbordamiento, el acceso continúa en el archivo de desbordamiento hasta que encuentra un puntero nulo, entonces renueva el acceso donde se abandonó en el archivo principal. 

LAS CARACTERÍSTICAS MÁS RELEVANTES DE UN ARCHIVO INDEXADO,5SON0LAS0SIGUIENTES:

a) El diseño del registro tiene que tener un campo, o combinación de campos, que permita identificar cada registro de forma única, es decir, que no pueda haber dos registros que tengan la misma información en él. A este campo se le llama campo clave y es el que va a servir de índice. Un mismo fichero puede tener más de un campo clave, pero al menos uno de ellos no admitirá valores duplicados y se le llama clave primaria. A las restantes se les llama claves alternativas.

b) Permiten utilizar el modo de acceso secuencial y el modo de acceso directo para leer la información guardada en sus registros.

El modo de acceso directo se hace conociendo el contenido del campo clave del registro que queremos localizar. Con esa información el sistema operativo puede consultar el índice y conocer la posición del registro dentro del fichero.

7

Page 6: Trabajo dprogramacion

En el modo de acceso secuencial los registros son leídos ordenados por el contenido del campo clave, independientemente del orden en que se fueron grabando (El orden lógico no es igual al orden físico), debido a que el acceso a los datos se hace a través del índice, que para hacer más fácil la búsqueda de los registros permanece siempre ordenado por el campo clave.

c) Solamente se puede grabar en un soporte direccionable. Ej.: disco magnético. Si esto no fuera así no podría emplear el acceso directo.

VENTAJAS1. Permite el acceso secuencial.2. Permite el acceso directo a los registros.3. Se pueden actualizar los registros en el mismo fichero, sin necesidad de crear un fichero nuevo de copia en el proceso de actualización.

DESVENTAJAS1. Ocupa más espacio en el disco que los ficheros secuénciales, debido al uso del área de índices.2. Tiene tendencia a que aumente el tiempo medio de acceso a los registros, cuando se producen muchas altas nuevas con claves que hay que intercalar entre las existentes, ya que aumenta el área de overflow.3. Solo se puede utilizar soportes direccionables.4. Obliga a una inversión económica mayor, por la necesidad de programas y, a veces, hardware más sofisticado.

ÍNDICEEl índice de una base de datos es una estructura de datos que mejora la

velocidad de las operaciones, permitiendo un rápido acceso a los registros de una tabla en una base de datos. Al aumentar drásticamente la velocidad de acceso, se suelen usar sobre aquellos campos sobre los cuales se hacen frecuentes búsquedas.

El índice tiene un funcionamiento similar al índice de un libro, guardando parejas de elementos: el elemento que se desea indexar y su posición en la base de datos. Para buscar un elemento que esté indexado, sólo hay que buscar en el índice dicho elemento para, una vez encontrado, devolver el registro que se encuentre en la posición marcada por el índice.

Los índices pueden ser creados usando una o más columnas, proporcionando la base tanto para búsquedas rápidas al azar como de un ordenado acceso a registros eficiente.

Los índices son construidos sobre árboles B, B+, B* o sobre una mezcla de ellos, funciones de cálculo u otros métodos.

El espacio en disco requerido para almacenar el índice es típicamente menor que el espacio de almacenamiento de la tabla (puesto que los índices generalmente contienen solamente los campos clave de acuerdo con los que la tabla será ordenada, y excluyen el resto de los detalles de la tabla), lo que da la posibilidad de almacenar en memoria los índices de tablas que no cabrían en ella. En una base de datos relacional un índice es una copia de una parte de la tabla.

8

Page 7: Trabajo dprogramacion

Algunas bases de datos amplían la potencia del indexado al permitir que los índices sean creados de funciones o expresiones. Por ejemplo, un índice puede ser creado sobre la función upper(apellido), que almacenaría en el índice solamente las versiones mayúsculas del campo apellido. Otra opción a veces soportada, es el uso de índices "filtrados", donde las entradas del índice son creadas solamente para los registros que satisfagan una cierta expresión condicional. Un aspecto adicional de flexibilidad es permitir la indexación en funciones definidas por el usuario, también como expresiones formadas de un surtido de funciones incorporadas. Todos estos refinamientos de la indexación son soportados en Visual FoxPro y otros lenguajes de programación, por ejemplo.1

Los índices pueden ser definidos como únicos o no únicos. Un índice único actúa como una restricción en la tabla previniendo filas idénticas en el índice.

ARCHIVO ALEATORIO

Es aquel en donde los datos se guardan en registros mediante una estructura definida de tipo Type (estructura definida por nosotros) también llamada UDT. Estos permiten acceder a cualquier parte del fichero en cualquier momento, como si fueran arrays en memoria. Las operaciones de lectura y/o escritura pueden hacerse en cualquier punto del archivo.

En general se suelen establecer ciertas normas para la creación, aunque no todas son obligatorias:

• Abrir el archivo en un modo que te permita leer y escribir. Esto no es imprescindible, es posible usar archivos de acceso aleatorio sólo de lectura o de escritura.

• Abrirlo en modo binario, ya que algunos o todos los campos de la estructura pueden no ser caracteres.

• Usar funciones como fread y fwrite, que permiten leer y escribir registros de longitud constante desde y hacia un fichero.

• Usar la función fseek para situar el puntero de lectura/escritura en el lugar apropiado de tu archivo.

EJEMPLO

Supongamos que nuestros registros tienen la siguiente estructura:struct stRegistro { char Nombre[34]; int dato; int matriz[23];} reg;

Teniendo en cuenta que los registros empiezan a contarse desde el cero, para hacer una lectura del registro número 6 usaremos:fseek(fichero, 5*sizeof(stRegistro), SEEK_SET);fread(&reg, sizeof(stRegistro), 1, fichero);

Análogamente, para hacer una operación de escritura, usaremos:fseek(fichero, 5*sizeof(stRegistro), SEEK_SET);fwrite(&reg, sizeof(stRegistro), 1, fichero);

9

Page 8: Trabajo dprogramacion

Muy importante: después de cada operación de lectura o escritura, el cursor del fichero se actualiza automáticamente a la siguiente posición, así que es buena idea hacer siempre un fseek antes de un fread o un fwrite.

En el caso de streams, la forma de trabajar es análoga:fichero.seekg(5*sizeof(stRegistro), ios::beg);fichero.read(&reg, sizeof(stRegistro));

Y para hacer una operación de escritura, usaremos:fichero.seekp(5*sizeof(stRegistro), ios::beg);fichero.write(&reg, sizeof(stRegistro));

ARCHIVOS DE ACCESO DIRECTO

Un archivo de acceso directo está formado por un conjunto de partes individuales que pertenecen al mismo tipo de datos. Cada uno de los componentes del archivo es llamado registro.

Cada uno de los componentes de este tipo de archivos es accesible directamente.

Los archivos de acceso directo son también llamados archivos con tipos o tipeados.

ESTRUCTURA DEL ARCHIVO

A diferencia de los archivos secuenciales, los archivos tipeados no están compuestos de líneas de caracteres, sino que se acomodan en registros con estructuras fijas. La longitud de los registros está determinada por la cantidad de bytes que se necesitan para almacenar el tipo de datos que contendrá el registro.

Por ejemplo, si se van a almacenar números enteros en un archivo, cada registro servirá para un número específico y ocupará 2 bytes, el siguiente registro utilizará los dos bytes siguientes del archivo y así sucesivamente hasta completar la cantidad de datos que se vayan a almacenar.

Este tipo de archivos no pueden ser visualizados con la instrucción type del sistema operativo debido al formato utilizado para guardarlos.

DECLARACIÓN DE UN ARCHIVO

Para declarar un archivo de acceso directo se realiza con las palabras reservadas FILE OF, su sintaxis es la siguiente:

VariableArchivo: FILE OF TipoElementos;

Esta declaración se realiza en la sección correspondiente a la declaración de las variables. Ejemplo:

10

Page 9: Trabajo dprogramacion

PROGRAM Archivo_Tipeado;VARArchivo : FILE OF Integer;BEGINEND.

Normalmente no se desea crear archivos que puedan almacenar un solo tipo de datos ya que se requerirían varios archivos, por ejemplo para alguna base de datos: uno para los nombres, otro para apellidos, otro para la edad, etc. Para evitar este inconveniente es posible usar registros del tipo RECORD, que permiten grabar en un solo registro un grupo de datos que pueden ser de diferentes tipos, uno de tipo INTEGER, uno de tipo STRING, etc.

Los registros del tipo record deben ser declarados antes de las variables en una sección llamada TYPE con el siguiente formato:

TYPENombre_Reg = RECORDCampo_del_registro_1 : Tipo;Campo_del_registro_2 : Tipo;...Campo_del_registro_n : Tipo;END;

Donde Nombre_Reg es el nombre del registro que se utilizará, Campo_del_Registro_x son las variables que estarán contenidas en el registro y Tipo es el tipo de cada una de las variables del registro.

La sección TYPE se escribe antes de la declaración de las variables.

Como ejemplo, si se quiere crear un archivo el que se guarden el nombre, domicilio, edad y estado civil de un grupo de personas el primer paso a realizar es crear un registro que contenga todos estos campos:

TYPEDatos = RECORDNombre : String[40];Domicilio : String[60];Edad : Integer;EdoCivil : String[10];END;

El siguiente paso es declarar un archivo del tipo Datos así como una variable del mismo tipo de los que se utilizarán en el archivo:

VARArchivo : FILE OF Datos;Persona : Datos;

Asignación de un archivo:

11

Page 10: Trabajo dprogramacion

Aún cuando se tenga declarado el archivo no es posible grabar nada en él si no se le asigna un nombre real para guardarlo en el disco. El proceso de dicha asignación es el mismo que para los archivos de texto:

Assign (Archivo, 'Nombre.ext');

Nombre.txt puede ser una constante, una variable o estar escrita directamente en el programa. Naturalmente debe cumplir con todas las reglas para nombrar un archivo.

ABRIR ARCHIVOS:

Una vez declarado un archivo ya es posible abrirlo. En caso de querer abrir un archivo nuevo se utiliza la instrucción Rewrite, o si el archivo ya existe en el disco se abre con el procedimiento Reset.

No existe ninguna diferencia entre la apertura de un archivo de acceso directo para su lectura o para su escritura.

Si al utilizar el procedimiento Rewrite el archivo asignado ya existía se eliminará del disco y se creará uno nuevo, por lo mismo se debe tener ciudado al momento de abrir estos archivos.

Registro actual y tamaño de un archivo:

La función FileSize regresa el tamaño de un archivo, o mejor dicho devuelve el número de registros contenidos en éste.

Al momento de abrir un archivo nuevo la función FileSize regresa el valor de 0, lo que significa que el archivo no tiene datos guardados en él.

Posicionamiento en el interior de un archivo:

Cada uno de los registros de un archivo esta referenciado por un número específico comenzando desde el registro 0 y aumentando de 1 en 1.

La función FilePos devuelve el número de registro actual, su sintaxis es:

FilePos (VariableArchivo)

VariableArchivo es la variable a la cual se asignó un nombre de archivo en el disco.

Para moverse a un registro determinado se utiliza la función Seek, con la siguiente sintaxis:

Seek (VariableArchivo, NumRegistro);

Para moverse al final del archivo para agregar un nuevo registro se utiliza este mismo comando con el parametro NumRegistro como sigue:

12

Page 11: Trabajo dprogramacion

Seek (VariableArchivo, FileSize(VariableArchivo));

Cuando se avanza en un archivo registro por registro se utiliza la función EOF para determinar si ya se llegó al final del archivo.

Lectura y escritura de archivos

Para la lectura y escritura en un archivo de acceso directo unicamente se utilizan los procedimientos Read y Write. Despues de cada operacion de lectura o escritura el puntero se posiciona en el siguiente registro.

Para estar seguros de que se leera el registro que se desea se debe emplear el procedimiento seek antes de cualquier procedimiento de lectura o escritura.

CERRAR UN ARCHIVO:

Para cerrar los archivos abiertos se procede igual que en uno de acceso secuencial, utilizando el procedimiento close:

Close (VariableArchivo);

CONCLUSIÓN

13

Page 12: Trabajo dprogramacion

Lista consiste en una secuencia de nodos, en los que se guardan campos de datos arbitrarios y una o dos referencias, enlaces o punteros al nodo anterior o posterior.

Nodo es uno de los elementos de una lista enlazada, de un árbol o de un grafo.

Los apuntadores son capaces de manejar datos alojados en la zona de memoria dinámica o heap, bien sean datos elementales, estructuras u objetos pertenecientes a una clase.

Un grafo es un conjunto de puntos en el espacio, que están conectados por un conjunto de líneas.

Camino es un proceso administrativo de planeación, programación, ejecución y control de todas y cada una de las actividades componentes de un proyecto

En el archivo secuencial indexado, los registros se organizan en una secuencia basada en un campo clave presentando dos características, un índice del archivo para soportar los accesos aleatorios y un archivo de desbordamiento.

El índice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones, permitiendo un rápido acceso a los registros de una tabla en una base de datos.

Un archivo aleatorio es aquel en donde los datos se guardan en registros mediante una estructura definida de tipo Type, también llamada UDT.

Un archivo de acceso directo está formado por un conjunto de partes individuales que pertenecen al mismo tipo de datos. Cada uno de los componentes del archivo es llamado registro.

Para declarar un archivo de acceso directo se realiza con las palabras reservadas FILE OF.

Para abrir un archivo nuevo se utiliza la instrucción Rewrite, o si el archivo ya existe en el disco se abre con el procedimiento Reset.

Para cerrar los archivos abiertos se procede igual que en uno de acceso secuencial, utilizando el procedimiento close.

BIBLIOGRAFIA

14

Page 13: Trabajo dprogramacion

Acosta, L (2011) UNIDAD IX: DATOS COMPLEJOS (PILAS, COLAS, LISTAS, GRAFOS Y ÁRBOLE) disponible en http://programacioniagmb.blogspot.com/2011/06/unidad-ix-datos-complejos-pilas-colas.html

Cruz, M (2012) Listas Enlazadas Simples Lineales en C++ disponible en: http://casicodigo.blogspot.com/2012/10/listas-enlazadas-simples-en-c.html

Mary,0Angel1e1Ivoc1(2011)1Archivos1Aleatorios5disponible0en: http://unefaarchivosaleatorios.blogspot.com/2011/11/archivos-aleatorios_25.html

http://romerovivivi.blogspot.com/p/3-archivo-secuencial- indexado.html

http://www.frsn.utn.edu.ar/informatica00/Apuntes/Info_1/ cap8_tp.HTM

15