You are on page 1of 7

Universidad de Buenos Aires

Facultad De Ingeniera

Introduccion al Tipo de Dato Abstracto (TDA)


[75.40] Algoritmos y Programacion I

2do Cuatrimestre 2010

Catedra: Ing. Pablo Guarna

Autor: Bernardo Ortega Moncada


Apunte de TDA 2do Cuatrimestre 2010

Indice
1. Introduccion 2

2. Que es la Abstraccion? 2

3. Concepto de TDA 2
3.1. Abstraccion al utilizar un TDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
3.2. Abstraccion al construir un TDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

4. Diseno de un TDA 3
4.1. Ejemplo de diseno de un TDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
4.1.1. Analizar el problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
4.1.2. Obtener caractersticas principales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
4.1.3. Realizar diagrama del TDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4.1.4. Implementar un TDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4.1.5. Testear el TDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

5. Observaciones 6

Autor: Bernardo Ortega Moncada 1


Apunte de TDA 2do Cuatrimestre 2010

1. Introduccion
Este apunte esta orientado para introducirle al alumno, el concepto del mecanismo de Abstraccion y sobre el Tipo
de Dato Abstracto (TDA), tengan mucho en mente que este tema es dedicado con mucha profundidad en la materia
posterior a esta, es decir lo van a ver con mucho detalle en [75.41]Algoritmos y Programacion II

2. Que es la Abstraccion?
Bueno para arrancar vamos a definir el concepto de Abstraccion, este concepto no es muy facil de entender al
principio, pero con tiempo y dedicacion, uno logra captarlo.
El concepto de la Abstraccion o como comunmente se denomina Mecanismo de Abstraccion, en formas generales
es la consideracion de ciertas partes seleccionadas de un todo complejo, ignorando las partes sobrantes.
Bien hasta aca no aportamos mucho a la cuestion, para eso, vamos a aplicarlo a lo nuestro, es decir a un nivel mas
Ingenieril. La Abstraccion me otorga la posibilidad de considerar una resolucion de un cierto problema en el cual, no
tenemos idea de como esta resuelto, o demostrado o etc, es decir, que ignoramos todo lo que esta por debajo del nivel que
nos interesa. En este caso a nosotros nos interesa solo como se utiliza, lo cual un nivel inferior a lo que nos interesa es el
como esta implementado, o desarrollado, o demostrado, etc por ende lo descartamos.
Es mas podemos citar ejemplos en nuestra vida cotidiana en la cual, aplicamos el mecanismo de Abstraccion constan-
temente sin quizas darnos cuenta que lo hacemos. Como por ejemplo:
Al utilizar la television, es decir no nos interesa el como funciona, solo sabemos usarla
Al utilizar el auto, solo sabemos conducirlo, pero quizas no sabemos su complejo funcionamiento interno
Al programar en ciertos lenguajes, utilizamos funciones/procedimientos ya existentes sin saber como fueron cons-
truidos
etc

3. Concepto de TDA
Un TDA o tambien conocido como Tipo de Dato Abstracto (quizas si leen algun libro que este en ingles, o buscan
por Internet lo pueden encontrar como ADT que en ingles significa, Abstract Data Type) esta dado por un grupo de
datos(vectores, registros, constantes, etc) que cumplen cierta condicion especificada para el TDA, mas un conjunto de
operaciones que representan el comportamiento del mismo. Es decir que el TDA tiene una identidad y un comporta-
miento, con el cual permite la interaccion (comunicacion) con el mismo. Otro punto muy importante y que tienen que
saber siempre, es que el TDA es independiente del lenguaje en el que se quiera implementar, es decir, que cierto
TDA puede implementarse en P ASCAL, C, C + +, C#, JAV A, etc.
El TDA surgio para facilitar el trabajo con tipos de datos haciendo abstraccion de la implementacion de los mismos.
Como veran en el TDA, se aplica el concepto de Abstraccion en su totalidad. Es decir se aplica tanto en su utiliza-
cion como en su construccion. Para eso vamos a analizar este concepto en dos fases. La utilizacion de un TDA y la
construccion de un TDA.

3.1. Abstraccion al utilizar un TDA


La utilizacion de un TDA, como se menciono anteriormente, consiste en saber sobre que tema trata dicho TDA, que
tipos de datos utiliza y cuales son las operaciones que ofrece (es decir, sus funciones/procedimientos). Bien usted puede
decir: Ok, pero si yo conozco todo esto, estoy sabiendo como esta implementado. Esta afirmacion es comun y sepan
que esta totalmente Erronea, ya que se como esta compuesto ese TDA, se todas las operaciones que me ofrece, pero
no se como fue construido, es decir conozco la INTERFAZ (o el diseno), pero no se como dichas operaciones fueron
construidas, que vendra a ser la IMPLEMENTACION. Para citar un ejemplo comun es cuando ustedes en PASCAL,
utilizan el tipo de dato STRING, como sabran y buscan en Internet el STRING ofrece muchas rutinas (funciones/pro-
cedimientos) con el cual me permiten manipularlo. Pueden fijarse dichas rutinas en el siguiente link:

http://www.freepascal.org/docs-html/rtl/sysutils/stringfunctions.html.

Entonces podemos decir que STRING es un TDA compuesto por una cadena de caracteres de 255 posiciones cuya
rutinas que ofrece son las que aparecen en el link, en las cuales se me informa como se llaman y que es lo que hacen,
pero en NINGUN momento supe cuando ni como fueron programadas. Entonces, al utilizar el TDA STRING, estoy
realizando el mecanismo de abstraccion, considerando solo el nivel que me interesa (es decir, como funciona y como se
utiliza) y descarto todo nivel inferior (en este caso, vendra a ser, como fue programado).
Como conclusion, podemos decir que el mecanismo de abstraccion se cumple al pie de la letra, al momento de utilizar
un TDA.

Autor: Bernardo Ortega Moncada 2


Apunte de TDA 2do Cuatrimestre 2010

3.2. Abstraccion al construir un TDA


La construccion de un TDA, cambia bastante a diferencia de su utilizacion al momento de aplicar el mecanismo de
abstraccion. Para eso vamos primero a recordar lo siguiente:
Durante esta materia ustedes solo creaban software cuyos clientes eran personas comunes, es decir, personas comunes y
corrientes que no saben sobre programacion, por lo tanto, creaban programas en los cuales, les daban opciones al usuario
que ingrese datos o que haga algo o etc, y el usuario segua todos los pasos, como pueden apreciar, ustedes construan
software, de tal manera que lograban que el usuario se abstraiga del como estaba programado (para el usuario creado)
y lo utilice sin preocupacion, ya que daba fe, que ese programa funcionaba correctamente.

Bueno, ahora cuando uno cree un TDA, lo que esta haciendo es exactamente lo mismo. Uno puede estar sorpren-
dido con esta afirmacion, ya que le resulta medio raro que un TDA sea un software que lo use un cliente. Pues bien, un
TDA es un software, cuyo destinatario o usuario, es en definitiva otro programador, as es, otra persona que sabe
programar al igual que ustedes. Por ende al igual que un programa comun y corriente, al momento de crear un TDA,
ustedes tienen que entregarle al usuario, la documentacion correspondiente al mismo, junto con los archivos necesarios
para que dicho TDA funcione.

Pero al momento de construir un TDA, se tiene que tener un buen diseno previo del mismo. Para eso vamos a ver el
concepto de diseno de un TDA.

4. Diseno de un TDA
Al momento de disenar un TDA, lo que se tiene que tener en mente es realizar un modelo del problema a resolver,
Como es esto?, Facil!, se tiene que seguir los siguientes pasos:
1. Analizar el problema a plantear
2. Obtener sus caractersticas principales
3. Hacer un diagrama de dicho TDA (como mas les resulte comodo) analizando que tipos de datos, constantes y
funciones/procedimientos se puede utilizar
4. Implementarlo (programarlo) en el lenguaje deseado, es decir, el que mas nos convenga (en este caso es PASCAL)
5. Testear el TDA una vez terminado
Bueno, ahora para que quede mas claro, vamos a realizar un ejemplo, aplicando este concepto de diseno.

4.1. Ejemplo de diseno de un TDA


Supongamos que viene una empresa y nos piden que realicemos un software que realice operaciones con numeros
complejos en su forma binomica. Bien, el cliente solo nos dice eso, ya que lo necesitan para realizar un programa que
opere con funciones de variable compleja. Entonces una vez planteado el problema (por parte del cliente) solo nos resta
disenarlo, siguiendo los pasos que mencione en la seccion 4.

4.1.1. Analizar el problema


Analicemos el siguiente problema, nos piden realizar un software, que haga operaciones con numeros complejos. Bien,
ahora solo nos resta aprender (o terminar de recordar) que es un numero complejo, para eso consultamos o si no tenemos
a quien consultar, buscamos un libro o por Internet, por ejemplo el siguiente link:

http://es.wikipedia.org/wiki/N%C3%BAmero_complejo.

4.1.2. Obtener caractersticas principales


Una vez analizado podemos resumir al problema, considerando las caractersticas que mas nos importa:

Numero Complejo:

1. Un numero complejo es un par ordenado tal que si: z C entonces z = a + ib, con a y b R, entonces podemos
decir, que un numero complejo se compone en dos partes:
Parte Real = <(z) = a

Autor: Bernardo Ortega Moncada 3


Apunte de TDA 2do Cuatrimestre 2010

Parte Imaginaria = =(z) = b


2. Las operaciones que puedo realizar con los numeros complejos son las siguiente:
Conjugacion: la conjugacion de un numero complejo z = a + ib se realiza de la siguiente manera: z = a ib
Suma: la suma de dos numeros complejos z = a + ib y w = x + iy se realiza de la siguiente manera:
z + w = (a + x) + i(b + y)
Resta: la resta de dos numeros complejos z = a + ib y w = x + iy se realiza de la siguiente manera: z w =
(a x) + i(b y)
Multiplicacion: la multiplicacion de dos numeros complejos z = a + ib y w = x + iy se realiza de la siguiente
manera: z w = (ax by) + i(ay + bx)
Division: la division de dos numeros complejos z = a + ib y w = x + iy se realiza de la siguiente manera:
z zw ax+by bxay
w = ww = x2 +y 2 + x2 +y 2 i

Modulo: el modulo de un numero complejo z = a + ib se realiza de la siguiente manera: |z| = a2 + b2

4.1.3. Realizar diagrama del TDA


Para realizar un diagrama no se necesita mucha complicacion, solo resta ver los pasos anteriores y armarlo. En este
caso el diagrama queda como si fuese una tabla veamos lo siguiente:

TDA Numero Complejo

unNumeroComplejo : tNumeroComplejo

crear numero(var unNumero :tNumeroComplejo ; real,imaginario : REAL)


conjugar numero(var unNumero :tNumeroComplejo):tNumeroComplejo
calcular modulo(var unNumero :tNumeroComplejo):Real
sumar numeros(var unNumero, otroNumero :tNumeroComplejo):tNumeroComplejo
restar numeros(var unNumero, otroNumero :tNumeroComplejo):tNumeroComplejo
multiplicar numeros(var unNumero, otroNumero :tNumeroComplejo):tNumeroComplejo
dividir numeros(var unNumero, otroNumero :tNumeroComplejo):tNumeroComplejo

4.1.4. Implementar un TDA


Para implementar dicho TDA, lo vamos a realizar en el lenguaje PASCAL, utilizando lo que se denomina (y ustedes
ya conocen) UNITS1 . Entonces solo nos resta crear dicha UNIT.

Aclaracion: Tengan en cuenta que dicha unit va a estar incompleta, para que ustedes la terminen a modo de ejer-
cicio

Unit: TDA Numero Complejo


1 UNIT numero complejo ;
2
3 INTERFACE
4
5 CONST
6 ERROR DIVISION = 0 ;
7
8 TYPE tNumeroComplejo = RECORD
9 p a r t e R e a l : REAL;
10 p a r t e I m a g i n a r i a : REAL
11 END;
12
13 {POST: c r e a un numero c o m p l e j o con l a p a r t e r e a l e i m a g i n a r i a d e s e a d a }
14 PROCEDURE c r e a r n u m e r o ( var unNumero : tNumeroComplejo ; r e a l , i m a g i n a r i o : REAL ) ;
15
16 {PRE: unNumero t i e n e que e s t a r c r e a d o }
1 Lo pueden chequear tambien en el apunte teorico que se encuentra en el grupo yahoo de la catedra llamado Apunte Teorico(Algoritmos

I)(VERSION 3)

Autor: Bernardo Ortega Moncada 4


Apunte de TDA 2do Cuatrimestre 2010

17 {POST: c o n j u g a e l numero c o m p l e j o d e s e a d o }
18 FUNCTION c o n j u g a r n u m e r o ( var unNumero : tNumeroComplejo ) : tNumeroComplejo ;
19
20 {PRE: unNumero t i e n e que e s t a r c r e a d o }
21 {POST: d e v u e l v e e l r e s u l t a d o d e l c a l c u l o
22 d e l modulo d e l numero c o m p l e j o d e s e a d o }
23 FUNCTION c a l c u l a r m o d u l o ( var unNumero : tNumeroComplejo ) : Real ;
24
25 {PRE: unNumero y otroNumero t i e n e n que e s t a r c r e a d o s }
26 {POST: d e v u e l v e un numero c o m p l e j o r e s u l t a d o de l a
27 suma de unNumero y otroNumero }
28 FUNCTION sumar numeros ( var unNumero , otroNumero : tNumeroComplejo ) : tNumeroComplejo ;
29
30 {PRE: unNumero y otroNumero t i e n e n que e s t a r c r e a d o s }
31 {POST: d e v u e l v e un numero c o m p l e j o r e s u l t a d o de l a
32 r e s t a de unNumero y otroNumero }
33 FUNCTION r e s t a r n u m e r o s ( var unNumero , otroNumero : tNumeroComplejo ) : tNumeroComplejo ;
34
35 {PRE: unNumero y otroNumero t i e n e n que e s t a r c r e a d o s }
36 {POST: d e v u e l v e un numero c o m p l e j o r e s u l t a d o de l a
37 m u l t i p l i c a c i o n de unNumero y otroNumero }
38 FUNCTION m u l t i p l i c a r n u m e r o s ( var unNumero , otroNumero : tNumeroComplejo ) : tNumeroComplejo ;
39
40 {PRE: unNumero y otroNumero t i e n e n que e s t a r c r e a d o s ,
41 otroNumero t i e n e que s e r d i s t i n t o de 0 + i 0 }
42 {POST: d e v u e l v e un numero d i s t i n t o de ERROR DIVISION
43 a s i g n a n d o a r e s u l t a d o l a d i v i s i o n e n t r e unNumero y otroNumero .
44 Caso c o n t r a r i o d e v u e l v e ERROR RESULTADO}
45 FUNCTION d i v i d i r n u m e r o s ( var unNumero , otroNumero , r e s u l t a d o : tNumeroComplejo ) : byte ;
46
47 IMPLEMENTATION
48
49
50 {PRE: unNumero t i e n e que e s t a r c r e a d o }
51 {POST: d e v u e l v e TRUE s i e l numero c o m p l e j o e s 0 + i0 , c a s o c o n t r a r i o FALSE}
52 { O b s e r v a c i o n : F i j a r s e que d i c h a f u n c i o n no e s t a d e c l a r a d a en INTERFACE, p e r o su c o d i g o
53 s i e s t a en IMPLEMENTATION, h a c i e n d o que d i c h a f u n c i o n s e a de c a r a c t e r p r i v a d o
54 l o c u a l e l c l i e n t e de e s t e TDA, NUNCA podra u s a r l a , ya que jamas s e e n t e r a r a
55 de su e x i s t e n c i a }
56 { Tip : Esta f u n c i o n p r i v a d a l e s va a s e r u t i l a l momento de programar l a f u n c i o n
57 dividir numeros }
58 FUNCTION e s c e r o ( var unNumero : tNumeroComplejo ) : b o o l e a n ;
59 VAR
60 r e s u l t a d o : BOOLEAN;
61 BEGIN
62 r e s u l t a d o := FALSE ;
63 IF ( ( unNumero . p a r t e R e a l = 0 ) and ( unNumero . p a r t e I m a g i n a r i a = 0 ) ) THEN
64 r e s u l t a d o := TRUE
65
66 e s c e r o := r e s u l t a d o
67
68 END;
69
70 PROCEDURE c r e a r n u m e r o ( var unNumero : tNumeroComplejo ; r e a l , i m a g i n a r i o : REAL ) ;
71 BEGIN
72 unNumero . p a r t e R e a l := r e a l ;
73 unNumero . p a r t e I m a g i n a r i a := i m a g i n a r i o ;
74 END;
75
76 FUNCTION c o n j u g a r n u m e r o ( var unNumero : tNumeroComplejo ) : tNumeroComplejo ;
77 VAR
78 aux : tNumeroComplejo ;
79 BEGIN
80 aux . p a r t e R e a l := unNumero . p a r t e R e a l ;
81 aux . p a r t e I m a g i n a r i a := 1 ( unNumero . p a r t e I m a g i n a r i a ) ;
82
83 c o n j u g a r n u m e r o := aux ;

Autor: Bernardo Ortega Moncada 5


Apunte de TDA 2do Cuatrimestre 2010

84 END;
85
86 FUNCTION sumar numeros ( var unNumero , otroNumero : tNumeroComplejo ) : tNumeroComplejo ;
87 VAR
88 aux : tNumeroComplejo ;
89 BEGIN
90 aux . p a r t e R e a l := unNumero . p a r t e R e a l + otroNumero . p a r t e R e a l ;
91 aux . p a r t e I m a g i n a r i a := unNumero . p a r t e R e a l + otroNumero . p a r t e I m a g i n a r i a ;
92
93 sumar numeros := aux ;
94 END;
95
96 {CONTINUAR DICHA UNIT HASTA COMPLETAR TODAS LAS FUNCIONES/PROCEDIMIENTOS}
97
98 END.

4.1.5. Testear el TDA


Una vez finalizado la implementacion del TDA, se tiene que testear, para eso se debe armar un nuevo programa que
este dedicado exclusivamente al testeo del TDA (que por cierto el cliente no DEBE enterarse), para eso se debe llamar
a la UNIT, y se empieza a manipular las funciones/procedimientos, verificando que hagan lo que tengan que hacer por
medio de impresiones por pantalla (utilizando Writeln), lo mas importante es que el testeo tiene que abarcar todas las
posibilidades de error en dicho TDA, para asegurarse que funcione correctamente, en caso de haber error, esta demas
aclarar que se tiene que reparar el TDA

5. Observaciones
Para terminar de cerrar este tema, paso a mostrarles, los puntos claves que tienen que tener en cuenta para saber si
disenaron un buen TDA:

El TDA, tiene que modelar solo un tema, es decir que el TDA tiene que resolver solo un problema y no varios a
la vez, en este caso, supongamos que tenemos el TDA Numero Complejo, dicho TDA, tiene que modelar y resolver
las operaciones con numeros complejos y no dedicarse a otra cosa como modelar y resolver las funciones de variable
compleja, ya que eso se encargara otro TDA.

Las funciones/procedimientos de los TDA, se denominan Primitivas y dichas Primitivas, tienen que conte-
ner codigos cortos, no tienen que ser extremadamente largas, una Primitiva con pocas lineas de codigo, es una
Primitiva bien disenada
Todo TDA tiene que tener una primitiva para su construccion y (en algunos casos) para su destruccion

Las primitivas del TDA tienen que permitirle al usuario manipularlo dandole la mnima informacion sobre la
implementacion del TDA, esto se denomina Ocultamiento de la Informacion con el cual al usuario solo le
informamos de como se compone y que herramientas tiene a la alcance para manipularlo. El ocultamiento de la
implementacion de las primitivas, es lo que se denomina como Encapsulamiento en el cual ocultamos toda linea
de codigo existente en dicho TDA.

El testeo del TDA tiene que ser 100 % exitoso

Autor: Bernardo Ortega Moncada 6

You might also like