Indice Valor
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
Fig. 7.2 冷 Inicialización de los elementos de un arreglo con valores predeterminados de cero.
La instrucción for (líneas 14 y 15) imprime el índice (representado por contador) y el valor de cada ele-
mento del arreglo (representado por arreglo[contador]). Al principio la variable de control contador es 0.
Los valores de los índices empiezan en 0, por lo que al utilizar un conteo con base cero se permite al ciclo
acceder a todos los elementos del arreglo. La condición de continuación de ciclo de la instrucción for
utiliza la expresión arreglo.length (línea 14) para determinar la longitud del arreglo. En este ejemplo la
longitud del arreglo es de 10, por lo que el ciclo continúa ejecutándose mientras el valor de la variable de
control contador sea menor que 10. El valor más alto para el índice de un arreglo de 10 elementos es 9,
por lo que al utilizar el operador “menor que” en la condición de continuación de ciclo se garantiza que
el ciclo no trate de acceder a un elemento que esté más alláá del final del arreglo (es decir, durante la itera-
ción final del ciclo, contador es 9). Pronto veremos lo que hace Java cuando encuentra un índice fuera de
rango en tiempo de ejecución.
crea un arreglo de cinco elementos con los valores de índices 0 a 4. El elemento n[0] se inicializa con 10,
n[1] se inicializa con 20, y así en lo sucesivo. Cuando el compilador encuentra la declaración de un arreglo
que incluye una lista inicializadora, cuentaa el número de inicializadores en la lista para determinar el tama-
ño del arreglo y después establece la operación new apropiada “tras bambalinas”.
La aplicación de la figura 7.3 inicializa un arreglo de enteros con 10 valores (línea 9) y muestra el arre-
glo en formato tabular. El código para mostrar los elementos del arreglo (líneas 14 y 15) es idéntico al de la
figura 7.2 (líneas 15 y 16).
Indice Valor
0 32
1 27
2 64
3 18
4 95
5 14
6 90
7 70
8 60
9 37
Fig. 7.4 冷 Cálculo de los valores a colocar en los elementos de un arreglo (parte 1 de 2).
Indice Valor
0 2
1 4
2 6
3 8
4 10
5 12
6 14
7 16
8 18
9 20
Fig. 7.4 冷 Cálculo de los valores a colocar en los elementos de un arreglo (parte 2 de 2).
La línea 8 utiliza el modificador final para declarar la variable constante LONGITUD_ARREGLO con el
valor 10. Las variables constantes deben inicializarse antess de usarlas, y no pueden modificarse de ahí en
adelante. Si trata de modificarr una variable final después de inicializarla en su declaración, el compilador
genera el siguiente mensaje de error:
7.4.5 Uso de gráficos de barra para mostrar en forma gráfica los datos de un arreglo
Muchos programas presentan datos a los usuarios en forma gráfica. Por ejemplo, con frecuencia los valores
numéricos se muestran como barras en un gráfico de barras. En dicho gráfico, las barras más largas repre-
sentan proporcionalmente los valores numéricos más grandes. Una manera sencilla de mostrar los datos
numéricos en forma gráfica es mediante un gráfico de barras que muestre cada valor numérico como una
barra de asteriscos (*).
A los profesores a menudo les gusta analizar la distribución de las calificaciones en un examen. Un
profesor podría graficar el número de calificaciones en cada una de las distintas categorías, para visualizar
la distribución de las calificaciones. Suponga que las calificaciones en un examen fueron 87, 68, 94, 100,
83, 78, 85, 91, 76 y 87. Se incluye una calificación de 100, dos calificaciones en el rango de 90 a 99, cuatro
calificaciones en el rango de 80 a 89, dos en el rango de 70 a 79, una en el rango de 60 a 69 y ninguna por
debajo de 60. Nuestra siguiente aplicación (figura 7.6) almacena estos datos de distribución de las califica-
ciones en un arreglo de 11 elementos, cada uno de los cuales corresponde a una categoría de calificaciones.
Por ejemplo, arreglo[0] indica el número de calificaciones en el rango de 0 a 9, arreglo[7] indica el
Distribucion de calificaciones:
00-09:
10-19:
20-29:
30-39:
40-49:
50-59:
60-69: *
70-79: **
80-89: ****
90-99: **
100: *
La aplicación lee los números del arreglo y grafica la información en forma de un gráfico de barras. Muestraa
cada rango de calificaciones seguido de una barra de asteriscos, que indican el número de calificaciones en
ese rango. Para etiquetar cada barra, las líneas 16 a 20 imprimen un rango de notas (por ejemplo, “70-79:”)
con base en el valor actual de contador. Cuando contador es 10, la línea 17 imprime 100 con una anchuraa
de campo de 5, seguida de dos puntos y un espacio, para alinear la etiqueta “100:” con las otras etiquetas de
las barras. La instrucción for anidada (líneas 23 y 24) imprime las barras en pantalla. Observe la condición
de continuación de ciclo en la línea 23 (estrellas < arreglo[contador]). Cada vez que el programa
llega al for interno, el ciclo cuenta desde 0 hasta arreglo[contador], con lo cual utiliza un valor en arre-
glo para determinar el número de asteriscos a mostrar en pantalla. En este ejemplo, ningún estudiante re-
cibió una calificación menor de 60, por lo que los valores de arreglo[0] hasta arreglo[5] son ceros, y no
se muestran asteriscos enseguida de los primeros seis rangos de calificaciones. En la línea 19, el especificador
de formato %02d indica que se debe dar formato a un valor int como un campo de dos dígitos. La bande-
ra 0 en el especificador de formato muestra un 0 a la izquierda para los valores con menos dígitos que la
anchura de campo (2).
Cara Frecuencia
1 999690
2 999512
3 1000575
4 999815
5 999781
6 1000627
Fig. 7.7 冷 Programa para tirar dados que utiliza arreglos en vez de switch.
La figura 7.7 utiliza el arreglo frecuencia (línea 10) para contar las ocurrencias de cada lado del dado.
La instrucción individual en la línea 14 de este programa sustituye las líneas 22 a 45 de la figura 6.7
7. La líneaa
14 utiliza el valor aleatorio para determinar qué elemento de frecuencia debe incrementar durante cada
iteración del ciclo. El cálculo en la línea 14 produce números aleatorios del 1 al 6, por lo que el arreglo
frecuencia debe ser lo bastante grande como para poder almacenar seis contadores. Sin embargo, utiliza-
mos un arreglo de siete elementos, en el cual ignoramos frecuencia[0]; es más lógico que el valor de cara
1 incremente a frecuencia[1] que a frecuencia[0]. Por ende, cada valor de cara se utiliza como subín-
dice para el arreglo frecuencia. En la línea 14, se evalúa primero el cálculo dentro de los corchetes para
determinar qué elemento del arreglo se debe incrementar, y después el operador ++ suma uno a ese elemen-
to. También sustituimos las líneas 49 a 51 de la figura 6.7 por un ciclo a través del arreglo frecuencia para
imprimir los resultados en pantalla (líneas 19 a 20). Cuando estudiemos las nuevas capacidades de progra-
mación funcional de Java SE 8 en el capítulo 17, le mostraremos cómo reemplazar las líneas 13-14 y 19-20
¡con una sola instrucción!
20 }
21 catch (ArrayIndexOutOfBoundsException e)
22 {
23 System.out.println(e); // invoca el método toString
24 System.out.printf( " respuestas[%d] = %d%n%n",
25 respuesta, respuestas[respuesta]);
26 }
27
7 }
28
29 System.out.printf(“%s%10s%n”, “Calificacion”, “Frecuencia”);
30
31 // imprime el valor de cada elemento del arreglo
32 for (int calificacion = 1; calificacion < frecuencia.length; calificacion++)
33 System.out.printf(“%6d%10d%n”, calificacion, frecuencia[calificacion]);
34 }
35 } // fin de la clase EncuestaEstudiantes
java.lang.ArrayIndexOutOfBoundsException: 14
respuestas[19] = 14
Calificacion Frecuencia
1 3
2 4
3 8
4 2
5 2
El arreglo frecuencia
Utilizamos el arreglo de seis elementoss llamado frecuencia (línea 11) para contar el número de ocurrencias
de cada respuesta. Cada elemento del arreglo se utiliza como un contadorr para uno de los posibles tipos de
respuestas de la encuesta, de tal forma que frecuencia[1] cuenta el número de estudiantes que calificaron
la comida como 1, frecuencia[2] cuenta el número de estudiantes que calificaron la comida como 2, y así
en lo sucesivo.
Sin importar el número de respuestas procesadas en la encuesta, el programa sólo requiere un arreglo de
seis elementos (en el cual se ignora el elemento cero) para resumir los resultados, ya que todos los valores
de las respuestas se encuentran entre 1 y 5, y los valores de subíndice para un arreglo de seis elementos
son del 0 al 5. En la salida del programa, la columna Frecuencia sintetiza sólo 19 de los 20 valores en el
arreglo respuestas; el último elemento del arreglo respuestas contiene una respuesta (intencional-
mente) incorrecta que no se contó. En la sección 7.5 hablaremos sobre lo que ocurre cuando el programa
de la figura 7.8 encuentra la respuesta inválida (14) en el último elemento del arreglo respuestas.
La clase Carta
La clase Carta (figura 7.9) contiene dos variables de instancia String (cara y palo) que se utilizan para
almacenar referencias al nombre de la cara y al del palo para una Carta específica. El constructor de
la clase (líneas 10 a 14) recibe dos objetos String que utiliza para inicializar cara y palo. El método
toString (líneas 17 a 20) crea un objeto String que consiste en la cara de la carta, el objeto String
“de ” y el palo de la carta. El método toString de Carta puede invocarse en forma explícita para obtener
la representación de cadena de un objeto Carta (por ejemplo, “As de Espadas”). El método toString de
un objeto se llama en forma implícita cuando el objeto se utiliza en donde se espera un objeto String
(por ejemplo, cuando printf imprime en pantalla el objeto como un String, usando el especificador
de formato %s, o cuando el objeto se concatena con un objeto String mediante el operador +). Para que
ocurra este comportamiento, toString debe declararse con el encabezado que se muestra en la figura 7.9.
La clase PaqueteDeCartas
La clase PaqueteDeCartas (figura 7.10) declara como variable de instancia un arreglo Carta llamado
paquete (línea 7). Un arreglo de tipo por referencia a se declara igual que cualquier otro arreglo. La
clase PaqueteDeCartas también declara la variable de instancia entera llamada cartaActual (línea 8), que
representa el número de secuencia (0 a 51) de la siguiente Carta a repartir del arreglo paquete, así como
una constante con nombre NUMERO_DE_CARTAS (línea 9), que indica el número de objetos Carta en el
paquete (52).
Fig. 7.10 冷 La clase PaqueteDeCartas representa un paquete de cartas de juego (parte 1 de 2).