Tabla de contenidos
En este ejercicio aprenderás a utilizar la línea de comandos para compilar y ejecutar programas escritos en Java. Antes de empezar a trabajar en estos ejercicios, conviene que leas primero esta breve guía sobre la línea de comandos en Windows.
Guarda el siguiente programa en un fichero llamado
HelloWorld.java
:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } }
Desde un terminal de línea de comandos, compílalo con el comando
javac
y ejecútalo con el comando java
:
C:\Users\Alumno>javac HelloWorld.java C:\Users\Alumno>java HelloWorld Hello World!
Como habrás comprobado, aparece en la línea de comandos el texto
"Hello World!". Eso es porque el programa
escribe ese mensaje en su salida estándar (System.out
).
Ejecuta de nuevo el programa anterior, pero esta vez haz que su
salida se guarde en un fichero, utilizando el operador de
redirección a fichero ">
" de la línea de comandos.
Uno de los posibles mecanismos para que un programa reciba los datos a procesar son los argumentos de línea de comandos. Normalmente se utilizan estos argumentos para especificar parámetros que regulen qué, cómo, etc. hace el programa, o para proporcionar datos de entrada de una forma distinta a como se hace mediante su entrada estándar.
El usuario proporciona estos argumentos en el momento de invocar
el programa. En Java, el programa los recibe como parámetro del
método main
, con tipo array de
cadenas de texto, donde cada cadena del
array contiene un argumento.
Para practicar este concepto, guarda y compila el siguiente programa:
public class HelloName { public static void main(String[] args) { String name = args[0]; System.out.println("Hello " + name); } }
Los argumentos se pasan al programa al invocar su ejecución, justo a continuación del nombre de la clase (con una separación de al menos un espacio en blanco):
C:\Users\Alumno>java HelloName Juan Hello Juan
También es posible pasar más de un argumento de línea de comandos separando cada uno del anterior mediante al menos un espacio en blanco. Guarda y compila el siguiente programa:
public class Adder { public static void main(String[] args) { int sum = 0; for (int i = 0; i < args.length; i++) { sum += Integer.parseInt(args[i]); } System.out.println(sum); } }
El programa recibe un número arbitrario de argumentos de línea de
comandos, cada uno de los cuales debe ser un número entero. Como
los programas Java siempre recogen los argumentos como cadenas de
texto, se está utilizando Integer.parseInt()
para obtener el entero que representa la cadena de texto
dada. Prueba a ejecutarlo pasándole varios números como
argumentos. Por ejemplo:
C:\Users\Alumno>java Adder 2 -3 6 4 9
Partiendo del programa anterior, escribe un programa que reciba
también como argumentos de línea de comandos una lista de
enteros, pero que en vez de la suma escriba en su salida
estándar el número más grande de la lista. Si no se proporcionan
argumentos de línea de comandos, el programa debe escribir el
número de tipo int
más pequeño que Java puede
representar (esto es, el valor de la constante Integer.MIN_VALUE
).
Haz un programa nuevo que combine los dos anteriores. El
programa recibirá como primer argumento de línea de comandos una
cadena de texto con valor "sum" o "max". El resto de los
argumentos de línea de comandos serán la lista de números
enteros. Si el primer parámetro es "sum", escribe la suma de los
números. Si es "max", escribe el valor más grande. Si es alguna
cadena distinta de las anteriores, o no se proporciona ningún
parámetro, debe mostrar un mensaje en la salida de
error (System.err
)
indicando el problema.
A continuación se muestran varios ejemplos de uso:
C:\Users\Alumno>java AdderOrMax sum 2 -3 6 4 9 C:\Users\Alumno>java AdderOrMax sum 0 C:\Users\Alumno>java AdderOrMax max 2 -3 6 4 6 C:\Users\Alumno>java AdderOrMax max -2147483648 C:\Users\Alumno>java AdderOrMax blah Invalid argument: blah
Ahora debes hacer un programa que haga lo mismo que el del apartado anterior, pero que organice el código en métodos de una misma clase, lo cual nos permitirá escribir un programa más elegante, reutilizable y modificable. Una posible forma de hacerlo es la siguiente (programa tú los trozos de código necesarios en los lugares que se indica):
public class NumbersCruncher { private int[] integers; public NumbersCruncher(int[] integers) { this.integers = integers; } public int sum() { int total = 0; for (int i = 0; i < integers.length; i++) { total += integers[i]; } return total; } public int max() { // TO DO: code this method return 0; } public static void main(String[] args) { int[] values; if (args.length >= 2) { values = new int[args.length - 1]; for (int i = 1; i < args.length; i++) { values[i - 1] = Integer.parseInt(args[i]); } } else { values = new int[0]; } NumbersCruncher cruncher = new NumbersCruncher(values); /* * TO DO: print the result of calling the sum() and * max() methods, or show some error messages if * necessary * */ } }
Añade las siguientes funciones al programa del apartado
anterior, haciendo que cada una de ellas se corresponda con otro
método en la clase NumbersCruncher
:
Si el primer argumento de línea de comandos es "sum-squared", imprime en la salida estándar la suma de los cuadrados de cada número entero de la lista. Por ejemplo:
C:\Users\Alumno>java NumbersCruncher sum-squared 3 -4 -1 0 2 30
Si el primer argumento de línea de comandos es "is-neg", imprime en la salida estándar la palabra "yes" si al menos uno de los números de la lista es negativo, o "no" en caso contrario. Por ejemplo:
C:\Users\Alumno>java NumbersCruncher is-neg 3 -4 -1 0 2 yes C:\Users\Alumno>java NumbersCruncher is-neg 3 0 1 7 2 2 no
Si el primer argumento de línea de comandos es "neg", imprime la lista resultante de cambiar el signo a cada número de la lista de entrada. Por ejemplo:
C:\Users\Alumno>java NumbersCruncher neg 3 -4 -1 0 2 -3 4 1 0 -2
Si el primer argumento de línea de comandos es "diff", imprime en la salida estándar una nueva lista de números en que cada número es la diferencia entre dos números consecutivos de la lista original, tomados de izquierda a derecha. Por ejemplo:
C:\Users\Alumno>java NumbersCruncher diff 3 6 2 10 7 3 -4 8 -3
Si no hay al menos dos enteros en la lista que se recibe, el programa debe mostrar un mensaje en la salida de error.
Si usas Eclipse para programar, también puedes especificar argumentos de línea de comandos cuando ejecutas un programa, aunque en realidad no estés usando una línea de comandos. Esto es útil porque te permite hacer ejecuciones de prueba de tu programa sin necesidad de salir del entorno de desarrollo. Para ello, vete al menú Run As / Run Configurations, seleccionando la pestaña Arguments y el cuadro de texto Program Arguments, tal y como se muestra en la siguiente captura de pantalla:
Eclipse muestra la salida estándar y la salida de error en una ventana llamada Console. Los datos de la salida de error salen por defecto en rojo para que los puedas distinguir más fácilmente.
Prueba a ejecutar alguno de los programas anteriores desde Eclipse, pasando argumentos de línea de comandos.