Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Escuela de Ingenierı́a
Departamento de Ciencia de la Computación
Resumen teórico
Arreglos
Hasta ahora poco a poco hemos podido almacenar y trabajar con información en java de manera cada vez
más eficiente.
Sin embargo cuando tenemos que trabajar con muchos objetos del mismo tipo, el código se vuelve un poco
ineficiente. Por eso es que existen estructuras llamadas arreglos, que hacen las veces de vectores, donde se
puede almacenar información del mismo tipo.
Es como una caja seccionada, donde podemos guardar un dato en cada casilla. Supongamos que cada casilla
guarda la palabra que representa a un número.
Algo importante es que al definir un arreglo, éste asigna posiciones a cada uno de los datos almacenados
comenzando desde CERO, entonces si el arreglo llega hasta la posición “n”, tendrá “n+1” elementos.
Por ejemplo: Arreglo de Strings
Podemos definirlo asignando el número de posiciones que tendrá al instante.
Podemos definirlo también de un largo determinado en un ciclo o directamente con sus elementos.
Es común asignar valores a los arreglos recorriendo cada una de sus casillas.
<identificador>[i]
Por ejemplo en el caso de los múltiplos, si yo quisiera averiguar el 5 deg múltiplo de 17, tengo que escribir:
int quinto=multiplos[4];
Entonces quinto = 5x17 (ojo con las posiciones que están definidas para el arreglo, comienzan desde cero).
Podemos tener arreglos de cualquier cosa, de String, int, char, objetos, arreglos, etc.
Importante: Para definir un arreglo se debe utilizar el sı́mbolo ’[ ]’. De la siguiente manera inicializamos el
arreglo:
Aunque cada una de las posiciones por defecto está vacı́a o nula (null).
Al igual que los otros objetos podemos crearlo y no inicializarlo hasta que sea necesario, lo importante es que
ANTES de asignarle valores a cada espacio, debemos indicarle al arreglo su largo (a menos que lo creemos
directamente, lo que no es muy usual).
Existen algunos comandos que se utilizan con los arreglos, por ejemplo, para saber el largo del arreglo, te-
nemos:
<identificador>.length;
Que nos devolverá el ndeg de valores que almacena el arreglo, es decir, al número que ingresamos al decla-
rarlo. Por ejemplo, si nuestro arreglo tiene casillas 0, 1 y 2, lenght nos retornará 3.
Un arreglo NO se puede asignar a otro arreglo, por ejemplo, si se tiene que:
num=Pares;
Esta asignación no copiará los valores, si no que, al igual que en los objetos, cambiará la referencia “num”,
de manera que apunte a la misma dirección de memoria que “Pares”. Para todos los efectos, ambas variables
“Pares” y “num” estarán apuntando al mismo arreglo. Para copiar los valores la forma correcta es:
Las matrices pueden ser regulares o irregulares, es decir, puede que en cada fila, el número de elementos sea
distinto, o pueden no ser cuadradas, etc.
La forma de definirlas es:
Se han establecido dos condiciones que revelan un posible funcionamiento anómalo en una máquina:
Oscilación: la cual se reconoce cuando aumenta (o disminuye) la temperatura en dos intervalos consecu-
tivos (t1 > t0 y t2 > t1) y luego disminuye (o aumenta) la temperatura en dos intervalos consecutivos
(t3 < t2 y t4 < t3). En el arreglo anterior, se pueden apreciar los dos tipos de oscilaciones: una
ascendente (a partir del instante 4) y otra descendente (a partir del instante 11).
Ciclicidad diaria: la cual se produce cuando en dos dı́as seguidos se repite una secuencia de tres tempe-
raturas en el mismo instante del dı́a. Si el siguiente arreglo corresponde al dı́a siguiente al del arreglo
anterior:
Entonces hay ciclicidad diaria a partir del instante 2, del instante 9 y del instante 16.
Escriba en lenguaje Java los siguientes métodos para ayudar a detectar comportamientos anómalos:
a) DetectarOscilaciones
b) DetectarCiclicidad
Posible solución
//Parte a)
//Muestra en consola mensajes indicando oscilaciones
//Recibe un arreglo que almacena la temperatura en un dı́a cualquiera
public static void DetectaOscilaciones(int[] regDia1){
int t;
for(t=0;t<regDia1.length-4;t++)//llegamos solo hasta la antepenultima posicion
{ if (regDia1[t+1] > regDia1[t] && //si se cumple la condicion para ascendente
regDia1[t+2] > regDia1[t+1] &&
regDia1[t+3] < regDia1[t+2] &&
regDia1[t+4] < regDia1[t+3]){
Usuario.mensajeConsola("Oscilación ascendente a partir del instante "+t);
} else if (regDia1[t+1] < regDia1[t] && //si se cumple la condicion para descendente
regDia1[t+2] < regDia1[t+1] &&
regDia1[t+3] > regDia1[t+2] &&
regDia1[t+4] > regDia1[t+3]){
Usuario.mensajeConsola("Oscilación descendente a partir del instante "+t);
}
}
}
//Parte b)
// Muestra en consola mensajes indicando ciclicidades
// Recibe dos arreglos que almacenan la temperatura en dos dı́as //consecutivos
public static void DetectaCiclicidad(int[] regDia1, int[] regDia2) {
int t;
for(t=0;t<regDia1.length-2;t++) {
if (regDia1[t] == regDia2[t] &&
regDia1[t+1] == regDia2[t+1] &&
regDia1[t+2] == regDia2[t+2]) {
Usuario.mensajeConsola("Ciclicidad diaria a partir del instante "+t);
}
}
}
En un espacio sin células solamente aparece (nace) una si es que está rodeada por exactamente 3
células.
Usted debe crear un programa que simule este juego. Debe mostrar el tablero en consola donde se deben
representar los espacios con células con unos y los vacı́os con ceros. Las posiciones de cada célula deben
ser generadas aleatoriamente al empezar cada juego y en cada iteración de este se debe mostrar el tablero.
Puede escoger cualquier tamaño de tablero mientras sea mayor que 3x3. Para terminar, en cada iteración
debe preguntar al usuario si desea continuar.
Ejemplo de tablero 8x8:
Criterios de solución
Es claro que la grilla del juego puede ser representado por una matriz. Entonces lo primero que debemos
hacer es crear una matriz e inicializarla, esto lo hacemos con un doble for el cual tiene una probabilidad de
30 % de generar un célula en dicho espacio.
Luego, para revisar las condiciones, debemos contar la cantidad de unos que hay alrededor de cada una de
las células, una vez hecho esto podemos decidir si la célula muere o vive. El problema que queda es que esta
información no puede ser inmediatamente aplicada a nuestra matriz ya que debemos ocuparla, tal como esta,
para calcular la condición de las otras células, es por esto que el siguiente estado de la matriz lo guardamos
en una matriz auxiliar. Luego esta matriz es guardada en la matriz original y se repite el proceso.
Posible solución
import iic1103Package.*;
public class Principal {
public static void main(String[] args) {
int numeroI=8; //numero de columnas
int numeroJ=8; //numero de filas
int probabilidad=3; //probabilidad de obtener un 1 en una posicion
int[][] matriz= new int[numeroI][numeroJ];//aqui guaradamos las
//posiciones de las celulas
int[][] auxiliar=new int[numeroI][numeroJ];//aqui guardamos las
//posiciones nuevas
for(int i=0;i<numeroI;i++)//creamos el tablero{
System.out.println("-----------------");
for(int j=0;j<numeroJ;j++){
if(Aleatorio.entero(1, 10)>probabilidad)//si es mayor que la
matriz[i][j]=0; //probabilidad no creamos una celula
else
matriz[i][j]=1;
System.out.print("|"+matriz[i][j]);
}
Criterios de solución
Lo importante aquı́ es darse cuenta de que cada fila de una matriz se puede tratar como un arreglo unidi-
mensional. Para hacer esto ocupamos matriz[i][j] dejando el i estático. Con esto vamos a ir obteniendo los
valores de nuestras filas. Luego para ordenarlas, se revisa uno por uno los caracteres y se le compara con
todos los otros caracteres de la misma fila. En caso de que sea mayor, se pone a la derecha del carácter
revisado. Luego es cosa de hacer lo mismo pero ahora para las columnas.
Posible solución
import iic1103Package.*;
public class Ordenar {
public static boolean sonIguales(char[] palabra1,char[] palabra2,int tamano){
for(int i=0;i<tamano;i++){
if(palabra1[i]!=palabra2[i])//vemos letra por letra
return false; //revisando que sean iguales
}
return true;
}
Dentro de una región no puede repetirse ninguna cifra (cada región tiene 9 celdas por lo que en cada
región deben estar las 9 cifras posibles).
Cada fila dentro de la cuadrı́cula debe tener las 9 cifras posibles (como son 9 celdas por fila, solamente
debe haber una aparición de cada cifra en esa fila).
Cada columna dentro de la cuadrı́cula debe tener las 9 cifras posibles (como son 9 celdas por columna,
solamente debe haber una aparición de cada cifra en esa columna).
En la siguiente figura se muestra el tablero final del Sudoku, siendo los valores alrededor del tablero,
ı́ndices que permiten identificar las filas y las columnas.
Usted debe escribir el método Validar que dado un tablero final de Sudoku chequea si este cumple con las
reglas arriba enunciadas.
Recuerde chequear que la matriz sea válida, puede suponer que la matriz es regular y que ha sido inicializada,
pero debe chequear que tiene la cantidad correcta de filas y columnas.
Si lo considera conveniente, puede crear otros métodos y clases que le permitan resolver el problema y que
sean llamados desde el método Validar.
Criterios de solución
Debemos ir revisando las condiciones de manera secuencial. Primero debemos comprobar que el tamaño del
arreglo sea correcto. Luego pasaremos por todos los casilleros, revisando que el número esté entre los valores
permitidos (1 y 9), y no se encuentre repetido en la fila o columna. Por último revisaremos las submatrices
de 3x3, comprobando que no se repitan números. Si en cualquier caso una comprobación falla, retornaremos
false, si pasa todas las validaciones, retornaremos true.
El suavizado se realiza asignando a cada pixel el color promedio entre él y los 8 pixeles adyacentes.
Criterios de solución
Primero observamos que debemos ver todos los pixeles que componen el bitmap, y para cada uno, revisar
todos los pixeles adyacentes, y obtener el promedio de sus colores. Además notamos que los pixeles de los
bordes tendrán menos pixeles adyacentes.
La forma de obtener el promedio de los colores es sumar determinada componente de todos los pixeles, y
dividirlo por el número de pixeles, repitiendo el proceso con cada componente.
También notamos que si realizamos las operaciones sobre la misma matriz, se modificará el resultado de los
pixeles adyacentes del siguiente pixel, por lo que es mejor opción realizar la tarea sobre un arreglo auxiliar.
Posible solución
private void Suavizar()
{ Pixel[][] nuevoBitmap = new Pixel[bitmap.length][bitmap[0].length];
for(int x = 0 ; x < nuevoBitmap.length ; x++){
for(int y = 0 ; y < nuevoBitmap[0].length ; y++){
int r, g, b, pixeles;
r = 0;
g = 0;
b = 0;
pixeles = 0;
for(int i = x - 1 ; i < x+1 ; i++){
for(int j = y - 1 ; j < y + 1 ; j++){
if(i >= 0 && i < nuevoBitmap.length && j >= 0 && j < nuevoBitmap[0].length){
pixeles++;
r = r + bitmap[i][j].getRojo();
g = g + bitmap[i][j].getVerde();
b = b + bitmap[i][j].getAzul();
}
}
}
r = r/pixeles;
g = g/pixeles;
b = b/pixeles;
Es decir, complete:
sin modificar:
Además, hay que llevar un registro con los corredores, i.e. es un arreglo de tipo Corredor, que como todos
los atributos será privado: private Corredor[] inscritos.
Ahora bien, al momento de agregar un corredor se pueden tener 2 escenarios:
el arreglo estaba vacı́o, y se crea uno nuevo (contiene sólo al nuevo corredor)
el arreglo ya tenı́a corredores. Es necesario crear uno nuevo, de tamaño mayor en 1 al anterior, copiar
cada elemento del arreglo antiguo al nuevo, y finalmente, copiar el nuevo elemento al final de este nuevo
arreglo 2 .
Por otro lado, la información que debemos mostrar emplea palabras para las categorı́as de los corredores,
por lo que debemos utilizar, por ejemplo, un switch para hacer la relación.
Por último, mostraremos un mensaje ad-hoc para la bienvenida, despedida, y en el caso que se pida infor-
mación y la lista esté vacı́a.
Posible solución
public class BBDD {
private Corredor[] inscritos;
// agrega un nuevo corredor al arreglo
public void agregar(Corredor nuevo){
// si el arreglo estaba vacio
if(this.inscritos == null){
inscritos = new Corredor[1]; // creamos un arreglo de tama~
no 1
inscritos[0] = nuevo; // ponemos al Corredor en la posicion 0 (la primera posicion)
}else{
agrandarArreglo(); // agrandamos el arreglo
// agregamos al nuevo Corredor en la ultima casilla (que la creamos vacia)
this.inscritos[this.inscritos.length-1] = nuevo;
}
}
// hacemos el arreglo una casilla mas grande
// es privado porque solo se debe llamar desde metodos de esta clase
private void agrandarArreglo() {
// creamos un arreglo auxiliar de largo lenght+1
Corredor[] aux = new Corredor[this.inscritos.length+1];
// copiamos cada Corredor al arreglo auxiliar
for(int i = 0 ; i < this.inscritos.length ; i++){
aux[i] = this.inscritos[i];
}
// la ultima posicion es null (porque es 1 mas grande)
this.inscritos = aux;
}
2 la solución que se muestra acá crea un método para esto