Você está na página 1de 76

Tema 1.

Tipos Abstractos de Datos


Proceso de Abstraccin
Capacidad de manejar un objeto (tema o idea) como un concepto general, sin considerar la enorme cantidad de detalles que pueden estar asociados con ese objeto Ej. Usar una computadora sin conocer como est construida Ej. Usar una televisor, sin saber como funciona internamente

Abstraccin
Aspectos complementarios al proceso de abstraccin
Enfocarse en aspectos relevantes del objeto Ignorar aspectos irrelevantes

NOTA: La relevancia depende del nivel de abstraccin

Abstraccin
Mtodo jerrquico para estudiar fenmenos complejos
Estudia niveles de detalle sucesivos
De niveles generales a niveles ms concretos Sentido de los niveles es descendente

Beneficio principal
Es ms fcil pensar en el problema a resolver

Abstraccin
Principios importantes del diseo de software
Abstraccin Ocultacin de informacin

TAD: Tipo Abstracto de Dato


Idea bsica es separar:
Uso del tipo de dato Implementacin (operaciones que actan sobre los valores de esos datos)

Especificacin del Tipo de Dato es la representacin del TAD independientemente de su implementacin

TAD: Tipo Abstracto de Dato


Establece un nivel intermedio de representacin entre lo esencial de la realidad y los detalles de implementacin Conceptos relacionados:
Modularidad: aplicacin se divide en mdulos Abstraccin de datos: inventar tipos de datos adecuados en un programa Objetos: unidad que combina datos y funciones que operan sobre esos datos

TAD: Tipo Abstracto de Dato


Fases del ciclo de vida del software
1. Definicin de Requisitos (Planteamiento del problema) 2. Anlisis de Requisitos 3. Diseo de Solucin 4. Codificacin de la Solucin 5. Mantenimiento de programas

TAD: Tipo Abstracto de Dato


Al aplicar la POO (programacin orientada a objetos) para hacer programas, los objetos se tratan en todas la fases del ciclo de vida Un Objeto se representa por un TAD (en un primer nivel) Un TAD define un tipo de dato en trminos de un tipo y un conjunto de operaciones sobre ese tipo

TAD: Tipo Abstracto de Dato


Las operaciones se definen por sus:
Entradas Salidas

Definicin de un TAD NO especfica cmo se implementa el tipo de dato. Encapsulacin: proceso de ocultacin de los detalles de la implementacin

TAD: Tipo Abstracto de Dato


El TAD consta de un conjunto de definiciones Una estructura de datos es la implementacin fsica de un TAD Cada operacin asociada con el TAD se implementa por una o ms subrutinas mientras ocultan las implementaciones

TAD: Tipo Abstracto de Dato


El trmino estructura de datos se refiere, frecuentemente, a los datos almacenados en la memoria principal de la computadora El trmino estructura archivo se refiere, normalmente, a la organizacin de los datos en un almacenamiento perifrico, tal como una unidad de cinta, disco, CD, DVD o similar.

TAD: Tipo Abstracto de Dato


Definicin:
Es una declaracin de datos empaquetada junto con las operaciones que son significativas para el tipo de dato. Se encapsula datos y operaciones Se oculta detalles de implementacin

TAD: Tipo Abstracto de Dato


Tipos de operaciones de los TAD
Para crear objetos nuevos Para determinar el estado de los objetos Para construir otros objetos a partir de algunos ya existentes Etc.

Implementacin tradicional frenta a los TAD


Programa = Datos + Algoritmo
Ecuacin de Wirth

Los TAD identifican operaciones o partes del algoritmo que operan sobre los datos, as:
Algoritmo = Algoritmo de datos + Algoritmo de control
Programa = Datos + Algoritmo de datos + Algoritmo de control

Implementacin tradicional frenta a los TAD


Datos + Algoritmo de datos + Algoritmo de control

Programa =

TAD = Datos + Algoritmo de datos

Implementacin tradicional frenta a los TAD


Programa = Implentacin del TAD + Algoritmo de control

Esta ecuacin describe el enfoque de desarrollo de programas utilizando Tipos Abstractos de Datos

Ventajas de los TAD


Permite una mejor conceptualizacin y modelizacin del mundo real. Mejora la representacin y la comprensibilidad. Clarifica los objetos basados en estructuras y comportamientos comunes. Mejora la robustez del sistema. Los tipos abstractos de datos permiten la comprobacin de tipos para evitar errores de tipo en tiempo de ejecucin.

Ventajas de los TAD


Mejora el rendimiento (prestaciones). Para sistemas tipificados, el conocimiento de los objetos permite la optimizacin del tiempo de compilacin. Separa la implementacin de la especificacin. Permite la modificacin y mejora de la implementacin sin afectar a la interfaz pblica del tipo abstracto de dato.

Ventajas de los TAD


Permite la extensibilidad del sistema. Los componentes de software reutilizables son ms fciles de crear y mantener. Recoge mejor la semntica del tipo. Los tipos abstractos de datos agrupan o localizan las operaciones y la representacin de atributos.

Especificacin de los TAD


Objetivo: Describir el comportamiento del TAD Partes de la Especificacin de un TAD
Datos. Descripcin matemtica del conjunto de datos Operaciones. Definidas para ese conjunto de datos

Clasificacin de las operaciones


Para crear objetos
Iniciales Constructores

Para transformar objetos de TAD


Simplificadoras

Para analizar los elementos del TAD


Analizadoras

Especificacin de los TAD


Tipos de Especificacin:
Informal (lenguaje natural)
Para anlisis

Semi-formal (lenguaje natural, axiomas o lenguajes de programacin)


Para diseo

Formal (axiomas o lenguaje de programacin)


Para codificacin o implementacin

Ejemplo: TAD Conjunto


Realizar una especificacin informal del TAD Conjunto, que incluye nmeros enteros positivos, con las operaciones:
CrearConjunto Esvacio Aadir un elemento al conjunto Pertenece un elemento al conjunto Retirar un elemento del conjunto Unin de dos conjuntos Interseccin de dos conjuntos Inclusin de conjuntos

Solucin al Ejemplo: TAD Conjunto


Anlisis:
Definir tipo de datos Descripcin de las operaciones

Diseo:
Definicin de valor Definicin de operadores

Anlisis del problema


Definicin del tipo de datos TAD Conjunto (Especificacin de elementos sin duplicidades pueden estar en cualquier orden, se usa para representar los conjuntos matemticos de nmeros enteros positivos con sus operaciones)

Anlisis del problema


Descripcin de las operaciones: CrearConjunto: . Crea un conjunto sin elementos Aadir(Conjunto, elemento): Comprueba si el elemento forma parte del conjunto, en caso negativo es aadido Retirar(Conjunto, elemento): En el caso de que el elemento pertenezca al conjunto es eliminado de este Pertenece(Conjunto, elemento): Verifica si el elemento forma parte del conjunto, en cuyo caso devuelve cierto.

Anlisis del problema


Descripcin de las operaciones: Pertenece(Conjunto, elemento): Verifica si el elemento forma parte del conjunto, en cuyo caso devuelve cierto Esvacio(Conjunto): Verifica si el conjunto no tiene elementos, en cuyo caso devuelve cierto Cardinal(Conjunto): Devuelve el nmero de elementos del conjunto Union(Conjunto, Conjunto): Realiza la operacin matemtica de la unin de dos conjuntos. La operacin devuelve un conjunto con los elementos comunes y no comunes a los dos argumentos

Anlisis del problema


Descripcin de las operaciones: Interseccin(Conjunto, Conjunto): Realiza la operacin matemtica de la interseccin de dos conjuntos. La operacin devuelve un conjunto con los elementos comunes a los dos argumentos. Inclusin(Conjunto, Conjunto): Verifica si el primer conjunto est incluido en el conjunto especificado en el segundo argumento, en cuyo caso devuelve cierto.

Resultado del Anlisis

Diseo del TAD Conjunto


Definicin de valor
Abstract typedef < integer, n > Conjunto Condition Conjunto Numeros enteros positivos

Diseo del TAD Conjunto


Definicin de operador
abstract Conjunto CrearConjunto() Conjunto MiConjunto = Null; PostCondition CrearConjunto = MiConjunto;

Diseo del TAD Conjunto


Definicin de operador
Abstract int Pertenece (Conjunto MiConjunto, int Elemento) int i=0, Resultado=0; Precondition MiConjunto != y Elemento Nmeros enteros positivos PostCondition while MiConjunto[i] != Null { If MiConjunto[i] == Elemento { Pertenece = Resultado=1; exit; // Rompe el ciclo} i++ } return Resultado;

Diseo del TAD Conjunto


Definicin de operador
abstract Conjunto Aadir( Conjunto MiConjunto, int Elemento) int i=0; PreCondition Elemento Nmeros enteros positivos PostCondition If !Pertenece(MiConjunto, Elemento){ /* identifica la primera posicin vaca */ while ( MiConjunto[i] != ) Aadir = i=i+1; MiConjunto[i] = Elemento; } return MiConjunto;

Diseo del TAD Conjunto


Definicin de operador abstract int Cardinal( Conjunto MiConjunto) int NumElementos, i=0; PreCondition MiConjunto != PostCondition while MiConjunto[i] != Null i=i+1; Cardinal = NumElementos = i; return NumElementos; TAREA: Definir los operadores restantes.

Ejemplo de Diseo del TAD RATIONAL


Definicin de valor
abstract typedef <integer, integer> RATIONAL; condition RATIONAL[1] != 0;

Diseo del TAD RATIONAL


Definicin de operador
abstract RATIONAL makerational (int Num, int Denom) Precondition Denom != 0; Postcondition makerational[0] = Num; makerational[1] = Denom;

Diseo del TAD RATIONAL


Definicin de operador
abstract RATIONAL add (RATIONAL a, RATIONAL b) /* written a + b */ Postcondition add[1] = a[1] * b[1] ; add[0] = a[0] * b[1] + b[0] * a[1] ;

Diseo del TAD RATIONAL


Definicin de operador
abstract RATIONAL mult (RATIONAL a, RATIONAL b) /* written a * b */ Postcondition mult[0] = a[0] * b[0] ; mult[1] = a[1] * b[1] ;

Diseo del TAD RATIONAL


Definicin de operador
abstract int equal (RATIONAL a, RATIONAL b) /* written a == b */ Postcondition equal = (a[0] * b[1] == b[0] * a[1] );

Secuencias como definiciones de valor


Las especificaciones para diferentes tipos de datos, se pueden realizar mediante
Notacin de teora de conjuntos, y en particular, es til usar la notacin de secuencias matemticas

Una secuencia es un conjunto de elementos ordenados Una secuencia S se escribe en ocasiones como la enumeracin de sus elementos, as: S = < s0, s1, ..., sn-1 >

Secuencia S
Si S contiene elementos, se dice que S tiene una longitud de n Se supone la existencia de las funciones:
De longitud len, por lo que len(S) es la longitud de la secuencia S first(S), la cual regresa el valor del primer elemento de S last(S), que retorna el valor del ltimo elemento de S

nilseq es una secuencia especial de longitud 0, que no contiene elementos first(nilseq) y last(nilseq), no estn definidos.

Ejemplos de Definicin de Valor


abstract typedef <<tp>> stp1; abstract typedef<tp0, tp1, tp2, ..., tpn> stp2; abstract typedef<<tp, n>> stp3;

Ejemplos de Definicin de Valor


abstract typedef <<tp>> stp1;
stp1 es un TAD cuyos valores son secuencias de elementos stp1 puede ser de una longitud arbitraria stp1 contiene elementos del mismo tipo tp

Ejemplos de Definicin de Valor


abstract typedef<tp0, tp1, tp2, ..., tpn> stp2;
TAD stp2, cuyos valores son secuencias de longitud fija Los elementos son de tipos de dato diferentes Los tipos de dato deberan existir, y si es necesario se especificara la definicin

Ejemplos de Definicin de Valor


abstract typedef<<tp, n>> stp3;
stp3 es una secuencia de longitud fija n Todos los elementos son del mismo tipo tp

Implementacin de los TAD


Al tener el diseo de un TAD, se escoge las estructuras de datos para representar cada uno de los objetos abstractos Se escribe un modulo (Procedimiento o funcin) en un lenguaje de programacin, que simule el funcionamiento de cada una de las operaciones, de acuerdo con su especificacin

Implementacin de los TAD


La seleccin de las estructuras de datos determina, en muchos casos, la complejidad del algoritmo que implementa una operacin

Implementacin de los TAD


El lenguaje C, permite la definicin de nuevos tipos y la declaracin de funciones para realizar operaciones sobre objetos de los tipos Pero los datos y las operaciones asociadas NO son declarados juntos como una unidad y con un solo nombre

Implementacin de los TAD


En los lenguajes en el que los TAD se pueden implementar como una unidad, stos reciben nombres distintos:
Turbo Pascal--Modula-2------Ada------------C++-----------Java-----------unidad, objeto mdulo paquete clase clase

Implementacin de los TAD


En C no existe como tal una construccin del lenguaje para especificar un TAD Sin embargo se puede agrupar la interfaz y la representacin de los datos en un archivo de inclusin: archivo.h La implementacin de la interfaz, de la funciones se realiza en el correspondiente archivo.c

Implementacin de los TAD


en Lenguaje C
Complejo.h Representacin de los datos Prototipos de las operaciones Complejo.c Incluir Complejo.h Codificacin de las operaciones

Implementacin de los TAD


en Lenguaje C
Complejo.h Complejo.c Representacin de los MiPrograma.cpp datos Incluir Rational.h

#include Complejo.h Prototipos de las Codificacin de las operaciones main(){ operaciones Complejo x, y, z; }

Se agregan estos archivos a un archivo de proyecto en Lenguaje C

Ejemplo de Diseo del TAD RATIONAL


Definicin de valor
abstract typedef <integer, integer> RATIONAL; condition RATIONAL[1] != 0;

Diseo del TAD RATIONAL


Definicin de operador
abstract RATIONAL makerational (int Num, int Denom) Precondition Denom != 0; Postcondition makerational[0] = Num; makerational[1] = Denom;

Diseo del TAD RATIONAL


Definicin de operador
abstract RATIONAL add (RATIONAL a, RATIONAL b) /* written a + b */ Postcondition add[1] = a[1] * b[1] ; add[0] = a[0] * b[1] + b[0] * a[1] ;

Diseo del TAD RATIONAL


Definicin de operador
abstract RATIONAL mult (RATIONAL a, RATIONAL b) /* written a * b */ Postcondition mult[0] = a[0] * b[0] ; mult[1] = a[1] * b[1] ;

Diseo del TAD RATIONAL


Definicin de operador
abstract int equal (RATIONAL a, RATIONAL b) /* written a == b */ Postcondition equal = (a[0] * b[1] == b[0] * a[1] );

Implementacin estructura TAD RACIONAL


La implementacin del TAD puede ser en cualquier lenguaje y con cualquier estructura de datos que no modifique la especificacin En la definicin de las operaciones del TAD RACIONAL, varias de ellas devuelven un racional

Implementacin estructura TAD RACIONAL


En el lenguaje C, no es posible devolver una estructura por lo cual se usar un apuntador a la estructura para poder retornar dicho apuntador. La implementacin del TAD RACIONAL en C sera:

Implementacin estructura TAD RACIONAL


typedef struct s_rac { int num; int den; } STRUCTRAC; typedef STRUCTRAC * RACIONAL;

Implementacin estructura TAD RACIONAL


Se declara la estructura (STRUCTRAC) Luego, se declara el apuntador a dicha estructura (RACIONAL) el cual es la implementacin del TAD

Implementacin estructura TAD RACIONAL


Las operaciones
R_adicion R_multiplicacion y R_igualdad

se implementan en base a las operaciones


R_crear y R_destruir R_num y R_den R_asignarNum y R_asignarDen

Implementacin estructura TAD RACIONAL


Los prototipos de las operaciones seran: RACIONAL R_Crear (int x, int y); /* PRE: y != 0 POST: R_Crear = x , y */ void R_Destruir (RACIONAL R); /* PRE: ninguna POST: Libera el espacio ocupado por el racional */

Implementacin estructura TAD RACIONAL


int R_Num(RACIONAL R) /* PRE: ninguna POST: Devuelve el numerador del racional dado */ int R_Den(RACIONAL R) /* PRE: ninguna POST: Devuelve el denominador del racional dado */

Implementacin estructura TAD RACIONAL


RACIONAL R_AsignarNum(RACIONAL R, int z) /* PRE: ninguna POST: Devuelve el racional modificado con z como numerador */ RACIONAL R_AsignarDen(RACIONAL R, int z) /* PRE: z != 0 POST: Devuelve el racional modificado con z como denominador */

Implementacin estructura TAD RACIONAL


Los prototipos se colocan en el archivo Rational.h junto con los typedef de la estructura Ahora implementando las operaciones adicin, multiplicacin e igualdad usando estos prototipos, se tiene:

Implementacin estructura TAD RACIONAL


RACIONAL R_adicion (RACIONAL R1, RACIONAL R2) /* PRE: R1 = X1/Y1 y R2=X2/Y2 POST: R_adicion = X1/Y1 + X2/Y2 = (X1*Y2 + X2*Y1) / Y1*Y2 */ { return( R_Crear(R_Num(R1)*R_Den(R2)+ R_Num(R2)*R_Den(R1), R_Den(R1)*R_Den(R2) ); }

Implementacin estructura TAD RACIONAL


RACIONAL R_multiplicacion ( RACIONAL R1, RACIONAL R2) /* PRE: R1 = X1/Y1 y R2=X2/Y2 POST: R_multiplicacion = X1/Y1 * X2/Y2 = (X1 * X2) / (Y1 * Y2) { return( R_Crear(R_Num(R1)*R_Num(R2), R_Den(R1)*R_Den(R2) ); }

*/

Implementacin estructura TAD RACIONAL


int R_igualdad( RACIONAL R1, RACIONAL R2) /* PRE: R1 = X1/Y1 y R2=X2/Y2 POST: R_igualdad=(X1*Y2 = X2*Y1 ) */ { return( R_Num(R1)*R_Den(R2) == R_Num(R2)*R_Den(R1) ); }

Implementacin estructura TAD RACIONAL


RACIONAL R_Crear (int x, int y) /* PRE: y != 0 POST: R_Crear = x , y */ { RACIONAL R; if ((R=(RACIONAL)malloc(sizeof(STRUCTRAC))) != NULL) { R->num = x; R->den = y; } return (R); }

Implementacin estructura TAD RACIONAL


void R_Destruir (RACIONAL R) /* PRE: ninguna POST: Libera el espacio ocupado por el racional */ { free(R); }

Implementacin estructura TAD RACIONAL


int R_Num(RACIONAL R) /* PRE: ninguna POST: Devuelve el numerador del racional dado */ { return( R->num ); }

Implementacin estructura TAD RACIONAL


int R_Den(RACIONAL R) /* PRE: ninguna POST: Devuelve el denominador del racional dado */ { return (R->den); }

Implementacin estructura TAD RACIONAL


RACIONAL R_AsignarNum(RACIONAL R, int z) /* PRE: ninguna POST: Devuelve el racional modificado con z como numerador */ { R->num = z; return(R); }

Implementacin estructura TAD RACIONAL


RACIONAL R_AsignarDen(RACIONAL R, int z) /* PRE: z != 0 POST: Devuelve el racional modificado con z como denominador */ { R->den = z; return(R); }

Tarea: Ejercicios de programacin


Disee un TAD para los nmeros imaginarios (TAD Complejo). Defina las operaciones crear, suma, resta, igual, menor que.

Você também pode gostar