Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Captulo 6: Arreglos
Resumen te
orico
Arreglos
Hasta ahora poco a poco hemos podido almacenar y trabajar con informaci
on en java de manera cada vez
m
as eficiente.
Sin embargo, cuando tenemos que trabajar con muchos objetos del mismo tipo, el c
odigo se vuelve un poco
ineficiente. Por eso es que existen estructuras llamadas arreglos, que hacen las veces de vectores, donde se
puede almacenar informaci
on 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
umero.
Algo importante es que al definir un arreglo, este asigna posiciones a cada uno de los datos almacenados
comenzando desde CERO, entonces si el arreglo llega hasta la posici
on n, tendr
a n+1 elementos.
Por ejemplo: Arreglo de Strings
Podemos definirlo asignando el n
umero de posiciones que tendr
a al instante.
//declaracion del arreglo
String[] nombres=new String[3];
nombres[0]="Juan";
nombres[1]="Pablo";
nombres[2]="Ana";
Podemos definirlo tambien de un largo determinado en un ciclo o directamente con sus elementos.
//declaracion del arreglo directamente
char[] iniciales={a,b,c};
Es com
un asignar valores a los arreglos recorriendo cada una de sus casillas.
//declaracion en un ciclo con los m
ultiplos de 17
int[] multiplos=new int[10];
for (int i=0; i<10; i++)
{
multiplos[i]=(i+1)*17;
}
Matrices
Las matrices no son mas que arreglos de arreglos, simplemente como un dato guardado en un espacio que
ahora no se define por una posici
on, sino por un par de coordenadas.
Las matrices pueden ser regulares o irregulares, es decir, puede que en cada fila, el n
umero de elementos sea
distinto, o pueden no ser cuadradas, etc.
La forma de definirlas es:
<tipo>[ ][ ] <identificador> = new <tipo>[ ][ ];
Ejemplos
Problema 1: Preguntas Varias
Enunciado
Responda las siguientes preguntas:
1. Responda las siguientes preguntas en base al arreglo: int[] array = {0,1,2,3}:
a) Si se realiza la instrucci
on array[1] = array[2]; seguida por la instrucci
on array[2] = array[2]
+ 1;, cu
ales son los valores del arreglo array?por que?
b) Si se realiza la instrucci
on array[1] = array[2]; seguida por la instrucci
on array[2] = 4;,
cu
ales son los valores del arreglo array?por que?
a) Si se realiza la instrucci
on array[1] = array[2]; seguida por la instrucci
on array[2] = array[2]
+ "la";, cu
ales son los valores del arreglo array?por que?
b) Si se realiza la instrucci
on array[1] = array[2]; seguida por la instrucci
on array[2] = "la";,
cu
ales son los valores del arreglo array?por que?
3. Existe la clase Auto declarada de la siguiente forma:
class Auto {
private String color ;
private int agno ;
public Auto ( String _color , int _agno ) {...}
public String getColor () { return color ; }
public int getAgno () { return agno ; }
public void setColor ( String nuevo ) { color = nuevo ; }
public void setAgno ( int nuevo ) { agno = nuevo ; }
}
a) Si se realiza la instrucci
on array[1] = array[2]; seguida por la instrucci
on
array[2].setAgno(array[2].getAgno()+1);, cu
ales son los valores de los atributos de los objetos del arreglo array?por que?
b) Si se realiza la instrucci
on array[1] = array[2]; seguida por la instrucci
on array[2] = new
Auto("negro", 2009);, cu
ales son los valores de los atributos de los objetos del arreglo array?por
que?
c) Si se realiza la instrucci
on array[3].setColor("gris") cu
al es el resultado de la comparaci
on
array[0] == array[3]?por que?
Criterios de soluci
on
En este ejercicio lo importante es tener claro cuando las variables se copian por valor y cuando por referencia.
En las dos primeras preguntas, al tratarse de arreglos de enteros y Strings las variables se copian por valor,
por lo que luego de copiadas quedan completamente independientes. Cuando se trata de objetos las variables
se copian por referencia, lo que implica que ambas (la original y la nueva copiada) referencian al mismo
objeto y los cambios que se hagan a una se reflejan tambien en la otra.
IIC1103 Captulo 6: Arreglos
Posible soluci
on
1. Soluci
on
a) 0,2,3,3
La primera instrucci
on hace una copia desde la posici
on 1 a la 2, y la segunda instrucci
on solamente modifica el valor en el casillero 2, ya que por ser int los casilleros 1 y 2 se mantienen
independientes.
b) 0,2,4,3
La misma justificaci
on anterior, como la primera instrucci
on realiza una copia del valor de la
casilla 2 a la 1, ambas se mantienen independientes.
2. Soluci
on
a) { " las " ," el " ," ella " ," un " };
La primera instrucci
on hace una copia de la referencia de la casilla 2 a la casilla 1, mostrando
ambos el mismo valor. La segunda instrucci
on modifica el String en la casilla 2, creando un nuevo
String (son inmutables) independiente del String en la casilla 1.
b) { " las " ," el " ," la " ," un " };
Al igual que la pregunta anterior, la primera instrucci
on hace una copia de la referencia de la
casilla 2 a la casilla 1, mostrando ambos el mismo valor. La segunda instrucci
on crea un nuevo
String en la casilla 2, independiente del String en la casilla 1.
3. Soluci
on
a) { Auto ( " gris " , 2000) , Auto ( " blanco " , 2006) ,
Auto ( " blanco " , 2006) , Auto ( " rojo " , 2000)}:
Problema 2: M
as Repetidos
Enunciado
En esta pregunta usted debe implementar un metodo con encabezado:
public int repetidos ( int arreglo [])
Problema 3: Patrones
Enunciado
Se le ha pedido ayuda para escribir un programa que detecte patrones an
omalos en el funcionamiento de
maquinaria industrial en una f
abrica.
Cada da una m
aquina registra minuto a minuto su temperatura de funcionamiento, la cual es almacenada
en un arreglo como el que se muestra a continuaci
on:
Criterios de soluci
on
NOTA: el ndice de la u
ltima posici
on de un arreglo es, ocupando como ejemplo regDia1, regDia1.length-1,
ya que los ndices parten desde cero.
a) En este problema lo importante es darse cuenta de que s
olo hay que comparar enteros y la verdadera
dificultad se encuentra en sacar estos enteros de los arreglos. Por esto, para comparar el da t con el da t+1,
sacamos el entero t+1 del arreglo (regDia1[t+1]) y lo comparamos con el entero t del arreglo (regDia1[t]).
Esto luego se hace para t+2, t+3 y t+4 buscando la condici
on indicada por el enunciado. Es importante
notar que el for llega hasta la ante ante ante pen
ultima posici
on del arreglo (regDia1.length-4) ya que, o si
no, al pedir el entero regDia1[t+4] este estara fuera del arreglo.
b) Esto es muy similar al ejercicio anterior, la diferencia est
a en que, en vez de comparar enteros dentro de
un mismo arreglo, se comparan entre dos arreglos distintos.
Posible soluci
on
// Parte a )
// Muestra en consola mensajes i n d i c a n d o o s c i l a c i o n e s
// Recibe un arreglo que almacena la t e m p e r a t u r a en un dia c u a l q u i e r a
public static void D e t e c t a O s c i l a c i o n e s( int [] regDia1 ){
int t ;
for ( t =0; t < regDia1 . length -4; t ++) // llegamos solo hasta la a n t e p e n u l t i m a posicion
{ if ( regDia1 [ t +1] > regDia1 [ t ] &&
// si se cumple la c o n d i c i o n para a s c e n d e n t e
regDia1 [ t +2] > regDia1 [ t +1] &&
regDia1 [ t +3] < regDia1 [ t +2] &&
regDia1 [ t +4] < regDia1 [ t +3]){
Usuario . m e n s a j e C o n s o l a( " O s c i l a c i o n a s c e n d e n t e a partir del instante " + t );
} else if ( regDia1 [ t +1] < regDia1 [ t ] &&
// si se cumple la c o n d i c i o n para d e s c e n d e n t e
regDia1 [ t +2] < regDia1 [ t +1] &&
regDia1 [ t +3] > regDia1 [ t +2] &&
regDia1 [ t +4] > regDia1 [ t +3]){
Usuario . m e n s a j e C o n s o l a( " O s c i l a c i o n d e s c e n d e n t e a partir del instante " + t );
}
}
}
// Parte b )
// Muestra en consola mensajes i n d i c a n d o c i c l i c i d a d e s
// Recibe dos arreglos que a l m a c e n a n la t e m p e r a t u r a en dos dias // c o n s e c u t i v o s
public static void D e t e c t a C i c l i c i d a d( 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 . m e n s a j e C o n s o l a( " C i c l i c i d a d diaria a partir del instante " + t );
}
}
}
Problema 4: Lista N
umeros
Enunciado
Escriba la clase ListaNumeros que reciba un arreglo de enteros. Esta clase debe proveer los metodos
ElementoMayor() que retorna el mayor elemento dentro del arreglo, ElementoMenor(), que retorna el menor elemento dentro de la lista y ElementoMasRepetido() que retorna el valor del elemento que mas veces
aparece en el arreglo.
Criterios de soluci
on
Para el metodo ElementoMayor lo que tenemos que hacer es tener una variable donde almacenar el mayor
valor. Luego recorremos todo el arreglo y comparamos cada elemento con el mayor valor, si el elemento es
mayor entonces actualizamos el mayor valor. Al terminar el ciclo que recorre todo el arreglo, en la variable
estar
a el mayor valor del arreglo.
Para el metodo ElementoMenor hacemos lo mismo que para el metodo anterior pero comparamos si el
elemento del arreglo es menor que el valor guardado en nuestra variable que almacena el menor valor en este
caso.
Para el metodo ElementoMasRepetido ocupamos dos variables, una que guarde el n
umero que se ha repetido
m
as veces y otra para guardar cuantas veces se ha repetido. Con un ciclo recorremos todo el arreglo, para
cada elemento contamos (utilizando otro ciclo que recorra todo el arreglo) cuantas veces aparece. Luego
comparamos este n
umero de veces con el n
umero que hasta el momento tenga mayor n
umero de repeticiones
y actualizamos su valor si es necesario.
Posible soluci
on
public class L i s t a N u m e r o s {
private int [] a r r e g l o E n t e r o s;
public L i s t a N u m e r o s( int [] lista ) {
// Copiamos el arreglo
a r r e g l o E n t e r o s = new int [ lista . length ];
for ( int i = 0; i < a r r e g l o E n t e r o s. length ; i ++) {
a r r e g l o E n t e r o s[ i ] = lista [ i ];
}
}
public int E l e m e n t o M a y o r() {
int mayor = a r r e g l o E n t e r o s[0];
for ( int i = 1; i < a r r e g l o E n t e r o s. length ; i ++) {
if ( a r r e g l o E n t e r o s[ i ] > mayor ) {
mayor = a r r e g l o E n t e r o s[ i ];
}
}
return mayor ;
}
public int E l e m e n t o M e n o r() {
int menor = a r r e g l o E n t e r o s[0];
for ( int i = 1; i < a r r e g l o E n t e r o s. length ; i ++) {
if ( a r r e g l o E n t e r o s[ i ] < menor ) {
menor = a r r e g l o E n t e r o s[ i ];
}
}
return menor ;
}
public int E l e m e n t o M a s R e p e t i d o() {
// Buscamos cuantas veces aparece cada elemento , y g u a r d a m o s el que mas
// aparezca
int m a s R e p e t i d o = 0;
int masVeces = 0;
for ( int i = 0; i < a r r e g l o E n t e r o s. length ; i ++) {
// Reviso cuantas a p a r i c i o n e s tiene el elemento i
int contador = 0;
for ( int j = 0; j < a r r e g l o E n t e r o s. length ; j ++) {
if ( a r r e g l o E n t e r o s[ i ] == a r r e g l o E n t e r o s[ j ]) {
contador ++;
}
}
// Veo si el elemento i tiene mas a p a r i c i o n e s que el con mas
// a p a r i c i o n e s hasta el momento
if ( contador > masVeces ) {
masVeces = contador ;
m a s R e p e t i d o = a r r e g l o E n t e r o s[ i ];
}
}
return m a s R e p e t i d o;
}
}
10
11
Problema 6: C
odigo Desconocido
Enunciado
Indique lo que el siguiente c
odigo muestra en la consola
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l {
public static void main ( String [] args ) {
int [] arreglo = { 171 , 472 , 96 , 443 , 112 , 78 , 352 , 320 , 70 };
Metodo ( arreglo );
}
public static void Metodo ( int [] arreglo ) {
int x = arreglo [0];
for ( int i = 1; i < arreglo . length ; i ++) {
if ( arreglo [ i ] > x ) {
x = arreglo [ i ];
}
}
for ( int n = 10; 10 * x / n > 0; n = n * 10) {
int [] temp = new int [10];
for ( int i = 0; i < temp . length ; i ++) {
temp [ i ] = 0;
}
for ( int i = 0; i < arreglo . length ; i ++) {
temp [( arreglo [ i ] % n ) / (( int ) ( n / 10))]++;
}
for ( int i = 1; i < temp . length ; i ++) {
temp [ i ] += temp [ i - 1];
}
Imprimir ( temp );
int [] aux = new int [ arreglo . length ];
for ( int i = arreglo . length - 1; i >= 0; i - -) {
aux [ temp [( arreglo [ i ] % n ) / (( int ) ( n / 10))] - 1] = arreglo [ i ];
temp [( arreglo [ i ] % n ) / (( int ) ( n / 10))] - -;
}
for ( int i = 0; i < arreglo . length ; i ++) {
arreglo [ i ] = aux [ i ];
}
Imprimir ( arreglo );
}
}
public static void Imprimir ( int [] arreglo ) {
String texto = " " ;
for ( int i = 0; i < arreglo . length ; i ++) {
texto += arreglo [ i ] + " " ;
}
Usuario . m e n s a j e C o n s o l a( texto );
}
}
Criterios de soluci
on
En este tipo de problemas es buena opci
on escribir a un lado una tabla con las variables, arreglos y objetos,
e ir anotando los cambios lnea a lnea, realizando una especie de debug manual. Se debe ser bastante
sistem
atico para no equivocarse, y cuidar interpretar correctamente los cambios en las variables, arreglos y
en los objetos.
Posible soluci
on
2 3 6 7 7 7 8 8 9 9
320 70 171 472 112 352 443 96 78
0 1 2 2 3 4 4 8 8 9
112 320 443 352 70 171 472 78 96
3 5 5 7 9 9 9 9 9 9
70 78 96 112 171 320 352 443 472
12
Problema 7: Histograma
Enunciado
Un histograma es una representaci
on gr
afica (o como tabla) de las frecuencias de ciertos datos, distribuidos
en alguna cantidad de categoras. Por ejemplo en los siguientes datos:
0, 2, 4, 5, 3, 12, 1, 4, 5, 121, 78, 12, 56, 1, 7, 9, 12, 13, 25, 24, 28, 6, 65, 91, 14, 75, 10
. . . podramos definir las categoras x 20, 20 < x 50 y 50 < x, con lo que se produce el siguiente
histograma:
X
x 20
20 < x 50
50 < x
Frecuencia
18
3
6
Se le pide implementar la clase Histograma que permita crear un histograma de una serie de n
umeros
enteros comprendidos en un rango establecido al momento de inicializar el objeto, y usando como categoras
los mismos n
umeros, es decir, contar cuantas veces se repite cada n
umero en el rango. Use un metodo Agregar
que permita agregar un nuevo valor al Histograma.
Criterios de soluci
on
Para definir nuestra clase Histograma utilizamos como atributos un arreglo que lleve el conteo de las apariciones de los n
umeros y variables que nos permitan identificar el rango en el que se encuentran los n
umeros.
As nuestro arreglo debe ser del tama
no suficiente para almacenar el conteo de todos los valores posibles
dentro del rango definido.
Luego creamos un metodo Agregar como nos dice el enunciado que lo que hace es revisar en que posici
on
del arreglo se esta acumulando el valor recibido como par
ametro (la cual ser
a el valor ingresado menos el
lmite inferior del rango) y aumentamos la cantidad almacenada en esa posici
on en uno.
Para completar nuestra clase agregamos un metodo Mostrar que recorre el arreglo donde almacenamos el
conteo y muestra cada valor (correspondiente a la posicion en el arreglo m
as el lmite inferior) y la cantidad
almacenada en el.
13
Posible soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
public class H i s t o g r a m a {
private int [] conteo ;
private int limInf ;
private int limSup ;
private int cantidad ;
// Constructor , recibe los limites de los valores
public H i s t o g r a m a( int limInf , int limSup ) {
this . limInf = limInf ;
this . limSup = limSup ;
this . cantidad = limSup - limInf + 1;
conteo = new int [ cantidad ];
for ( int i = 0; i < conteo . length ; i ++) {
conteo [ i ] = 0;
}
}
// Agrega un valor al Histograma , para ello busca en que posicion del arreglo
// se esta a c u m u l a n d o ese valor
public void Agregar ( int valor ) {
conteo [ valor - limInf ] = conteo [ valor - limInf ] + 1;
}
public void Mostrar () {
int limite = limSup - limInf ;
int suma = 0;
for ( int i = 0; i < conteo . length ; i ++) {
Usuario . m e n s a j e C o n s o l a (( i + limInf ) + " : " + conteo [ i ]);
suma = suma + conteo [ i ];
}
Usuario . m e n s a j e C o n s o l a( " Suma : " + suma );
}
}
14
5
1
-3
-2
2
0
6
7
2
8
3
-3
-2
1
-2
7
6
11
0
4
-3
-4
-6
1
0
Si tam fuera 2, el metodo debe retornar el arreglo {0, 3}, ya que es la posicion donde comienza la matriz de
2x2, cuya suma es mayor (13). En cambio si tam fuera 3, el metodo debe retornar el arreglo {0, 2}, dado que
es la mayor suma (35).
Criterios de soluci
on
Lo primero que tenemos que hacer es recorrer la matriz por completo. Para eso utilizamos un doble ciclo pero
considerando que para no pasarnos de los lmites de la matriz tenemos que llegar a length-tam. Dentro de
este ciclo tenemos que recorrer la submatriz de tama
no tam, utilizando tambien un doble ciclo y calculando
la suma de sus posiciones. Luego, si esa suma es mayor que la encontrada hasta el momento actualizamos el
valor de la suma mayor y el valor de los ndices donde comienza la submatriz.
Posible soluci
on
public int [] b u s c a r M e j o r U b i c a c i o n( int [][] plano , int tam ) {
int [] indices = { -1 , -1 };
int max = 0;
for ( int i = 0; i <= plano . length - tam ; i ++) {
for ( int j = 0; j <= plano [ i ]. length - tam ; j ++) {
int suma = 0;
for ( int k = i ; k < i + tam ; k ++) {
for ( int m = j ; m < j + tam ; m ++) {
suma += plano [ k ][ m ];
}
}
if ( indices [0] == -1 || suma > max ) {
max = suma ;
indices [0] = i ;
indices [1] = j ;
}
}
}
return indices ;
}
15
16
Criterios de soluci
on
En este tipo de problemas es buena opci
on escribir a un lado una tabla con las variables, arreglos y objetos,
e ir anotando los cambios lnea a lnea, realizando una especie de debug manual. Se debe ser bastante
sistem
atico para no equivocarse, y cuidar interpretar correctamente los cambios en las variables, arreglos y
en los objetos.
Posible soluci
on
L1:texto:
L2:texto:
L3:texto:
L4:texto:
L5:texto:
L6:texto:
T0
T0
T0
T0
T0
T0
T1
T1
T1
T1
T1
T1
T2
T2
T2 T2S
T2S
T2 T2S
T2S T2SP3N
17
.
A continuaci
on se muestra un ejemplo de un main que utiliza esta clase y el output que produce.
public static void main ( String [] args ) {
String [] lista = { " auto " , " pato " , " palo " , " poto " , " amar " , " amor " ,
" loca " , " loco " , " polo " , " poco " , " poca " , " rota " , " roto " };
A d m i n P a l a b r a s admin = new A d m i n P a l a b r a s( lista );
String [] letras = { " escalopa " , " a u t o m o t o r" , " p e r c a t a d o" };
for ( int i = 0; i < letras . length ; i ++) {
int cont = admin . C o n t a r P a l a b r a s P o s i b l e s( letras [ i ]);
Usuario . m e n s a j e C o n s o l a( letras [ i ] + " : " + cont );
}
}
.
Output:
escalopa: 3
automotor: 4
percatado: 3
Criterios de soluci
on
Para implementar el metodo que nos piden necesitamos primero declarar una variable para ir contando.
Luego recorremos todas las palabras en la lista (con un f or por ejemplo) y para cada una revisamos si es
posible formarla con las letras recibidas. Para esto, dentro del ciclo que recorre la lista, creamos un arreglo
para saber que letras ya hemos utilizado, donde el largo del arreglo es el n
umero de letras disponibles y en
cada posicion del arreglo guardamos un true si esa letra ya se us
o o false si todava no se ha utilizado. Luego
recorremos todas las letras de la palabras y vemos si est
an en la letras disponibles sin haber sido usadas.
Cuando encontramos una letra la marcamos como no disponible. As, si pudimos conseguir todas las letras
aumentamos el contador en uno. Finalmente retornamos el contador.
18
Posible soluci
on
public class A d m i n P a l a b r a s {
private String [] l i s t a P a l a b r a s;
public A d m i n P a l a b r a s( String [] lista ) {
l i s t a P a l a b r a s = lista ;
}
public int C o n t a r P a l a b r a s P o s i b l e s( String letras ) {
// Creamos una variable para ir contando
int contador = 0;
// R e c o r r e m o s todas las palabras en la lista y para cada una r e v i s a m o s
// si es posible formarla con las letras r e c i b i d a s
for ( int i = 0; i < l i s t a P a l a b r a s. length ; i ++) {
// Creamos un arreglo para saber que letras ya hemos utilizado ,
// lo i n i c i a m o s en false
boolean [] usadas = new boolean [ letras . length ()];
for ( int j = 0; j < usadas . length ; j ++) {
usadas [ j ] = false ;
}
// R e c o r r e m o s todas las letras de la palabra y vemos si estan en las
// letras d i s p o n i b l e s sin haber sido usadas
boolean e s P o s i b l e = true ;
for ( int j = 0; j < l i s t a P a l a b r a s[ i ]. length (); j ++) {
boolean e n c o n t r a d a = false ;
// Buscamos la letra entre las d i s p o n i b l e s
for ( int k = 0; k < letras . length () && ! e n c o n t r a d a; k ++) {
if (! usadas [ k ] && l i s t a P a l a b r a s[ i ]. charAt ( j ) == letras . charAt ( k )) {
// E n c o n t r a m o s la letra , la marcamos como u t i l i z a d a
e n c o n t r a d a = true ;
usadas [ k ] = true ;
}
}
if (! e n c o n t r a d a) {
// Indica que la letra no fue e n c o n t r a d a entre las d i s p o n i b l e s
e s P o s i b l e = false ;
}
}
// R e v i s a m o s si fue posible c o n s e g u i r todas las letras
if ( e s P o s i b l e) {
contador ++;
}
}
return contador ;
}
}
19
Usted debe crear un programa que simule este juego. Debe mostrar el tablero en consola donde se deben
representar los espacios con celulas con unos y los vacos con ceros. Las posiciones de cada celula deben
ser generadas aleatoriamente al empezar cada juego y en cada iteraci
on de este se debe mostrar el tablero.
Puede escoger cualquier tama
no de tablero mientras sea mayor que 3x3. Para terminar, en cada iteraci
on
debe preguntar al usuario si desea continuar.
Ejemplo de tablero 8x8:
20
Primera Iteracion
----------------|0|0|0|0|0|0|0|0|
----------------|0|0|0|0|0|1|0|1|
----------------|0|0|0|0|0|0|0|0|
----------------|0|0|0|0|0|0|0|0|
----------------|0|0|0|0|0|0|1|1|
----------------|0|1|0|0|1|0|0|0|
----------------|0|1|0|0|0|0|0|0|
----------------|0|0|0|0|0|0|0|0|
-----------------
Segunda Iteraci
on
----------------|0|0|0|0|0|0|0|0|
----------------|0|0|0|0|0|0|0|0|
----------------|0|0|0|0|0|0|0|0|
----------------|0|0|0|0|0|0|0|0|
----------------|0|0|0|0|0|0|0|0|
----------------|0|0|0|0|0|0|0|0|
----------------|0|0|0|0|0|0|0|0|
----------------|0|0|0|0|0|0|0|0|
-----------------
Criterios de soluci
on
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 celula en dicho espacio.
Luego, para revisar las condiciones, debemos contar la cantidad de unos que hay alrededor de cada una de
las celulas, una vez hecho esto podemos decidir si la celula muere o vive. El problema que queda es que esta
informaci
on no puede ser inmediatamente aplicada a nuestra matriz ya que debemos ocuparla, tal como est
a,
para calcular la condici
on de las otras celulas, 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
on
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l {
public static void
int numeroI = 8;
int numeroJ = 8;
int p r o b a b i l i d a d
int [][] matriz =
int [][] auxiliar
21
22
23
Usted debe escribir el metodo Validar que dado un tablero final de Sudoku chequea si este cumple con las
reglas arriba enunciadas.
boolean Validar(int[][] sudoku){...}
Recuerde chequear que la matriz sea valida, 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 metodos y clases que le permitan resolver el problema y que
sean llamados desde el metodo Validar.
Criterios de soluci
on
Debemos ir revisando las condiciones de manera secuencial. Primero debemos comprobar que el tama
no del
arreglo sea correcto. Luego pasaremos por todos los casilleros, revisando que el n
umero este entre los valores
permitidos (1 y 9), y no se encuentre repetido en la fila o columna. Por ultimo revisaremos las submatrices
de 3x3, comprobando que no se repitan n
umeros. Si en cualquier caso una comprobaci
on falla, retornaremos
false, si pasa todas las validaciones, retornaremos true.
24
Posible soluci
on
public static boolean Validar ( int [][] tabla ) {
// C o m p r o b a m o s que el tamano sea el c o r r e s p o n d i e n t e
if ( tabla . length != 9 || tabla [0]. length != 9) {
return false ;
}
for ( int k = 1; k < 10; k ++) {
// Elejimos un numero del 1 al 9
// Viajamos por una de las d i m e n s i o n e s del array
for ( int i = 0; i < tabla . length ; i ++) {
// S u p o n e m o s que el numero buscado no esta ni en las filas ni en las columnas
// para cada columna y fila r e s p e c t i v a m e n t e e i n i c i a l m e n t e
boolean e s t a f i l a s = false ;
boolean e s t a c o l u m n a s = false ;
for ( int j = 0; j < tabla [ i ]. length ; j ++) {
// C o m p r o b a m o s que el numero de la tabla este entre 1 y 9
if ( tabla [ i ][ j ] < 1 || tabla [ i ][ j ] > 9) {
return false ;
}
// V e r i f i c a m o s igualdad del numero en la tabla c o r r e s p o n d e
// al buscado en las filas
if ( tabla [ i ][ j ] == k ) {
// Si estaba a n t e r i o r m e n t e retorna false , sino graba que esta
if ( e s t a f i l a s) {
return false ;
}
e s t a f i l a s = true ;
}
// V e r i f i c a m o s igualdad del numero en la tabla c o r r e s p o n d e
// al buscado en las columnas
if ( tabla [ j ][ i ] == k ) {
// Si estaba a n t e r i o r m e n t e retorna false , sino graba que esta
if ( e s t a c o l u m n a s) {
return false ;
}
e s t a c o l u m n a s = true ;
}
}
}
// D i v i d i m o s la tabla en s u b m a t r i c e s de 3 x3
// R e c o r r e s m o s las s u b m a t r i c e s con los indices n y m
for ( int n = 0; n < 3; n ++) {
for ( int m = 0; m < 3; m ++) {
// S u p o n e m o s que el numero buscado no esta en el cuadrado
boolean e s t a c u a d r a d o = false ;
// R e c o r r e m o s la s u b m e t r i z con los indices i y j ,
// d e p e n d i e n t e s de n y m
for ( int i = 3 * n ; i < 3 * n + 3; i ++) {
for ( int j = 3 * m ; j < 3 * m + 3; j ++) {
// V e r i f i c a m o s igualdad del numero en la tabla
// c o r r e s p o n d e al buscado la s u b m a t r i z
if ( tabla [ j ][ i ] == k ) {
// Si estaba a n t e r i o r m e n t e retorna false ,
// sino graba que esta
if ( e s t a c u a d r a d o) {
return false ;
}
e s t a c u a d r a d o = true ;
}
}
}
}
}
}
return true ;
}
25
Posible soluci
on
private void Suavizar () {
Pixel [][] n u e v o B i t m a p = new Pixel [ bitmap . length ][ bitmap [0]. length ];
for ( int x = 0; x < n u e v o B i t m a p. length ; x ++) {
for ( int y = 0; y < n u e v o B i t m a p [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 < n u e v o B i t m a p. length && j >= 0
&& j < n u e v o B i t m a p [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 ;
n u e v o B i t m a p[ x ][ y ] = new Pixel (r , g , b );
}
}
bitmap = n u e v o B i t m a p;
}
26
Criterios de soluci
on
Lo primero que tenemos que hacer es revisar si las dimensiones son las mismas, ya que esto es una restricci
on
de la fusi
on. Si no son iguales simplemente retornamos null. Si son iguales seguimos con el metodo.
Creamos la matriz de Pixeles donde guardaremos los resultados.
Implementamos un doble ciclo que nos permita recorrer toda la matriz de resultados para ir llenando cada
posici
on. Luego calculamos dos sumas: la suma de todos los colores del pixel de la primera imagen y la suma
de todos los colores del pixel de la segunda imagen. Revisamos cu
al suma es mayor y seg
un esto aplicamos
la f
ormula descrita en el enunciado para calcular el resultado y almacenarlo en la posicion de la matriz
resultante.
Finalmente retornamos la matriz resultante.
27
Posible soluci
on
public Pixel [][] F u s i o n E s p e c i a l( Imagen imagen , float p o n d e r a d o r) {
Pixel [][] otros = imagen . g e t P i x e l e s ();
// R e v i s a m o s si las d i m e n s i o n e s son las mismas , ya que esto es una
// r e s t r i c c i o n de la fusion
if ( pixeles . length != otros . length || pixeles [0]. length != otros [0]. length ) {
return null ;
}
// Creamos la matriz de pixeles donde g u a r d a r e m o s los r e s u l t a d o s
Pixel [][] r e s u l t a d o = new Pixel [ pixeles . length ][ pixeles [0]. length ];
// R e c o r r e m o s la imagen r e s u l t a n t e creando el color para cada pixel de esta
for ( int i = 0; i < r e s u l t a d o. length ; i ++) {
for ( int j = 0; j < r e s u l t a d o[ i ]. length ; j ++) {
// Sumamos cada color para ver cual es mas fuerte
int suma1 = pixeles [ i ][ j ]. getRojo () + pixeles [ i ][ j ]. getVerde ()
+ pixeles [ i ][ j ]. getAzul ();
int suma2 = otros [ i ][ j ]. getRojo () + otros [ i ][ j ]. getVerde ()
+ otros [ i ][ j ]. getAzul ();
int rojo , verde , azul ;
if ( suma1 > suma2 ) {
rojo = ( int ) ( pixeles [ i ][ j ]. getRojo () * p o n d e r a d o r + (1 - p o n d e r a d o r)
* otros [ i ][ j ]. getRojo ());
verde = ( int ) ( pixeles [ i ][ j ]. getVerde () * p o n d e r a d o r + (1 - p o n d e r a d o r)
* otros [ i ][ j ]. getVerde ());
azul = ( int ) ( pixeles [ i ][ j ]. getAzul () * p o n d e r a d o r + (1 - p o n d e r a d o r)
* otros [ i ][ j ]. getAzul ());
} else {
rojo = ( int ) ( otros [ i ][ j ]. getRojo () * p o n d e r a d o r + (1 - p o n d e r a d o r)
* pixeles [ i ][ j ]. getRojo ());
verde = ( int ) ( otros [ i ][ j ]. getVerde () * p o n d e r a d o r + (1 - p o n d e r a d o r)
* pixeles [ i ][ j ]. getVerde ());
azul = ( int ) ( otros [ i ][ j ]. getAzul () * p o n d e r a d o r + (1 - p o n d e r a d o r)
* pixeles [ i ][ j ]. getAzul ());
}
// A g r e g a m o s el pixel al r e s u l t a d o
r e s u l t a d o[ i ][ j ] = new Pixel ( rojo , verde , azul );
}
}
return r e s u l t a d o;
}
28
Problema 15: M
aquina de Bebidas
Enunciado
Una m
aquina expendedora de bebidas calientes vende 5 tipos de esta, cafe, chocolate, cortado, capuccino
y moka. La m
aquina recibe las monedas del cliente, procesa la opcion elegida, y si es posible le entrega el
producto, en conjunto con el vuelto correspondiente. La m
aquina acepta monedas de 10, 50, 100, 500, y
billetes de 1000 y 2000. La m
aquina solamente es capaz de dar vuelto si es posible hacerlo con la mnima
cantidad de monedas posibles (nunca se utilizan billetes para dar vuelto, s
olo monedas). Por ejemplo, si el
vuelto a dar son 1270, entonces la venta se realizar
a si y solo s la m
aquina posee al menos 2 monedas de
500, 2 monedas de 100, 1 moneda de 50 y 2 monedas de 10.
Implemente la clase Maquina la cual debe representar a esta maquina expendedora. Su clase debe tener
al menos un constructor que reciba un arreglo con los precios de las 5 bebidas, e inicialice las cantidades
iniciales para cada moneda, las cuales son 50 monedas de 10, 50, 100 y 500. Adem
as su clase debe tener el
metodo Vender el cual debe tener la siguiente firma:
public int[] Vender(int[] ingresados, int producto)
Donde ingresados representa a las monedas ingresadas por el cliente, en la posici
on 0 est
an las monedas
de 10, en la 1 las de 50 y as sucesivamente en forma creciente (si no se ingresan monedas de alg
un tipo,
entonces en la posici
on que le corresponde en el arreglo hay un 0). El par
ametro producto indica el ndice
de la bebida seleccionada, en el mismo orden indicado anteriormente. Este metodo debe retornar un arreglo
con las monedas (y billetes) que se deben dar de vuelto al usuario. En caso de no poder realizar la venta se
retorna null. La compra no se puede realizar en caso que no sea posible dar el vuelto o en caso que el dinero
ingresado no sea suficiente para la bebida seleccionada.
Puede agregar todos los metodos y atributos que quiera a su clase.
Criterios de soluci
on
Para cumplir con lo que nos piden en el enunciado la clase Maquina debera tener como atributos un arreglo
que contenga la cantidad de cada una de las monedas que hay actualmente en la m
aquina y otro arreglo que
contenga los precios de las 5 bebidas calientes.
Adem
as de esto la clase debe tener un constructor que reciba como par
ametro los precios de las bebidas y
los asigne al arreglo de precios que tiene como atributo. Adem
as debe inicializar la cantidad de monedas en
50 (datos obtenidos del enunciado).
Finalmente la clase debe tener un metodo Vender. En este metodo lo primero que hacemos es recorrer el
arreglo con las monedas ingresadas por el usuario y calcular el precio total ingresado, para esto utilizamos
un ciclo y multiplicamos el valor en cada posici
on del arreglo por el valor de la moneda que representa la
posici
on. Luego de esto actualizamos la cantidad de monedas que tiene la m
aquina recorriendo el arreglo de
ingresados y sumando las cantidades al atributo que contiene las cantidades de cada moneda. A continuaci
on
tenemos que verificar si es factible hacer la venta, para eso revisamos que el dinero total ingresado sea mayor
que el precio del producto y que contemos con dinero suficiente para entregar el vuelto. Si se cumple esto
entonces calculamos el vuelto y formamos el arreglo con las cantidades de cada moneda a devolver.
29
Posible soluci
on
public class Maquina {
private int [] monedas ;
private int [] v a l o r M o n e d a s = { 10 , 50 , 100 , 500 , 1000 , 2000 };
private int [] precios ;
public Maquina ( int [] precios ) {
this . precios = new int [5];
for ( int i = 0; i < this . precios . length ; i ++) {
this . precios [ i ] = precios [ i ];
}
monedas = new int [6];
for ( int i = 0; i < monedas . length - 2; i ++) {
monedas [ i ] = 50;
}
}
public int [] Vender ( int [] ingresados , int producto ) {
int d i n e r o I n g r e s a d o = 0;
for ( int i = 0; i < i n g r e s a d o s. length ; i ++) {
d i n e r o I n g r e s a d o += i n g r e s a d o s[ i ]* v a l o r M o n e d a s[ i ];
}
int m a x V u e l t o = d i n e r o I n g r e s a d o - masCaro ();
for ( int i = 0; i < monedas . length ; i ++) {
monedas [ i ] += i n g r e s a d o s[ i ];
}
if ( v e r i f i c a r F a c t i b i l i d a d( m a x V u e l t o)
&& d i n e r o I n g r e s a d o >= precios [ producto ]) {
return d e v o l v e r D i n e r o( d i n e r o I n g r e s a d o - precios [ producto ]);
} else {
for ( int i = 0; i < monedas . length ; i ++) {
monedas [ i ] -= i n g r e s a d o s[ i ];
}
return null ;
}
}
public int masCaro () {
int masCaro = precios [0];
for ( int i = 1; i < precios . length ; i ++) {
if ( precios [ i ] > masCaro ) {
masCaro = precios [ i ];
}
}
return masCaro ;
}
public boolean v e r i f i c a r F a c t i b i l i d a d( int monto ) {
for ( int i = monedas . length - 1; i > 0; i - -) {
if ( monto / v a l o r M o n e d a s[ i ] > monedas [ i ]) {
return false ;
}
monto = monto % v a l o r M o n e d a s[ i ];
}
return true ;
}
public int [] d e v o l v e r D i n e r o( int dinero ) {
int [] vuelto = new int [ monedas . length ];
for ( int i = monedas . length - 1; i > 0; i - -) {
vuelto [ i ] = dinero / v a l o r M o n e d a s[ i ];
monedas [ i ] -= vuelto [ i ];
dinero = dinero % v a l o r M o n e d a s[ i ];
}
return vuelto ;
}
}
30
Problema 16: C
odigo Misterioso
Enunciado
Para el siguiente c
odigo, indique el output que aparecera en la Consola.
public class ClassA {
private String id ;
private ClassA hijo ;
private int total ;
public ClassA ( String n ) {
id = n ;
total = 0;
}
public void setHijo ( ClassA h ) {
hijo = h ;
}
public ClassA getHijo () {
return hijo ;
}
public String getId () {
return id ;
}
public void aumentar ( int delta ) {
a u m e n t a r D e s d e P a d r e( delta );
if ( hijo != null )
hijo . a u m e n t a r D e s d e P a d r e( delta );
}
public void a u m e n t a r D e s d e P a d r e( int delta ) {
total += delta ;
}
public int getTotal () {
return total ;
}
}
public static void main ( String [] args ) {
ClassA [] l i s t a O b j e t o s = new ClassA [5];
for ( int i = 0; i < l i s t a O b j e t o s. length ; i ++) {
l i s t a O b j e t o s[ i ] = new ClassA ( " Objeto " + i );
if ( i % 2 == 1) {
l i s t a O b j e t o s[ i ]. setHijo ( l i s t a O b j e t o s[ i - 1]);
}
l i s t a O b j e t o s[ i ]. aumentar ( i );
}
for ( int i = 0; i < l i s t a O b j e t o s. length ; i ++) {
if ( l i s t a O b j e t o s[ i ]. getTotal () == 1) {
Usuario . m e n s a j e C o n s o l a( " L1 : " + l i s t a O b j e t o s[ i ]. getId ());
}
}
for ( int i = 0; i < l i s t a O b j e t o s. length ; i ++) {
if ( l i s t a O b j e t o s[ i ]. getHijo () == null ) {
l i s t a O b j e t o s[ i ]. setHijo ( l i s t a O b j e t o s[( i + 2)
% l i s t a O b j e t o s. length ]);
}
}
for ( int i = 0; i < l i s t a O b j e t o s. length ; i ++) {
l i s t a O b j e t o s[ i ]. aumentar ( l i s t a O b j e t o s[ i ]. getHijo (). getHijo (). getTotal ());
}
for ( int i = 0; i < l i s t a O b j e t o s. length ; i ++) {
Usuario . m e n s a j e C o n s o l a( " L2 : " + l i s t a O b j e t o s[ i ]. getId ()
+ " - Total : " + l i s t a O b j e t o s[ i ]. getTotal ());
}
}
31
Criterios de soluci
on
En este tipo de problemas es buena opci
on escribir a un lado una tabla con las variables, arreglos y objetos,
e ir anotando los cambios lnea a lnea, realizando una especie de debug manual. Se debe ser bastante
sistem
atico para no equivocarse, y cuidar interpretar correctamente los cambios en las variables, arreglos y
en los objetos.
Posible soluci
on
L1:
L1:
L2:
L2:
L2:
L2:
L2:
Objeto0
Objeto1
Objeto0
Objeto1
Objeto2
Objeto3
Objeto4
Total:
Total:
Total:
Total:
Total:
14
24
33
17
28
32
sin modificar:
public class Corredor {
// [ A T R I B U T O S]
private String nombre ; // nombre del corredor
private int edad ; // su edad
private int c a t e g o r i a; // 5 para 5k , 10 para 10 k , 11 para elite
// [ METODOS ]
// C o n s t r u c t o r
public Corredor ( String nombre , int edad , int c a t e g o r i a) {
this . nombre = nombre ;
this . edad = edad ;
this . c a t e g o r i a = c a t e g o r i a;
}
// getters
public int g e t C a t e g o r i a() {
return c a t e g o r i a;
}
public int getEdad () {
return edad ;
}
public String g e t N o m b r e() {
return nombre ;
}
}
1 para
esto y m
as visite www.runninguc.cl, o dirjase a deportes
33
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l {
/* * Programa para manejar la i n s c r i p c i o n para una corrida */
public static void main ( String [] args ) {
// String con los mensajes a mostrar
String b i e n v e n i d a = " B i e n v e n i d o a la i n s c r i p c i o n de soporte para el R u n n i n g U C" +
" \ nMas i n f o r m a c i o n en www . r u n n i n g u c. cl " ;
String d e s p e d i d a = " Nos vemos \ n ( mas info en www . r u n n i n g u c. cl ) " ;
String p e d i r N o m b b r e = " Ingrese el nombre " , p e d i r E d a d = " Ingrese la edad " ;
String p e d i r C a t e g o r i a = " Ingrese la c a t e g o r i a: " +
" \ n 1] 5 K \ n 2] 10 K \ n 3] Elite " ;
String menu = " Ingrese una opcion : " +
" \ n0 ) Salir \ n1 ) I n s c r i b i r\ n2 ) Mostrar i n f o r m a c i o n de un corredor \ n3 ) Mostrar i n s c r i t o s" ;
BBDD bd = new BBDD (); // creamos la base de datos ( i n i c i a l m e n t e vacia )
int opcion ;
Usuario . mensaje ( b i e n v e n i d a);
do {
opcion = Usuario . entero ( menu ); // pedimos una opcion
while ( opcion < 0 || opcion > 3){ // la v a l i d a m o s
Usuario . mensaje ( " Opcion i n c o r r e c t a! " );
opcion = Usuario . entero ( menu );
}
switch ( opcion ) { // hacemos lo que se pide
case 0: { Usuario . mensaje ( d e s p e d i d a); break ;} // Salir
case 1: { // I n s c r i b i r
// pedimos el nombre
String nombre = Usuario . texto ( p e d i r N o m b b r e);
// pedimos la edad
int edad = Usuario . entero ( p e d i r E d a d);
while ( edad < 0) { edad = Usuario . entero ( p e d i r E d a d );} // v a l i d a m o s que sea >0
// pedimos la c a t e g o r i a
int c a t e g o r i a = Usuario . entero ( p e d i r C a t e g o r i a);
// v e r i f i c a m o s que este entre 1 y 3
while ( c a t e g o r i a < 1 || c a t e g o r i a > 3 ) {
c a t e g o r i a = Usuario . entero ( p e d i r C a t e g o r i a);
}
Corredor al = new Corredor ( nombre , edad , c a t e g o r i a); // lo creamos
bd . agregar ( al ); // lo a g r e g a m o s
break ;
} case 2: { // Pedir i n f o r m a c i o n de un corredor
int numero = Usuario . entero ( " Ingrese el numero del corredor : " );
while ( numero < 1 ) // v a l i d a m o s que sea >= 1
numero = Usuario . entero ( " Ingrese el numero del corredor : " );
// buscamos esa posicion . Partimos de 0 , asi que restamos 1 al numero
Usuario . mensaje ( bd . i n f o I n s c r i t o N( numero -1));
break ;
} case 3: { Usuario . m e n s a j e C o n s o l a( bd . m o s t r a r I n s c r i t o s ()); break ;} // Mostrar todos
}
} while ( opcion != 0);
}
}
Criterios de soluci
on
Primero que todo, es importante reconocer los metodos que debemos implementar y su forma:
public void agregar(Corredor al) {...}
public String infoInscritoN(int i) {...}
public String mostrarInscritos() {...}
Adem
as, hay que llevar un registro con los corredores, i.e. es un arreglo de tipo Corredor, que como todos
los atributos ser
a privado: private Corredor[] inscritos.
Ahora bien, al momento de agregar un corredor se pueden tener 2 escenarios:
El arreglo estaba vaco, y se crea uno nuevo (contiene solo al nuevo corredor)
El arreglo ya tena corredores. Es necesario crear uno nuevo, de tama
no mayor en 1 al anterior, copiar
cada elemento del arreglo antiguo al nuevo, y finalmente, copiar el nuevo elemento al final de este nuevo
IIC1103 Captulo 6: Arreglos
34
arreglo 2 .
Por otro lado, la informaci
on que debemos mostrar emplea palabras para las categoras de los corredores,
por lo que debemos utilizar, por ejemplo, un switch para hacer la relacion.
Por u
ltimo, mostraremos un mensaje ad-hoc para la bienvenida, despedida, y en el caso que se pida informaci
on y la lista este vaca.
Posible soluci
on
public class BBDD {
private Corredor [] i n s c r i t o s;
// agrega un nuevo corredor al arreglo
public void agregar ( Corredor nuevo ) {
// si el arreglo estaba vacio
if ( this . i n s c r i t o s == null ) {
i n s c r i t o s = new Corredor [1]; // creamos un arreglo de tamanio 1
i n s c r i t o s[0] = nuevo ; // ponemos al Corredor en la posicion 0 ( la
// primera posicion )
} else {
a g r a n d a r A r r e g l o (); // a g r a n d a m o s el arreglo
// a g r e g a m o s al nuevo Corredor en la ultima casilla ( que la creamos
// vacia )
this . i n s c r i t o s[ this . i n s c r i t o s. length - 1] = nuevo ;
}
}
// hacemos el arreglo una casilla mas grande
// es privado porque solo se debe llamar desde metodos de esta clase
private void a g r a n d a r A r r e g l o() {
// creamos un arreglo auxiliar de largo lenght +1
Corredor [] aux = new Corredor [ this . i n s c r i t o s. length + 1];
// copiamos cada Corredor al arreglo auxiliar
for ( int i = 0; i < this . i n s c r i t o s. length ; i ++) {
aux [ i ] = this . i n s c r i t o s[ i ];
}
// la ultima posicion es null ( porque es 1 mas grande )
this . i n s c r i t o s = aux ;
}
// metodo para retornar la i n f o r m a c i o n del inscrito numero - esimo
public String i n f o I n s c r i t o N( int numero ) {
String info = " " ;
// si la lista esta vacia
if ( this . i n s c r i t o s == null ) {
info = " No hay i n s c r i t o s. " ; // decimos que no hay i n s c r i t o s
} else { // si la lista tiene por lo menos un inscrito
// avisamos si el numero esta fuera del largo del arreglo
if ( this . i n s c r i t o s. length <= numero ) {
info += " No se e n c u e n t r a el numero s o l i c i t a d o" ;
} else {
// es una posicion valida , asi que o b t e n e m o s su i n f o r m a c i o n
// llamamos a los gets () c o r r e s p o n d i e n t e s ( y a g r e g a m o s un "\ n ")
info += " Corredor Numero : " + ( numero + 1) + " | " ;
info += " Nombre : " + this . i n s c r i t o s[ numero ]. g e t N o m b r e() + " | " ;
info += " Edad : " + this . i n s c r i t o s[ numero ]. getEdad () + " | " ;
int c a t e g o r i a = this . i n s c r i t o s[ numero ]. g e t C a t e g o r i a ();
String cat = " " ; // m o s t r a r e m o s la c a t e g o r i a como el string que
// c o r r e s p o n d e
switch ( c a t e g o r i a) {
case 1:
cat = " 5 K " ;
break ;
case 2:
cat = " 10 K " ;
break ;
case 3:
cat = " Elite " ;
break ;
}
info += " C a t e g o r i a: " + cat + " | " ;
2 la
soluci
on que se muestra ac
a crea un m
etodo para esto
35
}
}
return info ; // r e t o r n a m o s la i n f o r m a c i o n del inscrito
}
// metodo para mostrar todos los i n s c r i t o s que hay en ese momento
public String m o s t r a r I n s c r i t o s() {
String todos = " " ; // variable que guardara la i n f o r m a c i o n
// si el arreglo es null
if ( this . i n s c r i t o s == null ) {
todos = " No hay i n s c r i t o s. " ; // quiere decir que no hay i n s c r i t o s
} else { // hay por lo menos un inscrito
// r e c o r r e m o s el arreglo
for ( int i = 0; i < this . i n s c r i t o s. length ; i ++) {
// le a g r e g a m o s la i n f o r m a c i o n del i - esimo inscrito
todos += i n f o I n s c r i t o N( i ) + " \ n " ;
}
}
return todos ; // r e t o r n a m o s la i n f o r m a c i o n total
}
}
36
37
Posible soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
public class Naipe {
String [] mazo ;
int n u m e r o _ c a r t a s;
public Naipe () {
n u m e r o _ c a r t a s = 52;
mazo = new String [ n u m e r o _ c a r t a s];
String [] pinta = { " corazon " , " pica " , " trebol " ,
String [] n u m e r o _ s i m b o l o = { " 1 " , " 2 " , " 3 " , " 4 " ,
" 9 " , " 10 " , " J " , " Q " , " K " };
for ( int i = 0; i < n u m e r o _ s i m b o l o. length ; i ++)
for ( int j = 0; j < pinta . length ; j ++) {
mazo [ i * 4 + j ] = n u m e r o _ s i m b o l o[ i ] + " " +
}
}
}
38
39
40
41
5000
2200
3000
6
2500
1500
800
6000
1
2
3
4
5
6
1
-1
-1
-1
-1
-1
-1
2
5000
-1
-1
-1
-1
-1
3
-1
3000
-1
-1
1500
-1
4
-1
-1
6000
-1
-1
-1
5
-1
-1
-1
-1
-1
2500
6
2200
-1
-1
800
-1
-1
El gr
afico de la izquierda muestra el esquema de recorridos para 6 ciudades, y a la derecha se muestra una
matriz que representa este esquema. En este ejemplo:
- Existe un recorrido desde la ciudad 1 hasta la ciudad 2 y tiene costo 5000, pero no existe un recorrido
desde la ciudad 2 hasta la ciudad 1 (costo es 1).
Para esta pregunta se le pide implementar la clase Ruta para representar los recorrido, de acuerdo a las
siguientes especificaciones:
a) Los atributos de la clase son la matriz donde se debe almacenar el costo de los recorridos entre las
ciudades y la matriz que indica la disponibilidad de asientos.
b) Implemente el metodo constructor de la clase Ruta. Este metodo debe solicitar al usuario que ingrese
la cantidad de ciudades. Luego debe solicitar el costo de viaje entre cada par de ciudades y almacenarlo
en la matriz de costos definida en la clase. Recuerde tener vaca la matriz de disponibilidad. Usted debe
pedirle al usuario que ingrese la cantidad de asientos disponibles en promoci
on, el cual es el mismo
para cada par de ciudades.
c) Implemente un metodo llamado costoRecorridoDirecto que retorne el costo de viaje entre dos ciudades.
Si el camino no existe el metodo debe retornar 1 e imprimir el error. Nota: verifique antes que exista
camino entre las dos ciudades.
Por ejemplo: si observamos el esquema de recorridos no existe camino directo entre 4 y 1, pues para
llegar a 4 antes debe recorrer las ciudades 2 y 3. Pero si existe camino directo entre 1 y 6 con costo
2200.
IIC1103 Captulo 6: Arreglos
42
43
if ( x >= 0 && y >= 0 && x < r e c o r r i d o s. length && y < r e c o r r i d o s [0]. length )
{
if ( r e c o r r i d o s[ x ][ y ] == -1)
Usuario . m e n s a j e C o n s o l a( " No existe camino directo entre las ciudades . " );
return r e c o r r i d o s[ x ][ y ];
}
return -1;
}
private boolean h a y D i s p o n i b i l i d a d( int i , int j ) {
for ( int k = 0; k < d i s p o n i b i l i d a d [0][0]. length ; k ++) {
if ( d i s p o n i b i l i d a d[ i ][ j ][ k ]) {
return true ;
}
}
Usuario . mensaje (" no hay d i s p o n i b i l i d a d de " + i -1 + " a " + j -1);
return false ;
}
public void v e n t a P a s a j e( int [] x ) {
int total = 0;
boolean valida = true ;
for ( int i = 0; i < x . length - 1 && valida ; i ++) {
int costo = this . c o s t o R e c o r r i d o D i r e c t o( x [ i ] , x [ i + 1]);
if ( costo > 0 && h a y D i s p o n i b i l i d a d( x [ i ] , x [ i + 1]))
total = total + costo ;
else
valida = false ;
}
if ( valida )
{
for ( int i = 0; i < x . length - 1; i ++)
this . r e s t a r D i s p o n i b i l i d a d(i , i +1);
}
}
private void r e s t a r D i s p o n i b i l i d a d( int i , int j ) {
int k = 0;
boolean n o E n c o n t r e = true ;
while ( n o E n c o n t r e && k < d i s p o n i b i l i d a d [0][0]. length ) {
if ( d i s p o n i b i l i d a d[ i ][ j ][ k ]) {
n o E n c o n t r e = false ;
d i s p o n i b i l i d a d[ i ][ j ][ k ]= false ;
}
k = k + 1;
}
}
}
44
Que la amistad es recproca, no puedo ser amigo de alguien sin que este sea amigo mo.
Poder pedirle a una persona que imprima en consola su red de amistades. La red de amistades est
a compuesta no s
olo por sus amigos directos sino tambien por los amigos directos de sus amigos.
La persona original no debe obviamente aparecer en la lista, pese a ser amiga de sus amigos.
amigos .
/* *
* Agrega un nuevo amigo . El metodo intenta evitar tener que definir un
* arreglo muy largo . Por ende , parte de una base fija y va d u p l i c a n d o la
* c a p a c i d a d cuando se queda sin espacio .
* @param amigo El amigo a agregar .
*/
45
46
}
}
/* * Retorna el contacto pedido . */
public Contacto g e t C o n t a c t o( int id ) {
return c o n t a c t o s[ id ];
}
}
47
48
import i i c 1 1 0 3 P a c k a g e .*;
public class P r i n c i p a l {
public static void main ( String [] args ) {
Patron [] _ p a t r o n e s = new Patron [4];
_ p a t r o n e s[0] = new Patron (1);
_ p a t r o n e s[1] = new Patron (2);
_ p a t r o n e s[2] = new Patron (3);
_ p a t r o n e s[3] = new Patron (4);
D i s t r i b u c i o n _dist = new D i s t r i b u c i o n( null , _ p a t r o n e s);
int opcion = 0;
while ( opcion != 5) {
opcion = Usuario . entero (" Ingrese opcion :\ n1 : Crear sala \ n2 : Aplicar patron \ n " +
" 3: D e s a p l i c a r patrones \ n4 : Ver info sala \ n5 : Salir " );
while ( opcion < 1 || opcion > 5) {
opcion = Usuario . entero ( " OPCION INVALIDA \ nIngrese opcion :\ n1 : Crear sala \ n " +
" 2: Aplicar patron \ n3 : D e s a p l i c a r patrones \ n4 : Ver info sala \ n5 : Salir " );
}
switch ( opcion ) {
case 1:
_dist . setSala ( c r e a r S a l a());
_dist . getSala (). i m p r i m i r R e p r e s e n t a c i o n S a l a ();
_dist . getSala (). i m p r i m i r I n f o S a l a ();
break ;
case 2:
if ( _dist . getSala () != null ) {
_dist . a p l i c a r P a t r o n( e s c o g e r P a t r o n ());
_dist . getSala (). i m p r i m i r R e p r e s e n t a c i o n S a l a ();
_dist . getSala (). i m p r i m i r I n f o S a l a ();
} else {
Usuario . mensaje ( " Debe crear una sala para usar esta opcion " );
}
break ;
case 3:
if ( _dist . getSala () != null ) {
_dist . d e s a p l i c a r P a t r o n e s();
_dist . getSala (). i m p r i m i r R e p r e s e n t a c i o n S a l a ();
_dist . getSala (). i m p r i m i r I n f o S a l a ();
} else {
Usuario . mensaje ( " Debe crear una sala para usar esta opcion " );
}
break ;
case 4:
if ( _dist . getSala () != null ) {
_dist . getSala (). i m p r i m i r R e p r e s e n t a c i o n S a l a ();
_dist . getSala (). i m p r i m i r I n f o S a l a ();
} else {
Usuario . mensaje ( " Debe crear una sala para usar esta opcion " );
}
break ;
}
}
}
public static int e s c o g e r P a t r o n() {
int opcion = 0;
opcion = Usuario . entero ( " Ingrese patron :\ n1 : Borrar filas h o r i z o n t a l e s impares \ n " +
" 2: Borrar filas v e r t i c a l e s impares \ n3 : Eliminar en cruz \ n " +
" 4: H a b i l i t a r puestos par / par o impar / impar " );
while ( opcion < 1 || opcion > 4) {
opcion = Usuario . entero (" OPCION INVALIDA \ nIngrese patron :\ n " +
" 1: Borrar filas h o r i z o n t a l e s impares \ n2 : Borrar filas v e r t i c a l e s impares \ n " +
" 3: Eliminar en cruz \ n4 : H a b i l i t a r puestos par / par o impar / impar " );
}
return opcion - 1;
}
public static Sala c r e a r S a l a() {
int ancho = Usuario . entero ( " Ingrese el ancho de la sala " );
int largo = Usuario . entero ( " Ingrese el largo de la sala ( desde el pizarron al fondo ) " );
return new Sala ( ancho , largo );
}
}
49
50
51
Incremento 2
Para completar el segundo incremento, Ud. debe agregar los siguientes metodos a la clase Sala:
1. int getCapacidadResultante() Retorna el n
umero de asientos disponibles (luego de haber aplicado alg
un patr
on, el n
umero de asientos disponibles vara).
2. void imprimirInfoSala() Muestra en pantalla con un mensaje, cierta informaci
on de la sala:
ancho, largo, capacidad total, capacidad resultante luego de aplicar patrones.
Adem
as deber
a implementar el patr
on # 4, dentro del metodo aplicarPatron(...) de la clase Patron.
Incremento 3
Para completar el tercer incremento, Ud. debe agregar los siguientes metodo a la clase Distribucion:
1. void aplicarPatrones() Aplica TODOS los patrones asociados a distribuci
on a la sala previamente seteada.
2. void desaplicarPatrones() Desaplica TODOS los patrones que se han aplicado a la sala de la
distribuci
on.
Adem
as deber
a implementar el patr
on # 3, dentro del metodo aplicarPatron(...) de la clase Patron.
Criterios de soluci
on
Posible soluci
on
public class D i s t r i b u c i o n {
private Sala sala ;
private Patron [] patrones ;
public D i s t r i b u c i o n( Sala sala , Patron [] patrones ) {
this . sala = sala ;
this . patrones = patrones ;
}
public void setSala ( Sala _sala ) {
sala = _sala ;
}
public Sala getSala () {
return sala ;
}
public void a p l i c a r P a t r o n e s () {
for ( int i = 0; i < patrones . length ; i ++) {
patrones [ i ]. a p l i c a r P a t r o n( sala );
}
}
public void d e s a p l i c a r P a t r o n e s() {
for ( int i = 0; i < sala . g e t R e p r e s e n t a c i o n S a l a (). length ; i ++) {
sala . g e t R e p r e s e n t a c i o n S a l a ()[ i ] = 0;
}
}
public void a p l i c a r P a t r o n( int index ) {
patrones [ index ]. a p l i c a r P a t r o n( sala );
}
}
public class Patron {
private int tipo ;
public Patron ( int _tipo ) {
52
tipo = _tipo ;
}
public void setTipo ( int _tipo ) {
tipo = _tipo ;
}
public int getTipo () {
return tipo ;
}
public void a p l i c a r P a t r o n( Sala _sala ) {
if ( tipo == 1) {
// eliminar filas h o r i z o n t a l e s impares
for ( int i = 0; i < _sala . g e t R e p r e s e n t a c i o n S a l a (). length ; i ++) {
if ( _sala . g e t I n d e x F i l a H o r i z o n t a l( i ) % 2 != 0) {
_sala . g e t R e p r e s e n t a c i o n S a l a()[ i ] = 1;
}
}
} else if ( tipo == 2) {
// eliminar filas v e r t i c a l e s impares
for ( int i = 0; i < _sala . g e t R e p r e s e n t a c i o n S a l a (). length ; i ++) {
if ( _sala . g e t I n d e x F i l a V e r t i c a l( i ) % 2 != 0) {
_sala . g e t R e p r e s e n t a c i o n S a l a()[ i ] = 1;
}
}
} else if ( tipo == 3){
// e l i m i n a c i o n cruz
for ( int i = 0; i < _sala . g e t R e p r e s e n t a c i o n S a l a (). length ; i ++) {
int f i l a V e r t i c a l = _sala . g e t I n d e x F i l a V e r t i c a l( i );
int f i l a H o r i z o n t a l = _sala . g e t I n d e x F i l a H o r i z o n t a l( i );
if ( f i l a V e r t i c a l == f i l a H o r i z o n t a l % _sala . getAncho ()
|| _sala . getAncho () - 1 - f i l a V e r t i c a l == f i l a H o r i z o n t a l
% _sala . getAncho ()) {
_sala . g e t R e p r e s e n t a c i o n S a l a()[ i ] = 1;
}
}
} else if ( tipo == 4) {
// h a b i l i t a c i o n puestos par / par o impar / impar
for ( int i = 0; i < _sala . g e t R e p r e s e n t a c i o n S a l a (). length ; i ++) {
int f i l a V e r t i c a l = _sala . g e t I n d e x F i l a V e r t i c a l( i );
int f i l a H o r i z o n t a l = _sala . g e t I n d e x F i l a H o r i z o n t a l( i );
if ( f i l a V e r t i c a l % 2 == f i l a H o r i z o n t a l % 2) {
_sala . g e t R e p r e s e n t a c i o n S a l a()[ i ] = 0;
}
}
}
}
}
import i i c 1 1 0 3 P a c k a g e .*;
public class Sala {
private int ancho ;
private int largo ;
private int [] r e p r e s e n t a c i o n S a l a;
public Sala ( int _ancho , int _largo ) {
ancho = _ancho ;
largo = _largo ;
r e p r e s e n t a c i o n S a l a = new int [ _ancho * _largo ];
for ( int i = 0; i < r e p r e s e n t a c i o n S a l a. length ; i ++)
r e p r e s e n t a c i o n S a l a[ i ] = 0;
}
public int [] g e t R e p r e s e n t a c i o n S a l a() {
return r e p r e s e n t a c i o n S a l a;
}
public int getLargo () {
return largo ;
}
53
54
55
56
57
}
public boolean r e a l i z a r C o m p r a( int numTienda , int monto ) {
// R e v i s a m o s que la tienda sea valida
if ( n u m T i e n d a >= t i e n d a A c t u a l) {
return false ;
}
// R e t o r n a m o s el valor devuelto por el metodo agregar venta de la
// clase tienda , ya que de no poder a g r e g a r s e mas ventas este debe
// retornar
// false .
return tiendas [ n u m T i e n d a ]. a g r e g a r V e n t a( monto );
}
public Tienda m a s V e n t a s() {
// Buscamos la Tienda que tienes mas ventas r e a l i z a d a s
// Si no hay tiendas r e t o r n a m o s null
if ( t i e n d a A c t u a l == 0) {
return null ;
}
Tienda max = tiendas [0];
// R e c o r r e m o s todas las tiendas para ver cual es la con mas ventas
for ( int i = 1; i < t i e n d a A c t u a l; i ++) {
if ( tiendas [ i ]. g e t N u m V e n t a s() > max . g e t N u m V e n t a s()) {
max = tiendas [ i ];
}
}
return max ;
}
public int t o t a l V e n d i d o M a l l () {
// Si no hay tiendas entonces no hay ventas
if ( t i e n d a A c t u a l == 0) {
return 0;
}
// D e f i n i m o s una variable quesirva de a c u m u l a d o r
int total = 0;
for ( int i = 0; i < t i e n d a A c t u a l; i ++) {
total += tiendas [ i ]. t o t a l V e n d i d o ();
}
return total ;
}
public void m o s t r a r C e r c a n o s( double cantidad , double d i f e r e n c i a) {
// D e f i n i m o s una variable para contar las tiendas que poseen la
// d i f e r e n c i a indicada .
int contador = 0;
// R e c o r r e m o s todas las tiendas y m o s t r a m o s aquellas cuyo promedio
// se d i f e r e n c i a en a lo mas la d i f e r e n c i a indicada con la cantidad
// recibida .
for ( int i = 0; i < t i e n d a A c t u a l; i ++) {
// C a l c u l a m o s la d i f e r e n c i a entre el promedio de la tienda y la
// cantidad
// recibida . Le a p l i c a m o s valor absoluto para que no importe si es
// positivo o negativo
if ( Math . abs ( cantidad - tiendas [ i ]. p r o m e d i o V e n t a s()) <= d i f e r e n c i a) {
contador ++;
Usuario . m e n s a j e C o n s o l a( " La tienda " + i
+ " tiene un promedio de " + " ventas de "
+ tiendas [ i ]. p r o m e d i o V e n t a s ());
}
}
// M o s t r a m o s el mensaje resumen
Usuario . mensaje ( " Se e n c o n t r a r o n " + contador
+ " tiendas cuyo promedio de "
+ " ventas se d i f e r e n c i a b a por a lo mas " + d i f e r e n c i a
+ " con respecto a " + cantidad );
}
}
58
.
El juego consiste en que se genera un c
odigo de un largo predeterminado de n
umeros, y luego el usuario
intenta adivinar el c
odigo generado. Para ello ingresa secuencias de n
umeros del mismo largo que el c
odigo.
Para cada secuencia el juego le indica la cantidad de toques y la cantidad de famas que obtuvo, ambos valores
obtenidos de la comparaci
on del c
odigo ingresado por el usuario con el c
odigo secreto generado por el juego.
Una fama se produce cuando uno de los valores indicados por el usuario est
a justo en la misma posici
on que
el mismo valor en el c
odigo secreto. Por su parte, un toque se produce cuando el c
odigo del usuario contiene
un valor que se encuentra en el c
odigo secreto, pero no est
an en la misma posici
on.
Por ejemplo, si el c
odigo fuera de largo 4, el c
odigo secreto fuese {1, 2, 3, 4} y el usuario ingresa el codigo
{2, 6, 3, 1}, se le debiera indicar al usuario que obtuvo una fama (producto de que el 3 se encuentra en ambos
codigos en la misma posici
on), y 2 toques, provocados por los n
umeros 1 y 2.
59
60
indic
andole esto y terminar el programa. En caso de que no adivine debe revisarse si a
un le quedan intentos,
si no le quedan se debe mostrar un mensaje indic
andole que perdi
o.
Criterios de soluci
on
Posible soluci
on
import i i c 1 1 0 3 P a c k a g e .*;
public class M a s t e r M i n d {
private int [] codigo ;
private int [][] t a b l e r o J u e g o;
private int [][] t a b l e r o A y u d a s;
private I n t e r f a z M a s t e r M i n d GUI ;
private int n u m I n t e n t o s;
/* * C o n s t r u c t o r */
public M a s t e r M i n d() {
GUI = new I n t e r f a z M a s t e r M i n d();
n u m I n t e n t o s = 0;
}
/* * Metodo que i n i c i a l i z a los valores en el tablero del juego
* @param m a x I n t e n t o s : numero maximo de intentos
* @param l a r g o C o d i g o : numero de valores que forman el codigo
*/
public void I n i c i a l i z a r T a b l e r o( int maxIntentos , int l a r g o C o d i g o) {
// Creamos tablero , i n i c i a l i z a d o en -1
t a b l e r o J u e g o = new int [ m a x I n t e n t o s][ l a r g o C o d i g o];
for ( int i = 0; i < t a b l e r o J u e g o. length ; i ++) {
for ( int j = 0; j < t a b l e r o J u e g o[ i ]. length ; j ++) {
t a b l e r o J u e g o[ i ][ j ] = -1;
}
}
// Creamos tablero de ayudas , i n i c i a l i z a d o en -1
t a b l e r o A y u d a s = new int [ m a x I n t e n t o s ][2];
for ( int i = 0; i < t a b l e r o J u e g o. length ; i ++) {
for ( int j = 0; j < 2; j ++) {
t a b l e r o A y u d a s[ i ][ j ] = -1;
}
}
}
/* *
* Metodo que genera un codigo de forma a l e a t o r i a con todos los valores
* distintos
* @param l a r g o C o d i g o : numero de valores que forman el codigo
* @param rangoMax : valor maximo para cada uno de los numeros que forman el codigo
*/
public void G e n e r a r C o d i g o( int largoCodigo , int rangoMax ) {
// Creamos el arreglo
codigo = new int [ l a r g o C o d i g o];
// G e n e r a m o s los valores al azar , buscando que no se repitan
for ( int i = 0; i < codigo . length ; i ++) {
boolean aceptado = false ;
// Lo c o m p a r a m o s con los valores a n t e r i o r e s
while (! aceptado ) {
codigo [ i ] = A l e a t o r i o. entero (1 , rangoMax );
aceptado = true ;
for ( int j = i - 1; j >= 0; j - -) {
if ( codigo [ j ] == codigo [ i ]) {
aceptado = false ;
}
}
}
}
}
/* *
* Intenta adivinar el codigo
* @param intento : un arreglo con el intento de adivinar el codigo
* @return si gano o todavia no
*/
public boolean Adivinar ( int [] intento ) {
// O b t e n e m o s intento del jugador y lo ponemos en el tablero
61
62
63