Download - Tema 1 TAD
Tema 1. Tipos Abstractos deDatos
• Proceso de Abstracción– Capacidad de manejar un objeto (tema o idea)
como un concepto general, sin considerar laenorme cantidad de detalles que pueden estarasociados con ese objeto
– Ej. Usar una computadora sin conocer comoestá construida
– Ej. Usar una televisor, sin saber como funcionainternamente
• Proceso de Abstracción– Capacidad de manejar un objeto (tema o idea)
como un concepto general, sin considerar laenorme cantidad de detalles que pueden estarasociados con ese objeto
– Ej. Usar una computadora sin conocer comoestá construida
– Ej. Usar una televisor, sin saber como funcionainternamente
Abstracción
• Aspectos complementarios al proceso deabstracción– Enfocarse en aspectos relevantes del objeto
– Ignorar aspectos irrelevantes
• NOTA: La relevancia depende del nivel deabstracción
• Aspectos complementarios al proceso deabstracción– Enfocarse en aspectos relevantes del objeto
– Ignorar aspectos irrelevantes
• NOTA: La relevancia depende del nivel deabstracción
Abstracción
• Método jerárquico para estudiar fenómenoscomplejos– Estudia niveles de detalle sucesivos
• De niveles generales a niveles más concretos
• Sentido de los niveles es descendente ↓
• Beneficio principal– Es más fácil pensar en el problema a resolver
• Método jerárquico para estudiar fenómenoscomplejos– Estudia niveles de detalle sucesivos
• De niveles generales a niveles más concretos
• Sentido de los niveles es descendente ↓
• Beneficio principal– Es más fácil pensar en el problema a resolver
Abstracción
• Principios importantes del diseño desoftware– Abstracción
– Ocultación de información
• Principios importantes del diseño desoftware– Abstracción
– Ocultación de información
TAD: Tipo Abstracto de Dato
• Idea básica es separar:– Uso del tipo de dato
– Implementación (operaciones que actúansobre los valores de esos datos)
• Especificación del Tipo de Dato es larepresentación del TADindependientemente de su implementación
• Idea básica es separar:– Uso del tipo de dato
– Implementación (operaciones que actúansobre los valores de esos datos)
• Especificación del Tipo de Dato es larepresentación del TADindependientemente de su implementación
TAD: Tipo Abstracto de Dato
• Establece un nivel intermedio derepresentación entre lo esencial de larealidad y los detalles de implementación
• Conceptos relacionados:– Modularidad: aplicación se divide en módulos
– Abstracción de datos: inventar tipos de datosadecuados en un programa
– Objetos: unidad que combina datos y funcionesque operan sobre esos datos
• Establece un nivel intermedio derepresentación entre lo esencial de larealidad y los detalles de implementación
• Conceptos relacionados:– Modularidad: aplicación se divide en módulos
– Abstracción de datos: inventar tipos de datosadecuados en un programa
– Objetos: unidad que combina datos y funcionesque operan sobre esos datos
TAD: Tipo Abstracto de Dato
• Fases del ciclo de vida del software1. Definición de Requisitos (Planteamiento del
problema)
2. Análisis de Requisitos
3. Diseño de Solución
4. Codificación de la Solución
5. Mantenimiento de programas
• Fases del ciclo de vida del software1. Definición de Requisitos (Planteamiento del
problema)
2. Análisis de Requisitos
3. Diseño de Solución
4. Codificación de la Solución
5. Mantenimiento de programas
TAD: Tipo Abstracto de Dato
• Al aplicar la POO (programación orientadaa objetos) para hacer programas, los objetosse tratan en todas la fases del ciclo de vida
• Un Objeto se representa por un TAD (enun primer nivel)
• Un TAD define un tipo de dato en términosde un tipo y un conjunto de operacionessobre ese tipo
• Al aplicar la POO (programación orientadaa objetos) para hacer programas, los objetosse tratan en todas la fases del ciclo de vida
• Un Objeto se representa por un TAD (enun primer nivel)
• Un TAD define un tipo de dato en términosde un tipo y un conjunto de operacionessobre ese tipo
TAD: Tipo Abstracto de Dato
• Las operaciones se definen por sus:– Entradas
– Salidas
• Definición de un TAD NO específica cómose implementa el tipo de dato.
• Encapsulación: proceso de ocultación delos detalles de la implementación
• Las operaciones se definen por sus:– Entradas
– Salidas
• Definición de un TAD NO específica cómose implementa el tipo de dato.
• Encapsulación: proceso de ocultación delos detalles de la implementación
TAD: Tipo Abstracto de Dato
• El TAD consta de un conjunto dedefiniciones
• Una estructura de datos es laimplementación física de un TAD
• Cada operación asociada con el TAD seimplementa por una o más subrutinasmientras ocultan las implementaciones
• El TAD consta de un conjunto dedefiniciones
• Una estructura de datos es laimplementación física de un TAD
• Cada operación asociada con el TAD seimplementa por una o más subrutinasmientras ocultan las implementaciones
TAD: Tipo Abstracto de Dato
• El término “estructura de datos” se refiere,frecuentemente, a los datos almacenados enla memoria principal de la computadora
• El término estructura archivo se refiere,normalmente, a la organización de los datosen un almacenamiento periférico, tal comouna unidad de cinta, disco, CD, DVD osimilar.
• El término “estructura de datos” se refiere,frecuentemente, a los datos almacenados enla memoria principal de la computadora
• El término estructura archivo se refiere,normalmente, a la organización de los datosen un almacenamiento periférico, tal comouna unidad de cinta, disco, CD, DVD osimilar.
TAD: Tipo Abstracto de Dato
• Definición:– Es una declaración de datos empaquetada junto
con las operaciones que son significativas parael tipo de dato.
– Se encapsula datos y operaciones
– Se oculta detalles de implementación
• Definición:– Es una declaración de datos empaquetada junto
con las operaciones que son significativas parael tipo de dato.
– Se encapsula datos y operaciones
– Se oculta detalles de implementación
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 algunosya existentes
– Etc.
• Tipos de operaciones de los TAD– Para crear objetos nuevos
– Para determinar el estado de los objetos
– Para construir otros objetos a partir de algunosya existentes
– Etc.
Implementación tradicionalfrenta a los TAD
• Programa = Datos + Algoritmo– Ecuación de Wirth
• Los TAD identifican operaciones o partes delalgoritmo que operan sobre los datos, así:
• Algoritmo = Algoritmo de datos + Algoritmo de control
• Programa = Datos + Algoritmo de datos + Algoritmo de control
• Programa = Datos + Algoritmo– Ecuación de Wirth
• Los TAD identifican operaciones o partes delalgoritmo que operan sobre los datos, así:
• Algoritmo = Algoritmo de datos + Algoritmo de control
• Programa = Datos + Algoritmo de datos + Algoritmo de control
Implementación tradicionalfrenta a los TAD
Datos+
Programa = Algoritmo de datos+
Algoritmo de control
TAD = Datos + Algoritmo de datos
Datos+
Programa = Algoritmo de datos+
Algoritmo de control
TAD = Datos + Algoritmo de datos
Implementación tradicionalfrenta a los TAD
Implentación del TAD
Programa = +
Algoritmo de control
• Esta ecuación describe el enfoque dedesarrollo de programas utilizando TiposAbstractos de Datos
Implentación del TAD
Programa = +
Algoritmo de control
• Esta ecuación describe el enfoque dedesarrollo de programas utilizando TiposAbstractos de Datos
Ventajas de los TAD
• Permite una mejor conceptualización ymodelización del mundo real. Mejora larepresentación y la comprensibilidad.Clarifica los objetos basados en estructurasy comportamientos comunes.
• Mejora la robustez del sistema.
• Los tipos abstractos de datos permiten lacomprobación de tipos para evitar erroresde tipo en tiempo de ejecución.
• Permite una mejor conceptualización ymodelización del mundo real. Mejora larepresentación y la comprensibilidad.Clarifica los objetos basados en estructurasy comportamientos comunes.
• Mejora la robustez del sistema.
• Los tipos abstractos de datos permiten lacomprobación de tipos para evitar erroresde tipo en tiempo de ejecución.
Ventajas de los TAD
• Mejora el rendimiento (prestaciones). Parasistemas tipificados, el conocimiento de losobjetos permite la optimización del tiempode compilación.
• Separa la implementación de laespecificación. Permite la modificación ymejora de la implementación sin afectar a lainterfaz pública del tipo abstracto de dato.
• Mejora el rendimiento (prestaciones). Parasistemas tipificados, el conocimiento de losobjetos permite la optimización del tiempode compilación.
• Separa la implementación de laespecificación. Permite la modificación ymejora de la implementación sin afectar a lainterfaz pública del tipo abstracto de dato.
Ventajas de los TAD
• Permite la extensibilidad del sistema. Loscomponentes de software reutilizables sonmás fáciles de crear y mantener.
• Recoge mejor la semántica del tipo. Lostipos abstractos de datos agrupan olocalizan las operaciones y la representaciónde atributos.
• Permite la extensibilidad del sistema. Loscomponentes de software reutilizables sonmás fáciles de crear y mantener.
• Recoge mejor la semántica del tipo. Lostipos abstractos de datos agrupan olocalizan las operaciones y la representaciónde atributos.
Especificación de los TAD
• Objetivo: Describir el comportamiento delTAD
• Partes de la Especificación de un TAD– Datos. Descripción matemática del conjunto de
datos
– Operaciones. Definidas para ese conjunto dedatos
• Objetivo: Describir el comportamiento delTAD
• Partes de la Especificación de un TAD– Datos. Descripción matemática del conjunto de
datos
– Operaciones. Definidas para ese conjunto dedatos
Clasificación de las operaciones
• Para crear objetos– Iniciales
– Constructores
• Para transformar objetos de TAD– Simplificadoras
• Para analizar los elementos del TAD– Analizadoras
• Para crear objetos– Iniciales
– Constructores
• Para transformar objetos de TAD– Simplificadoras
• Para analizar los elementos del TAD– Analizadoras
Especificación de los TAD
• Tipos de Especificación:– Informal (lenguaje natural)
• Para análisis
– Semi-formal (lenguaje natural, axiomas olenguajes de programación)
• Para diseño
– Formal (axiomas o lenguaje de programación)• Para codificación o implementación
• Tipos de Especificación:– Informal (lenguaje natural)
• Para análisis
– Semi-formal (lenguaje natural, axiomas olenguajes de programación)
• Para diseño
– Formal (axiomas o lenguaje de programación)• Para codificación o implementación
Ejemplo: TAD Conjunto
• Realizar una especificación informal del TADConjunto, que incluye números enterospositivos, con las operaciones:– CrearConjunto– Esvacio– Añadir un elemento al conjunto– Pertenece un elemento al conjunto– Retirar un elemento del conjunto– Unión de dos conjuntos– Intersección de dos conjuntos– Inclusión de conjuntos
• Realizar una especificación informal del TADConjunto, que incluye números enterospositivos, con las operaciones:– CrearConjunto– Esvacio– Añadir un elemento al conjunto– Pertenece un elemento al conjunto– Retirar un elemento del conjunto– Unión de dos conjuntos– Intersección de dos conjuntos– Inclusión de conjuntos
Solución al Ejemplo: TAD Conjunto
• Análisis:– Definir tipo de datos
– Descripción de las operaciones
• Diseño:– Definición de valor
– Definición de operadores
• Análisis:– Definir tipo de datos
– Descripción de las operaciones
• Diseño:– Definición de valor
– Definición de operadores
Análisis del problema
• Definición del tipo de datosTAD Conjunto (Especificación deelementos sin duplicidades pueden estar encualquier orden, se usa para representar losconjuntos matemáticos de números enterospositivos con sus operaciones)
• Definición del tipo de datosTAD Conjunto (Especificación deelementos sin duplicidades pueden estar encualquier orden, se usa para representar losconjuntos matemáticos de números enterospositivos con sus operaciones)
Análisis del problema
Descripción de las operaciones:• CrearConjunto: . Crea un conjunto sin elementos
• Añadir(Conjunto, elemento): Comprueba si el elementoforma parte del conjunto, en caso negativo es añadido
• Retirar(Conjunto, elemento): En el caso de que elelemento pertenezca al conjunto es eliminado de este
• Pertenece(Conjunto, elemento): Verifica si el elementoforma parte del conjunto, en cuyo caso devuelve cierto.
Descripción de las operaciones:• CrearConjunto: . Crea un conjunto sin elementos
• Añadir(Conjunto, elemento): Comprueba si el elementoforma parte del conjunto, en caso negativo es añadido
• Retirar(Conjunto, elemento): En el caso de que elelemento pertenezca al conjunto es eliminado de este
• Pertenece(Conjunto, elemento): Verifica si el elementoforma parte del conjunto, en cuyo caso devuelve cierto.
Análisis del problema
Descripción 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 número de elementos del
conjunto• Union(Conjunto, Conjunto): Realiza la operación
matemática de la unión de dos conjuntos. La operacióndevuelve un conjunto con los elementos comunes y nocomunes a los dos argumentos
Descripción 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 número de elementos del
conjunto• Union(Conjunto, Conjunto): Realiza la operación
matemática de la unión de dos conjuntos. La operacióndevuelve un conjunto con los elementos comunes y nocomunes a los dos argumentos
Análisis del problema
Descripción de las operaciones:
• Intersección(Conjunto, Conjunto): Realiza laoperación matemática de la intersección de dosconjuntos. La operación devuelve un conjunto conlos elementos comunes a los dos argumentos.
• Inclusión(Conjunto, Conjunto): Verifica si elprimer conjunto está incluido en el conjuntoespecificado en el segundo argumento, en cuyocaso devuelve cierto.
Descripción de las operaciones:
• Intersección(Conjunto, Conjunto): Realiza laoperación matemática de la intersección de dosconjuntos. La operación devuelve un conjunto conlos elementos comunes a los dos argumentos.
• Inclusión(Conjunto, Conjunto): Verifica si elprimer conjunto está incluido en el conjuntoespecificado en el segundo argumento, en cuyocaso devuelve cierto.
Diseño del TAD Conjunto
Definición de valor
Abstract typedef < integer, n > Conjunto
Condition Conjunto Є Numeros enterospositivos
Definición de valor
Abstract typedef < integer, n > Conjunto
Condition Conjunto Є Numeros enterospositivos
Diseño del TAD Conjunto
Definición de operador
abstract Conjunto CrearConjunto()
Conjunto MiConjunto = Null;
PostCondition CrearConjunto = MiConjunto;
Definición de operador
abstract Conjunto CrearConjunto()
Conjunto MiConjunto = Null;
PostCondition CrearConjunto = MiConjunto;
Diseño del TAD Conjunto
Definición de operador
Abstract int Pertenece (Conjunto MiConjunto, int Elemento)int i=0, Resultado=0;Precondition MiConjunto != Ø y Elemento Є Números enteros positivosPostCondition
while MiConjunto[i] != Null{
If MiConjunto[i] == Elemento {Pertenece = Resultado=1; exit; // Rompe el ciclo}
i++}return Resultado;
Definición de operador
Abstract int Pertenece (Conjunto MiConjunto, int Elemento)int i=0, Resultado=0;Precondition MiConjunto != Ø y Elemento Є Números enteros positivosPostCondition
while MiConjunto[i] != Null{
If MiConjunto[i] == Elemento {Pertenece = Resultado=1; exit; // Rompe el ciclo}
i++}return Resultado;
Diseño del TAD Conjunto
Definición de operadorabstract Conjunto Añadir( Conjunto MiConjunto, int Elemento)int i=0;PreCondition Elemento Є Números enteros positivosPostCondition
If !Pertenece(MiConjunto, Elemento){/* identifica la primera posición vacía */while ( MiConjunto[i] != Ø)
Añadir = i=i+1;MiConjunto[i] = Elemento;
}return MiConjunto;
Definición de operadorabstract Conjunto Añadir( Conjunto MiConjunto, int Elemento)int i=0;PreCondition Elemento Є Números enteros positivosPostCondition
If !Pertenece(MiConjunto, Elemento){/* identifica la primera posición vacía */while ( MiConjunto[i] != Ø)
Añadir = i=i+1;MiConjunto[i] = Elemento;
}return MiConjunto;
Diseño del TAD Conjunto
Definición de operador
abstract int Cardinal( Conjunto MiConjunto)int NumElementos, i=0;PreCondition MiConjunto != ØPostCondition
while MiConjunto[i] != Nulli=i+1;
Cardinal = NumElementos = i;return NumElementos;
TAREA: Definir los operadores restantes.
Definición de operador
abstract int Cardinal( Conjunto MiConjunto)int NumElementos, i=0;PreCondition MiConjunto != ØPostCondition
while MiConjunto[i] != Nulli=i+1;
Cardinal = NumElementos = i;return NumElementos;
TAREA: Definir los operadores restantes.
Ejemplo de Diseño delTAD RATIONAL
Definición de valor
abstract typedef <integer, integer> RATIONAL;
condition RATIONAL[1] != 0;
Definición de valor
abstract typedef <integer, integer> RATIONAL;
condition RATIONAL[1] != 0;
Diseño del TAD RATIONAL
Definición de operador
abstract RATIONAL makerational (int Num, int Denom)
Precondition Denom != 0;
Postcondition makerational[0] = Num;
makerational[1] = Denom;
Definición de operador
abstract RATIONAL makerational (int Num, int Denom)
Precondition Denom != 0;
Postcondition makerational[0] = Num;
makerational[1] = Denom;
Diseño del TAD RATIONAL
Definición 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] ;
Definición 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] ;
Diseño del TAD RATIONAL
Definición 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] ;
Definición 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] ;
Diseño del TAD RATIONAL
Definición de operador
abstract int equal (RATIONAL a, RATIONAL b)/* written a == b */
Postcondition equal = (a[0] * b[1] == b[0] * a[1] );
Definición de operador
abstract int equal (RATIONAL a, RATIONAL b)/* written a == b */
Postcondition equal = (a[0] * b[1] == b[0] * a[1] );
Secuencias comodefiniciones de valor
• Las especificaciones para diferentes tipos de datos,se pueden realizar mediante– Notación de teoría de conjuntos, y en particular, es útil
usar la notación de secuencias matemáticas
• Una secuencia es un conjunto de elementosordenados
• Una secuencia S se escribe en ocasiones como laenumeración de sus elementos, así:
S = < s0, s1, ..., sn-1 >
• Las especificaciones para diferentes tipos de datos,se pueden realizar mediante– Notación de teoría de conjuntos, y en particular, es útil
usar la notación de secuencias matemáticas
• Una secuencia es un conjunto de elementosordenados
• Una secuencia S se escribe en ocasiones como laenumeración de sus elementos, así:
S = < s0, s1, ..., sn-1 >
Secuencia S
• Si S contiene elementos, se dice que S tiene unalongitud 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, queno contiene elementos
• first(nilseq) y last(nilseq), no están definidos.
• Si S contiene elementos, se dice que S tiene unalongitud 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, queno contiene elementos
• first(nilseq) y last(nilseq), no están definidos.
Ejemplos de Definición de Valor
• abstract typedef <<tp>> stp1;
• abstract typedef<tp0, tp1, tp2, ..., tpn>stp2;
• abstract typedef<<tp, n>> stp3;
• abstract typedef <<tp>> stp1;
• abstract typedef<tp0, tp1, tp2, ..., tpn>stp2;
• abstract typedef<<tp, n>> stp3;
Ejemplos de Definición 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
• 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 Definición 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 deberían existir, y si es
necesario se especificaría la definición
• 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 deberían existir, y si es
necesario se especificaría la definición
Ejemplos de Definición de Valor
• abstract typedef<<tp, n>> stp3;– stp3 es una secuencia de longitud fija n
– Todos los elementos son del mismo tipo tp
• abstract typedef<<tp, n>> stp3;– stp3 es una secuencia de longitud fija n
– Todos los elementos son del mismo tipo tp
Implementación de los TAD
• Al tener el diseño de un TAD, se escoge lasestructuras de datos para representar cadauno de los objetos abstractos
• Se escribe un modulo (Procedimiento ofunción) en un lenguaje de programación,que simule el funcionamiento de cada unade las operaciones, de acuerdo con suespecificación
• Al tener el diseño de un TAD, se escoge lasestructuras de datos para representar cadauno de los objetos abstractos
• Se escribe un modulo (Procedimiento ofunción) en un lenguaje de programación,que simule el funcionamiento de cada unade las operaciones, de acuerdo con suespecificación
Implementación de los TAD
• La selección de las estructuras de datosdetermina, en muchos casos, la complejidaddel algoritmo que implementa unaoperación
• La selección de las estructuras de datosdetermina, en muchos casos, la complejidaddel algoritmo que implementa unaoperación
Implementación de los TAD
• El lenguaje C, permite la definición denuevos tipos y la declaración de funcionespara realizar operaciones sobre objetos delos tipos
• Pero los datos y las operaciones asociadasNO son declarados juntos como una unidady con un solo nombre
• El lenguaje C, permite la definición denuevos tipos y la declaración de funcionespara realizar operaciones sobre objetos delos tipos
• Pero los datos y las operaciones asociadasNO son declarados juntos como una unidady con un solo nombre
Implementación de los TAD
• En los lenguajes en el que los TAD sepueden implementar como una unidad,éstos reciben nombres distintos:– Turbo Pascal--- unidad, objeto
– Modula-2------- módulo
– Ada------------- paquete
– C++------------ clase
– Java------------ clase
• En los lenguajes en el que los TAD sepueden implementar como una unidad,éstos reciben nombres distintos:– Turbo Pascal--- unidad, objeto
– Modula-2------- módulo
– Ada------------- paquete
– C++------------ clase
– Java------------ clase
Implementación de los TAD
• En C no existe como tal una construccióndel lenguaje para especificar un TAD
• Sin embargo se puede agrupar la interfaz yla representación de los datos en un archivode inclusión: archivo.h
• La implementación de la interfaz, de lafunciones se realiza en el correspondientearchivo.c
• En C no existe como tal una construccióndel lenguaje para especificar un TAD
• Sin embargo se puede agrupar la interfaz yla representación de los datos en un archivode inclusión: archivo.h
• La implementación de la interfaz, de lafunciones se realiza en el correspondientearchivo.c
Implementación de los TAD
“Complejo.h”
• Representación delos datos
• Prototipos de lasoperaciones
“Complejo.c”
• Incluir “Complejo.h”
• Codificación de lasoperaciones
… en Lenguaje C
“Complejo.h”
• Representación delos datos
• Prototipos de lasoperaciones
“Complejo.c”
• Incluir “Complejo.h”
• Codificación de lasoperaciones
Implementación de los TAD
“Complejo.h”
• Representación de losdatos
• Prototipos de lasoperaciones
“Complejo.c”
• Incluir “Rational.h”
• Codificación de lasoperaciones
… en Lenguaje C
“MiPrograma.cpp”#include “Complejo.h”…main(){
Complejo x, y, z;…
}
Se agregan estosarchivos a unarchivo deproyecto enLenguaje C
“Complejo.h”
• Representación de losdatos
• Prototipos de lasoperaciones
“Complejo.c”
• Incluir “Rational.h”
• Codificación de lasoperaciones
“MiPrograma.cpp”#include “Complejo.h”…main(){
Complejo x, y, z;…
}
Se agregan estosarchivos a unarchivo deproyecto enLenguaje C
Ejemplo de Diseño delTAD RATIONAL
Definición de valor
abstract typedef <integer, integer> RATIONAL;
condition RATIONAL[1] != 0;
Definición de valor
abstract typedef <integer, integer> RATIONAL;
condition RATIONAL[1] != 0;
Diseño del TAD RATIONAL
Definición de operador
abstract RATIONAL makerational (int Num, int Denom)
Precondition Denom != 0;
Postcondition makerational[0] = Num;
makerational[1] = Denom;
Definición de operador
abstract RATIONAL makerational (int Num, int Denom)
Precondition Denom != 0;
Postcondition makerational[0] = Num;
makerational[1] = Denom;
Diseño del TAD RATIONAL
Definición 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] ;
Definición 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] ;
Diseño del TAD RATIONAL
Definición 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] ;
Definición 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] ;
Diseño del TAD RATIONAL
Definición de operador
abstract int equal (RATIONAL a, RATIONAL b)/* written a == b */
Postcondition equal = (a[0] * b[1] == b[0] * a[1] );
Definición de operador
abstract int equal (RATIONAL a, RATIONAL b)/* written a == b */
Postcondition equal = (a[0] * b[1] == b[0] * a[1] );
Implementación estructura TADRACIONAL
• La implementación del TAD puede ser encualquier lenguaje y con cualquierestructura de datos que no modifique laespecificación
• En la definición de las operaciones del TADRACIONAL, varias de ellas devuelven unracional
• La implementación del TAD puede ser encualquier lenguaje y con cualquierestructura de datos que no modifique laespecificación
• En la definición de las operaciones del TADRACIONAL, varias de ellas devuelven unracional
Implementación estructura TADRACIONAL
• En el lenguaje C, no es posible devolver unaestructura por lo cual se usará unapuntador a la estructura para poderretornar dicho apuntador.
• La implementación del TAD RACIONALen C sería:
• En el lenguaje C, no es posible devolver unaestructura por lo cual se usará unapuntador a la estructura para poderretornar dicho apuntador.
• La implementación del TAD RACIONALen C sería:
Implementación estructura TADRACIONAL
typedef struct s_rac {
int num;
int den;
} STRUCTRAC;
typedef STRUCTRAC * RACIONAL;
typedef struct s_rac {
int num;
int den;
} STRUCTRAC;
typedef STRUCTRAC * RACIONAL;
Implementación estructura TADRACIONAL
• Se declara la estructura (STRUCTRAC)
• Luego, se declara el apuntador a dichaestructura (RACIONAL) el cual es laimplementación del TAD
• Se declara la estructura (STRUCTRAC)
• Luego, se declara el apuntador a dichaestructura (RACIONAL) el cual es laimplementación del TAD
Implementación estructura TADRACIONAL
• 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
• 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
Implementación estructura TADRACIONAL
Los prototipos de las operaciones serían:
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 */
Los prototipos de las operaciones serían:
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 */
Implementación estructura TADRACIONAL
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 */
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 */
Implementación estructura TADRACIONAL
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 */
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 */
Implementación estructura TADRACIONAL
• Los prototipos se colocan en el archivoRational.h junto con los typedef de laestructura
• Ahora implementando las operacionesadición, multiplicación e igualdad usandoestos prototipos, se tiene:
• Los prototipos se colocan en el archivoRational.h junto con los typedef de laestructura
• Ahora implementando las operacionesadición, multiplicación e igualdad usandoestos prototipos, se tiene:
Implementación estructura TADRACIONAL
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) );
}
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) );
}
Implementación estructura TADRACIONAL
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) );
}
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) );
}
Implementación estructura TADRACIONAL
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) );
}
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) );
}
Implementación estructura TADRACIONAL
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);
}
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);
}
Implementación estructura TADRACIONAL
void R_Destruir (RACIONAL R)
/* PRE: ninguna
POST: Libera el espacio ocupado por el racional */
{
free(R);
}
void R_Destruir (RACIONAL R)
/* PRE: ninguna
POST: Libera el espacio ocupado por el racional */
{
free(R);
}
Implementación estructura TADRACIONAL
int R_Num(RACIONAL R)
/* PRE: ninguna
POST: Devuelve el numerador del racional dado */
{
return( R->num );
}
int R_Num(RACIONAL R)
/* PRE: ninguna
POST: Devuelve el numerador del racional dado */
{
return( R->num );
}
Implementación estructura TADRACIONAL
int R_Den(RACIONAL R)
/* PRE: ninguna
POST: Devuelve el denominador del racional dado */
{
return (R->den);
}
int R_Den(RACIONAL R)
/* PRE: ninguna
POST: Devuelve el denominador del racional dado */
{
return (R->den);
}
Implementación estructura TADRACIONAL
RACIONAL R_AsignarNum(RACIONAL R, int z)
/* PRE: ninguna
POST: Devuelve el racional modificado con z
como numerador */
{
R->num = z;
return(R);
}
RACIONAL R_AsignarNum(RACIONAL R, int z)
/* PRE: ninguna
POST: Devuelve el racional modificado con z
como numerador */
{
R->num = z;
return(R);
}
Implementación estructura TADRACIONAL
RACIONAL R_AsignarDen(RACIONAL R, int z)
/* PRE: z != 0
POST: Devuelve el racional modificado con z
como denominador */
{
R->den = z;
return(R);
}
RACIONAL R_AsignarDen(RACIONAL R, int z)
/* PRE: z != 0
POST: Devuelve el racional modificado con z
como denominador */
{
R->den = z;
return(R);
}