Introducción a los Tipos Abstractos de Datos

Documentos relacionados
Introducción a los Tipos Abstractos de Datos

Tipos Abstractos de Datos (TAD) Lección 1

Programación Orientada a Objetos. Conceptos Básicos

obtenidos a partir de los objetos que manipula. un nuevo paradigma de programación, La POO es Clases su forma de módulo.

Concepto. Ventajas. Abstracción, Encapsulamiento, Interfaz e Implementación. Tipos de unidades. Creación y uso de unidades para implementar TADs.

Unidad III: Introducción a la Programación

Tema 01: Abstracción en los lenguajes de programación y tipo abstracto de dato (TAD)

UNIDAD 6 Tipos Abstractos de Datos (TAD) Interfaz e Implementación. Tipos de unidades. Creación y uso de unidades para

Unidad II: Análisis semántico

Capítulo 3 CICLO DE VIDA DE UN PROGRAMA. Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C"

Especificación de TAD. Lección 2

Procesadores de lenguaje Tema 5 Comprobación de tipos

Tipos de Datos Abstractos TDA

Tema 3 Concepto y Especificación de Tipos Abstractos de Datos

TIPO DE DATO ABSTRACTO (TAD)

Tema 01: Abstracción en los lenguajes de programación y tipo abstracto de dato (TAD)

Programación Orientada a Objetos. Sesión 6: El Elemento adicional del lenguaje orientado a objetos

INICIACIÓN A LA PROGRAMACIÓN 1ª parte

Tema 04: Lenguajes de programación y el lenguaje C

PROGRAMACION II. Dr. Mario Rossainz López. Fac. de Cs. de la Computación Benemérita Universidad Autónoma de Puebla Primavera de 2017

Introducción a la Programación en C

Estructura de datos Tema 2: Tipos Abstractos de Datos (TADs)

UNIVERSIDAD SIMÓN BOLÍVAR Vicerrectorado Académico

PROGRAMACION ORIENTADA A OBJETOS: Tema 2. Conceptos básicos de la Programación Orientada a Objetos

CAPÍTULO IV: 4.1 Introducción a la. Programación Funcional

Introducción a la programación: Contenido. Introducción

PNFSI. Asignatura: Desarrollo de Software. Tema 1: Programación Orientada a Objetos

INTRODUCCION A LA PROGRAMACION (C.U.) PROGRAMACION (T.I.G.)

ALGORITMO. Podemos encontrar muchas definiciones de algoritmo en los textos de programación, todas ellas muy similares:

SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos

Unidad I: Introducción a las estructuras de datos

Tipo Abstracto de Dato

1/1. Diseño Modular. 18 de febrero de 2017

Abstracciones de diseño

1. Corrección de un programa TEMA 2: ESPECIFICACIÓN Y CORRECCIÓN DE ALGORITMOS. 1. Corrección de un programa. 1. Corrección de un programa

TIPOS Y ESTRUCTURAS DE DATOS

CÓMO DESARROLLAR Y PROBAR PROGRAMAS?, COMPRUÉBALO!

INTRODUCCION A LA PROGRAMACIÓN ORIENTADA A OBJETOS

Computación Avanzada. Ing. Daniel Capriles M.

Programación Orientada a Objetos

Actividad de Evaluación Brandon Emmanuelle Cuevas Rangel GPO: 303 Carrera: Informática 3er Semestre Joel Rocha Barocio Cienega de Flores N.L.

Programación de Ordenadores

Modularidad: Tipos abstractos de datos Programación Orientada a Objetos Tema 2: Modularidad

INGENIERÍA DE SOFTWARE. Sesión 4: Diseño de software

INSTITUTO POLITECNICO NACIONAL SECRETARIA ACADEMICA DIRECCION DE ESTUDIOS PROFESIONALES EN INGENIERIA Y CIENCIAS FISICO MATEMATICAS

Prof. María Alejandra Quintero. Informática Año

Aspectos pragmáticos de los lenguajes de programación

GUÍA DOCENTE ABREVIADA DE LA ASIGNATURA

DURACIÓN Y UBICACIÓN TEMPORAL DENTRO DEL PLAN DE ESTUDIOS

Programación Orientada a Objetos

Concepto de compilador Intérprete Fases de un Compilador Herramientas de construcción de Compiladores

Lenguajes de Programación I

1. Computadores y programación

Tema 2 Introducción a la Programación en C.

CAPÍTULO I Investigación Preliminar

Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN

Tema 2. Concepto de Algoritmo

Introducción a los tipos de datos abstractos (TAD)

Arreglos y Subrangos

TEMA 1. PROGRAMACIÓN DE UN COMPUTADOR

Bloque 1. Conceptos y técnicas básicas en programación

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

Este método de diseño de algoritmos en etapas, yendo de los conceptos generales a los de detalle, se conoce como método descendente (top-down).

Programación estructurada

CONCEPTO Y DEFINICIÓN DE CLASE EN JAVA. OBJETOS DEL MUNDO REAL Y ABSTRACTOS. EJEMPLOS. EJERCICIO (CU00644B)

Programación TADs Colecciones Conjuntos, Diccionarios y Tablas

Tipos abstractos. Taller de Álgebra I. Segundo cuatrimestre de 2013

Presentación del Curso Presencial. Programación en Java Nivel Básico

Modularización. Bibliografía

METODOLOGÍAS PARA EL DESARROLLO DE SISTEMAS

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Diagrama de Flujo de Datos (DFD)

Unidad IV: Modelo de Diseño 4.1. Estrategias de diseño

TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES TRABAJO DE PRÁCTICAS. Convocatoria de junio de 2013

Tipos Abstractos de Datos

Fundamentos de Informática 3. Construcción de Software

Programación de Ordenadores. Dept. Ciencias de la Computación e I.A. Universidad de Granada

Algoritmos y Estructuras de Datos: Introducción a los TAD y los Algoritmos. Guillermo Román Díez

Cristian Blanco

Lenguaje de Diseño. Primera Parte. Resolución de Problemas y Algoritmos. Primer Cuatrimestre Ing. En Informática e Ing.

INGENIERÍA DE SOFTWARE. Sesión 8: Tipos de diagramas

El estudiante, para superar esta asignatura, deberá demostrar los siguientes resultados...

TEORÍA DE AUTÓMATAS Y LENGUAJES

Programación Web Tema 3.2 Java Script Estructura del Lenguaje. Ramón Alcarria ETSI en Topografía, Geodesia y Cartografía - UPM

Lenguaje de Diseño. Primera Parte. Segundo Cuatrimestre 2017

Algorítmica y Lenguajes de Programación. Eficiencia y notación asintótica (i)

Metodología de la programación. Progr. de Computadores Metod.de la Programación 1

Índice general 7. Presentación 15

Metodología y Tecnología de la Programación. I.T. Informática de Gestión

Lenguajes de Programación

Los diagramas de clases y de objetos sirven para modelar diversos aspectos estructurales o estáticos de un sistema: Modelado - Vocabulario del Sistema

Lenguajes y paradigmas de programación

Variables, expresiones y sentencias

INSTITUTO TECNOLÓGICO DE TIJUANA

Te han solicitado diseñar un nuevo juego de monedas. Todas las monedas serán círculos de color plateado, pero con diferentes diámetros..

Arreglos y Subrangos

Transcripción:

Introducción a los Tipos Abstractos de Datos Introducción: Concepto de abstracción Abstracción funcional y abstracción de datos Construcción de tipos abstractos de datos Especificación de un TAD Implementación de un TAD Profesorado de Estructura de la información y Fundamentos de la Programación II 1

Introducción: Concepto de Abstracción La abstracción es un proceso cognitivo humano esencial para la comprensión de fenómenos o situaciones complejas que consiste en la categorización de elementos en grupos o clases de características similares. Cada una de las clases o grupo representa una abstracción, en virtud de la cual se destacan o ignoran determinadas características del grupo. La abstracción, por lo tanto, presenta dos caras complementarias: En primer lugar, considera o resalta algunos de los aspectos de los elementos en estudio, en concreto, los aspectos relevantes para el problema o situación que se desea resolver. En segundo lugar, ignora el resto de los detalles no relevantes para la tarea en curso de los elementos que se abstraen. La abstracción permite estudiar un sistema complejo a diferentes niveles de detalle, es decir, la abstracción sigue un método jerárquico. El objetivo es poder representar y manejar sistemas complejos de manera más sencilla; para conseguirlo se suele realizar un proceso de abstracción en sentido descendente, lo que implica ir abstrayendo desde niveles más generales a niveles más detallados. El propio ser humano es un ejemplo de este tipo de abstracción: desde el nivel de los seres humanos en sociedades (sociología) al nivel de los constituyentes últimos de nuestro organismo (biología, química), pasando por el estudio de nuestros subsistemas (medicina). Podemos encontrar otros muchos ejemplos en los que se utiliza la abstracción para tratar de disminuir la complejidad. Algunos de ellos pueden ser: Los sistemas de información en una empresa, desde su estructura departamental o geográfica hasta los procesos individuales que se realizan en cada punto. Un programa de ordenador es también un sistema complejo, ya que está compuesto de miles de instrucciones y cualquiera de ellas puede producir un error. Para disminuir la complejidad de los programas informáticos, se han llevado a cabo en toda la historia de la programación abstracciones como los lenguajes de alto nivel, que son abstracciones del lenguaje ensamblador o binario, y que permiten al desarrollador trabajar de un modo independiente de una máquina concreta. El paso de un nivel a otro puede hacerse de un nivel de menor detalle (general) o mayor granularidad a otro de mayor detalle o granularidad más fina y viceversa, según el enfoque sea descendente o ascendente. En resumen, podemos decir que la abstracción es un arma para la comprensión y resolución de sistemas o problemas complejos. Así pues la evolución en la informática está basada en caminar hacia un grado creciente de abstracción. De hecho, los paradigmas de programación más modernos abstraen al programador de la secuencia concreta de instrucciones. Profesorado de Estructura de la información y Fundamentos de la Programación II 2

Abstracción Funcional y Abstracción de Datos La abstracción produce como resultado el ocultamiento de la información, es decir, las entidades de uno de los niveles están compuestos internamente por entidades del nivel inferior, pero las ocultan. Podemos hablar de dos tipos de abstracción: Abstracción funcional! La abstracción funcional surge de la simple idea de crear procedimientos y funciones e invocarlos en diferentes partes del programa mediante un nombre. La parte que se ignora ( la información que se oculta ) en este proceso es la de cómo el procedimiento o función realiza su tarea. La parte con la que nos quedamos es la signatura o interfaz: los parámetros de entrada y salida (y sus tipos), y la descripción de la tarea que realiza. Las ventajas de la abstracción funcional son las siguientes: o Generalización del concepto de operador" Gracias a esta abstracción podemos definir operadores adicionales a los del lenguaje (por ejemplo, una función factorial), incluyendo la posibilidad de que dichos operadores no trabajen sobre tipos básicos del lenguaje (por ejemplo, determinantes o multiplicaciones de matrices). o Encapsulación y ocultamiento" Haciendo que una secuencia de acciones esté oculta y sólo se haga visible desde el exterior su resultado global que se entrega a través de parámetros de salida bien definidos. Abstracción de datos! La primera aplicación de la abstracción a los datos está en los propios tipos de datos básicos de los lenguajes de programación. Un tipo boolean en un lenguaje como Pascal tiene una semántica bien definida, que abstrae la representación concreta en una máquina o sistema operativo determinado (que puede ser un bit o un valor entero). Así, un programa en un lenguaje de alto nivel puede ejecutarse en máquinas de arquitecturas diferentes con sólo recompilarlo. Las operaciones que pueden realizarse sobre un tipo boolean son las operaciones lógicas habituales, y, aunque puede que internamente sea un entero, el lenguaje no nos permite manipularlo como tal (por ejemplo, manipular un bit o sumar). En este sentido, lenguajes como C permiten violar la abstracción (y por tanto la semántica) de los tipos de datos. Un paso más adelante en la abstracción de datos es el de los tipos definidos por el programador, como los enumerados, que permiten definir explícitamente el dominio de valores y dar un nombre a cada uno de ellos aunque internamente el compilador los maneje como un subrango de enteros. El problema es que se puede restringir el dominio de valores, pero no definir nuevas operaciones ni restringir las existentes, ya que estas vienen predefinidas por el lenguaje de programación. Los tipos estructurados son un paso adicional que ayuda a conseguir la genericidad, es decir, se define un tipo como un agregado de instancias de otro tipo. Este tipo subordinado se suele denominar tipo parámetro, y al agregado, tipo parametrizado: t = vector [líminferior..límsuperior] de t2 donde t2 es el tipo parámetro y t el tipo parametrizado. Profesorado de Estructura de la información y Fundamentos de la Programación II 3

El problema de los tipos estructurados 1 es que el lenguaje no permite que el programador establezca cuáles son las operaciones válidas sobre el tipo. Por ejemplo, dado un tipo estructurado registro fecha, nada nos impide realizar asignaciones incorrectas desde el punto de vista de la lógica de una fecha, ni realizar operaciones sin sentido sobre este tipo, como las que se muestran a continuación sobre f1 y f2, ambas variables del tipo fecha : f1.dia= 30 f1.mes= 2 f2.dia= 5 * f1.mes Para evitar este tipo de incoherencias lógicas de significado surgen los tipos abstractos de datos (TADs), que a continuación se describen. Construcción de tipos abstractos de datos Un tipo abstracto de datos (TAD) es una colección de propiedades y de operaciones que se definen mediante una especificación que es independiente de cualquier representación. La abstracción se centra en la independencia de la representación. Esto permite al programador modificar la representación del TAD sin que esto afecte a su utilización. Se suele considerar que un tipo abstracto de datos es un tipo de datos construido por el programador para resolver una determinada situación. Para definir un TAD, el programador ha de comenzar por definir las operaciones que se pueden realizar con él, es decir, qué operaciones son relevantes y útiles para operar con las variables pertenecientes al mismo. Esto se conoce como establecer la interfaz del tipo. La interfaz permite al programador utilizar el tipo (qué se puede hacer frente a cómo está hecho). Siguiendo con el ejemplo de las fechas, podemos indicar que las operaciones válidas sobre una fecha son, entre otras: Crear (dia, mes, año: natural): fecha Incrementar (fechainicio: fecha; numdias: entero): fecha Distancia (fechainicio, fin: fecha): entero ObtenerMes (f: fecha): natural... La representación del tipo fecha en el TAD es independiente y de hecho, puede variar sin que afecte a los programas que utilicen el tipo, ya que la especificación se mantiene. El hecho de que el programador desconozca la representación (ocultamiento) obliga a definir tanto un constructor para el tipo abstracto que 1 Estamos definiendo un tipo estructurado desde un punto de vista sintáctico, sin dotarlo de una semántica. La utilización correcta del tipo estructurado de acuerdo con su significado es responsabilidad del programador. Profesorado de Estructura de la información y Fundamentos de la Programación II 4

permita asignar valores a una variable de ese tipo como procedimientos y funciones que permitan establecer y obtener los valores del tipo 2. Una de las principales ventajas de los TADs es que permite construir programas modularizados y estructurados, ya que las tareas lógicas para un tipo se encapsulan en un módulo independiente, que se compila independientemente y cuya representación, como se ha dicho, puede variar sin que afecte al programa que los utiliza siempre y cuando no se modifique la interfaz. Los TAD tienen, por lo tanto, dos partes: Especificación " Refleja qué hace el tipo. Es necesaria para que el programador sepa cómo debe implementar el TAD. Suele coincidir con la interfaz, pero no es necesario que esto ocurra, ya que la interfaz es un concepto de programación por lo que puede añadir operaciones a la especificación (siempre que tengan justificación). Implementación " La implementación a su vez se compone de una interfaz pública, que permite al programador utilizar el TAD, y una implementación que puede variar siempre y cuando la interfaz se mantenga. Especificación de un TAD La especificación de los TADs suelen definirse de manera formal, según Aho, de la siguiente manera: Podemos pensar que un TAD es un modelo matemático con un conjunto de operaciones definido sobre ese modelo. Mediante la especificación de un TAD se conocen las operaciones que el tipo ofrece y cómo actúan estas operaciones. El proceso de definición (o construcción de la especificación) de un tipo abstracto conlleva los siguientes pasos: Definir las operaciones interesantes para el tipo (incluyendo los constructores del tipo, que nos permiten asignar valores a variables del tipo). A estas operaciones se las denomina primitivas en algunos textos. Hacer un análisis detallado de las signaturas de esas operaciones. Establecer precondiciones, postcondiciones e invariantes para las operaciones. Una precondición es un predicado lógico que debe cumplirse sobre los parámetros de entrada de una operación para que ésta pueda realizarse correctamente. Una postcondición es un predicado lógico que cumplen los datos de salida de una operación, luego expresa condiciones que afectan al resultado de la operación. Un invariante es un predicado lógico que indica los estados válidos para un objeto. Los invariantes pueden afectar a la representación del tipo o a las variables que intervienen en un bucle, dependiendo de si se trata del invariante de la representación o de un invariante de bucle. 2 En programación orientada a objetos, a este tipo de métodos que permiten el acceso a atributos se les conoce como getters y setters. Profesorado de Estructura de la información y Fundamentos de la Programación II 5

La especificación de un TAD debe poseer cuatro propiedades: Precisión" Que implica decir sólo lo imprescindible. Generalidad" Que quiere decir que sea adaptable a diferentes contextos. Legibilidad" Entendida como facilidad de comprensión. No-ambigüedad" Que quiere decir que no dé lugar a distintas interpretaciones. La especificación puede hacerse de manera formal o informal (en lenguaje natural 3 ). La especificación formal debe ajustarse a alguna notación matemática. A continuación se muestra la especificación de un TAD Natural. Pese a que se viene utilizado notación procedimiental en los ejemplos comentados hasta el momento, en este caso la especificación está realizada pensando que un número natural es un objeto de la clase Natural, y por lo tanto el acceso a sus operaciones se hace mediante la notación punto. Tipo: Natural Operación para comprobar si un natural es igual a cero: Esta operación devolverá verdadero si el natural que evalúa es igual a cero. n: Natural; b: Booleano {n= X} b= n.escero () {b (X=0)} Entendiendo por X un valor natural. Operación para hallar el sucesor de un número natural: Esta operación devuelve el natural incrementado en una unidad. n 0 : Natural; n1: Natural {n 0 = X} n 1 = n 0.Sucesor () {n 1 = X + 1} Operación para hallar el predecesor de un número natural: Para hallar el natural que precede a otro hay que tener en cuenta que el valor cero no tiene predecesor, ya que sería un número negativo y por tanto no natural. n 0 : Natural; n1: Natural {n 0 = X ^ n 0 0} n 1 = n 0. Predecesor () {n 1 = X - 1} 3 Con una especificación en lenguaje natural, puede ser difícil garantizar algunas de las propiedades antes mencionadas como, por ejemplo, la de no ambigüedad. En cualquier caso, la situación ideal sería una solución intermedia, donde se combinaría la especificación formal con la especificación en lenguaje natural. Profesorado de Estructura de la información y Fundamentos de la Programación II 6

Operación que comprueba si dos números naturales son iguales: Esta operación devuelve el valor lógico verdadero si ambos valores naturales son iguales. n 0 : Natural; n1: Natural; b: Booleano {n 0 = X ^ n 1 = W} { b (X=W)} b= n0. Igual (n1) Operación que averigua si un natural es mayor que otro: Esta operación devuelve el valor booleano verdadero si el primer valor natural es mayor que el segundo. n 0 : Natural; n1: Natural; b: Booleano {n 0 = X ^ n 1 = W} { b (X>W)} b= n0. Mayor (n1) Operación que averigua si un natural es menor que otro: Esta operación devuelve el valor booleano verdadero si el primer valor natural es menor que el segundo. n 0 : Natural; n1: Natural; b: Booleano {n 0 = X ^ n 1 = W} { b (X<W)} b= n0. Menor (n1) Operación que halla la suma de dos números naturales: El valor que devuelve esta operación es un natural igual a la suma de los dos valores de los naturales dados. n 0 = Natural; n 1 = Natural; n 2 = Natural {n 0 = X ^ n 1 = W } n 2 = n 0.Suma (n 1 ) {n 2 = X + W} Operación que halla la resta de dos números naturales: El valor que devuelve esta operación es un natural igual a la resta de los valores de los naturales dados, teniendo en cuenta que no se puede llegar a efectuar si el resultado no es un natural. n 0 = Natural; n 1 = Natural; n 2 = Natural {n 0 = X ^ n 1 = W ^ n 0 >= n 1 } n 2 = n 0.Resta (n 1 ) {n 2 = X - W} Implementación de un TAD La implementación de un tipo abstracto de datos es un tipo de datos que consta de: Estructuras de datos propias (encapsuladas, invisibles para el usuario del tipo de datos). La elección de estas estructuras queda a la libertad del programador, que seleccionará las más eficientes o convenientes. Profesorado de Estructura de la información y Fundamentos de la Programación II 7

Operaciones sobre esas estructuras propias (procedimientos y funciones). Dependerán de las estructuras internas seleccionadas. Es muy importante resaltar la diferencia entre: Interfaces visibles, que deben diseñarse cuidadosamente, ya que no deberían cambiar a pesar de que la implementación cambie. Implementaciones encapsuladas, ocultas, que pueden cambiarse por otras mejores mientras no afecten a la interfaz. Implementación de un TAD Módulo que utiliza el TAD Interfaz (definida en un especificación) Implementación (algoritmos + estructuras de datos) Vista pública Vista privada Para representar el modelo formal o matemático que define un TAD en un lenguaje de programación P, es decir, para implementarlo en P, tendremos que utilizar en último término los tipos de datos y operadores soportados por P. Al hacerlo, utilizamos estructuras de datos, que pueden definirse como colecciones de variables, posiblemente de diferentes tipos, conectadas de formas diversas. Las estructuras de datos fundamentales dependen, por tanto, del lenguaje de programación. Por ejemplo, Pascal incorpora array, registro, fichero y conjunto. En otros lenguajes como Java, podemos considerar que las bibliotecas predefinidas proporcionan construcciones adicionales como tablas Hash, mientras que no soportan conjuntos, por ejemplo. Profesorado de Estructura de la información y Fundamentos de la Programación II 8