Introducción a la programación en Java

Cadena de compilación en Java

Los programas de Java son archivos de texto.

Hola mundo en Java

]]>
Hola mundo en Java

Comentarios

Espacio en blanco

Secuencias de escape

Introducción: índice de masa corporal

]]>
Cálculo del índice de masa corporal en Java. Obtener código fuente.

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.

Operaciones matemáticas

]]>
Diferencia entre divisiones enteras, divisiones reales, y módulos. Obtener código fuente.

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.

]]>
Programa que realiza operaciones matemáticas escogidas por el usuario con un menú. Encadena lógica con if/else. Obtener código fuente.
]]>
Programa que hace lo mismo que el anterior pero en lugar de encadenar instrucciones if/else, utiliza el condicional switch. Obtener código fuente.

El siguiente ejemplo muestra un ejemplo imitando el menú del servicio Kolbi Prepago del ICE (1150) utilizando un switch.

]]>
Programa que imita el menú del servicio Kolbi Prepago del ICE. Obtener código fuente.

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

Ver una solución

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

Ver una solución

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:

  1. El valor mínimo
  2. El valor máximo
  3. Promedio
  4. La desviación estándar
// 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]".

Operadores de pre/pos incremento/decremento

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.

]]>
Ejemplo de los operadores de pre-incremento y pos-incremento. Obtener código fuente.

Ciclos

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?

]]>
Cálculo del factorial con un ciclo while. Obtener código fuente.

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.

]]>
Calcula el índice de masa corporal para varias personas con un ciclo do-while. Obtener código fuente.

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,

Ver una solución

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.

Ver una solución

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.

Ver una 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

Ver una solución

]]>
Estadísticas de números reales en Java (incompleto). Obtener código fuente.

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.

Diagrama de actividad del programa Estadísticas (incompleto).
]]>
Solución completa al ejercicio de Estadísticas de números reales. Incluye manejo de excepciones. Obtener código fuente.

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

Ver una solución

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

*******
*******
*******
*******
*******
*******
*******
]]>
Solución al ejercicio del cuadrado relleno. Obtener código fuente.

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

Manejo de excepciones y artimética de precisión arbitraria

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.

]]>
Calcula una potencia entera (Quiz 02 2013-II). Para leer la base utiliza manejo de excepciones. Para leer el exponente utiliza la clase Keyboard.java. Obtener código fuente.

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.

]]>
Calcula una potencia entera (Quiz 02 2013-II). Lee tanto la base como exponente con métodos de la clase Keyboard.java. Obtener código fuente.

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.

]]>
Calcula la potencia 21,000,000 utilizando la clase BigInteger. Obtener código fuente.

El siguiente código modifica el ejemplo de la potencia entera para que pueda calcular potencias muy grandes, utilizando la clase java.math.BigInteger.

]]>
Calcula una potencia entera (Quiz 02 2013-II). Puede calcular potencias muy grandes gracias a la clase BigInteger. Obtener código fuente.

Clases, objetos/instancias, referencias

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.

]]>
]]>
Ejemplo de cómo instanciar dos hornos de microondas y cambiarles las propiedades. Obtener código fuente: Almacen.java, HornoMicroondas.java.

Métodos

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.

]]>
Conversor de Fahrenheit a Kelvin con métodos estáticos. Obtener código fuente.

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:

  1. Celcius a Fahrenheit: convertirCelciusAFahrenheit(): F(C) = 9 * C / 5 + 32.
  2. Celcius a Kelvin: convertirCelciusAKelvin(): K(C) = C + 273.15.
  3. Fahrenheit a Celcius: convertirFahrenheitACelcius(): C(F) = 5 * (F - 32) / 9.
  4. Fahrenheit a Kelvin: convertirFahrenheitAKelvin(): K(F) = K( C(F) ).
  5. Kelvin a Celcius: convertirKelvinACelcius(): C(K) = K - 273.15.
  6. Kelvin a Fahrenheit: 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().

]]>
Ejemplo de un método que recibe tres parámetros y retorna un valor. Obtener código fuente.

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.

]]>
Solución a la tarea de propiedades de triángulos con métodos. Obtener código fuente.

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().

]]>
Ejemplos de invocación de un método que recibe parámetros. Obtener código fuente.

El siguiente ejemplo simplifica ligeramente la Tarea02 (2012-II) del juego de operaciones aritméticas utilizando métodos.

]]>
Juego reto matemático reutilizando código con métodos. Obtener código fuente.
Simplificación del método getNextLong(). Obtener código fuente.

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]: 
si

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]: 
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

Recursión es la capacidad de un método de invocarse a sí mismo.

]]>
Cálculo del factorial de un número en forma iterativa y recursiva. Obtener código fuente.

Atributos estáticos

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:

  1. main(). Recibe String args[], retorna nada. Simplemente invoca a correr().
  2. correr(). Recibe nada y retorna nada. Invoca a los demás métodos.
  3. imprimirMenu(). Recibe nada y retorna nada. Imprime el menú del programa en la pantalla.
  4. 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).
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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.
  10. 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.
  11. 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.

]]>
Programa de estadísticas modularizado en métodos. Obtener código fuente.

Miembros de instancia

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
]]>
]]>
Ejemplo incompleto de calculadora fraccional. Obtener código fuente: Fraccion.java, CalculadoraFraccional.java.

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.

Constructores

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.

]]>
La clase Fraccion con tres constructores. Obtener código fuente.

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.

Arreglos

]]>
Lee un arreglo de números reales y los ordena. Obtener código fuente: ArregloOrdenado.java.

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:


Arreglos literales

Los arreglos literales son aquellos cuyos valores se establecen en el código fuente y no cuando el programa corra. Ejmplos:

]]>
Java permite crear arreglos literales de la forma TipoDato[] arr = {valor1, valor2, ..., valorN};. Obtener código fuente.
]]>
Crea un arreglo literal de enteros y los pasa por parámetro a otra función. Obtener código fuente.

Nótese además cómo los arreglos fueron pasados por parámetro al método imprimirBilletes(long[], long[]).

Arreglos de objetos

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.

]]>
Cuando se crea un arreglo de objetos, Java crea realmente un arreglo de referencias a objetos. Obtener código fuente.

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.

]]>
Crea un arreglo de n estudiantes, pregunta sus datos, los imprime y calcula el promedio de los promedios ponderados de matrícula. Obtener código fuente.

Matrices

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.

]]>
En Java una matriz es un arreglo de arreglos. Obtener código fuente.

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.

Cadenas de caracteres (Strings)

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:

]]>
Los textos son arreglos de caracteres en Java y por ende son objetos. Obtener código fuente.
]]>
Algunas operaciones que pueden realizarse sobre cadenas de caracteres. Obtener código fuente.

Archivos

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.

]]>
Cargar matrices a partir de un archivo de texto con matrices aumentadas. Obtener código fuente.
]]>
Un archivo de texto con algunas matrices aumentadas y sus soluciones tras aplicar Gauss-Jordan. Útil para hacer pruebas. Obtener código fuente.

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:

]]>
Muestra el contenido de los archivos cuyos nombres son enviados por parámetros, y la opción -u lo hace en mayúsculas. Obtener código fuente.

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.

Archivos CSV

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.

]]>
Cargar matrices a partir de un archivo CSV e imprimir soluciones en otro archivo CSV. Obtener código fuente.
]]>
Un archivo CSV con matrices aumentadas que seran leidas por el programa. Obtener código fuente.
]]>
Un archivo CSV generado por el programa, con las mismas matrices aumentadas leídas del archivo anterior, mas soluciones ficticias. Obtener código fuente.

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.

Interfaces gráficas del usuario

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.

]]>
Ventana inicial para introducir pasos en el recorrido de un piso para calcular el área recorrida. Obtener código fuente.

Manejo de eventos

El siguiente ejemplo conecta el botón "Agregar" con un objeto manejador de eventos, el cual debe implementar la interfaz ActionListener.

]]>
Al presionar el botón "Agregar" Java invoca el método actionPerformed() del objeto BotonAceptarPresionado. Obtener código fuente.

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.

]]>
Al presionar el botón "Agregar" o presionar "Enter" en el campo de texto, Java invoca el método actionPerformed() de la clase AreaPiso. Obtener código fuente.

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.