* Práctica 4.2: Kotlin POO I
P4.2 - Ejercicios básicos de POO 1 al 5¶
Ejercicio 4.1¶
-
Crear una clase
Rectángulo
, con atributosbase
yaltura
. La clase debe disponer del constructor y los métodos para calcular elarea
y elperimetro
. Los atributos no se podrán modificar, aunque si consultar. Por último, tendrán que ser mayor que 0. -
Opcionalmente se puede crear el método
toString()
para mostrar información sobre el rectángulo:override fun toString() = ""
. (Pulsa Ctrl+o) -
En el programa principal, crear varios rectángulos. Mostarlos y mostrar por pantalla sus áreas y perímetros.
Ejercicio 4.2¶
-
Crear una clase
Persona
que tenganombre
,peso
(en kg con decimales),altura
(en metros con decimales) y suimc
. -
Crear un constructor primario con todos los atributos, excepto nombre e imc. Este último atributo se calcula en función del peso y la altura. Por tanto no se debe poder modificar, pero si consultar.
-
Crear un constructor secundario que también incluya el nombre de la persona cómo parámetro.
-
Implementa el método
toString
, representación del objeto en forma deString
:override fun toString() = ""
. (Pulsa Ctrl+o) -
En el
main()
a) crear 3 personas diferentes (la primera sin nombre) utilizando el constructor primario y secundario y b) mostrarlas por consola. A continuación, realizar lo siguiente:- Sobre la persona 1: a) modificar su nombre y para ello debes solicitarlo al usuario por consola. No puede ser nulo o vacio. b) Mostrar por consola sólo el nombre, peso y altura.
- Sobre la persona 3: a) Mostrar el peso, altura y imc. b) Modificar la altura, por ejemplo a
1.80
c) Mostrar el peso, altura y imc. - Sobre la persona 2; a) Modificar la altura para que tenga el mismo valor que la persona 3. b) Mostrar la persona 2 y persona 3. c) Comparar si las dos personas son iguales, y mostrar el resultado. d) Implementa el método
equals():boolean
(Pulsa Ctrl+o). e) Ejecutar la comparación.
Ejercicio 4.3¶
-
Actualizar el ejercicio 4.2 para añadir a la clase
Persona
el siguiente comportamiento:- Debe retornar un saludo con su nombre...
saludar():String
- Debe retornar si altura por encima de la media (solo si altura >= 1.75)...
alturaEncimaMedia():Boolean
- Debe retornar si peso por encima de la media (solo si peso >= 70)...
pesoEncimaMedia():Boolean
- Sería conveniente añadir también un método
obtenerDescImc()
para usar enobtenerDesc()
, que implemente el retorno de la descripción del rango de tipo de imc al que equivale su cálculo.
Nota: (Mejora: Enum class en https://www.baeldung.com/kotlin/enum) * Si el IMC es menos de 18.5, se encuentra dentro del rango de "peso insuficiente". * Si el IMC está entre 18.5 y 24.9, se encuentra dentro del rango de "peso saludable". * Si el IMC está entre 25.0 y 29.9, se encuentra dentro del rango de "sobrepeso". * Si el IMC es 30.0 o superior, se encuentra dentro del rango de "obesidad".
-
Debe implementar también un método que muestre una descripción completa de la persona...
obtenerDesc():String
. Por ejemplo, este método mostrará por pantalla algo así:2. Crear en el"Julia con una altura de 1.72m (Por debajo de la media) y un peso 64.7kg (Por encima de la media) tiene un IMC de 21,87 (peso saludable)".
main()
una estructura de datos con 4 o 5 personas más, recorrer la estructura y por cada persona debe saludar y mostrar su descripción completa.
- Debe retornar un saludo con su nombre...
-
Finalmente, revisa el IDE e intenta actualizar el modificador de visibilidad de los métodos de tu clase cómo os estará indicando... veréis que los métodos que realmente no van a ser llamados desde fuera de la clase te recomienda que sean privados a la misma. De esta manera estamos
encapsulando
estos métodos para que se puedan utilizar solo desde dentro de la clase y no sean públicos.
Ejercicio 4.4¶
-
Crear una clase
Coche
, a través de la cual se pueda conocer elcolor
del coche, lamarca
, elmodelo
, elnúmero de caballos
, elnúmero de puertas
y lamatrícula
. Crear el constructor del coche, así como el métodotoString()
.- Marca y modelo no podrán ser blancos ni nulos y no podrán modificarse.
- Número de caballos, número de puertas y matrícula no podrán modificarse, ni podrán ser nulos.
- Color podrá modificarse, pero no podrá ser nulo.
-
Recuerda que Kotlin añade los getters y setters con el comportamiento por defecto, por lo que no es necesario que los implementes, a no ser que tengas que añadir alguna funcionalidad extra.
- Modifica el atributo matricula para que no permita actualizar la matrícula con un valor que no tenga 7 caracteres.
- Los atributos de modelo la marca siempre se devolverán con la primera letra en mayúscula.
- Realiza también una modificación del atributo número de caballos, para que no permita actualizar el atributo
numCaballos
con un valor interior a 70, ni superior a 700. - Realiza una modificación del atributo número de puertas, para que no permita actualizar el atributo
numPuertas
con un valor inferior a 3, ni superior a 5. - Ten en cuenta todas estas condiciones a la hora de crear el constructor de la clase.
-
En el programa principal, instancia varios coches y muéstralos por pantalla. Probar las modificaciones anteriores, modifica el número de caballos para un coche y haz lo mismo para el número de puertas, el color, la marca y modelo. Vuelve a mostrarlos por pantalla.
- Intenta instanciar y modificar con la marca y modelo con valores nulos o blancos y comprueba que no es posible.
- Intenta instanciar y modificar con el número de caballos con un valor inferior a 70 o superior a 700 y comprueba que no es posible.
- Intenta instanciar y modificar con el número de puertas con un valor inferior a 3 o superior a 5 y comprueba que no es posible.
- Intenta instanciar y modificar con la matrícula con un valor que no tenga 7 caracteres y comprueba que no es posible.
- Intenta instanciar y modificar con el color, el número de caballos, el número de puertas y la matrícula con valores nulos/blancos y comprueba que no es posible.
Ejercicio 4.5¶
-
Crear una clase
Tiempo
, que refleja las horas de un día, es decír, desde00:00:00
hasta23:59:59
, con atributoshora
,minuto
ysegundo
, que pueda ser construida indicando los tres atributos, sólo hora y minuto o sólo la hora (si no se indica, el valor de minuto o segundo será 0). -
Crear el método
toString()
para mostrar el tiempo en formato:XXh XXm XXs
. -
En el programa principal, debe solicitar por teclado hora, minuto y segundo de forma que se puedan omitir los segundos o los minutos (y segundos, claro) e instancie la clase
Tiempo
mostrando su valor. -
A tener en cuenta:
- Si segundos o minutos es mayor que 60, se tendrá que hacer las operaciones necesarios para incrementar la magnitud superior por el resultado del modulo de 60, quedándose en segundos o minutos con el resto. Es decir 65 segundos equivale a : 1 minuto y 5 segundos.
- Hora siempre tendrá que ser menor que 24, si no, lanzará una excepción.
-
Añadir un nuevo método
incrementar(t:Tiempo):Boolean
, que incrementa ent
, el total del tiempo que almacena el objeto que recibe el mensaje, devolviendo false si al incrementar se superan las23:59:59
, en cuyo caso no cambiaría nada del objeto que recibe el mensaje. En el programa principal, debe solicitar por teclado hora, minuto y segundo del objetot
. Mostrará por pantalla el resultado obtenido al incrementar ent
el tiempo, mostrando un mensaje de error si devuelvefalse
. -
Añadir un nuevo método
decrementar(t:Tiempo):Boolean
, que decrementa ent
, el total del tiempo que almacena el objeto que recibe el mensaje, devolviendo false si al decrementar se superan las00:00:00
, en cuyo caso no cambiaría nada del objeto que recibe el mensaje. En el programa principal, debe solicitar por teclado hora, minuto y segundo del objetot
. Mostrará por pantalla el resultado obtenido al decrementar ent
el tiempo, mostrando un mensaje de error si devuelvefalse
. -
Añadir un nuevo método
comparar(t:Tiempo):Int
, que compara el tiempo que almacena el objeto que recibe el mensaje con el tiempo que almacenat
, devolviendo -1 si el tiempo del objeto que recibe el mensaje es menor quet
, 0 si son iguales y 1 si es mayor. En el programa principal, debe solicitar por teclado hora, minuto y segundo del objetot
. Mostrará por pantalla el resultado obtenido al comparar el tiempo del objeto que recibe el mensaje con el tiempo det
. -
Añadir un nuevo método
copiar():Tiempo
, que devuelve un objetoTiempo
con el mismo tiempo que almacena el objeto que recibe el mensaje. En el programa principal, debe solicitar por teclado hora, minuto y segundo del objetot
. Mostrará por pantalla el resultado obtenido al copiar el tiempo del objeto que recibe el mensaje en un nuevo objetoTiempo
. -
Añadir un nuevo método
copiar(t:Tiempo):Tiempo
, que copia el tiempo que almacenat
en el objeto que recibe el mensaje. En el programa principal, debe solicitar por teclado hora, minuto y segundo del objetot
. Mostrará por pantalla el resultado obtenido al copiar el tiempo det
en el objeto que recibe el mensaje. -
Añadir un nuevo método
sumar(t:Tiempo):Tiempo?
, que suma el tiempo que almacena el objeto que recibe el mensaje con el tiempo que almacenat
, devolviendo un nuevo objetoTiempo
con el resultado onull
si el resultado es mayor que23:59:59
. En el programa principal, debe solicitar por teclado hora, minuto y segundo del objetot
. Mostrará por pantalla el resultado obtenido al sumar el tiempo del objeto que recibe el mensaje con el tiempo det
. -
Añadir un nuevo método
restar(t:Tiempo):Tiempo?
, que resta el tiempo que almacena el objeto que recibe el mensaje con el tiempo que almacenat
, devolviendo un nuevo objetoTiempo
con el resultado onull
si el resultado es menor que00:00:00
. En el programa principal, debe solicitar por teclado hora, minuto y segundo del objetot
. Mostrará por pantalla el resultado obtenido al restar el tiempo del objeto que recibe el mensaje con el tiempo det
. -
Añadir un nuevo método
esMayorQue(t:Tiempo):Boolean
, que devuelve true si el tiempo que almacena el objeto que recibe el mensaje es mayor que el tiempo que almacenat
. En el programa principal, debe solicitar por teclado hora, minuto y segundo del objetot
. Mostrará por pantalla el resultado obtenido al comparar si el tiempo del objeto que recibe el mensaje es mayor que el tiempo det
. -
Añadir un nuevo método
esMenorQue(t:Tiempo):Boolean
, que devuelve true si el tiempo que almacena el objeto que recibe el mensaje es menor que el tiempo que almacenat
. En el programa principal, debe solicitar por teclado hora, minuto y segundo del objetot
. Mostrará por pantalla el resultado obtenido al comparar si el tiempo del objeto que recibe el mensaje es menor que el tiempo det
.