Arreglos Los arreglos son estructuras de datos que consisten de elementos de datos relacionados, del mismo tipo. Los arreglos son entidades son entidades de longitud fija: conservan la misma longitud una vez creados, aunque puede reasignarse una variable tipo arreglo de tal forma que haga referencia a un nuevo arreglo de distinta longitud. En Java, un arreglo es un grupo de variables (llamados elementos o componentes) que contienen valores, todos del mismo tipo. Los tipos en Java se dividen en dos categorías; tipos primitivos y tipos de referencia. El número de la posición de elementos se conoce formalmente como el índice o subíndice del elemento. Un programa puede hacer referencia a cualquiera de estos elementos mediante una expresión de acceso a un arreglo que incluye el nombre del arreglo, seguido por el índice del elemento específico encerrado entre corchetes ([]). El primer elemento en cualquier arreglo tiene el índice cero, y se conoce como elemento cero. Los elementos del arreglo c son c[0], c[1], c*2+,… Un programa puede utilizar una expresión como índice. Por ejemplo: Si a es 5, y b es 6 entonces c[ a + b ] += 2; suma dos al elemento c[11] del arreglo. Declaración y creación de arreglos. Los objetos arreglo ocupan espacio en memoria. Al igual que los demás objetos, los arreglos se crean con la palabra new. La siguiente declaración y expresión crea un objeto arreglo, que contiene 12 elementos int, y almacena la referencia del arreglo en la variable c: int c[ ] = new int[ 12 ]; Otra forma de hacerlo es: int c[ ]; // declara la variable arreglo c = new int[ 12 ]; // crea el arreglo; lo asigna a la variable tipo arreglo Para cada programa: 1. 2. 3. 4. Compile y ejecute el programa Realice un diagrama de flujo del mismo Identifique y explique cada uno de los métodos con los que esta compuesto el programa Enviar los resultados por e-mail y publicarlos en el blog Ejemplo de inicialización de arreglos y de manipulación de elementos // InicArreglo.java // Creación de un arreglo. public class InicArreglo { public static void main( String args[] ) { int arreglo[]; // declara un arreglo con el mismo nombre arreglo = new int[ 10 ]; // crea el espacio para el arreglo System.out.printf( "%s%8s\n", "Indice", "Valor" ); // encabezados de columnas // imprime el valor de cada elemento del arreglo for ( int contador = 0; contador < arreglo.length; contador++ ) System.out.printf( "%5d%8d\n", contador, arreglo[ contador ] ); } // fin de main } // fin de la clase InicArreglo Inicialización de un arreglo. Un programa puede crear un arreglo e inicializar sus elementos con un inicializador de arreglo, que es una lista de expresiones separadas por comas encerrada entre llaves ( { } ); la longitud del arreglo se determina en base al numero de elementos en la lista inicializadora. int n[ ] = { 10, 20, 30, 40, 50 } // InicArreglo.java // Inicialización de los elementos de un arreglo con un inicializador de arreglo. public class InicArreglo { public static void main( String args[] ) { // la lista inicializadora especifica el valor para cada elemento int arreglo[] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 }; System.out.printf( "%s%8s\n", "Indice", "Valor" ); // encabezados de columnas // imprime el valor del elemento de cada arreglo for ( int contador = 0; contador < arreglo.length; contador++ ) System.out.printf( "%5d%8d\n", contador, arreglo[ contador ] ); } // fin de main } // fin de la clase InicArreglo Cálculo de valores a guardar en un arreglo. El siguiente ejemplo crea un arreglo de elementos y asigna a cada elemento uno de los enteros pares del 2 al 20 (2, 4, 6, …, 20). Después, la aplicación muestra el arreglo en forma tabular. La instrucción for calcula el valor de un elemento del arreglo, multiplicando el valor actual de la variable de control contador por 2, y después le suma 2. Si trata de modificar una variable final después de inicializarla en su declaración, el compilador genera el siguiente mensaje: Cannot assign a value to final variable nombrevariable Si se trata de accede al valor de una variable final antes de inicializarla, el compilador produce lo siguiente: Variable nombreVariable migth not have been initialized // InicArreglo.java // Cálculo de los valores a colocar en los elementos de un arreglo. public class InicArreglo { public static void main( String args[] ) { final int LONGITUD_ARREGLO = 10; // declara la constante int arreglo[] = new int[ LONGITUD_ARREGLO ]; // crea el arreglo // calcula el valor para cada elemento del arreglo for ( int contador = 0; contador < arreglo.length; contador++ ) arreglo[ contador ] = 2 + 2 * contador; System.out.printf( "%s%8s\n", "Indice", "Valor" ); // encabezados de columnas // imprime el valor de cada elemento del arreglo for ( int contador = 0; contador < arreglo.length; contador++ ) System.out.printf( "%5d%8d\n", contador, arreglo[ contador ] ); } // fin de main } // fin de la clase InicArreglo Uso de gráficos de barra para mostrar los datos de un arreglo en forma gráfica: Con frecuencia los valores numéricos se muestran como barras en un gráfico de barras, los datos numéricos en forma gráfica muestran cada valor numérico con una barra de asteriscos. // SumaArreglo.java // Cálculo de la suma de los elementos de un arreglo. public class SumaArreglo { public static void main( String args[] ) { int arreglo[] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 }; int total = 0; // suma el valor de cada elemento al total for ( int contador = 0; contador < arreglo.length; contador++ ) total += arreglo[ contador ]; System.out.printf( "Total de los elementos del arreglo: %d\n", total ); } // fin de main } // fin de la clase SumaArreglo Programa para imprimir gráficos de barras. // GraficoBarras.java // Programa para imprimir gráficos de barras. public class GraficoBarras { public static void main( String args[] ) { int arreglo[] = { 0, 0, 0, 0, 0, 0, 1, 2, 4, 2, 1 }; System.out.println( "Distribucion de calificaciones:" ); // para cada elemento del arreglo, imprime una barra del gráfico for ( int contador = 0; contador < arreglo.length; contador++ ) { // imprime etiqueta de la barra ( "00-09: ", ..., "90-99: ", "100: " ) if ( contador == 10 ) System.out.printf( "%5d: ", 100 ); else System.out.printf( "%02d-%02d: ", contador * 10, contador * 10 + 9 ); // imprime barra de asteriscos for ( int estrellas = 0; estrellas < arreglo[ contador ]; estrellas++ ) System.out.print( "*" ); System.out.println(); // inicia una nueva línea de salida } // fin de for externo } // fin de main } // fin de la clase GraficoBarras Uso de los elementos de un arreglo como contadores Los programas utilizan variables tipo contador para sintetizar datos, como los resultados de una encuesta. El siguiente ejercicio utiliza contadores separados, para tirar dados y rastrear el número de veces que aparecería cada una de las caras de un dado con seis lados, al tiempo que la aplicación tiraba el dado 6000 veces. // TirarDado.java // Tira un dado de seis lados 6000 veces. import java.util.Random; public class TirarDado { public static void main( String args[] ) { Random numerosAleatorios = new Random(); // generador de números aleatorios int frecuencia[] = new int[ 7 ]; // arreglo de contadores de frecuencia // tira el dado 6000 veces; usa el valor del dado como índice de frecuencia for ( int tiro = 1; tiro <= 6000; tiro++ ) ++frecuencia[ 1 + numerosAleatorios.nextInt( 6 ) ]; System.out.printf( "%s%10s\n", "Cara", "Frecuencia" ); // imprime el valor de cada elemento del arreglo for ( int cara = 1; cara < frecuencia.length; cara++ ) System.out.printf( "%4d%10d\n", cara, frecuencia[ cara ] ); } // fin de main } // fin de la clase TirarDado Instrucción for mejorada. Para esto la instrucción for itera a través de los elementos en un arreglo. La sintaxis de una instrucción for mejorada es: for ( parámetro : nombreArreglo ) instrucción en donde parámetro tiene dos partes: un tipo y un identificador (por ejemplo, int numero), y nombreArreglo es el arreglo a través del cual se iterará. El tipo del parámetro debe concordar con el tipo de elementos de un arreglo. // PruebaForMejorado.java // Uso de la instrucción for mejorada para sumar el total de enteros en un arreglo. public class PruebaForMejorado { public static void main( String args[] ) { int arreglo[] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 }; int total = 0; // suma el valor de cada elemento al total for ( int numero : arreglo ) total += numero; System.out.printf( "Total de elementos del arreglo: %d\n", total ); } // fin de main } // fin de la clase PruebaForMejorado Paso de arreglos a los métodos Para pasar un argumento tipo arreglo a un método, se especifica el nombre del arreglo sin corchetes. Por ejemplo, si el arreglo TemperaturasPorHora se declara como double temperaturasPorHora[ ] = new double[ 24 ]; entonces la llamada al método modificarArreglo( temperaturasPorHora) pasa la referencia del arreglo temperaturasPorHora al método modificarArreglo. Todo objeto arreglo “conoce” su propia longitud ( a través de su campo length) Cuando un argumento para un método es todo, o un elemento individual de un arreglo de un tipo por referencia, el método llamado recibe una copia de la referencia. Cuando un argumento para un método es un elemento individual de un arreglo de un tipo primitivo, el método llamado recibe una copia del valor del elemento. Dichos valores primitivos se conocen como escalares o cantidades escalares. Para pasar un elemento individual de un arreglo a un método, se debe usar el nombre indexado del elemento del arreglo como argumento en la llamada al método. Paso de arreglos y elementos individuales de un arreglo a los métodos. // PasoArreglo.java // paso de arreglos y elementos individuales de un arreglo a los métodos. public class PasoArreglo { // main crea el arreglo y llama a modificarArreglo y a modificarElemento public static void main( String args[] ) { int arreglo[] = { 1, 2, 3, 4, 5 }; System.out.println( "Efectos de pasar una referencia a un arreglo completo:\n" + "Los valores del arreglo original son:" ); // imprime los elementos originales del arreglo for ( int valor : arreglo ) System.out.printf( " %d", valor ); modificarArreglo( arreglo ); // pasa la referencia al arreglo System.out.println( "\n\nLos valores del arreglo modificado son:" ); // imprime los elementos modificados del arreglo for ( int valor : arreglo ) System.out.printf( " %d", valor ); System.out.printf( "\n\nEfectos de pasar el valor de un elemento del arreglo:\n" + "arreglo[3] antes de modificarElemento: %d\n", arreglo[ 3 ] ); modificarElemento( arreglo[ 3 ] ); // intento por modificar arreglo[ 3 ] System.out.printf( "arreglo[3] despues de modificarElemento: %d\n", arreglo[ 3 ] ); } // fin de main // multiplica cada elemento de un arreglo por 2 public static void modificarArreglo( int arreglo2[] ) { for ( int contador = 0; contador < arreglo2.length; contador++ ) arreglo2[ contador ] *= 2; } // fin del método modificarArreglo // multiplica el argumento por 2 public static void modificarElemento( int elemento ) { elemento *= 2; System.out.printf( "Valor del elemento en modificarElemento: %d\n", elemento ); } // fin del método modificarElemento } // fin de la clase PasoArreglo Almacenar las calificaciones de los estudiantes en un arreglo en la clase LibroCalificaciones El arreglo de calificaciones se declara como una variable de instancia (7), cada objeto de LibroCalificaciones mantiene su propio conjunto de calificaciones. El constructor de la clase (10-14) tiene dos parámetros; el nombre del curso y un arreglos de calificaciones. Cuando una aplicación crea un objetoLibroCalificaciones, la aplicación pasa un arreglo int existente en el constructor, el cual asigna la referencia del arreglo a la variable de instancia de calificaciones (13). El tamaño del arreglo calificaciones se determina en base a la clase que pasa el arreglo al constructor Por lo tanto, un objeto LibroCalificaciones puede procesar un numero de calificaciones variable. // LibroCalificaciones.java // Libro de calificaciones que utiliza un arreglo para almacenar las calificaciones de una prueba. public class LibroCalificaciones { private String nombreDelCurso; // nombre del curso que representa este LibroCalificaciones private int calificaciones[]; // arreglo de calificaciones de estudiantes // el constructor de dos argumentos inicializa nombreDelCurso y el arreglo calificaciones public LibroCalificaciones( String nombre, int arregloCalif[] ) { nombreDelCurso = nombre; // inicializa nombreDelCurso calificaciones = arregloCalif; // almacena las calificaciones } // fin del constructor de LibroCalificaciones con dos argumentos // método para establecer el nombre del curso public void establecerNombreDelCurso( String nombre ) { nombreDelCurso = nombre; // almacena el nombre del curso } // fin del método establecerNombreDelCurso // método para obtener el nombre del curso public String obtenerNombreDelCurso() { return nombreDelCurso; } // fin del método obtenerNombreDelCurso // muestra un mensaje de bienvenida al usuario de LibroCalificaciones public void mostrarMensaje() { // obtenerNombreDelCurso obtiene el nombre del curso System.out.printf( "Bienvenido al libro de calificaciones para\n%s!\n\n", obtenerNombreDelCurso() ); } // fin del método mostrarMensaje // realiza varias operaciones sobre los datos public void procesarCalificaciones() { // imprime el arreglo de calificaciones imprimirCalificaciones(); // llama al método obtenerPromedio para calcular la calificación promedio System.out.printf( "\nEl promedio de la clase es %.2f\n", obtenerPromedio() ); // llama a los métodos obtenerMinima y obtenerMaxima System.out.printf( "La calificacion mas baja es %d\nLa calificacion mas alta es %d\n\n", obtenerMinima(), obtenerMaxima() ); // llama a imprimirGraficoBarras para imprimir el gráfico de distribución de calificaciones imprimirGraficoBarras(); } // fin del método procesarCalificaciones // busca la calificación más baja public int obtenerMinima() { int califBaja = calificaciones[ 0 ]; // asume que calificaciones[ 0 ] es la más baja // itera a través del arreglo de calificaciones for ( int calificacion : calificaciones ) { // si calificación es menor que califBaja, se asigna a califBaja if ( calificacion < califBaja ) califBaja = calificacion; // nueva calificación más baja } // fin de for return califBaja; // devuelve la calificación más baja } // fin del método obtenerMinima // busca la calificación más alta public int obtenerMaxima() { int califAlta = calificaciones[ 0 ]; // asume que calificaciones[ 0 ] es la más alta // itera a través del arreglo de calificaciones for ( int calificacion : calificaciones ) { // si calificacion es mayor que califAlta, se asigna a califAlta if ( calificacion > califAlta ) califAlta = calificacion; // nueva calificación más alta } // fin de for return califAlta; // devuelve la calificación más alta } // fin del método obtenerMaxima // determina la calificación promedio de la prueba public double obtenerPromedio() { int total = 0; // inicializa el total // suma las calificaciones para un estudiante for ( int calificacion : calificaciones ) total += calificacion; // devuelve el promedio de las calificaciones return (double) total / calificaciones.length; } // fin del método obtenerPromedio // imprime grafico de barras que muestra la distribución de las calificaciones public void imprimirGraficoBarras() { System.out.println( "Distribucion de calificaciones:" ); // almacena la frecuencia de las calificaciones en cada rango de 10 calificaciones int frecuencia[] = new int[ 11 ]; // para cada calificación, incrementa la frecuencia apropiada for ( int calificacion : calificaciones ) ++frecuencia[ calificacion / 10 ]; // para cada frecuencia de calificación, imprime una barra en el gráfico for ( int cuenta = 0; cuenta < frecuencia.length; cuenta++ ) { // imprime etiquetas de las barras ( "00-09: ", ..., "90-99: ", "100: " ) if ( cuenta == 10 ) System.out.printf( "%5d: ", 100 ); else System.out.printf( "%02d-%02d: ", cuenta * 10, cuenta * 10 + 9 ); // imprime barra de asteriscos for ( int estrellas = 0; estrellas < frecuencia[ cuenta ]; estrellas++ ) System.out.print( "*" ); System.out.println(); // inicia una nueva línea de salida } // fin de for externo } // fin del método imprimirGraficoBarras // imprime el contenido del arreglo de calificaciones public void imprimirCalificaciones() { System.out.println( "Las calificaciones son:\n" ); // imprime la calificación de cada estudiante for ( int estudiante = 0; estudiante < calificaciones.length; estudiante++ ) System.out.printf( "Estudiante %2d: %3d\n", estudiante + 1, calificaciones[ estudiante ] ); } // fin del método imprimirCalificaciones } // fin de la clase LibroCalificaciones La clase PruebaLibroCalificaciones para demostrar la clase libroCalificaciones // LibroCalificaciones.java // Libro de calificaciones que utiliza un arreglo para almacenar las calificaciones de una prueba. public class LibroCalificaciones { private String nombreDelCurso; // nombre del curso que representa este LibroCalificaciones private int calificaciones[]; // arreglo de calificaciones de estudiantes // el constructor de dos argumentos inicializa nombreDelCurso y el arreglo calificaciones public LibroCalificaciones( String nombre, int arregloCalif[] ) { nombreDelCurso = nombre; // inicializa nombreDelCurso calificaciones = arregloCalif; // almacena las calificaciones } // fin del constructor de LibroCalificaciones con dos argumentos // método para establecer el nombre del curso public void establecerNombreDelCurso( String nombre ) { nombreDelCurso = nombre; // almacena el nombre del curso } // fin del método establecerNombreDelCurso // método para obtener el nombre del curso public String obtenerNombreDelCurso() { return nombreDelCurso; } // fin del método obtenerNombreDelCurso // muestra un mensaje de bienvenida al usuario de LibroCalificaciones public void mostrarMensaje() { // obtenerNombreDelCurso obtiene el nombre del curso System.out.printf( "Bienvenido al libro de calificaciones para\n%s!\n\n", obtenerNombreDelCurso() ); } // fin del método mostrarMensaje // realiza varias operaciones sobre los datos public void procesarCalificaciones() { // imprime el arreglo de calificaciones imprimirCalificaciones(); // llama al método obtenerPromedio para calcular la calificación promedio System.out.printf( "\nEl promedio de la clase es %.2f\n", obtenerPromedio() ); // llama a los métodos obtenerMinima y obtenerMaxima System.out.printf( "La calificacion mas baja es %d\nLa calificacion mas alta es %d\n\n", obtenerMinima(), obtenerMaxima() ); // llama a imprimirGraficoBarras para imprimir el gráfico de distribución de calificaciones imprimirGraficoBarras(); } // fin del método procesarCalificaciones // busca la calificación más baja public int obtenerMinima() { int califBaja = calificaciones[ 0 ]; // asume que calificaciones[ 0 ] es la más baja // itera a través del arreglo de calificaciones for ( int calificacion : calificaciones ) { // si calificación es menor que califBaja, se asigna a califBaja if ( calificacion < califBaja ) califBaja = calificacion; // nueva calificación más baja } // fin de for return califBaja; // devuelve la calificación más baja } // fin del método obtenerMinima // busca la calificación más alta public int obtenerMaxima() { int califAlta = calificaciones[ 0 ]; // asume que calificaciones[ 0 ] es la más alta // itera a través del arreglo de calificaciones for ( int calificacion : calificaciones ) { // si calificacion es mayor que califAlta, se asigna a califAlta if ( calificacion > califAlta ) califAlta = calificacion; // nueva calificación más alta } // fin de for return califAlta; // devuelve la calificación más alta } // fin del método obtenerMaxima // determina la calificación promedio de la prueba public double obtenerPromedio() { int total = 0; // inicializa el total // suma las calificaciones para un estudiante for ( int calificacion : calificaciones ) total += calificacion; // devuelve el promedio de las calificaciones return (double) total / calificaciones.length; } // fin del método obtenerPromedio // imprime grafico de barras que muestra la distribución de las calificaciones public void imprimirGraficoBarras() { System.out.println( "Distribucion de calificaciones:" ); // almacena la frecuencia de las calificaciones en cada rango de 10 calificaciones int frecuencia[] = new int[ 11 ]; // para cada calificación, incrementa la frecuencia apropiada for ( int calificacion : calificaciones ) ++frecuencia[ calificacion / 10 ]; // para cada frecuencia de calificación, imprime una barra en el gráfico for ( int cuenta = 0; cuenta < frecuencia.length; cuenta++ ) { // imprime etiquetas de las barras ( "00-09: ", ..., "90-99: ", "100: " ) if ( cuenta == 10 ) System.out.printf( "%5d: ", 100 ); else System.out.printf( "%02d-%02d: ", cuenta * 10, cuenta * 10 + 9 ); // imprime barra de asteriscos for ( int estrellas = 0; estrellas < frecuencia[ cuenta ]; estrellas++ ) System.out.print( "*" ); System.out.println(); // inicia una nueva línea de salida } // fin de for externo } // fin del método imprimirGraficoBarras // imprime el contenido del arreglo de calificaciones public void imprimirCalificaciones() { System.out.println( "Las calificaciones son:\n" ); // imprime la calificación de cada estudiante for ( int estudiante = 0; estudiante < calificaciones.length; estudiante++ ) System.out.printf( "Estudiante %2d: %3d\n", estudiante + 1, calificaciones[ estudiante ] ); } // fin del método imprimirCalificaciones } // fin de la clase LibroCalificaciones La clase PruebaLibroCalificaciones para demostrar la clase LibroCalificaciones // Fig. 7.15: PruebaLibroCalificaciones.java // Crea objeto LibroCalificaciones, usando un arreglo de calificaciones. public class PruebaLibroCalificaciones { // el método main comienza la ejecución del programa public static void main( String args[] ) { // arreglo unidimensional de calificaciones de estudiantes int arregloCalif[] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 }; LibroCalificaciones miLibroCalificaciones = new LibroCalificaciones( "CS101 Introduccion a la programacion en Java", arregloCalif ); miLibroCalificaciones.mostrarMensaje(); miLibroCalificaciones.procesarCalificaciones(); } // fin de main } // fin de la clase PruebaLibroCalificaciones