Documente Academic
Documente Profesional
Documente Cultură
Enteros, reales, booleanos, caracteres Enumerados, subrango Son opacos Riesgo de crear valores sin semntica Tipos de datos creados por el programador, que deben ser opacos
Coleccin de valores + operaciones Se definen mediante una especificacin, que es independiente de cualquier representacin (abstraccin) Acceso a los valores limitado al uso de las operaciones (interfaz con el usuario limitada) Establecida la interfaz, el programador elige la representacin adecuada (implementacin) Los usuarios del TDA slo conocen su nombre y la especificacin de las operaciones Cambios en la representacin no afectarn al resto de programas
El lenguaje de programacin trata a los TDAs de igual forma que a sus propios tipos de datos, es decir, como tipos opacos:
Para que esto sea posible, la implementacin deber realizarse en un mbito de declaracin inaccesible al resto de los programas
El conjunto de operaciones ha de permitir generar cualquier valor del tipo Existen dos piezas de documentacin bien diferenciadas:
Especificacin del TDA. Es lo nico que conoce el usuario del TDA. Consiste en el nombre del TDA y la especificacin de las operaciones. Tienen parte sintctica y parte semntica Implementacin del TDA. Conocida slo por el programador del TDA. Se realiza en un lenguaje de programacin concreto. Consiste en la representacin del tipo y en la realizacin de las operaciones
Se destacan los detalles (normalmente pocos) del comportamiento observable del tipo, que es estable. Se ocultan los detalles (normalmente numerosos) de la implementacin, que es propensa a cambios.
Cambian su valor pero no su estructura espacio de almacenamiento constante Enteros, reales, booleanos, carcter, enumerado, subrango, etc. Cambian su valor y estructura (colecciones de elementos de nmero variable) espacio de almacenamiento variable Listas, colas, pilas, rboles, grafos, conjuntos, etc.
Sus casos no pueden modificarse (se crean y destruyen, pero no existen operaciones de modificacin) Representacin inmutable o mutable Sus casos pueden modificarse (existen operaciones de modificacin) Representacin mutable
Usuario
Especificacin
Implementador
Representacin elegida
Especificaciones informales:
Predomina el lenguaje natural Poco precisas y breves ambigedad Sencillas de escribir, leer y entender Lenguaje algebraico verificacin formal de programas Precisas y breves Pueden resultar ms complejas de escribir, leer y entender
Especificaciones formales:
Cabecera: Aparece el nombre de las operaciones. Descripcin: Se describe de forma general en qu consiste la abstraccin, sin decir nada acerca de la implementacin. Los casos del TDA pueden describirse en trminos de otros tipos para los cuales se espera que el lector de la especificacin est ms familiarizado. Se pueden utilizar grficos y abstracciones matemticas. Se puede incluir en la descripcin si el TDA es mutable o inmutable Especificacin de las operaciones: Para la especificacin de una abstraccin operacional seguiremos el siguiente modelo:
nombre de la operacin (entrada) devuelve (salida)
requerimientos: Esta clusula muestra las restricciones de uso modifica: Esta clusula identifica las entradas que van a ser modificadas efecto: Esta clusula define el comportamiento
Requerimientos: Restringen el dominio del procedimiento o funcin. Cuando introducimos requerimientos, obtenemos una abstraccin operacional parcial (en caso contario se dice que la abstraccin es total). El que use la abstraccin es el responsable de que los requerimientos se cumplan; si estos no se cumplen, los resultados pueden ser impredecibles. Si la abstraccin es total, la clusula de requerimientos puede omitirse. Se supone como requerimiento implcito (y por tanto no tiene que ser explicitado en la clusula de requerimientos) que las entradas que figuran en la lista de parmetros de la abstraccin han sido correctamente construidas mediante algn constructor del tipo Modifica: Indica los argumentos de entrada que cambian de valor tras una llamada a la abstraccin operacional Efecto: Se indica el efecto que se produce al ejecutar la operacin para las entradas que cumplen los requerimientos. Debe definir qu salidas son producidas y tambin qu modificaciones son hechas en la lista de entradas de la clusula modifica. La clusula efecto se escribe bajo la asumpcin de que se satisface la clusula requerimientos, y no se dice nada sobre el efecto de la abstraccin cuando dicha clusula no se satisface
El usuario de la abstraccin es el responsable de que se cumplan los requerimientos Implementaciones robustas: se autoprotegen frente a valores inconsistentes Mecanismos de proteccin frente a errores:
Puesto que las especificaciones son independientes de las implementaciones, existen requerimientos de uso (informacin adicional de cara al usuario)
Racional = tipo de datos es crea, num, den, suma, resta, multiplica, divide, simplifica DESCRIPCIN: Los valores del TDA racional son nmeros racionales. El TDA Racional es inmutable. OPERACIONES:
crea(a,b:entero) devuelve (Racional) requerimientos: b<>0. efecto: Devuelve un nmero racional cuyo numerador es a y cuyo denominador es b. num(a:Racional) devuelve (entero) efecto: Devuelve el numerador del nmero racional a. den(a:Racional) devuelve (entero) efecto: Devuelve el denominador del nmero racional a. suma(a,b:Racional) devuelve (Racional) efecto: Devuelve un nmero racional que es la suma de los nmeros racionales a y b. resta(a,b:Racional) devuelve (Racional) efecto: Devuelve un nmero racional que es la resta de los nmeros racionales a y b. multiplica(a,b:Racional) devuelve (Racional) efecto: Devuelve un nmero racional que es la multiplicacin de los nmeros racionales a y b. divide(a,b:Racional) devuelve (Racional) efecto: Devuelve un nmero racional que es la divisin de los nmeros racionales a y b. simplifica(a:Racional) devuelve (Racional) efecto: Devuelve un nmero racional que es la simplificacin del nmero racional a.
No se definen reglas semnticas (se consideran axiomas) para ciertas funciones, como son algunas funciones constructoras o las funciones destructoras. La expresin del resultado puede ser recursiva, conteniendo referencias a la misma funcin o a otras del TDA. Las expresiones pueden contener referencias a otros tipos que consideramos predefinidos. En particular es importante considerar como predefinido el tipo booleano, con los valores cierto y falso, o el valor predefinido error, para indicar los valores de los argumentos en los que ciertas funciones parciales no estn definidas. Cualquier implementacin del TDA deber cumplir las condiciones impuestas por la semntica. Las reglas han de intentar aplicarse en el orden indicado para la verificacin formal de programas.
Otra ampliacin de la notacin es permitir la definicin de TDA's genricos, que se expresan en base a otro u otros tipos sin especificar exactamente cules son.
esvacia(bolsavacia) cierto esvacia(poner(b,e)) falso cuantos(bolsavacia,e) cero cuantos(poner(b,f),e) si f=e sucesor(cuantos(b,e)) | cuantos(b,e)
Principales tcnicas de implementacin de TDAs Realizacin de dichas tcnicas mediante un lenguaje orientado a objetos, en concreto Java.
Diseado desde el principio como un lenguaje orientado a objetos. Integracin en el mbito de las telecomunicaciones, en concreto, internet. Lenguaje de gran actualidad e inters.
Objeto instanciado
Vehiculo
Motocicleta
Coche
Motocicleta Compacto
Coche
Monovolumen
Constructores sobrecargados
requiera el programa. Clasificar dichas propiedades y mtodos dentro de clases. Examinar las clases para ver las posibles relaciones de herencia. Establecer los mtodos necesarios para realizar la interface entre las diversas clases. Comprobar que dentro de la estructura de clases todo encaja. Realizar un buen diseo supone: Ahorro e tiempo y esfuerzo en la fase de programar Cdigo resultante de mayor calidad: ms fcil de depurar y mantener
Implementaciones estticas asignacin de memoria en tiempo de compilacin Implementaciones dinmicas asignacin de memoria en tiempo de ejecucin
Variables dinmicas:
Variables cuyo espacio de almacenamiento requerido se asigna en tiempo de ejecucin Se accede a ellas por medio de apuntadores Podemos crear variables dinmicas asignndoles memoria Podemos destruir variables dinmicas liberando memoria Se alojan en el segmento montn (heap)
Un Objeto es internamente un apuntador a los datos que lo componen. Cuando se crea un objeto mediante su constructor, la reserva de memoria se hace de forma dinmica. La liberacin de memoria se realiza mediante el destructor del objeto; en Java esto se realiza de forma automtica mediante el Garbaje Collector.
El uso de objetos abstrae al programador del manejo directo de apuntadores y ofrece mecanismos para conseguir privacidad y proteccin.
public interface Comparable { public boolean mayorQue(Object elemento); public boolean mayorIgualQue(Object elemento); public boolean menorQue(Object elemento); public boolean menorIgualQue(Object elemento); } // fin interface Comparable
Interface Valuable
Java posee un mecanismo propio para el manejo de errores mediante excepciones Cuando va a producirse una situacin de error, sta se traduce una excepcin. Por ejemplo, para la segunda definicin de la clase Estructura vista en la seccin anterior, el acceso a los datos del array debe hacerse mediante mtodos de interface, y dentro de estos mtodos, el acceso a una posicion no correcta puede traducirse en una excepcin
public class Estructura { private Object dato[]; private int longitud; public Estructura(int n) throws LongitudNoValidaException { if (n<0) throw new LongitudNoValidaException("Longitud no vlida. Debe ser positiva"); longitud = n; dato = new Object[n]; }
Para terminar este captulo mostraremos la implementacin en Java de los TDAs racional y bolsa. El TDA racional es un TDA simple que se ha definido como inmutable. El TDA bolsa es un TDA contenedor que se ha definido como mutable y se ha implementado utilizando representacin enlazada. Para el TDA racional se ha incluido manejo de excepciones, as como las operaciones toString, equals y clone. En el caso del TDA bolsa no se ha incluido manejo de excepciones porque no se ha contemplado ninguna situacin de error.
public boolean esVacia() { return (inicio==null); } public int cuantos(Object elemento) { Celda aux = inicio; int cont = 0; while (aux!=null) { if (elemento.equals(aux.dato)) cont++; aux = aux.siguiente; } return cont; } } // fin class Bolsa