java 41-47 ejercicios

8
ava 2 Clases y objetos ---- .• Problemas resueltos ATRIBUTOS Ejercicio 2.1: Definir una clase que represente a un coche. En la definición se debe incluir: el modelo, el color, si la pintura es metalizada o no, la matrícula, el tipo de coche, que puede ser MINI, UTILITARIO, FAMILIAR o DEPORTNO el año de fabricación la modalidad del seguro, que puede ser a terceros o a todo riesgo Planteamiento: Al diseñar una clase, hay que prestar especial atención a los atributos que se incluyen y sus tipos. Para los atributos hay que elegir nombres significativos, por ejemplo, "modelo" es un buen nombre para el atributo que representa el modelo del coche. Al elegir el tipo de un atributo, se debe pensar tanto en los valores que puede tomar, como en las operaciones que se van a aplicar. Para el modelo, el color y la matrícula, se elige el tipo Stri ng. Para determinar condiciones que se satisfa- cen o no, se debe elegir un boa 1ean, como es el caso de si la pintura es metalizada o no. Cuando un atributo puede tomar una serie de valores, lo más adecuado es utilizar un tipo enumerado, eligiendo los nombres adecuados para los diferentes valores. De esta forma, para el tipo de coche se usa un enumerado con los valores que sugiere el enunciado. Para el año de fabricación, se usa un número entero. Evidentemente, valores negativos o muy grandes podrían no ser legales, pero queda a cargo del programador comprobarlo. Por último, para la modalidad de seguro, de nuevo es adecuado un enumerado, con los valores { A_TERCEROS. A_TODO_RIESGO }. Solución: enum TipoDeCoche { MINI. UTILITARIO. FAMILIAR. DEPORTIVO }: enum TipoDeSeguro { A_TERCEROS. A TODO RIESGO }: public class Coche String modelo: String color: boolean esMetal izado: +----41 String matricula: TipoDeCoche tipo: int añoDeFabricación: TipoDeSeguro seguro: Los nombres de los atributos han de ser lo más significativos posible, pero no han de ser demasiado largos. Escoger adecuadamente los tipos de los atributos no siempre es tarea fácil. Comentario: Se podría pensar en utilizar un valor de tipo boa 1 ean para la modalidad de seguro, por ejemplo, boolean seguroATerceros. Se usaría el valor true cuando se disponga de un seguro a terceros, y fal se cuando el seguro sea a todo riesgo. En general, no es una buena decisión usar los booleanos para atributos que toman

Upload: ariel-saavedra-rodriguez

Post on 26-Oct-2015

295 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: JAVA 41-47 Ejercicios

ava 2 Clases y objetos ---- .•Problemas resueltos

ATRIBUTOS

Ejercicio 2.1:Definir una clase que represente a un coche. En la definición se debe incluir:

• el modelo,• el color,• si la pintura es metalizada o no,• la matrícula,• el tipo de coche, que puede ser MINI, UTILITARIO, FAMILIAR o DEPORTNO• el año de fabricación• la modalidad del seguro, que puede ser a terceros o a todo riesgo

Planteamiento: Al diseñar una clase, hay que prestar especial atención a los atributos que se incluyen y sustipos. Para los atributos hay que elegir nombres significativos, por ejemplo, "modelo" es un buen nombre parael atributo que representa el modelo del coche. Al elegir el tipo de un atributo, se debe pensar tanto en losvalores que puede tomar, como en las operaciones que se van a aplicar.

Para el modelo, el color y la matrícula, se elige el tipo Stri ng. Para determinar condiciones que se satisfa-cen o no, se debe elegir un boa 1ean, como es el caso de si la pintura es metalizada o no.

Cuando un atributo puede tomar una serie de valores, lo más adecuado es utilizar un tipo enumerado,eligiendo los nombres adecuados para los diferentes valores. De esta forma, para el tipo de coche se usa unenumerado con los valores que sugiere el enunciado.

Para el año de fabricación, se usa un número entero. Evidentemente, valores negativos o muy grandespodrían no ser legales, pero queda a cargo del programador comprobarlo.

Por último, para la modalidad de seguro, de nuevo es adecuado un enumerado, con los valores { A_TERCEROS.A_TODO_RIESGO}.

Solución:enum TipoDeCoche { MINI. UTILITARIO. FAMILIAR. DEPORTIVO }:

enum TipoDeSeguro { A_TERCEROS. A TODO RIESGO }:

public class Coche

String modelo:String color:boolean esMetal izado: +----41String matricula:TipoDeCoche tipo:int añoDeFabricación:

TipoDeSeguro seguro:

Los nombres de los atributos han deser lo más significativos posible, perono han de ser demasiado largos.

Escoger adecuadamente los tipos delos atributos no siempre es tarea fácil.

Comentario: Se podría pensar en utilizar un valor de tipo boa 1ean para la modalidad de seguro, por ejemplo,boolean seguroATerceros. Se usaría el valor true cuando se disponga de un seguro a terceros, y fal se cuandoel seguro sea a todo riesgo. En general, no es una buena decisión usar los booleanos para atributos que toman

Page 2: JAVA 41-47 Ejercicios

~---- Programación en Java 2

dos valores. Por un lado, no queda claro el significado del valor fa 1se. Por otro, se pueden aplicar operacionesque quizá no tengan sentido. Lo peor es que compromete la extensibilidad del programa: si se necesitara otramodalidad de seguro habrá que modificar muchas líneas de código, mientras que añadir un valor nuevo a unenumerado es sumamente sencillo.

Aviso: En este problema se ha abordado la elección de los atributos y sus tipos, sin tener en cuenta el tipo deacceso de los mismos; esto se tratará en posteriores ejercicios.

Ejercicio 2.2:Se desea imprimir el modelo y el color de un coche dado. Para ello, se pide escribir un método, que acepte unobjeto de la clase Coche. Si dicha referencia no es null, el método deberá imprimir el modelo y el color. Si esnull, el método no hará nada.

Planteamiento: No se dice el nombre del método, por lo que se elige uno significativo del problema, porejemplo, imprimeCoche. Este método acepta una referencia de la clase Coche. Se usa una sentencia if paracomprobar si la referencia es nu11 o contiene un objeto, en cuyo caso se imprime el modelo y el color.

Parámetros: La referencia a un objeto de la clase Coche.

Valor de retorno: El método no necesita devolver ningún valor de retorno por lo que se utiliza la cláusula void.

Solución:public void imprimeCoche (Coche coche) {

Para acceder al valor de los atributos,se pone el nombre del objeto, unpunto y el nombre del atributo .

if (coche != null) {System.out.println("El coche" + coche.modelo ++----11

.. es de color" + coche.color);

Comentario: En el ejercicio siguiente se verá una forma más conveniente de escribir métodos que añadencomportamiento a una clase.

Aviso: Es un error común que en ejecución se use un método o atributo de una referencia que está a nu11. Estoprovoca un error en tiempo de ejecución (RunTimeError) denominado Nu11Poi nterExcept ion, que normalmen-te terminará la ejecución del programa. Es una buena práctica asegurarse de que al usar una referencia, nocontendrá el valor especial nu11.

MÉTODOS

Ejercicio 2.3:Añadir a la clase Coche del Ejercicio 2.1 un método de nombre imprime Coche que imprima el modelo y elcolor del coche.

Planteamiento: Cuando se invoca un método de un objeto, desde el mismo se puede acceder directamente a losatributos de la clase. Por tanto, simplemente se han de imprimir los atributos modelo Y co1or.

Parámetros: Ninguno. Al ser un método de la clase Coche, no necesita ningún valor como parámetro ya que sedispone del modelo y color del coche como atributos.

Valor de retorno: El método no necesita devolver ningún valor de retorno por lo que se utiliza la cláusula voi d.

Page 3: JAVA 41-47 Ejercicios

a2

nesotraa un

de

unl es

id.

n

o

Clases y objetos ---- .•Solución:enum TipoDeCoche { MINI. UTILITARIO. FAMILIAR. DEPORTIVO };

enum TipoDeSeguro { A_TERCEROS. A_TODO_RIESGO };

class Coche {

String modelo;St ring color;boolean esMetalizado;String matricula;TipoDeCoche tipo; <IIi¿~--------------t1

int añoDeFabricación;TipoDeSeguro seguro;

Elcomportamientode laclaseCoche se recogeen su definición.

publiC void imprimeCoche () (System.out.println("El coche" + modelo +

" es de color" + color);

Los atributosdelobjetodentrode lamisma clasese usan directamente,sincualificación.

Comentario: Este ejercicio es similar al anterior en cuanto a funcionalidad. Sin embargo, el comportamientode los objetos ha de recogerse siempre en la definición de la clase y no depender de funciones externas en lamedida de lo posible.

Ejercicio 2.4:Escribir un programa que tenga una instancia de mi coche, que es un Rolls Royce de color dorado. Elprograma ha de imprimir un mensaje que diga de qué modelo y color es mi coche.

Planteamiento: Los objetos han de usarse por medio de referencias. Por tanto, habrá que declarar una referen-cia a la clase Coche. Además, hay que elegir un nombre significativo para la referencia. Como en este caso, seguarda la información de mi coche, el nombre mi Coche (u otro similar) puede ser adecuado. Luego se inicializanlos atributos modelo y color. Para ello, se escribe el nombre de la referencia, un punto, y el nombre del atributo,de la forma mi Coche. mode lo. Y con el operador de asignación ("=") se le asigna el valor "Ro 11 s Royce". Lomismo aplica al atributo color. Por último, se imprimen esos valores; como la clase Coche ya dispone delmétodo imprimeCoche() (del ejercicio anterior), se puede invocar dicho método de la formamiCoche. imprimeCoche().

Solución:enum TipoDeCoche { MINI. UTILITARIO. FAMILIAR. DEPORTIVO };

enum TipoDeSeguro { A_TERCEROS. A_TODO_RIESGO };

class Coche {

String modelo;String color;boolean esMetalizado;String matricula;TipoDeCoche tipo;int añoDeFabricación;

Page 4: JAVA 41-47 Ejercicios

Clases y objetos

Solución:enum TipoDeCoche { MINI. UTILITARIO. FAMILIAR. DEPORTIVO}:

enum TipoDeSeguro { A_TERCEROS.A_TODO_RIESGO};

class Coche {

String modelo;String color;boolean esMetalizado;String matricula;TipoDeCoche tipo;int añoDeFabricación;TipoDeSeguro seguro;

Elcomportamientode la claseCoche se recoge en su definición.

public void imprimeCoche () {System.out.println("El coche" + modelo +

" es de color" + color);

Losatributosdel objetodentro de lamismaclase se usan directamente,sincualificación.

Comentario: Este ejercicio es sirrúlar al anterior en cuanto a funcionalidad. Sin embargo, el comportarrúentode los objetos ha de recogerse siempre en la definición de la clase y no depender de funciones externas en lamedida de lo posible.

Ejercicio 2.4: .Escribir un programa que tenga una instancia de mi coche, que es un Rolls Royce de color dorado. Elprograma ha de imprimir un mensaje que diga de qué modelo y color es mi coche.

Planteamiento: Los objetos han de usarse por medio de referencias. Por tanto, habrá que declarar una referen-cia a la clase Coche. Además, hay que elegir un nombre significativo para la referencia. Como en este caso, seguarda la información de mi coche, el nombre miCoche (u otro sirrúlar) puede ser adecuado. Luego se inicializanlos atributos modelo y color. Para ello, se escribe el nombre de la referencia, un punto, y el nombre del atributo,de la forma miCoche. mode lo. Y con el operador de asignación ("=") se le asigna el valor "Ro11 s Royce". Lomismo aplica al atributo color. Por último, se imprimen esos valores; como la clase Coche ya dispone delmétodo imprimeCoche() (del ejercicio anterior), se puede invocar dicho método de la formamiCoche. impri meCoche().

Solución:enum TipoDeCoche { MINI. UTILITARIO. FAMILIAR. DEPORTIVO};

enum TipoDeSeguro { A_TERCEROS.A_TODO_RIESGO};

class Coche {

String modelo;String color;boolean esMetalizado;String matricula;TipoDeCoche tipo:int añoDeFabricación;

Page 5: JAVA 41-47 Ejercicios

.•---- Programación en Java 2

TipoDeSeguro seguro:

public void imprimeCoche () (System.out.println("El coche" + modelo +

" es de color" + color):

class pruebaCoche {public static void main (String args[J) (

Coche miCoche= new Coche():

mi Coche. mode10= "Ro 11s Royce":miCoche.color= "dorado":

mi Coche. imprimeCoche( ) : +----------;1 Se invoca a cierto comportamientode los objetos de tipo Coche.

Comentario: La salida por pantalla que produce el programa es:

El coche Rolls Royce es de color dorado

Ejercicio 2.5:Escriba una clase que represente un Semáforo, que podrá estar rojo, ámbar o verde. La clase tendrá unatributo llamado color, inicialmente a rojo. También dispondrá de un atributo que determine si el semáforoestá parpadeando. Inicialmente, el semáforo no está parpadeando.

Planteamiento: Para describir el color del semáforo, se usa un tipo enumerado con los tres posibles coloresdenominado Co1orSemáforo. Después, se escribe la clase Semáforo, que tendrá dos atributos: el primero será elcolor, de tipo ColorSemáforo; el segundo representará si el semáforo está parpadeando, para lo que se usa unboo 1ean.

Solución:enum ColorSemáforo { ROJO. ÁMBAR. VERDE}: +------11Este enumerado representa el color

que puede tomar un semáforo.

public class Semáforo {

ColorSemáforo color = ColorSemáforo.ROJO: ""'.¿---oil

boolean estáParpadeando = false:

Se pueden inicializar los atributos deun objeto en la misma línea que sedeclaran.

Comentario: Los atributos de los objetos pueden tomar un valor inicial en la misma línea que se decla-ran. No obstante, lo normal es que cada objeto tenga valores distintos, en cuyo caso se proporcionaráuno o más constructores para el valor inicial de los atributos de un objeto, como se verá en siguientesejercicios.

Aviso: Para los atributos que especifican condiciones que se cumplen o no, es muy habitual utilizar el tipoboo 1ean. Los nombres de dichos atributos suelen ser adjetivos o, como en el ejemplo, una palabra formada porel verbo "estar" y la condición.

l _

Page 6: JAVA 41-47 Ejercicios

Clases y objetos ---~--Ejercicio 2.6:

Escriba un programa que instancie un semáforo de la clase Semáforo del ejercicio anterior. El programaescribirá por pantalla el color del semáforo. Luego pondrá el semáforo en ámbar y volverá a imprimir elcolor.

Planteamiento: Se define una clase para el método main ( ), que se llamará PruebaSemá foro. En dicho métodomain(), se declara un semáforo, llamado 51, por ejemplo. Se instancia mediante new un objeto de la claseSemáforo y se asigna a 51. Ahora se puede imprimir su color, luego se cambia a ámbar y se vuelve a imprimir.

Solución:enum ColorSemáforo { ROJO. ÁMBAR.VERDE};

class Semáforo {

ColorSemáforo color = ColorSemáforo.ROJO;boolean estáParpadeando = false;

class PruebaSemáforo {

public static void main (String args[]) (Semáforo s l :

Se crea el objeto semáforo con lainstrucción new.

sl = new Semáforo(): +-----------11

System.out.println("Sl está" + sl.color);Para poner un valor de un tipoenumerado, se escribe el nombredel tipo, un punto y el valor deseado.

sl.color = ColorSemáforo.ÁMBAR; +------11System.out.println("Sl está" + sl.color);

Comentario: Hasta que no se genera el objeto con new, la referencia 51 contiene el valor null (inicializaciónpor defecto de lava). Es muy común hacer ambas cosas en la misma línea, como se presenta a continuación:

Semáforo sI = new Semáforo();

Aviso: La forma utilizada en la solución para acceder a los atributos no se considera la más adecuada. Ya severá en otros ejercicios los métodos accesores y los derechos de acceso. En el siguiente capítulo se hará hinca-pié en el tema.

Ejercicio 2.7:Escriba un programa que disponga de una clase para representar las asignaturas de una carrera. Una asig-natura tiene un nombre, un código numérico y el curso en el cual se imparte. Los valores iniciales han deproporcionarse en el constructor. La clase ha de tener métodos para obtener los valores de los atributos. Elprograma ha de construir un objeto con los siguientes valores: nombre "Matemáticas", código 1017, curso l.A continuación, el programa ha de imprimir los valores del objeto por pantalla.

Planteamiento: Se proporcionarán dos clases, una que representa a las asignaturas, llamada Asignatura, yotra para el programa, llamada Ejerci ci oAsi gnatura. La clase Asi gnatura dispondrá de un constructor queacepta los valores para representar una asignatura: el nombre, el código y el curso. El nombre del constructor

.0•••••••••••••••••••••••••••••••••••••••• _

Page 7: JAVA 41-47 Ejercicios

••~--- Programación en Java 2

es el mismo de la clase, Asignatura en este caso. Los atributos serán privados y se disponen de métodos paraacceder a sus valores. Normalmente, estos métodos denominados accesores, se suelen llamar como el atributo,anteponiendo el verbo dame o get. En la clase Ejercí cioAsignatura, habrá un método mai n( l, en el que se creala asignatura de matemáticas de primero y luego una sentencia para imprimir sus datos.

Solución:class Asignatura

Conviene que los atributos seanprivados y accesibles con métodosexplícitos.

private String nombre:private int código: +---------11private int curso:

public Asignatura (String nombre.this.nombre = nombre:this.código = código:this.curso = curso:

int código. int curso)

public String dameNombre(){return nombre:

Métodos accesores a los atributos.Típicamente estos métodos se llamandameAtributo o getAtributo.

public int dameCódigo(){return código:

public int dameCurso(){return curso:

class EjercicioAsignatura {

public static void main(String args[]) {Asignatura a = new Asignatura ("Matemáticas". 1017. 1):

System.out.println("Asignatura " + a.dameNombreO +

" códi go" + a.dameCódi go() +

" del curso " + a.dameCurso() ):

Comentario: Se podría haber incluido el método mai n( l en la clase Asignatura, con lo que con una sola clasese hubiera resuelto el ejercicio. Es muy típico añadir un main(l a clases intermedias para probar o ejercitar laclase, aunque dicho método main (l no forme parte del proyecto en el que participa la clase.

Respecto de los métodos accesores, nótese que no disponen de parámetros, lo que se indica con los parén-tesis vacíos, como en dameNombre( l. Estos métodos devuelven el mismo tipo que el atributo al que acceden.

Aviso: La codificación de los métodos accesores es tremendamente trivial, lo que suscita la tentación de elirni-narlos y poner los atributos como públicos. Se desaconseja esta práctica, pues el programador ha de responsa-bilizarse de una clase y no debe permitir que se modifiquen los atributos de forma arbitraria.

Page 8: JAVA 41-47 Ejercicios

Clases y objetos ----.-Ejercicio 2.8:

Definir una clase que represente un punto en un espacio bidimensional. La clase debe disponer de un cons-tructor con las coordenadas del punto y métodos acceso res a las coordenadas.

Planteamiento: En un espacio bidimensional, un punto se representa por un par ordenado de números reales.Se deben elegir nombres representativos para los mismos, como x e y. El tipo más adecuado dependerá del tipode aplicación en que se usen estos objetos. Como el enunciado no dice nada, se usará doub1e. Para asegurar laconsistencia de un objeto, es conveniente que los atributos sean privados y existan métodos públicos paraaveriguar su valor. Estos métodos se llamarán dameXC) y dameYC), sin parámetros, y con tipo de retorno igual aldel atributo que devuelven.

Solución:public class Punto {

Los atributos son privados, de forma, y: que sólo pueden modificarse

mediante métodos de la clase.

ble x, double y) { Nótese el uso de thi s para resolverla ambigüedad entre los nombres delos parámetros y los atributos.

private double x

public Punto(douthis.x = x:this.y = y:

public double dameX(){return x:

+- --11 Los métodos accesores proporcionan lapub 1i e doub 1e dameY( ) { información adecuada sobre el objeto.

return y:

Comentario: Fíjese que se ha elegido doub1e como tipo para las coordenadas. No obstante, ciertas aplicacio-nes (por ejemplo, gráficos) podrían requerir int, o podría ser suficiente fl oat.

Aviso: Se ha elegido representar el punto en coordenadas cartesianas. Se podría representar en polares, lo quesupondría tener que programar las conversiones entre los diferentes sistemas de representación.

Ejercicio 2.9:Escriba un programa que instancie cuatro puntos: el primero situado en el origen, el segundo situado en(5,3), el tercero en (2, -1) Y para el cuarto como punto medio entre el segundo y el tercero.

Planteamiento: Los tres primeros puntos se crean con los valores literales que nos proporciona el enunciado.Para el último, se calculan sus coordenadas como las medias entre las respectivas coordenadas del segundo ytercer puntos.

Solución:public static void main (String args[]) {

Punto p1 = new Punto (O, O): // origen de coordenadasF===============~

+- -11,1 Ejemplos de creación de objetos 11Punto p2 = new Punto (5, 3): 1I mediante new. JIPunto p3 = new Punto (2, -1); "==========1)