ing1310 { introducci on a la computaci on arregloscreveco/progra/arreglos... · 2012. 1. 9. ·...
TRANSCRIPT
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
ING1310 – Introduccion a la Computacion
ArreglosArreglos Multidimensionales
Carlos [email protected]
Facultad de Ingenierıa/Universidad de los Andes/Chile
Rev : 213
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 1 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
En esta clase
1 Resumen Clase Anterior
2 Arreglos UnidimensionalesDefinicion
3 EjemplosSumarMayor
4 EjercicioEnunciadoSolucion
5 Arreglos MultidimensionalesMotivacionEjemplos
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 2 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Resumen Clase Anterior
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 3 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Resumen Clase 11
• El comando this nos sirve para referirnos inequıvocamente a unelemento propio del objeto.
• De esta forma podemos evitar problemas con identificadores igualespara variables dentro de metodos y atributos.
• Existen tipos por valor y referencia que se comportan distintorespecto a su contenido.
• Un tipo por valor contiene el dato.• Un tipo por referencia contiene una referencia al dato, no el dato
mismo.• Esto tiene implicancias al momento de realizar copias de las variables
segun sea su tipo.
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 4 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Resumen Clase 11
• Los arreglos permiten manejar una lista de objetos desde solamenteun objeto.
• Todos los arreglos son tipos por referencia → hay que crearlos• Al crearlos se les debe asignar un largo fijo para toda su vida.• Cuando se crean no se crean sus elementos.
• Para acceder a los elementos del arreglo lo hacemos a traves de unındice
• El primer elemento es el 0• El ultimo elemento es el length− 1
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 5 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Arreglos Unidimensionales
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 6 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Arreglos Unidimensionales
Definicion
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 7 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Definicion
• Los arreglos son objetos que permiten agrupar una coleccion deobjetos de un mismo tipo.
• Por un lado es un objeto,• pero por otro lado es una coleccion de otros objetos.
Sintaxis Java: Arreglos
Tipo[] identificador;
• Como toda variable, en su declaracion necesita de un tipo y unidentificador.
• El tipo va seguido de parentesis de corchete, lo que indica que se tratade un arreglo de objetos de ese tipo.
Ejemplo: Declaracion de arreglos
int[] listaNumeros;
...
Auto[] listaDeAutos;
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 8 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Creacion
• Todos los arreglos son tipos por referencia ∴ deben ser creados• utilizando el comando new.
• La creacion consiste en darles una dimension,• cantidad maxima de elementos que puede contener.
Ejemplo: Creacion de arreglos
int[] numeros = new int [10];
Auto[] listaDeAutos = new Auto [25];
• Despues de crear el arreglo, se debe crear cada elemento:• si el tipo del arreglo es por referencia, todos los elementos son null
antes de ser creados,• si es por valor, puede que los elementos sean 0 antes de ser creados
(esto no lo considere como una verdad absoluta).
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 9 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Creacion con asignacion
• Es posible crear un arreglo asignandole directamente los elementosque va a contener.
• En este caso no es necesario proporcionar el largo, ya que este secalcula en funcion de la cantidad de elementos asignados.
Ejemplo: Creacion con asignacion
// Arreglo de enteros con 5 elementos
int[] numeros = {0, 1, 2, 3, 4};
// Arreglo de Auto con 3 elementos
Auto[] listaDeAutos = {new Auto (...), new Auto (...), new Auto (...)};
• Este tipo de asignacion solamente puede ser realizada al momento dela declaracion del arreglo.
Ejemplo: Creacion con asignacion no valida
int[] numeros;
numeros = {0, 1, 2, 3, 4}; // Error
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 10 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Acceso a elementos
• A los elementos de un arreglo se accede a traves de su ındice.• Los ındices validos estan en el rango [0, largo[.• Si se usa un ındice fuera de este rango el programa se caera.
Ejemplo: Acceso a elementos por ındice
int[] numeros = {2, 4, 6, 8, 10};
System.out.println(numeros [2]); // Muestra un 6
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 11 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Cantidad de elementos de un arreglo
• ¿Como podemos saber el largo de un arreglo que no hemos creadonosotros?
• Todos los arreglos tienen la propiedad length la cual retorna el largo.
Ejemplo: Largo de un arreglo
int[] numeros = {2, 4, 6, 8, 10};
System.out.println(numeros.length ); // Muestra un 5
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 12 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Recorrer un arreglo
• Es posible recorrer con un ciclo todos los elementos de un arreglo.
• Simplemente declaramos una variable para el ındice, la cualaumentamos en cada iteracion.
• El ciclo termina cuando el ındice es igual al largo del arreglo.
Ejemplo: Recorrer y mostrar un arreglo
String [] palabras = {"Hola", "Chao", "Bienvenido"};
for(int i = 0; i < palabras.length; i++)
System.out.println(palabras[i]);
• ¿Que pasa si ahora hago que el arreglo tenga 10997 elementos?• El ciclo no cambia.
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 13 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Tipos por referencia
• Los arreglos siempre funcionan como tipos por referencia.• Aunque el tipo de los elementos del arreglo sea un tipo por valor.
• Esto quiere decir que si uno asigna un arreglo a otro ambas variablesquedan referenciando al mismo elemento.
Ejemplo: Asignacion
int[] arreglo = {0, 1, 2};
int[] aux = arreglo;
aux [1] = 4; // Tambien cambia el valor de arreglo [1]
System.out.println(arreglo [1]);
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 14 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Copia de arreglos
• Para copiar dos arreglos se debe copiar cada uno de los elementos.
Ejemplo: Copia
int[] arreglo = {0, 1, 2};
int[] copia = new int[arreglo.length ];
for(int i = 0; i < copia.length; i++)
copia[i] = arreglo[i];
• Esto solo es valido para los arreglos cuyos elementos sean de tipo porvalor.
• En caso de que los elementos sean tipo por referencia, en la asignaciondentro del ciclo harıamos una copia de referencias, y no una copia devalores.
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 15 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Largo constante
• El largo de un arreglo es fijo desde el momento que es creado.
• No es posible cambiar el largo sin borrar los elementos que estan en elarreglo.
Ejemplo: Largo mal cambiado
int[] arreglo = {0, 1, 2};
arreglo = new int [5]; // Se borran los 3 elementos
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 16 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Largo constante
• Si se necesitara cambiar el largo de un arreglo, ¿como lo hacemos?• Podemos crear una variable auxiliar que apunte a nuestro arreglo.• Luego creamos nuevamente el arreglo con el nuevo tamano.• Copiamos los elementos del arreglo auxiliar a nuestro arreglo.
Ejemplo: Largo bien cambiado
int[] arreglo = {0, 1, 2};
int[] aux = arreglo;
arreglo = new int [5];
for(int i = 0; i < aux.length; i++)
arreglo[i] = aux[i];
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 17 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Ejemplos
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 18 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Ejemplos
Sumar
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 19 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Ejercicio Arreglos: Sumar
Escriba un metodo public int sumar(int[] numeros) que recibe unarreglo de numeros y retorna la suma de ellos.
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 20 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Metodo sumar
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 21 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Ejemplo: Metodo sumar
public int sumar(int[] numeros) {
int suma = 0;
for(int i = 0; i < numeros.length; i++)
suma = suma + numeros[i];
return suma;
}
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 22 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Ejemplos
Mayor
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 23 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Ejercicio Arreglos: Mayor
Escriba un metodo public int buscarMayor(double[] numeros) querecibe un arreglo de numeros y retorna el ındice del numero mayor en elarreglo.
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 24 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Metodo buscarMayor
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 25 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Ejemplo: Metodo buscarMayor
public int buscarMayor(double [] numeros) {
int index = 0;
for(int i = 1; i < numeros.length; i++) {
if(numeros[index] < numeros[i])
index = i;
}
return index;
}
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 26 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Ejercicio
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 27 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Ejercicio
Enunciado
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 28 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Ejercicio Arreglos: Contar apariciones
Escriba el siguiente metodo:
int contarApariciones(int[] original, int[] secuencia)
el cual retorna la cantidad de apariciones de secuencia en original.Debe considerar que cada elemento en original puede ser considerado unasola vez dentro de secuencia.
original={2,3,4,2,3,3,2,1,2,3} y secuencia={2,3} → 3original={2,5,5,6,5,6,5,6,6,5,6,5,2} y secuencia={5,6,5}→ 2
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 29 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Ejercicio
Solucion
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 30 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Solucion
public int contarApariciones(int [] original , int [] secuencia) {
int contador = 0;
for(int i = 0; i < original.length - secuencia.length; i++) {
boolean encontrada = true;
for(int j = 0; j < secuencia.length && encontrada; j++) {
if(original [i + j] != secuencia [j])
encontrada = false;
}
if(encontrada) {
contador ++;
i += secuencia.length - 1;
}
}
return contador;
}
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 31 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Arreglos Multidimensionales
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 32 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Arreglos Multidimensionales
Motivacion
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 33 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Motivacion
• Claramente los arreglos nos ayudan a manejar listas de elementos loque hace mas potente nuestras aplicaciones.
• Ahora bien, ¿que pasa si quiero manejar un plano cartesiano?• Por ejemplo quiero manejar la distribucion de los alumnos dentro de la
sala.• Con un arreglo simple solo puedo manejarme en una dimension.• ¿Que hacemos?
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 34 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Definicion
• Los arreglos son un conjunto de objetos.
• Los arreglos tambien son objetos.
∴ es posible tener arreglos cuyos elementos sean otros arreglos.
Ejemplo: Declaracion de arreglos multidimensionales
Auto [][] estacionamientos;
int [][][] mapasNumericos;
• En el primer caso tenemos un arreglo, donde cada elemento es unarreglo de Auto.
• En el segundo caso tenemos un arreglo, donde cada elemento es otroarreglo, en el cual cada elemento es un arreglo de enteros.
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 35 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Creacion
Para la creacion hay dos alternativas:
1 Definir en la creacion el tamano de todas las dimensiones.
Ejemplo: Definir todas las dimensiones
Auto [][] estacionamientos = new Auto [3][4];
int [][][] mapasNumericos = new int [10][2][4];
2 No definir todas las dimensiones, sino que dejar que los elementospuedan tener distintos tamanos.
Ejemplo: Diferentes dimensiones
Auto [][] estacionamientos = new Auto [3][];
for(int i = 0; i < estacionamientos.length; i++)
estacionamientos[i] = new Auto[i+1];
• Sin importar como se haga la declaracion, siempre debe estar asignadoel tamano de todas las dimensiones, antes de asignar los elementos.
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 36 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Acceso
• Para acceder a uno de los elementos se debe asignar un ındice paracada una de las dimensiones del arreglo.
• En caso de faltar al menos una dimension, se estara accediendo alsubarreglo correspondiente.
Ejemplo: Acceso
int [][][] mapasNumericos = new int [10][2][4];
...
int a = mapasNumericos [2][0][3];
int[] ar = mapasNumericos [8][1];
int [][] arr = mapasNumericos [5];
• Por supuesto que por ser arreglos todas las dimensiones estan en elrango [0, largo dimension[.
• Con el comando length se accede al largo de la primera dimension.• ¿Como accedo al largo de las otras dimensiones?
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 37 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Arreglos Multidimensionales
Ejemplos
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 38 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Ejemplo: Multiplicacion de matrices
Hagamos un metodo que multiplique dos matrices.
• El metodo debe recibir dos matrices de enteros y retornar el resultado.
• El metodo debe verificar que se puedan multiplicar ambas matrices.• Las columnas de la primera deben ser igual a las filas de la segunda.
• Amn ∗Bnp = Cmp
• cij =∑n−1
k=0 aikbkj
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 39 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Solucion
Ejemplo: Multiplicacion de matrices
public int [][] multiplicar(int [][] m1, int [][] m2) {
if(m1[0]. length != m2.length)
return null;
else {
int [][] res = new int[m1.length ][m2[0]. length ];
for(int i = 0; i < res.length; i++) {
for(int j = 0; j < res[i]. length; j++) {
res[i][j] = 0;
for(int k = 0; k < m2.length; k++)
res[i][j] += m1[i][k]*m2[k][j];
}
}
return res;
}
}
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 40 / 43
Resumen Clase Anterior Arreglos Unidimensionales Ejemplos Ejercicio Arreglos Multidimensionales
Ejemplo: Busqueda secuencia
Implemente el metodo public int contarApariciones(int[][]
tablero, int[] secuencia).Este metodo cuenta la cantidad de apariciones de la secuencia en eltablero.
• Las apariciones pueden ser tanto verticales como horizontales.
Un ejemplo
0 2 0 1 1
2 0 1 3 0
0 3 0 1 1
1 2 1 1 0
3 2 3 2 1
• Si la secuencia ingresada es {2, 0, 1}, el metodo debe retornar 3.• Hay 2 horizontales y una vertical.
C.Reveco Facultad de Ingenierıa/Universidad de los Andes/Chile ING1310– Clase 12 41 / 43
public int contarApariciones(int [][] tablero , int[] secuencia) {
int apariciones = 0;
for(int i = 0; i < tablero.length; i++) {
for(int j = 0; j <= tablero[i]. length - secuencia.length; j++) {
boolean isSec = true;
for(int k = 0; k < secuencia.length; k++) {
if(secuencia[k] != tablero[i][j + k])
isSec = false;
}
if(isSec)
apariciones ++;
}
}
for(int i = 0; i <= tablero.length - secuencia.length; i++) {
for(int j = 0; j < tablero[i]. length; j++) {
boolean isSec = true;
for(int k = 0; k < secuencia.length; k++) {
if(secuencia[k] != tablero[i + k][j])
isSec = false;
}
if(isSec)
apariciones ++;
}
}
return apariciones;
}
public int contarApariciones2(int [][] tablero , int[] secuencia) {
int apariciones = 0;
for (int i = 0; i < tablero.length; i++) {
for (int j = 0; j < tablero[i]. length; j++) {
int secHorizontal = 0;
int secVertical = 0;
for (int k = 0; k < secuencia.length; k++) {
if (j + k < tablero[i]. length
&& secuencia[k] == tablero[i][j + k])
secHorizontal ++;
if (i + k < tablero.length
&& secuencia[k] == tablero[i + k][j])
secVertical ++;
}
if (secHorizontal == secuencia.length)
apariciones ++;
if (secVertical == secuencia.length)
apariciones ++;
}
}
return apariciones;
}