0% encontró este documento útil (0 votos)
41 vistas21 páginas

Arreglos en Java: Ejemplos y Ejercicios

Cargado por

pablo villanueva
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
41 vistas21 páginas

Arreglos en Java: Ejemplos y Ejercicios

Cargado por

pablo villanueva
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Arreglos

Semana 9

Razón social
00.00.2015
¿Podemos resolver este problema?…
• Considere el siguiente programa (entrada subrayada):

¿Cuántos días de temperatura? 7


Temperatura alta del día 1: 45
Temperatura alta del día 2: 44
Temperatura alta del día 3: 39
Temperatura alta del día 4: 48
Temperatura alta del día 5: 37
Temperatura alta del día 6: 46
Temperatura alta del día 7: 53
Temp. Media = 44.6
4 días fueron superiores al promedio. 2
¿Por qué el problema es difícil, sin arreglos?
• Necesitamos cada valor de entrada dos veces:
– Para calcular el promedio (una suma acumulativa)
– Para contar cuántos estaban por encima del promedio

• Podríamos leer cada valor en una variable ... pero nosotros:


– No sabemos cuántos días son necesarios hasta que se ejecuta
el programa
– No sabemos cuántas variables declarar

• Necesitamos una forma de declarar muchas variables en un solo


paso.

Usaremos un arreglo para resolver el problema del clima:


Respuesta
// Lee las temperaturas del usuario, calcula el promedio y # días por encima del promedio.
import [Link].*;

public class Clima {


public static void main(String[] args) {
Scanner entrada = new Scanner([Link]);
[Link]("Cuántos días de temperatura?");
int dias = [Link]();

int[] temps = new int[dias]; // arreglo para almacenar temperatura del día
int sum = 0;

for (int i = 0; i < dias; i++) { // lee / almacena la temperatura de cada día
[Link](" Temperatura alta del Dia " + (i + 1) + " : ");
temps[i] = [Link]();
sum += temps[i];
}
double promedio = (double) sum / dias;

int contador = 0; // ver si cada día está por encima del promedio
for (int i = 0; i < dias; i++) {
if (temps[i] > promedio) {
contador++;
}
}

// informar resultados
[Link]("Temperatura promedio = %.1f\n", promedio);
[Link](contador + " dias superiores al promedio");
}
}
Limitaciones de los arreglos
• No puede cambiar el tamaño de una arreglo existente:

int[] a = new int[4];


[Link] = 10; // error

• No puede comparar matrices con == o equals:

int[] a1 = {42, -7, 1, 15};


int[] a2 = {42, -7, 1, 15};
if (a1 == a2) { ... } // false!
if ([Link](a2)) { ... } // false!

• Un arreglo no sabe cómo imprimirse:

int[] a1 = {42, -7, 1, 15};


[Link](a1); // [I@98f8c4]
La clase Arrays
La Clase Arrays en el paquete [Link] tiene métodos estáticos útiles para manipular
arreglos
Nombre del método Descripción
binarySearch (arreglo, valor) Devuelve el índice del valor dado en una matriz
ordenada (ó < 0 si no se encuentra)
copyOf (arreglo, longitud) Devuelve una nueva copia de un arreglo
equals (arreglo1, arreglo2) Devuelve verdadero si los dos arreglos contienen
los mismos elementos en el mismo orden
fill (arreglo, valor) Establece cada elemento del arreglo al valor dado
sort(arreglo) Organiza los elementos en orden
toString(arreglo) Devuelve un String que representa el arreglo, como
"[10, 30, -25, 17]"

Sintaxis: [Link](parametros)
[Link]

• [Link] acepta un arreglo como parámetro y


devuelve una representación String de sus elementos..

int[] e = {0, 2, 4, 6, 8};


e[1] = e[3] + e[4];
[Link]("e es " + [Link](e));

Salida:
e es [0, 14, 4, 6, 8]

–Debe importar [Link].*;


Ejercicio
Modifique el programa meteorológico para imprimir la siguiente salida:
¿Cuántos días de temperatura? 7
Temperatura alta del día 1: 45
Temperatura alta del día 2: 44
Temperatura alta del día 3: 39
Temperatura alta del día 4: 48
Temperatura alta del día 5: 37
Temperatura alta del día 6: 46
Temperatura alta del día 7: 53
Temp. Media = 44.6
4 días fueron superiores al promedio.
Temperaturas: [45, 44, 39, 48, 37, 46, 53]
Dos días más fríos: 37, 39
Dos días más calurosos: 53, 48 8
Respuesta
// Lee las temperaturas del usuario, calcula el promedio y # días por encima del promedio..
import [Link].*;

public class Clima2 {


public static void main(String[] args) {
...
int[] temps = new int[dias]; // arreglo para almacenar temperatura del día
... (el mismo que el programa anterior)

// informar resultados
[Link]("Temperatura promedio = %.1f\n", promedio);
[Link](contador + " dias superiores al promedio");

[Link]("Temperaturas: " + [Link](temps));


[Link](temps);
[Link]("Dos días más fríos: " + temps[0] + ", " + temps[1]);
[Link]("Dos días más calientes: " + temps[[Link] - 1] +
", " + temps[[Link] - 2]);
}
}
Matrices como parámetros - Intercambiar valores
public static void main(String[] args) {
int a = 7;
int b = 35;

// intercambia a con b?
a = b;
b = a;

[Link](a + " " + b);


}

– ¿Qué está mal con este código? ¿Cuál es su salida?

• El código rojo debe reemplazarse con:


int temp = a;
a = b;
b = temp;
Ejercicio
Escriba código que invierta los elementos de una matriz:

– Por ejemplo, si la matriz almacena inicialmente:


[11, 42, -5, 27, 0, 89]
– Luego, después de su código de inversión, debe
almacenar:
[89, 0, 27, -5, 42, 11]

• El código debería funcionar para una matriz de cualquier tamaño.


• Sugerencia: piense en intercambiar varios elementos ...
index 0 1 2 3 4 5
Intercambie pares de elementos desde
value 11
89 42
0 27
-5 27
-5 42
0 89
11
los bordes; trabajar hacia adentro
11
Algoritmo defectuoso
• ¿Qué hay de malo con este código?

int[] numeros = [11, 42, -5, 27, 0, 89];

// invierte la matriz
for (int i = 0; i < [Link]; i++) {
int temp = numeros[i];
numeros[i] = numeros[[Link] - 1 - i];
numeros[[Link] - 1 - i] = temp;
}

• ¡El bucle va demasiado lejos y deshace la matriz! Versión arreglada:

for (int i = 0; i < [Link] / 2; i++) {


int temp = numeros[i];
numeros[i] = numeros[[Link] - 1 - i];
numeros[[Link] - 1 - i] = temp;
} 12
Declarar un arreglo como parámetro
public static tipo nombreMetodo(tipo[] nombre) {

• Ejemplo:
// Devuelve el promedio de los números del arreglo dado.
public static double promedio(int[] numeros) {
int sum = 0;
for (int i = 0; i < [Link]; i++) {
sum += numeros[i];
}
return (double) sum / [Link];
}
– No especifica la longitud del arreglo(pero puede
examinarlo).
13
Llamar con un arreglo como parámetro
nombreMetodo(nombreArreglo);

• Ejemplo:

public class MiPrograma {


public static void main(String[] args) {
// calcule el CI promedio
int[] ci = {126, 84, 149, 167, 95};
double prom = promedio(ci);
[Link](" Promedio CI = " + prom);
}
...

– Tenga en cuenta que no escribe [] al pasar la matriz. 14


Return de un arreglo

public static tipo[] nombreMetodo(parametros) {

• Ejemplo:

// Devuelve una nueva matriz con dos copias de cada valor.


// Ejemplo: [1, 4, 0, 7] -> [1, 1, 4, 4, 0, 0, 7, 7]
public static int[] duplica(int[] numeros) {
int[] result = new int[2 * [Link]];
for (int i = 0; i < [Link]; i++) {
result[2 * i] = numeros[i];
result[2 * i + 1] = numeros[i];
}
return result;
} 15
Llamar a un método que retorna un arreglo
tipo[] nombre = nombreMetodo(parametros);

• Ejemplo:

public class MiPrograma {


public static void main(String[] args) {
int[] ci = {126, 84, 149, 167, 95};
int[] duplicado = duplica(ci);
[Link]([Link](duplicado));
}
...
• Salida:
[126, 126, 84, 84, 149, 149, 167, 167, 95, 95]

16
El bucle for mejorado
01 una forma más sencilla de recorrer todos los elementos de un arreglo u otro tipo
de colección Los dos puntos (:)
Declarar una variable de iteración que contendrá significa "EN"
un solo elemento del arreglo También se refieren al bucle mejorado
como for each y se lee: “PARA CADA cosa
EN la colección. .. "

Con cada iteración, se


Los elementos en el arreglo La colección de elementos sobre los que desea iterar. Imagine que en algún lugar anterior, el código decía:
asignará un elemento
DEBEN ser compatibles con String [] nameArray = {"Fred", "Mary", "Bob"};
diferente del arreglo a la
el tipo de variable declarada Con la primera iteración, la variable name tiene el valor de "Fred", y con la segunda iteración, el valor de
variable "name"
"Mary", etc.
En resumen significa: "Para cada elemento en nameArray, asigne el elemento a la variable 'name' y ejecute el cuerpo
del bucle".
Primera parte: Declaración de la variable de
iteración
Cómo lo ve el compilador:
•Use esta parte para declarar e inicializar una variable a 1. Cree una variable String llamada name y configúrela
usar dentro del cuerpo del bucle. Con cada iteración del
ciclo, esta variable contendrá un elemento diferente de la como nula.
colección. ¡El tipo de esta variable debe ser compatible 2. Asigne el primer valor de nameArray a name.
con los elementos del arreglo! Por ejemplo, no puede 3. Ejecute el cuerpo del bucle (el bloque de código
declarar una variable de iteración int para usar con un delimitado por llaves)
arreglo String [] 4. Asigne el siguiente valor en nameArray a name.
5. Repetir mientras todavía hay elementos en la matriz.
Segunda parte: La colección real
17
•Este debe ser una referencia a un arreglo u otra colección.
Ejercicios
¿Cuál de las siguientes alternativas usa la sintaxis ¿Cuál es el problema con el siguiente código?.
correcta?

a. int a[10] = new int[10];


b. int[10] a = new int[10];
c. []int a = [10]int;
d. int a[10];
e. int[] a = new int[10];

a. int[] a = {17, -3, 42, 5, 9, 28};


b. int a {17, -3, 42, 5, 9, 28};
c. int[] a = new int[6] {17, -3, 42, 5, 9, 28};
d. int[6] a = {17, -3, 42, 5, 9, 28};
e. int[] a = int [17, -3, 42, 5, 9, 28] {6};

18
Ejercicio
Escriba un programa Java que genere la siguiente salida. Use métodos estáticos para
Problema: escriba un método masFrecuenteDigito que devuelva
mostrar la estructura y eliminar la redundancia en la solución.

el valor del dígito que aparece con mayor frecuencia en un


número.
❑ Ejemplo: el número 669260267 contiene: un 0, dos 2s,
cuatro 6, un 7 y un 9.
❑ masFrecuenteDigito (669260267) devuelve 6.
❑ Si hay un empate, devuelva el dígito con el valor más
bajo.
❑ masFrecuenteDigito (57135203) devuelve 3.

19
Ejercicio – Histograma con arreglos
▪ Dado un archivo de puntajes
Escriba un programa Java que genere la de exámenes
siguiente deestáticos
salida. Use métodos enteros,
para como:
mostrar la estructura y eliminar la redundancia en la solución.
82
66
79
63
83
• Escriba un programa que imprima un histograma de
estrellas que indique el número de estudiantes que
obtuvieron cada puntaje.
85: *****
86: ************
87: ***
88: *
91: ****

20
FIN

FIN

21

También podría gustarte