Todo tipo de datos simples se pueden definir como un conjunto de valores y un conjunto de operaciones sobre tales valores. Este conjunto y estas operaciones forman una estructura matemtica que se implementa en un lenguaje y en el computador como un tipo. Ejemplo: En C, int {-!!"! ................!!"# $ $ - - % % & & y ' Esta misma concepci(n se lleva a los tipos estructurados, los cuales se que pueden definir en base a los tipos simples. )e esta manera abstraemos la definici(n matemtica de tipo a estructuras mas complejas. Ejemplo: *ueremos definir un nuevo tipo llamado C+,-.E/+0, que contenga los valores de los n1meros complejos 2 $ 3 i con 2, 3 4 5. .as operaciones ser6an: $ 7suma8, - 7diferencia8, % 7producto8, & 7divisi(n8. En general, pocos lenguajes de programaci(n proveen 9erramientas para construir T:);0. 0on los lenguajes orientados a objetos. En lenguajes como C, el dise<o de programas a trav=s de T:)s es una t=cnica de programaci(n. 3! Caracter"sticas #e los TAD$S Es la manera de dise<ar e implementar el ocultamiento de informaci(n. >os permite concentrarnos en los objetos del problema y no en los procesos. .os objetos pueden ser dise<ados independientes del problema. El problema se resuelve con la interacci(n de los diferentes T:)s que lo componen. >os olvidamos, al dise<ar, de la eficiencia del espacio o del tiempo. Esto son aspectos se consideran en la implementaci(n. ?n T:) consta de dos partes: definici(n de conjunto de valores, la definici(n de los operadores. -ara dise<ar e implementar los T:)s seguiremos las siguiente metodolog6a: @. ConceptualiAaci(n del T:), en este paso se intenta dar un modelo de los componentes 7objetos8 del T:). B. ConceptualiAaci(n de las operaciones del T:). 0e define cada una de la operaciones que su usarn para manipular el T:) a trav=s de notaci(n funcional, as6 como, las pre y post condiciones. :qu6 se destacan cules son las operaciones primitivas y cules operaciones se implementan en base a las primitivas. @ ". Cmplementaci(n de la estructura de datos. 0e define los typedef correspondientes al nuevo T:) D. Cmplementaci(n de las operaciones Ejemplo @: )ise<o del T:) 5:CC+>:. @. Concept%ali&aci'n #el TAD 5:CC+>:.: 2 donde 2,3 4 5 7reales8 y 3 E F 3 B. Concept%ali&aci'n #e las operaciones. Geremos primero operaciones que no son primitivas: A#ici'n: 2@ $ 2B H 2@%3B $ 2B%3@ 3@ 3B 3@ % 3B
(%ltiplicaci'n: 2@ % 2B H 2@ % 2B 3@ 3B 3@ % 3B I)%al#a# : 2@ H 2B H 72@ % 3B H 2B % 3@8 3@ 3B Estas operaciones se conceptualiAan con la notaci(n funcional: R_Adicin: RACIONAL x RACIONAL RACIONAL /* PRE: Dados dos racionales POST: Devuelve la sua de los dos racionales */ R_!ul"i#licacin: RACIONAL x RACIONAL RACIONAL /* PRE: Dados dos racionales POST: Devuelve la ul"i#licacin de dos racionales */ R_I$ualdad: RACIONAL x RACIONAL %ool /* PRE: Dados dos racionales POST: Dice si dos racionales son i$uales */ :9ora 9ablaremos de las primitivas del T:). Todo T:) contiene D clases de primitivas: un constructor, un destructor, los modificadores y los observadores. Geamos las primitivas del T:) 5:CC+>:.. a8 constr%ctor: permite crear un objeto del T:). )ebemos pensar que informaci(n es necesaria al momento de crear un objeto. En el caso del racional, se necesitan el numerador y el denominador. R_Crear: in" x in" RACIONAL /* PRE: Dados dos en"eros x&' con '( POST: Crea un racional con nuerador x& denoinador ' */ b8 #estr%ctor: permite liberar el espacio de memoria ocupado por un objeto del T:). En este caso no 9ay un valor de retorno lo cual se indica usando la palabra void. B R_Des"ruir: RACIONAL void /* PRE: Dado un racional POST: Li%era el es#acio ocu#ado #or el racional */ c8 o*serva#ores: permiten visualiAar la informaci(n interna del T:). 0e necesita un observador para cada campo del objeto que se necesita accesar. En el caso del racional, se necesitan visualiAar tanto el numerador y como el denominador. R_Nu: RACIONAL in" /* PRE: Dado un racional POST: Devuelve el nuerador de dic)o racional */ R_Den: RACIONAL in" /* PRE: Dado un racional POST: Devuelve el denoinador de dic)o racional */ d8 +o#i,ica#ores: permiten modificar la informaci(n interna del T:). 0e necesita un modificador para cada campo del objeto que se necesite alterar. En el caso del racional, se necesita poder modificar tanto el numerador y como el denominador. R_Asi$narNu: RACIONAL x in" RACIONAL /* PRE: Dado un racional ' un en"ero * POST: Devuelve el racional odi+icado con * coo nuerador */ R_Asi$narDen: RACIONAL x in" RACIONAL /* PRE: Dado un racional ' un en"ero *( POST: Devuelve el racional odi+icado con * coo denoinador */ ". I+ple+entaci'n #e la estr%ct%ra #el TAD. .a implementaci(n del T:) puede ser en cualquier lenguaje y con cualquier estructura de datos que no modifique la especificaci(n. +bservemos que en la definici(n de las operaciones del T:) 5:CC+>:., varias de ellas devuelven un racional. En el lenguaje C, no es posible devolver una estructura por lo cual usaremos un apuntador a la estructura para poder retornar dic9o apuntador. .a implementaci(n del T:) 5:CC+>:. en C ser6a: "'#ede+ s"ruc" s_rac , in" nu- in" den- . STR/CTRAC- "'#ede+ STR/CTRAC *RACIONAL- " >ote que se declara primero la estructura 70T5?CT5:C8 y luego el apuntador a dic9a estructura 75:CC+>:.8 el cual es la implementaci(n del T:). ". I+ple+entaci'n #e las operaciones #el TAD. .as operaciones que no son primitivas se implementan en base a las primitivas. -or esta raA(n escribiremos primero los prototipos de las primitivas, luego, las operaciones adici(n, multiplicaci(n e igualdad implementadas en base a las primitivas y finalmente, la implementaci(n de las primitivas. .os prototipos de las operaciones primitivas ser6an: RACIONAL R_Crear 0in" x& in" '1- /* PRE: '( POST: R_Crear 2 x ' */ void R_Des"ruir 0RACIONAL R1- /* PRE: nin$una POST: Li%era el es#acio ocu#ado #or el racional */ in" R_Nu0RACIONAL R1 /* PRE: nin$una POST: Devuelve el nuerador del racional dado */ in" R_Den0RACIONAL R1 /* PRE: nin$una POST: Devuelve el denoinador del racional dado */ RACIONAL R_Asi$narNu0RACIONAL R& in" *1 /* PRE: nin$una POST: Devuelve el racional odi+icado con * coo nuerador */ RACIONAL R_Asi$narDen0RACIONAL R& in" *1 /* PRE: *( POST: Devuelve el racional odi+icado con * coo denoinador */ .os prototipos se colocan en el arc9ivo 5acional.9 junto con los typedef de la estructura. :9ora implementemos las operaciones adici(n, multiplicaci(n e igualdad usando estos prototipos. D RACIONAL R_adicin 0 RACIONAL R3& RACIONAL R41 /* PRE: R3 2 53/63 ' R4254/64 POST: R_adicin 2 2@ $ 2B H 2@%3B $ 2B%3@ 3@ 3B 3@ % 3B */ , re"urn0 R_Crear0R_Nu0R31*R_Den0R417 R_Nu0R41*R_Den0R31& R_Den0R31*R_Den0R41 1- . RACIONAL R_ul"i#licacin 0 RACIONAL R3& RACIONAL R41 /* PRE: R3 2 53/63 ' R4254/64 POST: R_adicin 2 2@ % 2B H 2@ % 2B 3@ 3B 3@ % 3B */ , re"urn0 R_Crear0R_Nu0R31*R_Nu0R41& R_Den0R31*R_Den0R41 1- . %ool R_i$ualdad0 RACIONAL R3& RACIONAL R41 /* PRE: R3 2 53/63 ' R4254/64 POST: R_i$ualdad272@%3B H 2B%3@ 8 */ , re"urn0 R_Nu0R31*R_Den0R41 22 R_Nu0R41*R_Den0R311-& . .a implementaci(n de estas operaciones queda transparente de la estructura de datos del T:). .a estructura s(lo es accesible por las primitivas. Geamos la implementaci(n de las primitivas: RACIONAL R_Crear 0in" x& in" '1 /* PRE: '( POST: R_Crear 2 x ' */ , RACIONAL R- i+ 00R20RACIONAL1alloc0si*eo+0STR/CTRAC11182N/LL1. , R9:nu 2 x- R9:den 2 '- . re"urn0R1- . ! void R_Des"ruir 0RACIONAL R1 /* PRE: nin$una POST: Li%era el es#acio ocu#ado #or el racional */ , +ree0R1- . in" R_Nu0RACIONAL R1 /* PRE: nin$una POST: Devuelve el nuerador del racional dado */ , re"urn0R9:nu1- . in" R_Den0RACIONAL R1 /* PRE: nin$una POST: Devuelve el denoinador del racional dado */ , re"urn0R9:den1- . RACIONAL R_Asi$narNu0RACIONAL R& in" *1 /* PRE: nin$una POST: Devuelve el racional odi+icado con * coo nuerador */ , R9:nu 2 *- re"urn0R1- . RACIONAL R_Asi$narDen0RACIONAL R& in" *1 /* PRE: *( POST: Devuelve el racional odi+icado con * coo denoinador */ , R9:den 2 *- re"urn0R1- . >ote que las primitivas accesan los campos del T:) a trav=s del apuntador, por eso es necesario asignar memoria con el constructor y liberarla en el destructor. Ejemplo B: )ise<o del T:) C+>/?>T+ @. Concept%ali&aci'n #el TAD C+>/?>T+ : {e @ , e B ... , e n # donde e i int y n es la cardinalidad del conjunto
B. Concept%ali&aci'n #e las operaciones.
a1 constr%ctor: C_Crear: void CON;/NTO /* PRE: nin$una POST: Crea un con<un"o vac=o */ %1 #estr%ctor: C_Des"ruir: CON;/NTO void /* PRE: Dado un con<un"o POST: Li%era el es#acio ocu#ado #or el con<un"o */ c1 o*serva#ores: C_>acio: CON;/NTO %ool /* PRE: Dado un con<un"o POST: Dice si el con<un"o es vac=o */ C_Per"enece: CON;/NTO x in" %ool /* PRE: Dado un con<un"o ' un eleen"o POST: Dice si el eleen"o es"? en el con<un"o */ C_Eleen"o: CON;/NTO x in" in" /* PRE: Dado un con<un"o no vac=o ' un en"ero i POST: Devuelve el eleen"o i del con<un"o */ C_Cardinalidad: CON;/NTO in" /* PRE: Dado un con<un"o POST: Devuelve la cardinalidad del con<un"o */ d1 +o#i,ica#ores: C_Inser"Ele: CON;/NTO x in" CON;/NTO /* PRE: Dado un con<un"o ' un eleen"o POST: Devuelve el con<un"o con el eleen"o inser"ado Si 'a exis"e no lo inser"a */ C_EliEle: CON;/NTO x in" CON;/NTO /* PRE: Dado un con<un"o ' un eleen"o POST: Devuelve el con<un"o sin el eleen"o dado@ Si el eleen"o no #er"enece al con<un"o no )ace nada */ e1 otras operaciones: C_/nin: CON;/NTO x CON;/NTO CON;/NTO /* PRE: Dados dos con<un"os I POST: Devuelve la unin de ellos */ C_In"erseccin: CON;/NTO x CON;/NTO CON;/NTO /* PRE: Dados dos con<un"os POST: Devuelve la in"erseccin de ellos */ C_I$uales: CON;/NTO x CON;/NTO %ool /* PRE: Dados dos con<un"os POST: Dice si los dos con<un"os son i$uales */ ". I+ple+entaci'n #e la estr%ct%ra #el TAD. Ade+ine !A5 3(( "'#ede+ s"ruc" s_c<"o , in" card- in" eleen"osB!A5C- . STR/CTC;TO- "'#ede+ STR/CTC;TO *CON;/NTO- ". I+ple+entaci'n #e las operaciones #el TAD. )e las primitivas: CON;/NTO C_Crear 01 /* PRE: nin$una POST: C_Crear 2 ,. con<un"o vacion */ , CON;/NTO C- i+ 00C20CON;/NTO1alloc0si*eo+0STR/CTC;TO11182N/LL1. , C9:card 2 (- +or 0in" i2(- iD!A5- i771 , C9:eleen"osBiC 2 (- . . re"urn0C1- . void C_Des"ruir 0CON;/NTO C1 /* PRE: nin$una POST: Li%era el es#acio ocu#ado #or el con<un"o */ , +ree0C1- . J %ool C_>acio0CON;/NTO C1 /* PRE: Con<un"o Creado POST: Dice si el con<un"o es"? vac=o */ , re"urn0C9:card 22 (1- . %ool C_Per"enece0CON;/NTO C& in" e1 /* PRE: Con<un"o Creado POST: Dice si e #er"enece a C*/ , +or 0in" i2(- iDC9:card- i771 , i+ 0C9:eleen"osBiC 22 e1 re"urn0TR/E1- . re"urn0EALSE1- . in" C_Eleen"o0CON;/NTO C&in" i1 /* PRE: Con<un"o Creado ' no vac=o& (D2iDC_Cardinalidad0C1 POST: Devuelve el eleen"o i del con<un"o*/ , re"urn0C9:eleen"oBiC11- . in" C_Cardinalidad0CON;/NTO C1 /* PRE: Con<un"o Creado POST: Devuelve la cardinalidad del con<un"o dado */ , re"urn0C9:card1- . CON;/NTO C_Inser"Ele0CON;/NTO C& in" e1 /* PRE: Con<un"o creado POST: Devuelve el con<un"o con el eleen"o e inser"ado*/ , i+ 08C_Per"enece0C&e11 , C9:eleen"osBC9:cardC 2 e- C9:card77- . re"urn0C1- . K CON;/NTO C_EliEle0CON;/NTO C& in" e1 /* PRE: Con<un"o creado POST: Devuelve el con<un"o eliinando el eleen"o e Si no exis"e no )ace nada*/ , in" i2(- F)ile 0iDC9:Card1 , i+ 0C9:eleen"osBiC 22 e1 , C9:card99- /* Encon"re el eleen"o decreen"o la cardinalidad */ %reaG- . i77- . /* Eliina el eleen"o oviendo "odos a la #osicin an"erior */ F)ile 0iDC9:Card1 C9:eleen"oBiC 2 C9:eleen"oBi73C- re"urn0C1- . CON;/NTO C_unin0 CON;/NTO C3& CON;/NTO C41 /* PRE: Dados dos con<un"os creados POST: C_unin 2 C3 C4 & C3&C4 Huedan des"ruidos */ , CON;/NTO /- in" e- /2 C_Crear01- F)ile 08C_>acio0C311 , e 2 C_eleen"o0C31- / 2 C_Inser"Ele0/&e1- C3 2 C_EliEle0C3&e1- . F)ile 08C_>acio0C411 , e 2 C_eleen"o0C41- / 2 C_Inser"Ele0/&e1- C4 2 C_EliEle0C4&e1- . re"urn0/1- . @F CON;/NTO C_in"erseccin0CON;/NTO C3& CON;/NTO C41 /* PRE: Dados dos con<un"os creados POST: C_in"erseccin 2 C3 C4 & C3 Hueda des"ruido */ , CON;/NTO I- in" e- I2 C_Crear01- F)ile 08C_>acio0C311 , e 2 C_eleen"o0C31- i+ 0C_Per"enece 0C4&e11 I 2 C_Inser"Ele0I&e1- C3 2 C_EliEle0C3&e1- . re"urn0I1- . %ool C_I$uales0CON;/NTO C3& CON;/NTO C41 /* PRE: Dados dos con<un"os creados POST: C_I$uales20C3 HCB 8, C@ queda destruido */ , i+ 0C39:card 82 C49:card1 re"urn0EALSE1-