Universidad Carlos III de Madrid

Grado en Ingeniería Telemática/Grado en Ingeniería de Sistemas de Comunicaciones

Enero-Mayo 2014

Repaso: Fundamentos de Java

Lab Section1. Sesión 0 (laboratorio): La línea de comandos

Exercise Section1.1. Compilación y ejecución de programas en la línea de comandos

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.

Apartado 1

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.

Apartado 2

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

Apartado 3

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

Apartado 4

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

Apartado 5

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
         *
         */
    }
}

Apartado 6

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:

  1. 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
  2. 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
    
  3. 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 
  4. 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.

Apartado 7

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.