Los programas de Java son archivos de texto.
Comentarios
Espacio en blanco
Secuencias de escape
Variables. Memoria RAM. Procesamiento. Declaración de variables. Tipos de datos primitivos y clases.
Nombres significativos de variables. Sensitividad a mayúsculas y minúsculas.
Importar una clase. Paquetes de clases. El paquete java.lang
siempre está incluido.
Documentación oficial de las clases: System.in
, System.out
, Scanner
en el paquete java.util
.
Sacar double
del teclado a través de un Scanner
. Instanciar una clase. El operador new
.
Operadores aritméticos. Expresiones aritméticas.
El operador de división hace división entera (descarta los decimales) si sus dos operandos son enteros. Si al menos uno de sus operandos es real, hará división real (mantiene decimales). El módulo se evalúa como el residuo de la división entera. El módulo tiene muchas utilidades, como saber si un número es divisible por otro (en tal caso el residuo es 0) o para mapear un número cualquiera a un rango limitado de valores.
El siguiente ejemplo muestra un ejemplo imitando el menú del servicio Kolbi Prepago del ICE (1150) utilizando un switch
.
La siguiente es una secuencia de ejercicios sobre expresiones aritméticas, condicionales (if
), y expresiones lógicas. En algunos se introduce la necesidad de ciclos.
Ejercicio. Escriba un programa en Java que convierta una temperatura ingresada por el usuario en Fahrenheit a grados Celcius. Esta conversión está dada por la relación: C = 5(F - 32) / 9
, donde F
es la temperatura en grados Fahrenheit y C
la temperatura en grados Celcius. Ejemplo de interacción:
Temperatura (F): 100 100 Fahrenheit equivalen a 37.7777777777 Celcius
Ejercicio. Escriba un programa en Java que pregunte al usuario un año, e indique si ese año es o no bisiesto. De acuerdo al Calendario Gregoriano:
"Un año es bisiesto si es divisible entre 4, a menos que sea divisible entre 100. Sin embargo, si un año es divisible entre 100 y además es divisible entre 400, también resulta bisiesto". Ejemplos de ejecución:
// Ejecución 1 Año: 1970 1970 no es bisiesto // Ejecución 2 Año: 1980 1980 es bisiesto // Ejecución 3 Año: 1982 1982 no es bisiesto // Ejecución 4 Año: 2000 2000 es bisiesto // Ejecución 5 Año: 2012 2012 es bisiesto // Ejecución 6 Año: 2013 2013 no es bisiesto
Ejercicio. Escriba un programa en Java que en cada ejecución simule el lanzamiento de dos dados. Ejemplos:
Lanzando dados... 5 y 3
Lanzando dados... 3 y 3
Lanzando dados... 6 y 1
Ejercicio. Escriba un programa en Java que en cada ejecución pregunte al usuario por un entero mínimo y un entero máximo, y luego genere un número alteatorio entre esos dos valores (inclusive). Ejemplos:
Valor minimo: 90 Valor maximo: 100 Un aleatorio entre 90 y 100 es: 100
Valor minimo: 90 Valor maximo: 100 Un aleatorio entre 90 y 100 es: 98
Valor minimo: -5 Valor maximo: 5 Un aleatorio entre -5 y 5 es: -2
Valor minimo: 1 Valor maximo: 1 Un aleatorio entre 1 y 1 es: 1
Ejercicio. Modifique el programa anterior para que en caso de que el usuario provea un rango incorrecto, lo invierta. Ejemplos:
Valor minimo: 100 Valor maximo: 90 Un aleatorio entre 90 y 100 es: 91
Valor minimo: 5 Valor maximo: -5 Un aleatorio entre -5 y 5 es: 5
Valor minimo: 0 Valor maximo: 10 Un aleatorio entre 0 y 10 es: 2
Ejercicio. Dibuje el diagrama de actividad de su solución a la Tarea01.
Ejercicio. Haga un programa que imprima estadísticas de dos números ingresados por el usuario. Imprima las siguientes:
// Ejecución 1: Estadísticas de números. Ingrese dos reales: x1: 8.5 x2: 7 Mínimo: 7.0 Máximo: 8.5 Promedio: 7.75 Desviación estándar: 1.0606601718 // Ejecución 2: Estadísticas de números. Ingrese dos reales: x1: 8 x2: -16 Mínimo: -16.0 Máximo: 8.0 Promedio: -4.0 Desviación estándar: 16.9705627485
Ejercicio. Modifique el ejercicio anterior para proveer las mismas estadísticas pero de tres números reales ingresados por el usuario.
Ejercicio. Modifique el ejercicio anterior para proveer las mismas estadísticas para cuatro números reales ingresados por el usuario.
Ejercicio. Modifique el ejercicio anterior para proveer las mismas estadísticas para una cantidad arbitraria n
de números reales ingresados por el usuario.
Ejercicio. Escriba un programa que seleccione aleatoriamente dos números enteros positivos, los imprima en formato de suma y espera a que el usuario adivine el resultado de la suma. Si el usuario ingresa el resultado correcto, su programa lo felicita, de lo contrario, le revela el resultado correcto. Por ejemplo
// Ejecución 1 230 + 1285 = 1515 Felicitaciones! respondió correctamente. // Ejecución 2 9013 + 2499 = 11529 El resultado correcto es 11512.
Ejercicio. Modifique el ejercicio anterior para generar no sólo los números enteros aleatoriamente, sino también las operaciones (suma, resta, multiplicación, división y módulo). Ejemplo de ejecución:
// Ejecución 1: 12 * 105 = 1260 Felicitaciones! respondió correctamente. // Ejecución 2 188 - 4091 = -3893 El resultado correcto es -3903.
Ejercicio. Modifique el ejercicio anterior para mantener al programa proponiendo ejercicios aritméticos, hasta que el usuario indique no quiere jugar más respondiendo a una pregunta "¿Continuar jugando? [1=Sí, 2=No]
".
Los operadores de pre-incremento como en ++i
ó pre-decremento como --i
, se ejecutan antes de ejecutar el resto de la sentencia. Los operadores de pos-incremento como en i++
ó pos-decremento como i--
, se ejecutan después de ejecutar el resto de la sentencia. Consejo: no se deben combinar con otros operadores en una misma sentencia. Es decir, trate de que la sentencia completa sólo contenga un operador de incremento o decremento. Note que uno de estos operadores es ya una asignación.
El siguiente ejemplo muestra como calcular el factorial de un número entero ingresado por el usuario, utilizando un ciclo while
. ¿Qué hace el programa si el usuario ingresa un número negativo?
El siguiente ejemplo modifica al programa del índice de masa corporal para que pueda calcular el de varias personas sin salirse del programa. El usuario debe responder "si
" a la pregunta para hacer otro cálculo. Si se responde cualquier otro texto, el programa termina. Nótese que se invoca a teclado.skip("\n")
con el fin de que descarte algún cambio de línea que haya quedado de los ingresos numéricos (la altura) hechos previamente. Si este cambio de línea no se descarta, la respuesta que se lea podría ser el texto vacío.
Ejercicio. Escriba un programa en Java que cuente hasta 100 tres veces: con un ciclo while
, con un ciclo for
y con un ciclo do-while
. Ejemplo de ejecución:
Contando con while: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, [...], 99, 100, Contando con for: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, [...], 99, 100, Contando con do-while: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, [...], 99, 100,
Ejercicio. Escriba un programa en Java que solicite dos números enteros e imprima todos los números que haya entre ellos. Ejemplo de ejecución:
Primer valor: -5 Ultimo valor: 13 -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
Primer valor: 0 Ultimo valor: -20
Opcional. Evite imprimir la coma después del último número en el rango.
Ejercicio. Haga que el programa anterior solicite un tercer entero llamado el incremento, y cuente en incrementos de este número, ejemplos:
Primer valor: 60 Ultimo valor: 150 Incremento: 12 60, 72, 84, 96, 108, 120, 132, 144,
Primer valor: -100 Ultimo valor: -90 Incremento: 1 -100, -99, -98, -97, -96, -95, -94, -93, -92, -91, -90,
Opcional. ¿Qué pasa si el usuario ingresa un incremento negativo o cero? Proponga e implemente alguna solución.
Ejercicio. Modifique el programa anterior para que permita incrementos positivos cuando el rango es incremental, o incrementos negativos cuando el rango es decreciente. Note que el incremento nunca debe ser cero. Ejemplos de ejecución:
Primer valor: -10 Ultimo valor: 10 Incremento: 2 -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10,
Primer valor: -10 Ultimo valor: 10 Incremento: -2 El incremento debe ser positivo
Primer valor: 10 Ultimo valor: -10 Incremento: 2 El incremento debe ser negativo
Primer valor: 10 Ultimo valor: -10 Incremento: -2 10, 8, 6, 4, 2, 0, -2, -4, -6, -8, -10,
Primer valor: 10 Ultimo valor: -10 Incremento: 0 El incremento debe ser negativo
Ejercicio. Complete el ejemplo del programa de estadísticas para imprimir el promedio y la desviación estándar correctamente.
Ejercicio. Modifique el diagrama de actividad hecho en clase del ejemplo anterior para calcular el valor máximo y mínimo. Luego complete el programa en Java para que finalmente imprima las cuatro estadísticas: mínimo, máximo, promedio y desviación estándar de los datos ingresados por el usuario.
Ejercicio. Haga un programa que lea un número entero del teclado e imprime sus divisores propios. Si el número es primo imprime el texto "Es primo". Si el número es negativo, su programa lo ignora. Nótese que por definición 1 no es primo ni compuesto. Primero diseñe el algoritmo en un diagrama de actividad, luego impleméntelo en Java. Ejemplo de ejecución:
// Ejecución 1 Número para conocer sus divisores: 24 2 3 4 6 8 12 // Ejecución 2 Número para conocer sus divisores: 13 13 es primo
Ejercicio. Haga que el programa del ejercicio anterior lea repetitivamente números enteros del teclado e imprima sus divisores. Su programa debe terminar cuando el usuario ingresa 0. Si se ingresa un número negativo, se ignora y continúa con el siguiente número. Ejemplo de ejecución:
Número: 2 2 es primo Número: 1 1 no es primo ni compuesto Número: -1 Por favor ingrese un entero positivo Número: 18 2 3 6 9 Número: 0
Ejercicio. Escriba un programa en Java que lea un número entero positivo e imprima un cuadrado relleno de asteriscos de la misma longitud que el número dado. Si se ingresa un número negativo, se asume su valor absoluto. Ejemplo de ejecución:
Tamaño del cuadrado: 7 ******* ******* ******* ******* ******* ******* *******
Ejercicio. Modifique su programa anterior para imprimir un cuadrado sin relleno. Ejemplo de ejecución:
Tamaño del cuadrado: 7 ******* * * * * * * * * * * *******
Ejercicio. Modifique su programa anterior para imprimir un triángulo rectángulo relleno. Ejemplo de ejecución:
Tamaño de la figura: 6 * ** *** **** ***** ******
Ejercicio. Modifique su programa de figuras para imprimir un triángulo rectángulo relleno que es espejo del ejercicio anterior. Ejemplo de ejecución:
Tamaño de la figura: 6 * ** *** **** ***** ******
Ejercicio. Escriba un programa que lea repetitivamente números enteros positivos del teclado. Por cada uno de ellos escoge aleatoriamente una de las cuatro figuras anteriores y la imprime de acuerdo a las dimensiones del número ingresado. Si se ingresa un número negativo, el tamaño de la figura será el valor absoluto del número ingresado. Su programa termina cuando se ingresa un cero. ¿Qué ocurre si el usuario ingresa números muy grandes?.
Ejercicio. Escriba un programa que lea repetitivamente números enteros positivos, e imprima sus dígitos en orden inverso. Su programa termina cuando se ingresa cero. Si se ingresa un negativo se asume su valor absoluto. Ejemplo de ejecución:
Número: 18993 39981 Número: -13 31 Número: 0
Ejercicio. Un número capicúa o número palíndromo es aquel que se lee igual de izquierda a derecha, que de derecha a izquierda. Escriba un programa que lee repetitivamente números enteros y por cada uno de ellos indica si es o no capicúa. Si el usuario provee un número negativo, se asume su valor absoluto. Su programa termina cuando se ingresa un cero. Ejemplo de ejecución:
Número: 2828 2828 no es capicúa Número: -28082 28082 es capicúa Número: 0
El siguiente programa solicita dos números al usuario: una base entera y un exponente entero y calcula la potencia la cual puede resultar muy grande. El usuario puede estar tentado a escribir números muy grandes, o en el peor de los casos, ingresar un número no válido en el teclado. El programa hace manejo de excepciones para forzar al usuario a ingresar un número entero válido en la base. En el exponente se logra el mismo efecto reutilizando un método de la clase Keyboard.java.
El siguiente ejemplo muestra cómo leer tanto la base como el exponente con la clase Keyboard.java. La clase Scanner
se torna innecesaria, por lo que su inclusión e instanciación es eliminada del programa.
El siguiente ejemplo muestra cómo utilizar la clase BigInteger
del paquete java.math
para calcular una potencia muy grande, 21,000,000
, la cual no cabe en una variable long
.
El siguiente código modifica el ejemplo de la potencia entera para que pueda calcular potencias muy grandes, utilizando la clase java.math.BigInteger
.
El siguiente programa introductorio está pensando para un Almacén de electrodomésticos que necesita administrar el inventario de sus productos. El primer tipo de electrodoméstico a implementar en el sistema son los hornos de microondas. El programa consta de dos clases. El Almacen
que tiene el método main()
, el cual crea dos hornos de microondas de ejemplo. Cada horno de microondas es un objeto de la clase HornoMicroondas
. Ambas clases están almacenadas en la misma carpeta, por lo que una puede ver a la otra.
Los métodos simulan funciones, tales como las conocemos en matemática. Son segmentos de código que se pueden invocar tantas veces como sea necesario, por lo que permite la reutilización de código. El nombre de un método debería iniciar siempre con un verbo, mientras que las variables deberían ser sustantivos.
El método main()
es un método más. Otros métodos se pueden crear dentro de la clase. No importa el orden. Un método puede invocar a otro.
Ejercicio. Modifique el ejemplo de conversión de temperatura Fahrenheit a Kelvin para convertir una temperatura dada entre todas las unidades. Ejemplo de ejecución:
// Ejecución 1 Temperatura: 100 100.00 C = 212.00 F 100.00 C = 373.15 K 100.00 F = 37.78 C 100.00 F = 310.93 K 100.00 K = -173.15 C 100.00 K = -279.67 F // Ejecución 2 Temperatura: 0 0.00 C = 32.00 F 0.00 C = 273.15 K 0.00 F = -17.78 C 0.00 F = 255.37 K 0.00 K = -273.15 C 0.00 K = -459.67 F
Implemente un método por cada tipo de conversión:
convertirCelciusAFahrenheit()
: F(C) = 9 * C / 5 + 32
.convertirCelciusAKelvin()
: K(C) = C + 273.15
.convertirFahrenheitACelcius()
: C(F) = 5 * (F - 32) / 9
.convertirFahrenheitAKelvin()
: K(F) = K( C(F) )
.convertirKelvinACelcius()
: C(K) = K - 273.15
.convertirKelvinAFahrenheit()
: F(K) = F( C(K) )
.Luego modifique su programa para leer una temperatura como un número real, e invoque cada uno de los seis métodos anteriores, para conocer todas las posibles conversiones entre estas tres unidades.
El siguiente ejemplo declara un método fuerzaGravitacional(m1,m2,r)
que calcula la fuerza de gravedad dadas dos masas y la distancia entre ellas de acuerdo a Newton. El método es invocado desde el main()
.
El siguiente ejemplo modifica la solución a la Tarea01 (2012-III) sobre propiedades de triángulos. El programa se dividió en métodos coherentes, donde cada uno realiza una tarea específica y bien definida. Este programa, aunque ocupa más líneas, es más fácil de leer y de mantener. Nótese además que el método leer()
retorna true
si el usuario ingresó tres lados distintos de 0. Esto permite al main()
mantenerse en un ciclo leyendo triángulos, hasta que el usuario ingrese un lado nulo.
El siguiente programa declara un método random(min,max)
que recibe obligatoriamente dos parámetros y retorna un entero entre {min, ..., max}
escogido al azar. Se hacen tres invocaciones a este método desde el main()
.
El siguiente ejemplo simplifica ligeramente la Tarea02 (2012-II) del juego de operaciones aritméticas utilizando métodos.
Ejercicio. Modifique el ejemplo del juego matemático para implementar un método getNextShort()
el cual lee repetitivamente un valor short
hasta que se obtenga uno correcto. Modifique el método main()
para invocar a getNextShort()
cuando se solicita si continuar o no. Ejemplo de ejecución:
Juego: reto matemático. Responda cada operación correctamente: 4 % 2 = 0 Felicidades, respuesta correcta! Continuar jugando [1=Sí, 2=No]: sí si Sí 1 69 * 11 = 0 El resultado correcto es 759 Continuar jugando [1=Sí, 2=No]: 2
Ejercicio. Cada vez que el usuario falla el ingreso de la respuesta a una operación matemática o al indicar si quiere continuar jugando o no, se pierde el texto de la pregunta. Es deseable que este texto se repita de nuevo en cada oportunidad. Cree nuevas versiones de los métodos getNextLong(String)
y getNextShort(String)
para recibir este texto por parámetro, y desplegarlo cada vez que se solicita un valor al usuario. Ejemplo de ejecución:
Juego: reto matemático. Responda cada operación correctamente: 7 + 9 = 16 Felicidades, respuesta correcta! Continuar jugando [1=Sí, 2=No]: sí Continuar jugando [1=Sí, 2=No]: que sí Continuar jugando [1=Sí, 2=No]: 1.0 Continuar jugando [1=Sí, 2=No]: 1 37 / 48 = no sé 37 / 48 = 0 Felicidades, respuesta correcta! Continuar jugando [1=Sí, 2=No]: no Continuar jugando [1=Sí, 2=No]: 2
Ejercicio. Cree una nueva versión el método getNextShort(String text, int min, int max)
, el cual repetitivamente presenta el texto text
y lee valores del teclado hasta que el usuario ingrese un short
válido que además esté en el rango [min, max]
. Invoque dentro del juego esta nueva versión del método para permitir únicamente respuestas en el rango [1, 2]
. Ejemplo de ejecución:
Juego: reto matemático. Responda cada operación correctamente: 6 - 7 = -1 Felicidades, respuesta correcta! Continuar jugando [1=Sí, 2=No]: -1 Continuar jugando [1=Sí, 2=No]: 3 Continuar jugando [1=Sí, 2=No]: nop Continuar jugando [1=Sí, 2=No]: 2
Ejercicio. Implemente una clase Teclado
o Keyboard
con métodos reutilizables para obtener valores válidos del teclado. Implemente al menos los siguientes métodos:
short getNextShort() short getNextShort(String text) short getNextShort(String text, int min, int max) int getNextInt() int getNextInt(String text) int getNextInt(String text, int min, int max) long getNextLong() long getNextLong(String text) long getNextLong(String text, long min, long max) double getNextDouble() double getNextDouble(String text) double getNextDouble(String text, double min, double max)
Ejercicio. Modifique el programa de imprimir figuras aleatorias de tamaño variable (ejercicio 2.19), de tal forma que cada figura sea generada por un método. Recuerde utilizar identificadores significativos iniciados en verbo. Para leer números válidos del teclado reutilice su clase Keyboard
.
Ejercicio. Se llama número perfecto a aquellos enteros positivos cuyos divisores (incluyendo al 1 pero no al número mismo) suman el número. Por ejemplo, 6 es un número perfecto porque sus divisores 1 + 2 + 3 = 6. Implemente un método esPerfecto()
que retorne true
si su parámetro es un número perfecto. Luego escriba un programa que lea un número entero válido del teclado, e imprima todos los números perfectos entre 1 y el entero ingresado. Utilice su clase Keyboard
para leer el entero. Ejemplo de ejecución:
Números perfectos entre 1 y : 1000 6 28 496
Recursión es la capacidad de un método de invocarse a sí mismo.
Ejercicio. Modifique el programa de estadísticas de números reales, para permitir al usuario ingresar una cantidad de valores no conocida de antemano. En cada iteración, el programa presentará un menú que permitirá al usuario ingresar datos u obtener estadísticas particulares. Ejemplo de ejecución:
Programa estadístico Menú: 1. Agregar un valor 2. Ver suma 3. Ver promedio 4. Ver varianza 5. Ver desviación estándar 0. Salir [0 valores]. Opción: 1 Valor: 76 Menú: 1. Agregar un valor 2. Ver suma 3. Ver promedio 4. Ver varianza 5. Ver desviación estándar 0. Salir [1 valores]. Opción: 1 Valor: 35 Menú: 1. Agregar un valor 2. Ver suma 3. Ver promedio 4. Ver varianza 5. Ver desviación estándar 0. Salir [2 valores]. Opción: 100 [2 valores]. Opción: 1 Valor: 100 Menú: 1. Agregar un valor 2. Ver suma 3. Ver promedio 4. Ver varianza 5. Ver desviación estándar 0. Salir [3 valores]. Opción: 3 Promedio: 70.33333333 ...
Escriba una clase que almacene en atributos privados estáticos, la suma, la suma de cuadrados y la cantidad de elementos; y los siguientes métodos públicos estáticos:
main()
. Recibe String args[]
, retorna nada. Simplemente invoca a correr()
.correr()
. Recibe nada y retorna nada. Invoca a los demás métodos.imprimirMenu()
. Recibe nada y retorna nada. Imprime el menú del programa en la pantalla.agregarValor()
. Recibe nada y retorna nada. Lee el siguiente valor y actualiza los miembros estáticos de la clase (la suma, suma de cuadrados y la cantidad de elementos).verSuma()
. Recibe nada y retorna nada. Imprime la suma de los valores actualmente ingresados, por ejemplo: Suma: 104.00
. Nótese que el método no tiene que hacer ningún cálculo, ya el atributo estático suma
de la clase tiene este cálculo hecho, simplemente se imprime.calcularPromedio()
. Recibe nada y retorna double
. Calcula el promedio de los valores actualmente ingresados y lo retorna. Simplemente divide la suma
entre la cantidad de valores y lo retorna. Debe tenerse cuidado cuando el número de elementos es 0. En tal caso puede retornar 0.0
o mejor lanzar una excepción.verPromedio()
. Recibe nada y retorna nada. Invoca al método calcularPromedio()
e imprime el resultado con algún texto indicativo, por ejemplo: Promedio: 75.33
.calcularVarianza()
. Recibe nada y retorna double
. Calcula la varianza utilizando la suma de cuadrados (que es un miembro estático privado de la clase) e invocando al método calcularPromedio()
. Retorna el resultado del cálculo. Debe tenerse cuidado cuando el número de elementos es 0.verVarianza()
. Recibe nada y retorna nada. Invoca al método calcularVarianza()
e imprime el resultado con algún texto indicativo, por ejemplo: Varianza: 11.79
.calcularDesviacionEstandar()
. Recibe nada y retorna double
. Calcula la desviación estándar como la raíz cuadrada de la varianza. Debe invocar al método calcularVarianza()
. Retorna el resultado al llamador. Debe hacerse algún manejo cuando el número de elementos es 0.verDesviacionEstandar()
. Recibe nada y retorna nada. Invoca al método calcularDesviacionEstandar()
e imprime el resultado con algún texto indicativo, por ejemplo: Desviación estándar: 3.43
.Aproveche su clase Keyboard
para leer los valores y opciones del usuario. Puede tomar el siguiente código como punto de partida.
Ejercicio. Una fracción es un número representado de la forma a/b
, donde a
, b
son enteros y b
nunca es cero. Escriba una clase Fraccion
con dos miembros de datos: numerador
y denominador
. Implemente un método leer()
el cual lee el numerador y denominador del teclado, y además invoca a un método simplificar()
. Implemente un método imprimir()
el cual imprime la fracción en la pantalla.
Para simplificar la fracción, implemente el algoritmo de Euclides, el cual consiste en encontrar el máximo común divisor (mcd
) entre el numerador y denominador, y si este es diferente de cero, se divide tanto el numerador como el denominador por el mcd
encontrado. Para calcular el máximo común divisor, implemente un método estático que recibe dos enteros a
y b
por parámetro, y retorna el máximo común divisor entre ellos ó 0 si no hay, utilizando el algoritmo de Euclides, el cual se resume en el siguiente pseudocódigo:
función maximoComunDivisor(a, b): mientras ( b != 0 ) t = b b = a modulo b a = t El resultado es a
Haga también que su método simplificar()
ajuste negativos, dado que por convención, no se escriben denominadores negativos en las fracciones. Escriba otra clase, CalculadoraFraccional
que en su método main()
lee e imprime una fracción. Ejemplo de ejecución:
Ingrese una fracción en formato a b: 12 -8 Fracción leída: -3/2
Ejercicio. Implemente en su clase Fraccion
un método sumar()
, el cual recibe por parámetro otra Fraccion
y retorna una nueva Fraccion
, con el resultado simplificado de realizar la suma. Ejemplo de ejecución:
Ingrese fracción 1 en formato a b: 12 8 Ingrese fracción 2 en formato a b: 1 4 3/2 + 1/4 = 7/4
Ejercicio. Implemente un constructor por defecto en su clase Fraccion
el cual inicialice la fracción como 0/1
. Implemente un segundo constructor que recibe un numerador por parámetro y asume denominador 1
. Implemente un tercer constructor que recibe tanto el numerador como denominador por parámetro, el cual evita que el denominador sea 0
. Modifique su método sumar()
para aprovechar este tercer constructor.
Implmente métodos get
y set
para el numerador y denominador. Aprovéchelos en sus constructores.
Ejercicio. Implemente los métodos restar()
, multiplicar()
y dividir()
en su clase Fraccion
. Modifique el main()
de su CalculadoraFraccional
para imprimir el resultado de las cuatro operaciones entre las dos fracciones leídas. Ejemplo de ejecución:
Ingrese fracción 1 en formato a b: 12 8 Ingrese fracción 2 en formato a b: 1 4 3/2 + 1/4 = 7/4 3/2 - 1/4 = 5/4 3/2 * 1/4 = 3/8 3/2 / 1/4 = 6/1
Ejercicio. Modifique el ejercicio anterior para leer tres fracciones e imprimir el resultado de las cuatro operaciones entre las tres fracciones leídas.
Un constructor es un método que tiene el mismo nombre de la clase y se invoca cuando se construye un nuevo objeto con el operador new con el fin de que inicialice a los miembros de datos de la clase. El siguiente ejemplo agrega tres constructores a la clase Fraccion
, los cuales permiten establecer diferentes valores iniciales del numerador
y denominador
para la fracción recién creada.
Nótese cómo a la hora de sumar dos fracciones (líneas 51 y 52), la fracción resultado se le asigna su numerador y denominador a través del tercer constructor.
Ejercicio. Modifique el ejemplo del arreglo ordenado para imprimir sólo valores únicos. Note que un valor es único si no es igual al valor anterior en el arreglo si el arreglo está ordenado. Al procesar el primer elemento del arreglo, debe tener cuidado de no tratar de acceder al elemento previo, ya que no existe. Ejemplo de ejecución:
Cantidad de elementos: 7 Valor 1: 90 Valor 2: 75 Valor 3: 85 Valor 4: 90 Valor 5: 85 Valor 6: 100 Valor 7: 90 Valores unicos: 75.0 85.0 90.0 100.0
Ejercicio. Escriba un programa que lea una cantidad n
de valores reales e imprima su mediana, es decir, el valor que está en la posición central al ordenar el conjunto de datos. Note que si n
es impar, la mediana corresponderá al valor que esté en la posición resultado de la división entera n / 2
. Si n
es par, la mediana corresponderá a promediar los dos valores que están en el centro, es decir, el promedio del valor en la posición n / 2
y el valor en la posición n / 2 - 1
. . Ejemplos de ejecución:
// Ejecución 1: Cantidad de elementos: 5 Valor 1: 95 Valor 2: 70 Valor 3: 85 Valor 4: 95 Valor 5: 90 Mediana: 90.0 // Ejecución 2: Cantidad de elementos: 6 Valor 1: 95 Valor 2: 70 Valor 3: 85 Valor 4: 95 Valor 5: 90 Valor 6: 75 Mediana: 87.5
Ejercicio. Escriba un programa que leea una cantidad n
de valores reales e imprima su moda estadística. El valor modal es aquel que más se repite en el conjunto de datos. Puede ocurrir que el conjunto tenga dos o más valores modales, su programa debe imprimir cada uno de ellos (sugerencia: puede hacer dos recorridos por el conjunto de datos, si lo requiere). Si todos los valores en el cojunto de datos se repiten con la misma frecuencia, no existe una moda y su programa debe informarlo. Ejemplo de ejecución:
// Ejecucion 1: un valor modal Cantidad de elementos: 7 Valor 1: 90 Valor 2: 75 Valor 3: 85 Valor 4: 90 Valor 5: 85 Valor 6: 100 Valor 7: 90 Valor modal: 90.00 (3 veces) // Ejecucion 2: dos valores modales Cantidad de elementos: 6 Valor 1: 90 Valor 2: 75 Valor 3: 85 Valor 4: 90 Valor 5: 85 Valor 6: 100 2 valores modales encontrados (2 veces cada uno): 85.00 90.00 // Ejecucion 3: todos los valores con igual moda Cantidad de elementos: 6 Valor 1: 90 Valor 2: 75 Valor 3: 75 Valor 4: 85 Valor 5: 90 Valor 6: 85 No hay moda: todos los valores tienen la misma ocurrencia // Ejecucion 4: todos los valores distintos Cantidad de elementos: 6 Valor 1: 95 Valor 2: 100 Valor 3: 75 Valor 4: 80 Valor 5: 90 Valor 6: 85 No hay moda: todos los valores tienen la misma ocurrencia // Ejecucion 5: solo un valor Cantidad de elementos: 1 Valor 1: 75 No hay moda: todos los valores tienen la misma ocurrencia
Ejercicio. Escriba un programa que leea una cantidad n
de valores reales e imprima un histograma. Ejemplo de ejecución:
Los arreglos literales son aquellos cuyos valores se establecen en el código fuente y no cuando el programa corra. Ejmplos:
Nótese además cómo los arreglos fueron pasados por parámetro al método imprimirBilletes(long[], long[])
.
El siguiente ejemplo muestra como crear una baraja (o mazo) de cartas (o naipes), donde cada carta se representa con un objeto. Las 52 cartas de la baraja se almacenan en un arreglo, que en Java es realmente un arreglo de referencias a objetos de tipo Carta.
El siguiente ejemplo crea un arreglo de n
estudiantes, donde n
es indicado por el usuario. Cada estudiante es un objeto de la clase Estudiante
, la cual puede leer al estudiante del teclado y retornar un String
representando al estudiante.
Al correr el programa solicita el número de estudiantes n
(línea 7), crea un arreglo de referencias a objetos Estudiantes (línea 10). Inicialmente el arreglo tendrá sólo referencias vacías. En un ciclo (líneas 13 a 18) se hará a cada entrada del arreglo referir a un objeto Estudiante
(línea 16), al cual se le solicita leerse del teclado (línea 17). Otro ciclo (líneas 20 a 22) imprime cada estudiante en la pantalla (invocando al método toString()
al colocar un objeto Estudiante
en un contexto donde se espera un String
). Finalmente se calcula el promedio de los promedios ponderados de matrícula de todos los estudiantes (líneas 25 a 30) y se imprime en la pantalla.
Java no tiene el concepto de matrices. Se simulan con arreglos. En Java una matriz es un arreglo cuyos elementos son otros arreglos (todos del mismo tamaño). Para recorrer las matrices se utilizan dos for anidados: el más externo recorre las filas y el más interno las columnas.
Ejercicio. Agregue a la clase Matriz
un método esCuadrada()
que retorne true
si la matriz tiene igual número de filas y columnas. Invoque este método en el main()
e imprima si matriz leída es o no cuadrada. Ejemplos de ejecución:
n: 2 m: 3 m(1,1): 1 m(1,2): 2 m(1,3): 3 m(2,1): 4 m(2,2): 5 m(2,3): 6 1.0 2.0 3.0 4.0 5.0 6.0 Es cuadrada: false
n: 2 m: 2 m(1,1): 1 m(1,2): 2 m(2,1): -1 m(2,2): -2 1.0 2.0 -1.0 -2.0 Es cuadrada: true
Ejercicio. Agregue a la clase Matriz
un método esNula()
que retorne true
si todos los elementos en la matriz son 0. Invoque este método en el main()
e imprima si matriz leída es o no nula. Ejemplos de ejecución:
n: 2 m: 2 m(1,1): 0 m(1,2): 0 m(2,1): 0 m(2,2): 0 0.0 0.0 0.0 0.0 Es cuadrada: true Es nula: true
n: 2 m: 2 m(1,1): 0 m(1,2): 0 m(2,1): 1 m(2,2): 0 0.0 0.0 1.0 0.0 Es cuadrada: true Es nula: false
Ejercicio. Agregue a la clase Matriz
un método imprimirDiagonal()
que en caso de ser una matriz cuadrada, imprime la diagonal, es decir, los elementos a11
, a22
, ..., ann
. En caso de no ser una matriz cuadrada, imprime nada. Invoque este método en el main()
. Ejemplo de ejecución:
n: 3 m: 3 m(1,1): 1 m(1,2): 2 m(1,3): 3 m(2,1): 4 m(2,2): 5 m(2,3): 6 m(3,1): 7 m(3,2): 8 m(3,3): 9 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 Es cuadrada: true Es nula: false Diagonal: 1.0 5.0 9.0
Ejercicio. Se llama traza de una matriz cuadrada a la suma de los elementos en la diagonal de una matriz. Agregue a la clase Matriz
un método traza()
que retorna esta suma. En caso de no ser una matriz cuadrada, retorna siempre esta suma aunque la diagonal sea incompleta. Invoque este método en el main()
. Ejemplos de ejecución:
n: 3 m: 3 m(1,1): 1 m(1,2): 2 m(1,3): 3 m(2,1): 4 m(2,2): 5 m(2,3): 6 m(3,1): 7 m(3,2): 8 m(3,3): 9 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 Es cuadrada: true Es nula: false Diagonal: 1.0 5.0 9.0 Traza: 15.0
n: 2 m: 3 m(1,1): 1 m(1,2): 2 m(1,3): 3 m(2,1): 4 m(2,2): 5 m(2,3): 6 1.0 2.0 3.0 4.0 5.0 6.0 Es cuadrada: false Es nula: false Traza: 6.0
Ejercicio. Se llama matriz diagonal a una matriz cuadrada cuyos elementos son todos 0 excepto todos los elementos que están en la diagonal. Agregue a la clase Matriz
un método esDiagonal()
que retorna true
si la matriz es diagonal. En caso de ser una matriz nula o una matriz no cuadrada, retorna false
. Invoque este método en el main()
. Ejemplos de ejecución:
n: 3 m: 3 m(1,1): 1 m(1,2): 0 m(1,3): 0 m(2,1): 0 m(2,2): -13 m(2,3): 0 m(3,1): 0 m(3,2): 0 m(3,3): 3.3 1.0 0.0 0.0 0.0 -13.0 0.0 0.0 0.0 3.3 Es cuadrada: true Es nula: false Diagonal: 1.0 -13.0 3.3 Traza: -8.7 Es diagonal: true
n: 2 m: 2 m(1,1): 1.2 m(1,2): -4 m(2,1): 0 m(2,2): 3.1 1.2 -4.0 0.0 3.1 Es cuadrada: true Es nula: false Diagonal: 1.2 3.1 Traza: 4.3 Es diagonal: false
Ejercicio. Se llama matriz identidad a una matriz cuadrada cuyos elementos son todos 0 excepto todos los elementos en la diagonal que son 1. Agregue a la clase Matriz
un método esIdentidad()
que retorna true
si la matriz es identidad. En caso de ser una matriz no cuadrada, retorna false
. Invoque este método en el main()
.
Ejercicio. Se llama matriz triangular superior a una matriz cuadrada si todos sus elementos por debajo de la diagonal son 0. Se llama matriz triangular inferior a una matriz cuadrada si todos sus elementos por encima de la diagonal son nulos. Agregue a la clase Matriz
los métodos esTriangularSuperior()
y esTriangularInferior()
que retornan true
si la matriz es triangular superior o inferior respectivamente. Ejemplos de ejecución:
n: 3 m: 3 m(1,1): 1 m(1,2): 4 m(1,3): -3 m(2,1): 0 m(2,2): 9 m(2,3): -1 m(3,1): 0 m(3,2): 0 m(3,3): -7 1.0 4.0 -3.0 0.0 9.0 -1.0 0.0 0.0 -7.0 Es cuadrada: true Es nula: false Diagonal: 1.0 9.0 -7.0 Traza: 3.0 Es diagonal: false Es triangular superior: true Es triangular inferior: false
n: 4 m: 4 m(1,1): 1 m(1,2): 0 m(1,3): 0 m(1,4): 0 m(2,1): 0 m(2,2): -2 m(2,3): 0 m(2,4): 0 m(3,1): -3 m(3,2): 4 m(3,3): 5 m(3,4): 0 m(4,1): -1 m(4,2): 0 m(4,3): 7 m(4,4): -6 1.0 0.0 0.0 0.0 0.0 -2.0 0.0 0.0 -3.0 4.0 5.0 0.0 -1.0 0.0 7.0 -6.0 Es cuadrada: true Es nula: false Diagonal: 1.0 -2.0 5.0 -6.0 Traza: -2.0 Es diagonal: false Es triangular superior: false Es triangular inferior: true
Ejercicio. Cree en su clase Matriz
un método imprimirPropiedades()
. Mueva todas las invocaciones a los métodos esCuadrada()
, esNula()
, etc. del main()
al método imprimirPropiedades()
. Finalmente invoque el nuevo método desde el main()
. Puede mejorar la salida sólo imprimiendo aquellas propiedades que cumple la matriz ingresada. Por ejemplo:
n: 3 m: 3 m(1,1): 1 m(1,2): 5 m(1,3): -1 m(2,1): 0 m(2,2): 6 m(2,3): 0 m(3,1): 0 m(3,2): 0 m(3,3): -8 1.0 5.0 -1.0 0.0 6.0 0.0 0.0 0.0 -8.0 (Cuadrada. Triangular superior. Traza: -1.0)
n: 2 m: 2 m(1,1): 1 m(1,2): 0 m(2,1): 0 m(2,2): 1 1.0 0.0 0.0 1.0 (Cuadrada. Diagonal. Identidad. Triangular superior. Triangular inferior. Traza: 2.0)
Ejercicio. La traspuesta At
de una matriz A
, es la matriz que resulta de intercambiar las filas por las columnas de A
. Implemente en su clase Matriz
un método traspuesta()
que retorne una nueva matriz resultado de intercambiar sus filas por su columnas. Nota: necesitará implementar dos constructores: Matriz()
y Matriz(n,m)
, el segundo crea una matriz de n x m
reales (inicializados en 0). Ejemplo de ejecución:
Matriz A: n: 3 m: 3 m(1,1): 1 m(1,2): 2 m(1,3): 3 m(2,1): 4 m(2,2): 5 m(2,3): 6 m(3,1): 7 m(3,2): 8 m(3,3): 9 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 (Cuadrada. Traza: 15.0) Traspuesta de A: 1.0 4.0 7.0 2.0 5.0 8.0 3.0 6.0 9.0
Matriz A: n: 2 m: 4 m(1,1): 1 m(1,2): 2 m(1,3): 3 m(1,4): 4 m(2,1): 5 m(2,2): 6 m(2,3): 7 m(2,4): 8 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 (Traza: 7.0) Traspuesta de A: 1.0 5.0 2.0 6.0 3.0 7.0 4.0 8.0
Ejercicio. La suma de dos matrices de igual tamaño An x m
y Bn x m
, es una nueva matriz Cn x m
resultado de sumar los elementos que se encuentran en la misma posición de A
y B
. Implemente en su clase Matriz
un método A.sumar(B)
que se invoque en una matriz A
y reciba por parámetro una referencia a otra matriz B
y retorne una nueva matriz resultado de sumar A
con B
. No se puede sumar dos matrices de distinto tamaño. En Java este incidente puede reportarse retornando un objeto nulo (null
, usado para indicar que una referencia no apunta a ningún objeto) o lanzando una excepción. Ejemplo de ejecución:
Matriz A: n: 2 m: 3 m(1,1): 1 m(1,2): 2 m(1,3): 3 m(2,1): 4 m(2,2): 5 m(2,3): 6 1.0 2.0 3.0 4.0 5.0 6.0 (Traza: 6.0) Matriz B: n: 2 m: 3 m(1,1): -1 m(1,2): 0 m(1,3): 1 m(2,1): 2 m(2,2): -2 m(2,3): 0 -1.0 0.0 1.0 2.0 -2.0 0.0 (Traza: -3.0) A + B = 0.0 2.0 4.0 6.0 3.0 6.0
Matriz A: n: 2 m: 2 m(1,1): 1 m(1,2): 0 m(2,1): 0 m(2,2): 1 1.0 0.0 0.0 1.0 (Cuadrada. Diagonal. Identidad. Triangular superior. Triangular inferior. Traza: 2.0) Matriz B: n: 2 m: 3 m(1,1): 6 m(1,2): 5 m(1,3): 4 m(2,1): 3 m(2,2): 2 m(2,3): 1 6.0 5.0 4.0 3.0 2.0 1.0 (Traza: 8.0) A + B = (null)
Ejercicio. Implemente en su clase Matriz
un método A.restar(B)
, el cual opera de la misma forma que la suma, con la diferencia de que resta los elementos que se encuentran en la misma posición.
En Java los textos se representan como arreglos de caracteres, llamados cadenas de caracteres y por ende son objetos; específicamente son objetos de la clase String
. Si se comparan dos String
con el operador ==, no se están comparando dos textos, sino dos referencias, y el operador == se evaluará como true
sólo si ambas referencias apuntan al mismo objeto:
Un archivo es una secuencia de bytes terminadas en un carácter fin de archivo (EOF
, End-Of-File). La clase Scanner
se puede conectar no sólo al teclado (System.in
), sino también a cualquier archivo de texto (con la clase File
). La lectura de valores del archivo se hace de la misma forma que se hace con el teclado. Sin embargo, otras excepciones pueden generarse, como que el archivo no existe, que no se tenga permiso de lectura, etc.
Ejercicio. Escriba un programa en Java que imprima exactamente su mismo código fuente en la pantalla. Por ejemplo, si su programa está en un archivo Mostrar.java
, lo que haría es abrir el archivo Mostrar.java
, leerlo línea a línea (con la clase Scanner
) e imprimirlas en la pantalla (con el objeto System.out
).
Ejercicio. Modifique el programa anterior para que en lugar de siempre abrir el archivo Mostrar.java
, abra un archivo cuyo nombre es enviado por parámetro. Sugerencia, cree un archivo de texto con un poema, o una canción de su agrado, o un conjunto de frases célebres; luego utilice este archivo como parámetro al invocar su programa. Ejemplo de ejecución:
java Mostrar refranes.txt Mejor viejo conocido que nuevo por conocer. A 2 puyas no hay toro valiente. Mas sabe el diablo por viejo que por diablo. A Dios rogando y con el mazo dando. Nadie sabe lo que tiene hasta que lo pierde. Mal de todos, consejo de tontos.
Ejercicio. Modifique el programa Mostrar
para mostrar en la pantalla no sólo uno, sino todos los archivos cuyos nombres son enviados por parámetro. Ejemplo de ejecución
java Mostrar refranes.txt chistes.txt Mejor viejo conocido que nuevo por conocer. A 2 puyas no hay toro valiente. Mas sabe el diablo por viejo que por diablo. A Dios rogando y con el mazo dando. Nadie sabe lo que tiene hasta que lo pierde. Mal de todos, consejo de tontos. Estaba Pepito en la escuela[...]
Ejercicio. Modifique el programa Mostrar
de tal forma que si recibe un parámetro -u
despliegue el contenido de los archivos completamente en mayúsculas. Ejemplo de ejecución:
java Mostrar -u refranes.txt chistes.txt MEJOR VIEJO CONOCIDO QUE NUEVO POR CONOCER. A 2 PUYAS NO HAY TORO VALIENTE. MAS SABE EL DIABLO POR VIEJO QUE POR DIABLO. A DIOS ROGANDO Y CON EL MAZO DANDO. NADIE SABE LO QUE TIENE HASTA QUE LO PIERDE. MAL DE TODOS, CONSEJO DE TONTOS. ESTABA PEPITO EN LA ESCUELA[...]
El siguiente programa soluciona los tres ejercicios anteriores: muestra el contenido de archivos en la pantalla, y la opción -u
ocasiona que se impriman en mayúsculas:
Ejercicio. Modifique el programa Mostrar
para que en caso de recibir un parámetro -l
imprima todos los archivos en minúscula, o si recibe el parámetro -i
invierta las mayúsculas y minúsculas. Si el usuario escribe dos o los tres parámetros -l -i -u
el programa tomará el último provisto. Ejemplo de ejecución:
java Mostrar -i refranes.txt chistes.txt mEJOR VIEJO CONOCIDO QUE NUEVO POR CONOCER. a 2 PUYAS NO HAY TORO VALIENTE. mAS SABE EL DIABLO POR VIEJO QUE POR DIABLO[...]
Ejercicio. Modifique su programa mostrar para que ante la opción -e
, imprima estadísticas de cada archivo que recibe. Ejemplo de ejecución:
java Mostrar -e refranes.txt chistes.txt refranes.txt: 6 líneas 46 palabras 235 caracteres chistes.txt: 275 líneas 1948 palabras 11036 caracteres
Ejercicio. Modifique su programa Mostrar
para que ante la opción -s
muestre el resultado de ordenar las líneas de todos los archivos que reciba por parámetro. Ejemplo de ejecución:
java Mostrar -s refranes.txt chistes.txt A 2 puyas no hay toro valiente. A Dios rogando y con el mazo dando. Estaba Pepito en la escuela Mal de todos, consejo de tontos. Mas sabe el diablo por viejo que por diablo. Mejor viejo conocido que nuevo por conocer. Nadie sabe lo que tiene hasta que lo pierde.
Un archivo de valores separados por comas (CSV, comma separated values) es un archivo de texto que representa una "tabla" de datos, donde cada fila de la tabla corresponde con una línea del archivo; y una celda de la tabla es un valor separado con una coma (o un tabulador) del próximo valor. Opcionalmente los archivos CSV pueden contener encabezados en la primera fila. Los programas de oficina (LibreOffice, Microsoft Office, etc.), motores de bases de datos, aplicaciones de análisis estadístico y otros, utilizan archivos CSV como medio universal de intercambio de datos.
El siguiente ejemplo muestra cómo leer las matrices aumentadas de un archivo CSV (ejercicios.csv
), invoca a un método transformar()
el cual debería aplicar el algoritmo de Gauss-Jordan y finalmente imprime las matrices mismas junto con sus respuestas (ficticias) a un archivo soluciones.csv
con un objeto PrintWriter
, el cual funciona de la misma forma que System.out
, con la diferencia de que su salida es destinada a un archivo en disco, en lugar de la pantalla. De hecho, cada vez que es ejecutado este programa no produce salida alguna en la pantalla, sino que sobrescribe el archivo soluciones.csv
.
Después de implementar el método transformar()
, es buen ejercicio escribir matrices de un gran tamano en el archivo ejercicios.csv
y correr el programa.
El siguiente ejemplo crea una ventana con un área para pintar en la parte superior y en la parte inferior, un campo de texto más un botón para introducir pasos de recorrido. La clase aún no tiene manejo de eventos, por lo que los controles parecerán inanimados.
El siguiente ejemplo conecta el botón "Agregar" con un objeto manejador de eventos, el cual debe implementar la interfaz ActionListener
.
El siguiente ejemplo hace al objeto AreaPiso
un manejador de eventos, y lo conecta tanto al botón "Agregar" como el campo de texto campoRecorrido
, de tal forma que cuando se presione el botón, o se presione "Enter
" en el campo de texto, se invoca el método actionPerformed()
de la clase AreaPiso
.
Nótese que una clase puede heredar de sólo una única clase base; pero puede implementar una cantidad arbitraria de interfaces. Una interface de Java, es como una clase que sólo tiene métodos y no miembros de datos. Cualquier otra clase que cumpla esa interfaz, deberá implementar obligatoriamente todos los métodos declarados en dicha interfaz.