AnteriorPosterior

7.4. Los arrays

Por: Nacho Cabanes
Actualizado: 26-04-2019 13:56
Tiempo de lectura estimado: 13 min.

 

Java

7.4. Los arrays

Imaginemos que tenemos que realizar cálculos estadísticos con 10 números que introduzca el usuario. Parece evidente que tiene que haber una solución más cómoda que definir 10 variables distintas y escribir 10 veces las instrucciones de avisar al usuario, leer los datos que teclee, y almacenar esos datos. Si necesitamos manejar 100, 1.000 o 10.000 datos, resulta todavía más claro que no es eficiente utilizar una variable para cada uno de esos datos.

Por eso se emplean los arrays (que en ocasiones también se llaman "matrices" o "vectores", por similitud con estas estructuras matemáticas, y que algunos autores traducen como "arreglos"). Un array es una variable que puede contener varios datos del mismo tipo. Para acceder a cada uno de esos datos, indicaremos su posición entre corchetes. Por ejemplo, si definimos una variable llamada "m" que contenga 10 números enteros, accederemos al primero de estos números como m[0], el último como m[9] y el quinto como m[4] (se empieza a numerar a desde 0 y se termina en n-1). Veamos un ejemplo que halla la media de cinco números (con decimales, "double"):

// Array1.java
// Aplicación de ejemplo con Arrays
// Introducción a Java, Nacho Cabanes
 
class Array1 {
    public static void main( String args[] ) {
        double[] a = { 10, 23.5, 15, 7, 8.9 };
        double total = 0;
        int i;
 
        for (i=0; i<5; i++)
            total += a[i];
 
        System.out.println( "La media es:" );
        System.out.println( total / 5 );
    }
}

Para definir la variable podemos usar dos formatos: "double a[]" (que es la sintaxis habitual en C y C++, no recomendada en Java) o bien "double[] a" (que es la sintaxis recomendada en Java, y posiblemente es una forma más "razonable" de escribir "la variable a es un array de doubles").

Lo habitual no será conocer los valores en el momento de teclear el programa, como hemos hecho esta vez. Será mucho más frecuente que los datos los teclee el usuario o bien que los leamos de algún fichero, los calculemos, etc. En este caso, tendremos que reservar el espacio, y los valores los almacenaremos a medida que vayamos conociéndolos.

Para ello, primero declararíamos que vamos a utilizar un array, así:

double[] datos;

y después reservaríamos espacio (por ejemplo, para 1.000 datos) con

datos = new double [1000];

Si conocemos el tamaño desde el primer momento, estos dos pasos se pueden dar en uno solo, así:

double[] datos = new double [1000];

y daríamos los valores de una forma similar a la que hemos visto en el ejemplo anterior:

datos[25] = 100 ; datos[0] = i*5 ; datos[j+1] = (j+5)*2;

Vamos a ver un ejemplo algo más completo, con tres arrays de números enteros, llamados a, b y c. A uno de ellos (a) le daremos valores al definirlo, otro lo definiremos en dos pasos (b) y le daremos fijos, y el otro lo definiremos en un paso y le daremos valores calculados a partir de ciertas operaciones:

// Array2.java
// Aplicación de ejemplo con Arrays
// Introducción a Java, Nacho Cabanes
 
class Array2 {
    public static void main( String args[] ) {
 
        int i; // Para repetir con bucles "for"
 
        // ------  Primer array de ejemplo, valores prefijados
        int[] a = { 10, 12345, -15, 0, 7 };
        System.out.print( "Los valores de a son: " );
        for (i=0; i<5; i++)
            System.out.print( a[i] + " " );
        System.out.println( );
 
        // ------  Segundo array de ejemplo, valores uno por uno
        int[] b;
        b = new int [3];
        b[0] = 15; b[1] = 132; b[2] = -1;
        System.out.print( "Los valores de b son: " );
        for (i=0; i<3; i++)
            System.out.print( b[i] + " " );
        System.out.println( );
 
        // ------  Tercer array de ejemplo, valores con "for"
        int j = 4;
        int[] c = new int[j];
        for (i=0; i < j; i++)
            c[i] = (i+1)*(i+1);
        System.out.print( "Los valores de c son: " );
        for (i=0; i < j; i++)
            System.out.print( c[i] + " " );
        System.out.println( );
   }
}

Y si queremos que sea el usuario el que introduzca los valores y luego mostrar esos valores, lo podríamos conseguir de esta manera:

// Array3.java
// Leer de teclado y mostrar datos de un array
// Introducción a Java, Nacho Cabanes
 
import java.util.Scanner;
 
class Array3 {
    public static void main( String args[] ) {
 
        Scanner teclado = new Scanner(System.in);
 
        int[] datos = new int[5];
        for (int i=0; i<5; i++)
        {
            System.out.print( "Deme el dato "+i+": " );
            datos[i] = teclado.nextInt();
        }
 
        for (int i=4; i>=0; i--)
        {
            System.out.println( "El dato "+ i +" vale " + datos[i] );
        }
    }
}

Un programa no debería tener "números mágicos" prefijados dentro del fuente, como ese 5. Pueden no ser evidentes cuando se revise el programa más adelante, y pueden dar lugares a errores si tenemos más adelante que modificarlos y no lo hacemos en todos los sitios en los que aparezca. Por eso, será preferible usar "constantes" para esos números que indican valores especiales como el tamaño del array y que no van a cambiar durante el funcionamiento del programa, así:

// Array4.java
// Leer y mostrar datos de un array, usando constantes
// Introducción a Java, Nacho Cabanes
 
import java.util.Scanner;
 
class Array4 {
    public static void main( String args[] ) {
 
        Scanner teclado = new Scanner(System.in);
        final int TAMANYO = 5;
 
        int[] datos = new int[TAMANYO];
        for (int i=0; i<TAMANYO; i++)
        {
            System.out.print( "Deme el dato "+i+": " );
            datos[i] = teclado.nextInt();
        }
 
        for (int i=TAMANYO-1; i>=0; i--)
        {
            System.out.println( "El dato "+ i +" vale " + datos[i] );
        }
    }
}

Como se ve en ese ejemplo, para indicar que un dato será constante usaremos la palabra "final" y existe el convenio de usar nombres totalmente en mayúsculas para las constantes.

Ejercicio propuesto 7.4.1: Crea un programa que pida al usuario 5 números reales, que guardará en un array. Luego calculará y mostrará su media (la suma de todos los datos, dividida entre la cantidad de datos) y los valores que están por encima de la media.

Ejercicio propuesto 7.4.2: Crea un programa que pida al usuario 8 números enteros, los guarde en un array, halle y muestre el valor más alto que contiene (su máximo) y el valor más bajo que contiene (su mínimo). Pista: puedes empezar suponiendo que el primer valor es el máximo provisional; a partir de ahí, recorre todos los demás con un "for"; si alguno de los datos es mayor que el máximo provisional, pasará a ser el nuevo máximo; el mínimo se calculará de forma similar.

Ejercicio propuesto 7.4.3: Crea un programa que prepare un array que contenga la cantidad de días que hay en cada mes del año. A partir de entonces el usuario introducirá un número de mes (por ejemplo, 4 para abril) y el programa le responderá cuántos días tiene ese mes. Se repetirá hasta que el usuario introduzca un mes menor que 1 o mayor que 12.

Ejercicio propuesto 7.4.4: Crea un programa que prepare un array que contenga el nombre de cada mes del año. El usuario introducirá un número de mes (por ejemplo, 4 para abril) y el programa le dirá el nombre de ese mes.

Ejercicio propuesto 7.4.5: Si has estudiado estadística, crea un programa que pida al usuario 10 números reales de doble precisión, los guarde en un array y luego muestre su media aritmética, varianza y desviación típica.

Ejercicio propuesto 7.4.6: Crea un programa que pida al usuario 10 números enteros largos, los guarde en un array y después pregunte qué número quiere buscar y le contestará si ese número forma parte de los 10 iniciales o no. Volverá a preguntar qué número desea buscar, hasta que el usuario introduzca "-1" para indicar que no quiere seguir buscando.

Ejercicio propuesto 7.4.7: Crea un programa que prepare un array de hasta 1000 números enteros. El usuario podrá elegir añadir un nuevo dato (tendrás que llevar la cuenta la cantidad de datos que ya hay introducidos), buscar para comprobar si aparece un cierto dato, o salir del programa.

Ejercicio propuesto 7.4.8: Si has estudiado lo que es un vector, crea un dos arrays de tres elementos, cada uno de los cuales representará un vector de tres dimensiones. Pide al usuario los datos para ambos vectores, luego muéstralos en la forma "(5, 7, -2)", después calcula (y muestra) su producto escalar y su producto vectorial.

Si no necesitamos una única serie de datos sino varias, podemos usar un array bidimensional. Por ejemplo, podríamos crear un array con dos filas de dos elementos cada una, así:

// ArrayBi.java
// Ejemplo de array bidimensional
// Introducción a Java, Nacho Cabanes
 
class ArrayBi {
    public static void main( String args[] ) {
 
        int[][] datos = new int[2][2];
        datos[0][0] = 5;
        datos[0][1] = 1;
        datos[1][0] = -2;
        datos[1][1] = 3;
 
        for (int i=0; i<2; i++)
            for (int j=0; j<2; j++)
                System.out.println( "El dato "+ i + "," + j +
                    " vale " + datos[i][j] );
    }
}

Ejercicio propuesto 7.4.9: Si has estudiado lo que es una matriz, crea un array de 3x3 elementos, pide al usuario los datos de esas 9 posiciones y luego calcula el determinante de esa matriz bidimensional.

Ejercicio propuesto 7.4.10: Crea un programa que cree un array de 5x5 caracteres, lo rellene con puntos, excepto la segunda fila, que estará rellena de letras "A" y luego muestra el contenido del array en pantalla. Deberá aparecer algo como:

.....
AAAAA
.....
.....
.....

Ejercicio propuesto 7.4.11: Crea un programa que cree un array de 5x5 caracteres, lo rellene con puntos en todas las posiciones excepto aquellas en las que el número de fila es igual al número de columna, en las que pondrá un X. Luego muestra su contenido en pantalla, que deberá ser algo como:

X....
.X...
..X..
...X.
....X

13031 visitas desde el 26-04-2019

AnteriorPosterior