Tdas

También podría gustarte

Está en la página 1de 68

Captulo 1.

Tipos de Datos Abstractos y


Programacin Orientada a Objetos
1.1 Concepto de Tipo de Datos Abstracto.
1.2 Clasificacin de Tipos de Datos Abstractos.
1.3 Especificacin de Tipos de Datos Abstractos.
1.3.1 Especificaciones informales.
1.3.2 Especificaciones formales.
1.4 Programacin Orientada a Objetos
1.4.1 Clases y Objetos.
1.4.2 Propiedades y Mtodos.
1.4.3 Herencia y Polimorfismo.
1.4.4 Pautas generales en diseo orientado a objetos.
1.4.5 Tcnicas de implementacin
1.4.5.1 Implementaciones estticas y dinmicas.
1.4.5.2 Representaciones contiguas y enlazadas.
1.4.6 Utilizacin correcta de objetos.
1.4.6.1 Privacidad de los objetos.
1.4.6.2 Previniendo efectos laterales.
1.4.6.3 Comparacin de objetos.
1.4.6.4 Tratamiento de excepciones.
1.4.7 Ejemplos en Java.
1.1 Concepto y terminologa

Tipos de Datos coleccin de valores + operaciones


Enteros, reales, booleanos, caracteres
Enumerados, subrango
Son opacos
Tipos Estructurados genericidad
Riesgo de crear valores sin semntica
Tipos de Datos Abstractos (TDA)
Tipos de datos creados por el programador, que deben ser
opacos
1.1 Concepto y terminologa

Tipos de Datos Abstractos:


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
1.1 Concepto y terminologa

Tipos de Datos Abstractos:


El lenguaje de programacin trata a los TDAs de igual
forma que a sus propios tipos de datos, es decir, como
tipos opacos:
Privacidad de la representacin
Proteccin
Para que esto sea posible, la implementacin deber
realizarse en un mbito de declaracin inaccesible al
resto de los programas
1.1 Concepto y terminologa

Tipos de Datos Abstractos:


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
1.1 Concepto y terminologa

Tipos de datos abstractos:


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.
1.2 Clasificacin de Tipos de Datos Abstractos

Tipos de Datos Abstractos simples:


Cambian su valor pero no su estructura espacio de
almacenamiento constante
Enteros, reales, booleanos, carcter, enumerado, subrango,
etc.
Tipos de Datos Abstractos contenedores:
Cambian su valor y estructura (colecciones de elementos
de nmero variable) espacio de almacenamiento
variable
Listas, colas, pilas, rboles, grafos, conjuntos, etc.
1.2 Clasificacin de Tipos de Datos Abstractos

Tipos de datos abstractos inmutables:


Sus casos no pueden modificarse (se crean y destruyen,
pero no existen operaciones de modificacin)
Representacin inmutable o mutable
Tipos de datos abstractos mutables:
Sus casos pueden modificarse (existen operaciones de
modificacin)
Representacin mutable
1.3 Especificacin de Tipos de Datos Abstractos

TDA Coleccin de valores + Operaciones

Usuario Especificacin Implementador

Implementacin Representacin Representacin


+
del TDA elegida de las operaciones
1.3 Especificacin de Tipos de Datos Abstractos

Especificaciones informales:
Predomina el lenguaje natural
Poco precisas y breves ambigedad
Sencillas de escribir, leer y entender
Especificaciones formales:
Lenguaje algebraico verificacin formal de programas
Precisas y breves
Pueden resultar ms complejas de escribir, leer y entender
1.3.1 Especificaciones informales

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
1.3.1 Especificaciones informales
Observamos los siguientes componentes:
Cabecera: Es la informacin sintctica. Se indica el nombre de la operacin y el
nmero, orden y tipos de sus entradas y salidas. Deben darse nombres para las
entradas y pueden darse para las salidas
Cuerpo: Es la informacin semntica. Consta de las siguientes clusulas:
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
1.3 Especificacin de Tipos de Datos Abstractos

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:
Manejo de excepciones
Parmetros de salida de error en cada operacin
Puesto que las especificaciones son independientes
de las implementaciones, existen requerimientos de
uso (informacin adicional de cara al usuario)
1.3.1 Especificaciones informales
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.
1.3.2 Especificaciones formales

Tipo: Nombre del TDA

Sintasis: Forma de las operaciones


nombre de la funcin (tipo de los argumentos) tipo del resultado

Semntica: Significado de las operaciones


nombre de la funcin (valores particulares) expresin del resultado
1.3.2 Especificaciones formales
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.
1.3.2 Especificaciones formales
Para facilitar la escritura de las expresiones en la parte de
semntica, se permite emplear expresiones condicionales, que
adoptan la forma:

si condicin valor si cierto | valor si falso

La condicin ser una expresin que toma un valor booleano.


Se considera como predefinida la comparacin de igualdad
entre valores del mismo tipo, escrita como valor1 = valor2.

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.
1.3.2 Especificaciones formales

Tipo Bolsa (Elemento)


Sintaxis
bolsavacia Bolsa
poner(Bolsa,Elemento) Bolsa
esvacia(Bolsa) booleano
cuantos(Bolsa,Elemento) natural
Semntica b Bolsa, e,f Elemento:
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)
1.4 Programacin Orientada a
Objetos

Caractersticas de la OO:
Herencia
Polimorfismo
Objetivos conseguidos:
Estructuracin
Encapsulacin
1.4 Programacin Orientada a
Objetos

Conceptos de la OO:
Clase
Objeto
Propiedad
Mtodo
Herencia
Polimorfismo
1.4 Programacin Orientada a
Objetos

Estudiaremos:
Principales tcnicas de implementacin
de TDAs
Realizacin de dichas tcnicas
mediante un lenguaje orientado a
objetos, en concreto Java.
1.4 Programacin Orientada a
Objetos

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.
1.4.1 Clases y Objetos

Clase: Tipo de datos definido por el


usuario.

Objeto: Es un dato del tipo definido por


su clase, es decir, es una instancia
especfica de su clase.
1.4.1 Clases y Objetos

Fases de la vida de un objeto:


Creacin del Objeto: declaracin + instanciacin
Objeto instanciado
Destruccin del Objeto

Creacin del Objeto: Destruccin del Objeto:


Objeto instanciado
Constructor Destructor
1.4.1 Clases y Objetos

Declaracin de una clase en Java:


Class <nombre_de_la_clase> { }

Declaracin de un Objeto:
<nombre_de_la_clase> <nombre_del_objeto>

Instanciacin de un Objeto: mediante la palabra clave new

Ejemplo:
Class Vehiculo{ }

Vehiculo miVehiculo;
miVechiculo = new Vehiculo();

O en una sola lnea:


Vehiculo miVehiculo = new Vehiculo();
1.4.2 Propiedades y Mtodos

Campos de datos dentro de una clase: variables miembros o


propiedades de la clase.

Operaciones con los datos de una clase: funciones miembros o


mtodos de la clase.

Los miembros de una clase (propiedades y mtodos) pueden ser:


-Pblicos; se puede acceder a ellos desde fuera de la clase
-Privados; slo se puede acceder a ellos desde dentro de la clase

Para acceder a propiedades privadas de la clase se definen mtodos


de acceso.

Un miembro puede ser esttico, si pertenece a la clase en s y no a los


objetos de la clase.
1.4.2 Propiedades y Mtodos

Definicin en Java de una clase con sus propiedades y mtodos:

<modificador> class <nombre_de_la_clase> {


private <tipo_de_dato> <nombre_del_dato>;
public <nombre_de_la_clase> (<lista_de_argumentos>) {
<codigo_del_metodo_constructor>
}
public <tipo_de_dato_devuelto> <nombre_del_metodo>
(<lista_de_argumentos>) {
<codigo_del_metodo>
}
}
1.4.2 Propiedades y Mtodos

Palabras clave para restringir el acceso a los


miembros de una clase:
- public
- private
- protected

Miembro esttico: static


1.4.2 Propiedades y Mtodos
public class Vehiculo {
private int numeroRuedas;
private double velocidadMaxima;
public String nombrePropietario;
static private String nombreFabrica = "SEAT";
public Vehiculo(int nRuedas) {
if (nRuedas<0) numeroRuedas=0;
else numeroRuedas = nRuedas;
}
public void estableceVelocidadMaxima(double vMaxima) {
if (vMaxima<0) velocidadMaxima=0.0;
else velocidadMaxima = vMaxima;
}
public double recuperaVelocidadMaxima() {
return velocidadMaxima;
}
static public String recuperaNombreFabrica() {
return nombreFabrica;
}
}
1.4.2 Propiedades y Mtodos

Declaracin e instanciacin de un objeto:


Vehiculo miVehiculo = new Vehiculo(4);

Acceso a un dato publico:


miVehiculo.nombrePropietario = Cipriano Lpez;
String nombre = miVehiculo.nombrePropietario;

Acceso a un dato privado:


miVehiculo.estableceVelocidadMaxima(200.0);
Double velocidad =
miVehiculo.recuperaVelocidadMaxima();

Acceso a un dato esttico:


String nombre = Vehiculo.recuperaNombreFabrica();
1.4.3 Herencia y Polimorfismo

La herencia permite la reutilizacin de cdigo.


Las clases Motocicleta y Coche son subclases de Vehiculo,
mientras que Vehiculo es la superclase de Motocicleta y
Coche.
Las clases Motocicleta y Coche heredan de la clase Vehiculo
todas sus variables y mtodos miembros.

Vehiculo

Motocicleta Coche
1.4.3 Herencia y Polimorfismo

Herencia multinivel
Vehiculo

Motocicleta Coche

Compacto Monovolumen
1.4.3 Herencia y Polimorfismo

Conceptos de Polimorfismo:

-Sobreescritura: reemplazar los mtodos de


la superclase en las subclases.

-Sobrecarga: varios mtodos se llaman


igual, pero difieren en el nmero, tipo u
orden de sus argumentos.
1.4.3 Herencia y Polimorfismo

Declaracin de subclases en Java


public class Motocicleta extends Vehiculo {
public Motocicleta() {
super(2);
}
}
1.4.3 Herencia y Polimorfismo
public class Coche extends Vehiculo {
private int numeroPuertas;
public Coche(int nPuertas) {
super(4);
numeroPuertas = nPuertas;
}
public Coche() {
super(4);
numeroPuertas = 4;
}
public int recuperaNumeroPuertas() {
return numeroPuertas;
}
}
Constructores sobrecargados
Coche miCoche = new Coche(5);
Coche miCoche = new Coche();
1.4.3 Herencia y Polimorfismo
public class Monovolumen extends Coche {
public Monovolumen() {
super(5);
}
}

public class Compacto extends Coche {


public Compacto() {
super(2);
}
}
1.4.4 Pautas generales en diseo orientado a objetos

Hacer una lista de todas las propiedades y mtodos que


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
1.4.5 Tcnicas de implementacin

Implementaciones estticas y dinmicas

Representaciones contiguas y enlazadas


1.4.5.1 Implementaciones estticas y
dinmicas
Implementaciones estticas asignacin
de memoria en tiempo de compilacin

Implementaciones dinmicas asignacin


de memoria en tiempo de ejecucin
1.4.5.1 Implementaciones stticas y
dinmicas

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)
1.4.5.1 Implementaciones stticas y
dinmicas

En Programacin Orientada a Objetos:


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.
1.4.5.2 Representaciones contiguas y
enlazadas

En la representacin de TDAs formados por colecciones


de elementos, nos encontramos las siguientes
situaciones:
1. La cantidad de elementos de los casos del TDA es
fija y conocida a priori (en tiempo de compilacin)
2. La cantidad de elementos de los casos del TDA es
fija, pero se conoce en tiempo de ejecucin
3. La cantidad de elementos de los casos del TDA es
variable en tiempo de ejecucin
1.4.5.2 Representaciones contiguas y
enlazadas
Ante la situacin (1) probablemente la mejor opcin es
representar los casos del TDA mediante un array.
public class Estructura {
public Object dato[];
static private int longitud = 10;
public Estructura() {
dato = new Object[longitud];
}
// resto de mtodos de la clase
} // fin class Estructura

Estructura estructura;
estructura = new Estructura();

estructura.dato[i]=x;
y=estructura.dato[i];
1.4.5.2 Representaciones contiguas y
enlazadas
Para la situacin (2), Java permite la siguiente forma de
representacin contigua:

public class Estructura {


public Object dato[];
private int longitud;
public Estructura(int n) {
longitud = n;
dato = new Object[n];
}
// resto de mtodos de la clase
} // fin class Estructura

Estructura estructura;
estructura = new Estructura(10);
1.4.5.2 Representaciones contiguas y
enlazadas
Para la situacin (3) disponemos de varias alternativas. Si sabemos en
tiempo de compilacin el nmero aproximado de elementos, se puede
establecer una cantidad mxima maxLongitud de elementos que
podrn contener los casos del TDA

public class Estructura {


public Object dato[];
static private int maxLongitud = 100;
private int longitud = 0;
public Estructura() {
dato = new Object[maxLongitud];
}
// resto de mtodos de la clase
} // fin class Estructura
1.4.5.2 Representaciones contiguas y
enlazadas
Cuando en tiempo de compilacin no sabemos ni siquiera de
forma aproximada el nmero de elementos es conveniente
utilizar una representacin enlazada:

public class Estructura {


class Celda {
Object dato;
Celda siguiente;
}
private Celda inicio;
// mtodos de la clase Estructura
} // fin class Estructura
1.4.6 Utilizacin correcta de objetos

Privacidad de los objetos


Prevencin de efectos laterales
Comparacin de objetos
Tratamiento de excepciones
1.4.6.1 Privacidad de los Objetos

Declarar los campos de los objetos como privados


Ofrecer mtodos pblicos para su acceso
public class Elemento {
private int dato;
public Elemento(int valor) {
dato = valor;
}
public int valor() {
return dato;
}
} // fin class Elemento

Elemento elemento = new Elemento(10);


int n = elemento.valor();
1.4.6.2 Previniendo efectos laterales

Utilizacin del mtodo clone


public class Elemento implements Cloneable {
private int dato;
public Elemento(int valor) {
dato = valor;
}
public Object clone() {
return new Elemento(dato);
}
} // fin class Elemento

elemento1 = (Elemento)elemento2.clone();
1.4.6.3 Comparacin de objetos

Utilizacin del mtodo equals


public class Elemento {
private int dato;
public Elemento(int valor) {
dato = valor;
}
public Object clone() {
return new Elemento(dato);
}
public boolean equals(Object elemento) {
if (elemento==null) return false;
Elemento e = (Elemento)elemento;
return (dato==e.dato);
}
} // fin class Elemento
if (elemento1.equals(elemento2)) {
// cuerpo de la sentencia condicional
}
1.4.6.3 Comparacin de objetos

Utilizacin del mtodo toString


public class Elemento {
private int dato;
public Elemento(int valor) {
dato = valor;
}
public Object clone() {
return new Elemento(dato);
}
public boolean equals(Object elemento) {
if (elemento==null) return false;
Elemento e = (Elemento)elemento;
return (dato==e.dato);
}
public toString(){
return ""+dato;
}
} // fin class Elemento
System.out.println(elemento);
1.4.6.3 Comparacin de objetos

import java.io.*;
public class Util {
static public int leeEntero() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int i = Integer.valueOf(br.readLine().trim()).intValue();
return i;
}
static public double leeDoble() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double d = Double.valueOf(br.readLine().trim()).doubleValue();
return d;
}
static public String leeString() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
return s;
}
}
1.4.6.3 Comparacin de objetos

Interface Comparable
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
public interface Valuable {
public int valor();
} // fin interface Valuable
1.4.6.3 Comparacin de objetos

public class Elemento implements Cloneable,


Comparable, Valuable {
private int dato;
public Elemento(int valor) {
dato = valor;
}
public int valor() {
return dato;
}

public Object clone() {


return new Elemento(dato);
}
1.4.6.3 Comparacin de objetos

public boolean equals(Object elemento) {


if (elemento==null) return false;
Elemento e = (Elemento)elemento;
return (dato==e.dato);
}
public toString() {
return ""+dato;
}
public boolean mayorQue(Object elemento) {
Elemento e = (Elemento)elemento;
return (dato>e.dato);
}
1.4.6.3 Comparacin de objetos

public boolean mayorIgualQue(Object elemento) {


Elemento e = (Elemento)elemento;
return (dato>=e.dato);
}
public boolean menorQue(Object elemento) {
Elemento e = (Elemento)elemento;
return (dato<e.dato);
}
public boolean menorIgualQue(Object elemento) {
Elemento e = (Elemento)elemento;
return (dato<=e.dato);
}
} // fin class Elemento
1.4.6.4 Tratamiento de excepciones

- 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];
}
1.4.6.4 Tratamiento de excepciones

public Object recuperaDato(int i) throws IndiceNoValidoException {


if ((i<0)||(i>=longitud)) throw new IndiceNoValidoException("Indice
no vlido. Debe estar entre 0 y "+longitud-1);
return dato[i];
}
public void estableceDato(int i, Object valor)
throws IndiceNoValidoException {
if ((i<0)||(i>=longitud)) throw new IndiceNoValidoException("Indice
no vlido. Debe estar entre 0 y "+longitud-1);
dato[i] = valor;
}
} // fin class Estructura
1.4.6.4 Tratamiento de excepciones

Podemos crear nuevas excepciones como clases


que heredan de la clase Exception
public class LongitudNoValidaException extends Exception {
public LongitudNoValidaException() { super(); };
public LongitudNoValidaException(String s) { super(s);
};
}
public class IndiceNoValidoException extends Exception {
public IndiceNoValidoException() { super(); };
public IndiceNoValidoException(String s) { super(s);
};
}
1.4.6.4 Tratamiento de excepciones

Para utilizar las llamadas a mtodos con


excepciones, se deben manejar dichas
excepciones mediante bloques try catch
try {
Estructura estructura = new Estructura(10);
estructura.estableceDato(0,elemento);
elemento = estructura.recuperaDato(0);
} catch (LongitudNoValidaException e) {
System.err.println(e);
} catch (IndiceNoValidoException e) {
System.err.println(e);
}
1.4.7 Ejemplos en Java

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.
1.4.7 Ejemplos en Java

public class Racional implements Cloneable {


private int num, den;
public Racional(int n, int d) {
if (d==0) throw new DenominadorCeroException("El
denominador no puede ser cero");
num = n;
den = d;
}
static private int mcd(int m, int n) {
int t;
while(m>0) {
t=m;
m=n%m;
n=t;
}
return n;
}
1.4.7 Ejemplos en Java

public int numerador() {


return num;
}
public int denominador() {
return den;
}
static public Racional suma(Racional a, Racional b) {
int n = (a.num*b.den)+(b.num*a.den);
int d = a.den*b.den;
return new Racional(n,d);
}
static public Racional resta(Racional a, Racional b) {
int n = (a.num*b.den)-(b.num*a.den);
int d = a.den*b.den;
return new Racional(n,d);
}
1.4.7 Ejemplos en Java

static public Racional multiplica(Racional a, Racional b)


{
int n = a.num*b.num;
int d = a.den*b.den;
return new Racional(n,d);
}
static public Racional divide(Racional a, Racional b) {
int n = a.num*b.den;
int d = a.den*b.num;
return new Racional(n,d);
}
static public Racional simplifica(Racional a) {
int x = mcd(Math.abs(a.num),Math.abs(a.den));
int n = a.num/x;
int d = a.den/x;
return new Racional(n,d);
}
1.4.7 Ejemplos en Java

public String toString() {


return (num+"/"+den);
}
public boolean equals(Object o) {
Racional r1 = simplifica(this);
Racional r2 = simplifica((Racional)o);
return ((r1.num==r2.num)&&(r1.den==r2.den));
}
public Object clone() {
Racional r = new Racional(num,den);
return r;
}
} // fin class Racional
1.4.7 Ejemplos en Java

public class DenominadorCeroException extends RuntimeException


{
public DenominadorCeroException() { super(); };
public DenominadorCeroException(String s) { super(s); };
}
1.4.7 Ejemplos en Java

public class Bolsa {


class Celda {
Object dato;
Celda siguiente;
}
private Celda inicio;
public Bolsa() {
inicio = null;
}
public void poner(Object elemento) {
Celda aux = new Celda();
aux.dato = elemento;
aux.siguiente = inicio;
inicio = aux;
}
1.4.7 Ejemplos en Java

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

También podría gustarte