Você está na página 1de 29

Arreglos

I Los arreglos son tipos de datos complejos (en el sentido de


que no son atómicos).
I Agrupan varios (1 o más) datos de un mismo tipo, llamado el
tipo base del arreglo.
I La idea es que tenemos espacio para almacenar varios valores
sin tener que definir una variable distinta para cada valor a
almacenar.
I El tipo base de un arreglo puede ser cualquiera de los tipos
primitivos de JAVA (int, double, float etc), e incluso otros
tipos complejos (por ejemplo otros arreglos, lo veremos más
adelante).

Jorge Pérez – Programación Estructurada en JAVA 75 / 103


Arreglos

I Al igual que las variables debemos hacer una declaración de


arreglo y asociarlo a un identificador.
I Por ejemplo, para declarar un arreglo de enteros identificado
por arr, hacemos:

int[] arr;
I Esto no es suficiente para comenzar a usar el arreglo, además
debemos especificar la cantidad de elementos que queremos
almacenar (construir el arreglo)

arr = new int[20];


I Con la anterior instruccion estoy especificando que el arreglo
tendrá espacio para almacenar 20 enteros.
I De la misma forma podemos hacer arreglos de otros tipos de
datos.
Jorge Pérez – Programación Estructurada en JAVA 76 / 103
Arreglos

I La sintaxis del lenguaje permite referirse a cada uno de los


elementos que constituyen el arreglo empleando ı́ndices.
I Los elementos del arreglo están numerados en forma
jerárquica y consecutiva, empezando en 0.
I Si A es un arreglo de entero de tamaño 3, A[0] se refiere al
primer espacio del arreglo, A[1] al segundo espacio, y A[2] al
último espacio.
I La idea es que cada espacio puede ser tratado como una
variable para hacer asignaciones, construir expresiones, etc.

Jorge Pérez – Programación Estructurada en JAVA 77 / 103


Arreglos

¿Qué muestra el siguiente código?


{
int[] A;
A = new int[3];

A[0] = 1;
A[1] = 2;
A[2] = 2 * A[0] + 10 * A[1];

System.out.println(A[2]);
}

Jorge Pérez – Programación Estructurada en JAVA 78 / 103


Arreglos: declaración y construcción

I Los arreglos pueden declararse y construirse al mismo tiempo.

int[] A = new int[20];


double[] D = new double[10];

I La primera instrucción declara y crea un arreglo de 20 enteros,


la segunda un arreglo de 10 reales.
I También se pueden construir asignándoles inmediatamente
valores.
int[] A = { 2, 3, 5, 7, 9, 11 };
double[] D = { 0.5, 1.0, 1.5, 2.0 };

I La primera instrucción crea un arreglo de tamaño 6 con los


seis primeros números primos, la segunda crea un arreglo de 4
reales.

Jorge Pérez – Programación Estructurada en JAVA 79 / 103


Arreglos: ı́ndices

I Como dijimos la idea de un arreglo es que cada posición


pueda ser usado como una variable independiente.
I Para esto se usan los ı́ndices que indican la posición del
espacio al que se hace referencia
I Un ı́ndice puede ser una expresión cualquiera que se evalúe
como un entero positivo.
I Por ejemplo, luego se ejecutar el siguiente código
int[] A = { 1, 2, 3, 2, 1 };
int i, x, y;

i = 3;
x = A[2 * i - 4];
y = A[A[i]] + 3;

¿Cuáles son los valores de las variables x e y?

Jorge Pérez – Programación Estructurada en JAVA 80 / 103


Arreglos: ı́ndices

I De la misma forma se pueden usar expresiones en los ı́ndices


para asignaciones.
I Por ejemplo, luego se ejecutar el siguiente código

int[] A = new int[4];


int i = 1;

A[i - 1] = 1;
A[A[0]] = 2;
A[i + A[0]] = A[1];
A[A[A[2 - i]] + i] = 3;

¿Cuáles son los valores del arreglo A?

Jorge Pérez – Programación Estructurada en JAVA 81 / 103


Arreglos: ı́ndices

I El poder poner expresiones en los ı́ndices nos permiten asignar


valores a un arreglo ingresados por el usuario
{
double[] A = new double[10];
int i;

for(i = 0; i < 10; i++)


{
System.out.println("Ingrese un número");
A[i] = In.readDouble();
}

System.out.print("Los datos ingresados son: ");


for(i = 0; i < 10; i++)
{
System.out.print(A[i] + " ");
}
}

Jorge Pérez – Programación Estructurada en JAVA 82 / 103


Arreglos: Ejercicios

1. Pedir 10 números enteros y luego un entero x y mostrar el


número de los ingresados que está más cercano a x.
2. Pedir 20 números enteros x1 , x2 , . . . , x20 y luego imprimirlos
en el orden x1 , x20 , x2 , x19 , . . . , x10 .
3. Pedir 20 números enteros y luego un entero x y mostrar
cuántas veces aparece x entre los números ingresados.
4. Pedir 20 números enteros y luego mostrar cada número
distinto ingresado, por ejemplo si se ingresan 1, 2, 1, 2, . . . , 1, 2
se debiera mostrar sólo 1 y 2.
5. Pedir 20 números enteros y luego mostrar cada número
distinto ingresado y la cantidad de veces que ese número
aparece. Por ejemplo si se ingresan 1, 2, 1, 2, . . . , 1, 2 se
debiera mostrar 1 : 10 y 2 : 10.

Jorge Pérez – Programación Estructurada en JAVA 83 / 103


Arreglos

I Los arreglos son tipos no atómicos de datos (objetos), por lo


tanto cuando declaramos un arreglo

int[] peso;

Estamos creando la variable peso la cual es una referencia a


un lugar de la memoria donde posteriormente el arreglo de
enteros se almacenará fı́sicamente. Sin embargo, hasta este
momento no hemos creado un arreglo de enteros.
I Cuando construimos el arreglo se asigna la memoria
correspondiente

peso = new int[10];

Ahora peso apunta a un espacio reservado para 10 enteros.

Jorge Pérez – Programación Estructurada en JAVA 84 / 103


Arreglos y referencias

I Veamos paso a paso que pasa cuando ejecutamos este código:

double[] A = new double[10];


double[] B;

B = A;
A[4] = 4.5;

System.out.println(B[4]);

double[] C = {1.0,2.0,3.0};

B=C;

int i;
for(i = 0; i < 3; i++)
{ System.out.println(B[i]); }

Jorge Pérez – Programación Estructurada en JAVA 85 / 103


Arreglos y referencias

double[] A = new double[10];

Creamos una variable A que es una referencia a un arreglo (que


también creamos) de 10 elementos de tipo double.

double[] B;

Creamos una variable B que es una referencia a un arreglo de


elementos de tipo double pero aún no creamos ningún arreglo al
que apunte B.
B = A;

A B se le asigna lo referenciado por A (asignación de referencias).

Jorge Pérez – Programación Estructurada en JAVA 86 / 103


Arreglos y referencias

A[4] = 4.5;

Asignamos al elemento de ı́ndice 4 del arreglo A el valor 4.5.

System.out.println(B[4]);
¿Qué se imprime en pantalla?
4.5

double[] C = {1.0,2.0,3.0};

Creamos una variable C que apunta a un arreglo de 3 elementos de


tipo double.

Jorge Pérez – Programación Estructurada en JAVA 87 / 103


Arreglos y referencias

B = C;

A B se le asigna lo referenciado por C (asignación de referencias). B


deja de hacer referencia al mismo arreglo que A y ahora hace
referencia a un arreglo de 3 elementos.
int i;
for(i = 0; i < 3; i++)
{ System.out.println(B[i]); }
¿Qué imprime esto?
1.0
2.0
3.0

Jorge Pérez – Programación Estructurada en JAVA 88 / 103


Arreglos referencias y tipos de datos

I Si tenemos:
double[] B;
int[] C = {1,2,3};
B = C;

¿Qué pasa en este caso?


Producirı́a un error pues B puede hacer referencia sólo a un
arreglo de elemtos de tipo doubles.

Jorge Pérez – Programación Estructurada en JAVA 89 / 103


Strings

I Los Strings Son tipos de datos similares a los arreglos, pero


en este caso se usan para almacenar texto (cadenas de
caracteres).
I Versátiles para hacer programas que manipulen texto.
I Declaración de un string:
String s;
I Declaración e inicialización de un string:
String s = "Este es el valor inicial";
I Crear un string a partir de otros:
String s1 = "Hola, ";
String s2 = " ¿qué tal?";
String s3 = s1 + s2;

Jorge Pérez – Programación Estructurada en JAVA 90 / 103


Strings y referencias

I Al igual que con los arreglos una variable de tipo String es


una referencia a una posición de memoria donde se encuetra
el texto fı́sicamente almacenado.
I ¿Qué muestra este trozo de código?
String s1 = "Blanco";
String s2 = "Azul";
s1 = s2;
s2 = "Rojo";
System.out.println(s1 + " " + s2);

Jorge Pérez – Programación Estructurada en JAVA 91 / 103


Strings, comparaciones

I Tomando en cuenta que las variables de tipo String son


referencias, debemos entender a que nos referimos si
preguntamos si:
s1 == s2
I En este caso el valor de la expresión va a ser verdadero si
ambas variables apuntan (o hacen referencia) al mismo lugar
de la memoria, y falso en caso contrario.
I ¿Qué muestra el siguiente código?
String s1 = "Rojo";
String s2 = "Rojo";
if (s1 == s2)
{ System.out.println("Misma referencia!");}

Jorge Pérez – Programación Estructurada en JAVA 92 / 103


Comparando Strings JAVA

I Para comparar el contenido de dos strings se usa el método


(instrucción) especial equals.
I Si s1 es un string que quiero comparar con s2 se hace

s1.equals(s2)

I El resultadp de la instrucción es un valor de verdad, verdadero


si los strings tiene el mismo contenido, falso en otro caso.
I ¿Qué muestra el siguiente código?
String s1 = "Rojo";
String s2 = "Rojo";
if (s1.equals(s2))
{ System.out.println("Mismo texto!");}

Jorge Pérez – Programación Estructurada en JAVA 93 / 103


Strings y arreglos

I Dados que los strings son tipos de datos podemos hacer


arreglos de strings, se la misma forma que lo haciamos con los
otros tipos de datos:

String[] nombres;
nombres = new String[4];
nombres[0] = "Juan";
nombres[1] = "Pepe";
nombres[2] = "Pedro";
nombres[3] = "Maria";
I O equivalentemente

String[] nombres = {"Juan","Pepe","Pedro","Maria"};

I Nuestro primer acercamiento a arreglos más complejos.

Jorge Pérez – Programación Estructurada en JAVA 94 / 103


Arreglos bidimensionales o matrices

I Algunos datos vienen en dos dimensiones:


I Tableros, mapas, áreas, imágenes (dibujos), matrices, planillas
de cálculo, etc.
I Arreglos bidimensionales:
I Dos ı́ndices en lugar de uno.
I Dimensión: n × m
I Fila, Columna: [x][y]
I Si A es un arreglo bidimensional A[2][4] es un valor especı́fico
en el arreglo.
I Se pueden ver como matrices.
I Ejemplo: Notas de alumnos tabuladas, una fila para cada
alumno (en cierto orden) una columna para cada nota de
pruebas.

Jorge Pérez – Programación Estructurada en JAVA 95 / 103


Arreglos bidimensionales o matrices

Declaración
int[][] tablero;
Construcción
tablero = new int[8][8];
Podemos declarar y construir al mismo tiempo

int[][] tablero = new int[8][8];


Inicialización en la declaración (2 × 3)

int[][] numero = {{1,3,5}, {3,6,7}};

En este último caso numero[1][2] es 7.

Jorge Pérez – Programación Estructurada en JAVA 96 / 103


Arreglos bidimensionales o matrices

I Recuerden que tanto en arreglos unidimensionales como en


matrices podemos ver a cada elemento como una variable. La
diferencia está en que cuando creamos un matriz:

double[][] A = new double[20][30];


I Estamos creando 20 · 30 elementos (que podemos ver como
variables) de una sola vez.
I Por lo tanto podemos tratar a cada elemento igual como
tratamos a una variable.
double a,b;
a = A[1][2] + A[0][0] + 3;
b = A[1][2]*A[0][0];
A[a+3][b-1] = 6;

Jorge Pérez – Programación Estructurada en JAVA 97 / 103


Leyendo una matriz desde el usuario

Podemos leer los valores se una matriz de 3 × 3 con el siguiente


código

double[][] A = new double[3][4];


int i,j;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
System.out.println("Dime un número?");
A[i][j] = In.readDouble();
}
}
De forma similar podemos mostrar los elementos de una matriz,
solo cambie el contenido del for anidado por
System.out.println(A[i][j]).

Jorge Pérez – Programación Estructurada en JAVA 98 / 103


Operaciones de matrices
I Dadas dos matrices (usuales) A de n × m y B de n × m
podemos sumarlas para crear una matriz C de n × m tal que
Cij = Aij + Bij

I Ejercicio: construya un programa que dados dos matrices


JAVA A y B construya una tercera correspondiente a la suma.
I Dada una matriz (usual) A de n × m la matriz traspuesta At
es una matriz de m × n tal que
Atij = Aji
Una matriz A es simétrica si A = At .
I Ejercicio: haga un programa en JAVA que dada una matriz
construya la matriz traspuesta.
I Ejercicio: haga un programa que determine si una matriz es
simétrica.
Jorge Pérez – Programación Estructurada en JAVA 99 / 103
int[][] A ={{1,2,3,4}, {5,6,7,8}};
int[][] B ={{1,4,5,6}, {4,8,9,7}};

int n = 2, m = 4; // dimensiones de las matrices

int[][] C = new int[n][m];


int i,j;

for(i = 0; i < n ; i++)


{
for(j = 0; j < m ; j++)
{
C[i][j] = A[i][j] + B[i][j];
}
}

//Ahora imprimos cada fila de C


for(i = 0; i < n ; i++)
{
for(j = 0; j < m ; j++)
{
System.out.print(C[i][j] + " ");
}
System.out.println();
}

Jorge Pérez – Programación Estructurada en JAVA 100 / 103


Operaciones de matrices

I Dadas dos matrice (usuales) A de n × m y B de m × l


podemos multiplicarls para creando una matrix C de n × l tal
que
Xm
Cij = Aik · Bki
k=1
I Ejercicio: construya un programa que dados dos matrices
JAVA A y B construya una tercera correspondiente a la
multiplicación (ojo que en la definición matemática se
suponen los ı́ndices partiendo desde 1).

Jorge Pérez – Programación Estructurada en JAVA 101 / 103


int[][] A = {{2,3,8},{9,5,4},{7,8,3},{4,6,8}}; // 4 x 3
int[][] B = {{1,4,7},{2,5,8}}; // 3 x 2

int n = 4, m = 3, l = 2;

int[][] C = new int[n][l];

int i,j,k,suma;

for(i = 0; i < n; i++)


{
for(j = 0; j< l; j++)
{
for(k = 0, suma = 0; k < m; k++)
{
suma = suma + A[i][k] * B[k][j];
}
C[i][j]= suma;
}
}

for(i = 0; i < n; i++)


{
for(j = 0; j < l; j++)
{
System.out.print(C[i][j]+ " ");
}
Jorge Pérez – Programación Estructurada en JAVA 102 / 103
Arreglos multidimensionales

I Hasta ahora hemos visto arreglos unidimensionales y


bidimensionales. Sin embargo, podemos tener arreglos con las
dimensiones que uno desee.
I Por ejemplo, podemos tener arreglos de 3, 4 ó 5 dimensiones.
I Por ejemplo:

char[][][] A = new char[2][3][6];


I Aquı́ hemos creado 2 × 3 × 6 elementos de tipo char.

int[][][][] B = new int[2][2][2][2];


I Aquı́ hemos creado 2 × 2 × 2 × 2 elementos de tipo int.

Jorge Pérez – Programación Estructurada en JAVA 103 / 103

Você também pode gostar