Beruflich Dokumente
Kultur Dokumente
Mart Ugarte n
M. Ugarte
Arreglos
Un arreglo es una estructura de datos que permite almacenar ms de un elemento. a Los elementos almacenados por un arreglo deben ser todos del mismo tipo. A este tipo le llamamos tipo base del arreglo. El tipo base de un arreglo puede ser cualquiera de los tipos mencionados hasta ahora (int, char, boolean, arreglos, etc).
M. Ugarte
Lo bsico a
La cantidad de elementos que se pueden almacenar en un arreglo es ja, y es indicada al momento de construir el arreglo. Un arreglo guarda ordenadamente sus elementos, que van desde la posicin 0 hasta la posicin n 1 donde n es la o o cantidad de elementos del arreglo. Para referirnos al elemento en la posicin i utilizamos el o nombre del arreglo seguido del ndice i entre llaves [i].
M. Ugarte
Sintaxis
Para declarar un arreglo: -tipo base-[] -nombre-; Para inicializar con n elementos un arreglo que ya fue declarado: -nombre- = new -tipo base-[n]; Para inicializar un arreglo y cada uno de sus elementos: -nombre- = {e0 , e1 ,. . ., en1 }; donde el tipo de las variables e0 , e1 , . . . , en1 es el tipo base.
M. Ugarte
Sintaxis (cont.)
Al igual que con los otros tipos, est permitido declarar e a inicializar un arreglo en una linea. Por ejemplo para declarar e inicializar un arreglo de enteros con cinco elementos: int[] arreglo1 = new int[5]; Y si queremos declarar un arreglo de cinco enteros, todos iguales a uno: int[] arreglo1 = {1,1,1,1,1};
M. Ugarte
Sintaxis (cont.)
Supongamos que tenemos declarado int[] arreglo1; Cmo lo inicializamos con los valores (1,2,3,4)? o arreglo1 = {1,2,3,4}; Cmo cambiamos el valor 4 que se encuentra en el arreglo o por un 5? arreglo1[3]=5;
M. Ugarte
Para considerar
Qu ocurre? e Trataremos de evitar este tipo de problemas declarando expl citamente los elementos.
M. Ugarte
Ejemplos
Pedir al usuario un nmero n y luego inicializar un arreglo con u n nmeros, los cuales deben ser pedidas al usuario. u Pedir al usuario un entero n, luego guardar n doubles ingresados por el usuario y nalmente calcular su varianza. Podemos hacer esto sin arreglos?
M. Ugarte
Un arreglo es tambin un objeto, y por tanto se puede e retornar y pasar como parmetro. a Un arreglo cuyo tipo base es t1 es un objeto del tipo t1 []. Esto signica que si queremos retornar un arreglo entonces debemos indicar que el tipo de retorno es t1 [].
M. Ugarte
Crear un mtodo ordenar que reciba un arreglo de enteros o e de doubles y que retorne un arreglo con los mismos elementos pero ordenados de menor a mayor.
M. Ugarte
Existen ciertos tipos de valores que no pueden ser asignados con el signo =. Qu imprime el siguiente cdigo? e o
int[] a={1,2,3,4,5}; int[] b=a; b[0]=10; Usuario.mensaje(a[0]);
M. Ugarte
Ocurre que, al ser un arreglo un tipo complejo, la instruccin int[] b = a; hace que a y b sean exactamente o el mismo elemento, por lo que si cambiamos uno tambin e cambia el otro. Esto ocurre incluso con los parmetros. a Ejemplo:
Realizar un mtodo void earnedValue que reciba un arreglo e de enteros y cambie el elemento i por la suma de los primeros i + 1 elementos para 0 i n 1.
M. Ugarte
Ejemplo
M. Ugarte
Ejemplo (cont.)
Nuevamente vemos que cambi el valor del arreglo a, pues el o parmetro (la variable muda que estamos cambiando) es a exactamente el mismo objeto que a. Dentro de lo que conocemos hasta el momento, los tipos complejos son slo los arreglos. Ms adelante podremos o a denir nuevos tipos de objetos (clases). Estos objetos sern a tambin complejos. e Llamamos tipos simples a aquellos que se pueden asignar con el signo = sin dejar las variables ligadas. Diremos que los tipos simples se pasan por valor y que los tipos complejos se pasan por referencia. Por qu? e
M. Ugarte
Duplicar arreglos
Al ser el tipo base del arreglo un tipo simple, los elementos de los arreglos no quedan ligados. Qu ocurre si el tipo base del arreglo e es complejo?
M. Ugarte
Preguntas?
M. Ugarte
A continuacin crearemos un programa que nos permita o trabajar con nmeros naturales mayores a los que permite u utilizar Java. Trabajaremos con nmeros de a lo ms u a cuatrocientos d gitos (esto estar jo). a Para esto interpretaremos un arreglo completo como un nmero, donde cada posicin del arreglo guarda un d u o gito. En la posicin cero guardaremos las unidades. o Debemos ser capaces de:
Dado un entero (variable de tipo int), guardarlo en un arreglo de la forma indicada arriba. Sumar dos nmeros u Multiplicar dos nmeros u Elevar un nmero a una potencia de tipo int u
M. Ugarte
Cul debe ser el tipo base de nuestros arreglos? a Cmo nos aseguramos de que en cada posicin haya o o exactamente un d gito? Cmo podemos inicializar un nmero con n d o u gitos al azar?
M. Ugarte
A continuacin nos aseguramos de que en cada posicin haya un o o nmero entre cero y nueve: u
static boolean esNumero(int[] a){ for(int i=0;i<a.length;i++){ if(a[i]<0 || a[i]>9){ return false; } } return true; }
M. Ugarte
Antes de comenzar, creamos un mtodo para ver en consola los e arreglos como nmeros: u
static void mostrarNumero(int[] a){ for(int i = 400; i >= 0; i--){ System.out.print(a[i]); } System.out.println(); }
M. Ugarte
Cmo hacemos para ver el nmero sin todos estos ceros al o u principio?
static int ultimaPosicion(int[] a){ for(int i = a.length-1; i >= 0; i--){ if(a[i] != 0){ return i; } } return -1; }
M. Ugarte
M. Ugarte
Como creamos un arreglo que representa el mismo nmero que un u entero positivo?
static int[] toArray(int n){ int[] resultado = new int[400]; int contador=0; while(n>0){ resultado[contador]=n%10; n = n/10; contador++; } return resultado; }
M. Ugarte
M. Ugarte
M. Ugarte
El algoritmo de multiplicacin es el siguiente: Tomamos los dos o enteros positivos a y b y los ponemos en la primera la de una tabla con dos columnas. Luego multiplicamos el primero por diez y el segundo por diez. Estos resultados los ponemos en la prxima o la de la tabla en el mismo orden. Luego repetimos hasta que el nmero que estamos dividiendo por diez sea cero. Supongamos que u la tabla tiene n las. Llamaremos ai y bi al i -simo nmero de la e u primera y segunda columna respectivamente. Sea ci = ai (bi %10). Finalmente n=1 ci = a b. i
M. Ugarte
Multiplicaremos los nmeros a = 2457 y b = 324: u ai 2457 24570 245700 2457000 Finalmente tenemos que bi 324 32 3 0 ci 9828 49140 737100 0
n i =1 ci
= 796068
M. Ugarte
static int[] multiplicar(int[] a, int[] b){ int[] aux_a = clonar(a); int[] aux_b = clonar(b); int[] resultado = toArray(0); while(ultimaPosicion(aux_a) >= 0){ for(int i=0;i<aux_a[0];i++){ resultado = sumar(resultado,aux_b); } aux_b = multiplicarPorDiez(aux_b); aux_a = dividirPorDiez(aux_a); } return resultado; }
M. Ugarte