You are on page 1of 4

Dpto.

Lenguajes y Ciencias de la Computacin

Ingeniera Tcnica en Informtica

Prctica 8. TAD rbol binario de bsqueda


Objetivos. Se trata de construir el TAD rbol binario de bsqueda y escribir una aplicacin para obtener el listado de identificadores de un programa Modula-2. Enunciado. Construir el TAD ARBOL segn el siguiente mdulo de definicin:
DEFINITION MODULE Arbol; FROM TadItem IMPORT ITEM; TYPE ARBOL; TIPO_ERROR = <<a definir>>; PROCEDURE Error(): TIPO_ERROR; PROCEDURE Crear(): ARBOL; PROCEDURE Destruir(VAR a: ARBOL); PROCEDURE EsVacio(a: ARBOL): BOOLEAN; PROCEDURE Esta(a: ARBOL; x: ITEM):BOOLEAN; (* pre: NOT EsVacio(a) *) PROCEDURE Raiz(a: ARBOL): ITEM; (* pre: NOT EsVacio(a) *) PROCEDURE Izquierdo(a: ARBOL): ARBOL; (* pre: NOT EsVacio(a) *) PROCEDURE Derecho(a: ARBOL): ARBOL; (* pre: NOT Esta(a, x) *) PROCEDURE Insertar(VAR a: ARBOL;x: ITEM); (* pre: Esta(a, x) *) PROCEDURE Borrar(VAR a: ARBOL;x: ITEM); PROCEDURE Copiar(VAR a1:ARBOL; a2:ARBOL); END Arbol.

El TAD ARBOL se representar internamente mediante la siguiente estructura de datos:


TYPE ARBOL = POINTER TO NODO; NODO = RECORD cont : ITEM; izq,dch: ARBOL END;

Para implementar el TAD ARBOL de forma genrica, el mdulo TadItem debe exportar una operacin que nos permita comparar dos datos de tipo ITEM. As, adems del procedimiento ValorPorDefecto, incluiremos en el mdulo de definicin de TadItem el procedimiento
PROCEDURE Comparar(a, b: ITEM): INTEGER;

que devuelve -1 si a es menor que b, 0 si a es igual a b, y 1 si a es mayor que b.

Laboratorio de Programacin III. 2.000/2.001

36

Dpto. Lenguajes y Ciencias de la Computacin

Ingeniera Tcnica en Informtica

Aplicacin: Listado de identificadores para Modula-2. Como aplicacin, se trata de escribir un programa que lea un programa en Modula-2 y genere como resultado un listado en el que aparezcan en orden alfabtico los identificadores definidos por el usuario. Un identificador es una cadena de caracteres que comienza por una letra y est compuesta por letras, dgitos y el carcter de subrayado. Se debe tener especial cuidado en no contabilizar como identificadores las cadenas contenidas dentro de un comentario o un literal de cadena; aunque en un primer prototipo este detalle se puede ignorar. Lectura del cdigo fuente Para la lectura del cdigo fuente, implementaremos una librera LexMod2 segn el siguiente mdulo de definicin:
DEFINITION MODULE LexMod2; PROCEDURE Abrir(VAR nombre: ARRAY OF CHAR); PROCEDURE Cerrar; PROCEDURE SigIdent(VAR id: ARRAY OF CHAR); END LexMod2.

En el mdulo de implementacin tendremos una variable encapsulada de tipo File, sobre la que se efectuarn las operaciones de lectura. Esta forma de abstraccin se denomina encapsulado de datos: se oculta la definicin de un dato (en nuestro caso, la variable de tipo File) y se interacta con l a travs de una interfaz. La variable de error del TAD es otro ejemplo de encapsulado de datos. El procedimiento Abrir abre el fichero nombre que contiene el programa Modula2 a procesar, mientras que el procedimiento Cerrar cierra este fichero. El procedimiento SigIdent devuelve en id el siguiente identificador que aparece en el programa. Para ello, el procedimiento SigIdent va leyendo el fichero nombre carcter a carcter, agrupndolos hasta formar un elemento lexicogrfico de Modula-2. Los elementos lexicogrficos de Modula-2 pueden ser identificadores, constantes literales (enteros, reales, caracteres y cadenas), comentarios o smbolos. En general, puede saberse qu tipo de elemento lexicogrfico estamos leyendo al encontrar su primer carcter: los nmeros empiezan por un dgito, las cadenas por comillas simples o dobles, etc. Si el elemento lexicogrfico no es un identificador, se descarta y se contina leyendo el fichero. Por el contrario, si el elemento lexicogrfico es un identificador, se devuelve en el parmetro id. Por ejemplo, las primeras llamadas aplicadas al fichero LEXMOD2.DEF devolvern DEFINITION, MODULE, LexMod2, PROCEDURE , Abrir, VAR, nombre, ARRAY.... El fin de fichero se sealar devolviendo en id la cadena vaca. Generacin del listado de identificadores Para generar el listado de identificadores, se utilizar el TAD ARBOL empleando el siguiente tipo ITEM:
CONST MAX_IDENTIFICADOR= <<a definir>>; TYPE ITEM= ARRAY [1..MAX_IDENTIFICADOR] OF CHAR;

Antes de incluir un identificador en el ARBOL se debe comprobar que no sea una palabra reservada de Modula-2 (en el listado slo deben aparecer los identificadores definidos por el usuario). Si se trata de la primera aparicin del identificador, se inserta en el ARBOL.

Laboratorio de Programacin III. 2.000/2.001

37

Dpto. Lenguajes y Ciencias de la Computacin

Ingeniera Tcnica en Informtica

Impresin del listado de identificadores Para imprimir el listado, basta efectuar un recorrido inorden del ARBOL. Prctica Suplementaria Un rbol TRIE es un rbol general, es decir, cada nodo puede tener un nmero diferente de hijos, que es muy apropiado para representar diccionarios de palabras. Las palabras vienen representadas por caminos dentro del rbol. Para evitar tomar como palabra independiente las primeras letras de otra palabra, se aade un campo especial de final de palabra (FDP). As podemos distinguir si, por ejemplo, DAD es parte de DADO o es una palabra por s solo.
ATRIE

... D

...

...

FDP F

... D

... O

... Z

FDP F

... D

... O

... Z

FDP F

... D

... R

...

FDP F

... D

... L

...

FDP F

... D

... O

...

FDP F

... D

...

...

FDP V

... D

... O

...

FDP V

... D

...

...

FDP V

Este TRIE contiene las palabras: DADO, DAR y SOL.


(* Devuelve un rbol de tipo ATRIE vaca *) PROCEDURE Crear (): ATRIE; (* Inserta una palabra en el rbol trie. Si ya est no se hace nada. *) PROCEDURE Insertar(VAR a: ATRIE; s: ARRAY OF CHAR); (* Elimina una palabra en el rbol trie. Si no est no se hace nada. *) PROCEDURE Eliminar(VAR a: ATRIE; s: ARRAY OF CHAR); (* Devuelve TRUE si la palabra est en el rbol, FALSE en caso contrario *) PROCEDURE Est( a: ATRIE; s: ARRAY OF CHAR): BOOLEAN; (* Devuelve TRUE si el rbol no tiene elementos. FALSE en caso contrario *) PROCEDURE EsVaco(a: ATRIE): BOOOLEAN; (* Devuelve la palabra anterior en el rbol. Si la palabra que se pasa de parmetro es la primera, se devuelve ella misma. *) PROCEDURE Anterior(a: ATRIE; p: ARRAY OF CHAR; VAR ant: ARRAY OF CHAR);

Laboratorio de Programacin III. 2.000/2.001

38

Dpto. Lenguajes y Ciencias de la Computacin

Ingeniera Tcnica en Informtica

(* Devuelve la palabra siguiente en el rbol. Si la palabra que se pasa de parmetro es la ltima, se devuelve ella misma.*) PROCEDURE Siguiente(a: ATRIE; p: ARRAY OF CHAR; VAR sig: ARRAY OF CHAR); (* Libera toda la memoria ocupada por el rbol *) PROCEDURE Destruir(VAR a: ATRIE); (* Lista por pantalla todos las palabras contenidas en el rbol *) PROCEDURE Listar(a: ATRIE);

Laboratorio de Programacin III. 2.000/2.001

39

You might also like