Sie sind auf Seite 1von 28

IIC1103 - Introduccin a la Programacin o o Arreglos

Mart Ugarte n

P.U.C. Chile, 2011

M. Ugarte

P.U.C. Chile, 2011

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

P.U.C. Chile, 2011

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

P.U.C. Chile, 2011

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

P.U.C. Chile, 2011

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

P.U.C. Chile, 2011

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

P.U.C. Chile, 2011

Para considerar

Inicializar un arreglo es distinto de inicializar sus elementos. En qu caso podemos notarlo? e

int[] a=new int [5]; Usuario.mensaje(a[0]);

Qu ocurre? e Trataremos de evitar este tipo de problemas declarando expl citamente los elementos.

M. Ugarte

P.U.C. Chile, 2011

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

P.U.C. Chile, 2011

Arreglos como objetos

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

P.U.C. Chile, 2011

Arreglos como objetos: Ejemplo

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

P.U.C. Chile, 2011

Parntesis: Tipos complejos e

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

P.U.C. Chile, 2011

Parntesis: Tipos complejos (cont.) e

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

P.U.C. Chile, 2011

Ejemplo

Habiendo realizado el mtodo anterior, ejecutar el siguiente cdigo: e o


int[] a={1,1,1,1,1,1,1,1}; earnedValue(a); Usuario.mensaje(a[5]);

M. Ugarte

P.U.C. Chile, 2011

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

P.U.C. Chile, 2011

Duplicar arreglos

Cmo duplicamos un arreglo sin el problema de dejar variables o ligadas?


int[] a={1,2,3,4,5,6,7,8}; int[] b=new int[a.length]; for(int i=0;i<a.length;i++){ b[i]=a[i]; }

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

P.U.C. Chile, 2011

Preguntas?

M. Ugarte

P.U.C. Chile, 2011

Ejemplo: Nmeros grandes u

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

P.U.C. Chile, 2011

Nmeros grandes: lo primero u

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

P.U.C. Chile, 2011

Nmeros grandes: validacin u o

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

P.U.C. Chile, 2011

Nmeros grandes: visualizacin u o

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

P.U.C. Chile, 2011

Nmeros grandes: visualizacin (cont.) u o

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

P.U.C. Chile, 2011

Nmeros grandes: visualizacin (cont.) u o

Luego cambiamos el mtodo mostrarNumero: e


static void mostrarNumero(int[] a){ for(int i = ultimaPosicion(a); i >= 0; i--){ System.out.print(a[i]); } System.out.println(); }

M. Ugarte

P.U.C. Chile, 2011

Nmeros grandes: inicializacin u o

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; }

Nota: Estamos asumiendo que n es positivo

M. Ugarte

P.U.C. Chile, 2011

Nmeros grandes: suma u

Como sumar dos arreglos interpretados como nmeros grandes? u


static int[] sumar(int[] a, int[] b){ int[] resultado = new int[400]; int carry = 0; int limite = Math.max(ultimaPosicion(a), ultimaPosicion(b))+1; limite = Math.min(limite, 400); for(int i = 0; i <= limite; i++){ resultado[i] = a[i] + b[i] + carry; carry = resultado[i]/10; resultado[i] = resultado[i]%10; } return resultado; }

M. Ugarte

P.U.C. Chile, 2011

Nmeros grandes: multiplicacin y divisin por diez u o o


Para multiplicar nmeros grandes utilizaremos la multiplicacin u o del campesino ruso en base 10. Para esto necesitamos saber multiplicar y dividir por diez.
static int[] multiplicarPorDiez(int[] a){ int[] resultado = new int[a.length]; for(int i = 0; i<=ultimaPosicion(a); i++){ resultado[i+1]=a[i]; } return resultado; } static int[] dividirPorDiez(int[] a){ int[] resultado = new int[a.length]; for(int i = 1; i<=ultimaPosicion(a); i++){ resultado[i-1]=a[i]; } return resultado; }

M. Ugarte

P.U.C. Chile, 2011

Nmeros grandes: multiplicacin del campesino ruso u o

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

P.U.C. Chile, 2011

Multiplicacin del campesino ruso: ejemplo o

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

P.U.C. Chile, 2011

Multiplicacin del campesino ruso: Java o

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

P.U.C. Chile, 2011

Das könnte Ihnen auch gefallen