UNIDAD 3: TIPOS ABSTRACTOS DE DATOS

. 1 UNIDAD 3: TIPOS ABSTRACTOS DE DATOS (APUNTES DE APOYO A CLASES TEÓRICAS TIEMPO DE EXPOSICIÓN: 2 HS) Bibliografía: 2 1. Rubén Maza. Artículo A...
0 downloads 0 Views 373KB Size
.

1

UNIDAD 3: TIPOS ABSTRACTOS DE DATOS (APUNTES DE APOYO A CLASES TEÓRICAS TIEMPO DE EXPOSICIÓN: 2 HS)

Bibliografía: 2

1. Rubén Maza. Artículo Abstracción de Datos. Revista Compumagazine 1993 2000. 2. Aho, Hopcroft y Ullman, Estructuras de Datos y Algoritmos. Addison Wesley . 1988.

3. Luis Joyanes Aguilar, Programación en Pascal y C -

Objetivos: 3

1. Definir Abstracción, Niveles de abstracción y Tipo Abstracto de Datos (TAD). 2. Conceptualizar las etapas del diseño de un TAD

3. Diseñar un TAD ejemplo 4. Desarrollar otros ejemplos de aplicación

Definiciones: 4

Abstracción: Es un proceso mental que consiste en eliminar los detalles superfluos, resaltando solo los esenciales, permitiendo de esta manera entender los aspectos que interesan. También podemos definir la abstracción, como la extracción de las propiedades esenciales de un concepto. Niveles de abstracción: El programador solo ve los detalles que son importantes en un determinado nivel de diseño, ignorando los detalles de los niveles más bajos. De esta manera, podemos concentrarnos sobre la especificación (EL QUE HACER) y dejar los detalles de la implementación para después (EL COMO HACER).

Tipo Abstrcto de Datos: (TAD) Definición 5

TAD: Es un modelo matemático definido por medio de especificaciones que son independientes

de su implementación .

Un tipo abstracto de dato (TDA) es un tipo de dato definido por el programador que encapsula en una sola entidad: •

la representación de los datos (una estructura de datos)



las operaciones (procedimientos y funciones para manipular la estructura de datos). La

única manera de manipular la estructura de datos será mediante estas operaciones.

Se denominan ABSTRACTOS para diferenciarlos de los tipos de datos fundamentales o básicos definidos por el lenguaje, por ejemplo en Pascal, tales como integer, char , etc

Diseño de un TAD: Consta de dos niveles. 6

• Nivel lógico: Se especifica solamente qué se debe hacer. • Nivel de Implementación: Se detalla el cómo hacerlo, cómo se representan los datos en memoria y cómo se implementan los algoritmos para la gestión de la estructura de datos elegida. EjemploTAD Complejo

Nivel lógico:

Nivel de Implementación:

- Estructura de datos: - Parte real. - Parte imaginaria

- Estructura de datos: - pReal: Integer - pImag: Integer

- Operaciones: - Leer un nro. complejo. - Sumar dos nros. complejos. - Mostar un nro. Complejo..

- Operaciones: - Leer(VAR A: Complejo) - Sumar (A,B,VAR C: Complejo) - Mostar (A: Complejo)

Diseño de un TAD: Ventajas. 7

Ventajas de separar los dos niveles de diseño: 1. Ocultamiento de la información: Nos permite concentrarnos en el diseño global del TAD, sin considerar los detalles de los niveles inferiores del diseño. Esto incrementa la modularidad.

2. Mejora el mantenimiento de los programas. Al separar los TAD de los programas que los usan, podemos cambiar el nivel de implementación sin afectar los programas. Esto incrementa la modificabilidad 3. Un mismo TAD puede ser utilizado en programas diferentes. No será necesario volver a escribir los procedimientos y funciones del TAD

Esto incrementa la reusabilidad.

Implementación de un TAD: en C 8

Definición en C archivo cabecera: Complejo.h //Complejo.h : Definición de tipos y declaración de operaciones // ---------------------------------------------------------------------------------typedef struct { int pReal; int pImag; } NumComplejo;

NumComplejo Leer(void); NumComplejo Sumar(NumComplejo z1, NumComplejo z2); void Mostrar(NumComplejo z);

Implementación de un TAD: en C… 9

Definición en C archivo cabecera: Complejo.c //Complejo.c : Definición de operaciones (implementación) //-----------------------------------------------------#include "Complejo.h" NumComplejo Leer(void) { NumComplejo z; printf("\nIngresa parte real:"); scanf("%i",&z.pReal); printf("\nIngresa parte imaginaria:"); scanf("%i",&z.pImag); return(z); } NumComplejo Sumar(NumComplejo z1, NumComplejo z2) { NumComplejo z; z.pReal = z1.pReal + z2.pReal; z.pImag = z1.pImag + z2.pImag; return(z); } void Mostrar(NumComplejo z) { printf("\nEl numero complejo es:"); printf("(%i + %ii)\n",z.pReal,z.pImag); }

Utilización de un TAD: en C… 10

//UsaComplejo.c

//Utiliza el TAD Complejo en un programa C #include #include #include "Complejo.h" main() { NumComplejo a,b,suma;

a= Leer(); b= Leer();

suma = Sumar(a,b); printf("La suma es:"); Mostrar(suma); system("pause"); }

Implementación de un TAD: en Pascal 11

En Pascal, es posible definir una unidad, es decir código fuente separado, escrito y compilado aparte del programa que la utiliza.

Definición en Pascal de una unidad: UNIT TADComplejo; INTERFACE {declaraciones públicas, visibles al usuario} Type Complejo = Record pReal: Integer; pImag: Integer; End; Procedure Leer(Var A: Complejo) Procedure Sumar(A,B: Complejo; VAR C: Complejo); Procedure Mostrar(A);

IMPLEMENTATION {Código de cada operación} … BEGIN END.

Utilización de un TAD: en Pascal 12

Teniendo en cuenta la unidad que contiene el TAD Complejo, el programa que la utiliza podría ser: Programa en Pascal: PROGRAM UsaTADComplejo; USES TADComplejo;

VAR A, B, C: Complejo; BEGIN Leer(A); Leer(B); Sumar(A,B,C); Mostrar(C); END.

Otro ejemplo: TAD CadenaDeLetras 13

TAD CadenaDeLetras

Nivel lógico: - Estructura de datos: - CantLetras - Letras

Nivel de Implementación: - Estructura de datos: - CantLetras: Integer - Letras: Array [1..80] of char

- Operaciones: - Leer la cadena. - Concatenar dos cadenas. - Longitud de la cadena. - etc

- Operaciones: - Leer(VAR S:CadenaDeLetras) - Concatenar(A,B:CadenaDeLetras; VAR C: CadenaDeLetras) - Longitud (S:CadenaDeLetras)

Implementación de TAD CadenaDeLetras 14

UNIT TADCadena; INTERFACE {declaraciones públicas, visibles al usuario} Type CadenaDeLetras = Record CantLetras :Integer; Letras: Array[1..80] of char; End; Procedure Leer(VAR S:CadenaDeLetras); Procedure Concatenar(A,B: CadenaDeLetras; VAR C: CadenaDeLetras); Function Longitud(S: CadenaDeLetras):Integer; IMPLEMENTATION … {Código de cada operación} BEGIN END. Los alumnos lo hacen en C.

Utilización del TAD en Pascal 15

Teniendo en cuenta la unidad que contiene el TAD CadenaDeLetras, el programa que la utiliza podría ser: Programa en Pascal: PROGRAM UsaTADCadenaDeLetras; USES TADCadena;

VAR S1,S2, S3: CadenaDeLetras; BEGIN Leer(S1); Leer(S2); Concatenar(S1,S2,S3); Writeln (Longitud(S3)); END.

Los alumnos lo hacen en C.

TAD Conjunto: 16

• Nivel lógico: - Estructura de datos: - CantElementos. - Elementos - Operaciones: - Agregar - Eliminar - Vacio - etc

• Nivel de Implementación (I): - Estructura de datos: Set de Pascal - Conjunto: Set of Elem (donde el tipo Elem : 0..255, por ej) - Operaciones: - Agregar (C, elem) - Eliminar (C, elem) - Vacio(C)

• Nivel de Implementación (II): - Estructura de datos: con Array de Pascal - Conjunto: Array [0..255] of Boolean - Operaciones: - Agregar (C, elem) - Eliminar(C, elem) - Vacio(C)

TAD Conjunto: Implementación I 17

UNIT TADConjuntoI; INTERFACE {declaraciones públicas, visibles al usuario} Type Elem = 0..255; Type Conjunto = Set of Elem; Procedure Agregar(VAR C:Conjunto; e:Elem); Procedure Eliminar(VAR C:Conjunto; e:Elem); Function Vacio(C:Conjunto): Boolean; IMPLEMENTATION {Código de cada operación} Procedure Agregar(VAR C:Conjunto; e:Elem); Begin C:= C + [e]; End;

… {implementación de las otras operaciones} BEGIN END.

TAD Conjunto: Implementación I 18

Teniendo en cuenta la unidad que contiene el TAD Conjunto implementado como Set de Pascal, el programa que la utiliza podría ser:

Programa en Pascal: PROGRAM UsaTADConjuntoI; USES TADConjuntoI; VAR A: Conjunto; BEGIN …; Agregar(A, 1); …; END.

TAD Conjunto: Implementación II 19

UNIT TADConjuntoII; INTERFACE {declaraciones públicas, visibles al usuario} Type Elem = 0..255; Type Conjunto = Array [0..255] of Boolean; Procedure Agregar(VAR C:Conjunto; e:Elem); Procedure Eliminar(VAR C:Conjunto; e:Elem); Function Vacio(C:Conjunto): Boolean; IMPLEMENTATION {Código de cada operación} Procedure Agregar(VAR C:Conjunto; e:Elem); Begin

If e