Documentos de Académico
Documentos de Profesional
Documentos de Cultura
7 Ordenacion y Busqueda PDF
7 Ordenacion y Busqueda PDF
Captulo 7: Ordenaci
on y B
usqueda
Resumen te
orico
La operacion de ordenar consisten seleccionar de un conjunto de datos y ordenarlos bajo alg un determinado
criterio. Por ejemplo, cada elemento del conjunto de datos de una gua telefonica tiene un nombre, una
direccion y un numero de telefono; la gua telefonica esta dispuesta en orden alfabetico de nombres; los
elementos numericos se pueden ordenar en orden creciente o decreciente de acuerdo al valor numerico del
elemento. En terminologa de ordenacion, el elemento por el cual esta ordenado un conjunto de datos (o se
esta buscando) se denomina clave.
Una coleccion de datos (estructura) puede ser almacenada por ejemplo en un array (vector o tabla). Una
estructura se dice que esta ordenada por la clave k si la lista esta en orden ascendente o descendente con
respecto a esta clave. La coleccionde datos se dice que esta en orden ascendente si: i < jimplicaquek[i] <=
k[j]. En cambio, esta en orden descendente si: i > jimplicaquek[i] <= k[j] para todos los elementos de la
coleccion.
Por ejemplo, para una gua telefonica, la lista esta clasificada en orden ascendente por el campo clave k,
donde k[i] es el nombre del abonado (apellidos, nombre). Un ejempo mas simple de n umeros es la coleccion
4514213245 que se encuentra en orden ascendente y la coleccion 757035161412 en cambio se encuentra en
orden descendente.
B
usqueda
Los computadores se emplean frecuentemente para almacenar grandes vol
umenes de datos.
Tener mucha informacion implica tener dificultades para darle real utilidad.
Los algortimos de b
usqueda son fundamentales para poder localizar la informacion relevante en el
menor tiempo posible.
Los algoritmos de ordenacion permiten mantener la informacion ordenada de tal forma que la b
usqueda
se simplifique.
Dado un valor X, debolver el ndice del elemento X en el arreglo, en caso de existir. En caso contrario devolver
no encontrado (-1). Se supone que en un arreglo no hay entradas duplicadas.
Existen varios procedimientos (algoritmos) de b usqueda. Nosotros veremos dos:
B
usqueda Lineal
B
usqueda Binaria
B
usqueda Lineal
Consiste en recorrer el arreglo hasta encontrar el elemento buscado (elemento por elemento).
Si se llega hasta el u
ltimo elemento y a
un no se ha encontrado, entonces no se encuentra en la lista.
B
usqueda Binaria
Restriccion
Ordenaci
on
Dado un arreglo con N elementos, ordenarlo en funcion de alguna caracterstica com
un entre ellos. Por ejem-
plo, escribir los valores en orden creciente (o decreciente).
Existen una gran cantidad de algoritmos que se diferencian en su rapidez y complejidad. Nosotros veremos
dos:
Ordenaci
on por selecci
on
Declaracion 3 public void ordenacionPorSeleccion ( int [] lista ) {
for ( int i = 0; i < lista.length -1; i ++) {
// Buscamos el menor
int menor = i;
for ( int j = i + 1; j < lista.length ; j + +){
if( lista [j] < lista [menor]){ menor = j; }
// Cambiamos el menor
int aux = lista [i];
lista [i] = lista [menor];
lista [menor] = aux ;
}
}
}
Ordenaci
on por burbuja
Si quisieramos ordenar ascendentemente:
Ordenaci
on por burbuja
Declaracion 4 public void ordenacionPorBurbuja ( int [] lista ) {
for ( int i = 1; i < lista . length ; i ++) {
for ( int j = i - 1; j 0; j - -) {
if( lista [j +1] < lista [j]) {
// Intercambio
int aux = lista [j +1];
lista [j +1] = lista [j];
lista [j] = aux ;
}
else { break; }
}
}
}
2. Despues, cuando hay k elementos ordenados de menor a mayor, se toma el elemento k+1 y se compara
con todos los elementos ya ordenados
3. deteniendose cuando se encuentra un elemento menor (todos los elementos mayores han sido desplaza-
dos una posicion a la derecha).
4. En este punto se inserta el elemento k+1 debiendo desplazarse los demas elementos.
public class T ab la De P at en t es {
private String [] tabla ;
public Tabl aD eP a te nt es () { tabla = new String [9999]; }
public boolean buscar ( Patente patente ) {}
otros metodos
}
La idea es que TablaDePatentes almacena en el atributo tabla todas las patentes autorizadas a estacionarse
en el campus San Joaqun. En particular, si la patente PL7812 esta autorizada, entonces tabla[7812] =
PL, y si la patente JK2345 esta autorizada, entonces tabla[2345] = JK. Ademas, si dos o mas
patentes autorizadas tienen el mismo n
umero, entonces sus pares de letras aparecen consecutivamente en el
string correspondiente de tabla. Por ejemplo, si las patentes PL7812 y MB7812 estan ambas autorizadas,
entonces tabla[7812] = PLMB; y si las patentes JK2345, RC2345 y DW2345 estan todas autorizadas,
entonces tabla[2345] = JKRCDW.
Escriba el metodo buscar de la clase TablaDePatentes, que busca rapidamente la Patente patente en
el atributo tabla, y devuelve true (verdadero) si patente esta en tabla, y false (falso) en caso contrario.
Criterios de soluci
on
Lo primero que tenemos que hacer es declarar el metodo como nos indican en el enunciado. Luego, con los
metodos de la clase Patente, obtenemos las letras y los n
umeros que la componen. Con el n umero de la
patente obtenemos lo almacenado en el arreglo y luego debemos recorrer este String obteniendo Substring
de largo 2 e ir comparando cada substring con las letras de la patente a buscar. Si coincide con alguno
retornamos true, de lo contrario retornamos false.
Posible soluci
on
public boolean buscar ( Patente patente ) {
int num = patente . obtNumero ();
String letras = patente . obtLetras ();
String validas = tabla [ num ];
if ( validas != null ){
int largo = validas . length ();
int k = 1;
while ( k < largo ) {
if ( letras . equals ( validas . substring ( k - 1 , k + 1)))
return true ;
k = k + 2;
}
}
return false ;
Para hacerle mas facil la implementacion cuenta con la clase Punto mostrada a continuacion.
public Punto () {
double r ;
r = Aleatorio . real (0 , 1000);
this . x = r ;
r = Aleatorio . real (0 , 1000);
this . y = r ;
}
Criterios de soluci
on
Antes de buscar la distancia debemos crear los puntos necesarios. Para eso pedimos al usuario la cantidad
de puntos a utilizar y luego con un ciclo creamos cada uno de los puntos.
Luego de que tenemos creados los puntos debemos recorrerlos y calcular la distancia entre cada uno de ellos.
Para ello podemos utilizar un doble ciclo que recorra cada punto y luego lo compare con todos los puntos
restantes. Utilizamos variables que almacenen el valor de la distancia maxima y la posicion en el arreglo de
los puntos involucrados. Luego dentro del ciclo calculamos la distancia entre los puntos y la comparamos con
la distancia maxima encontrada hasta el momento, actualizando las variables cuando corresponda.
int n_puntos , i , j , p1 = 0 , p2 = 0;
double dist_max = 0;
Punto [] puntos ;
n_puntos = Usuario . entero ( " Cuantos puntos usara para el ejercicio ? " );
puntos = new Punto [ n_puntos ];
for ( i = 0; i < n_puntos ; i ++) {
puntos [ i ] = new Punto ();
}
for ( i = 0; i < ( n_puntos - 1); i ++) {
for ( j = i + 1; j < n_puntos ; j ++) {
if ( puntos [ i ]. distancia ( puntos [ j ]) > dist_max ) {
dist_max = puntos [ i ]. distancia ( puntos [ j ]);
p1 = i ;
p2 = j ;
}
}
}
Usuario . mens ajeConso la ( " La mayor distancia en el conjunto de puntos es "
+ dist_max + " e involucra al punto " + p1 + " : ( "
+ puntos [ p1 ]. getX () + " ," + puntos [ p1 ]. getY () + " ) y al punto "
+ p2 + " : ( " + puntos [ p2 ]. getX () + " ," + puntos [ p2 ]. getY ()
+ " ) " );
Criterios de soluci
on
Para implementar el Diccionario lo mas logico es utilizar un arreglo de String para representar las palabras
que lo componen.
Luego debemos implementar los metodos que nos piden.
Metodo ConsultarPalabra: Utilizamos una variable para almacenar la palabra a menor distancia de
la buscada. Recorremos todo el arreglo y revisamos la distancia de la siguiente palabra a la palabra
buscada utilizando el metodo compareTo. Si la distancia es menor que la menor distancia encontrada
hasta el momento actualizamos la variable. Finalmente revisamos si la palabra encontrada es igual a
la buscada, si es as mostramos un mensaje indicando que encontramos la palabra.
Metodo AgregarPalabra: Revisamos que el arreglo no este lleno y que la palabra ya no este en el dic-
cionario. Para esto ultimo llamamos al metodo ConsultarPalabra y revisamos si la palabra retornada
por este metodo es igual a la palabra que queremos agregar. Si no es as agregamos el string al arreglo
en la posicion que corresponde.
Posible soluci
on
import iic1103Packa ge .*;
return palabraMenor ;
}
}
private int x1 , x2 , x3 ;
private String s ;
String getS () {
return s ;
}
int getX1 () {
return x1 ;
}
int getX2 () {
return x2 ;
}
int getX3 () {
return x3 ;
}
}
public class ClaseA {
private ClaseB [] Arr ;
private int tam ;
public void m2 () {
int i , k ;
for ( k = Arr . length - 1; k > 0; k - -) {
for ( i = 0; i < k ; i ++) {
ClaseB aux ;
if ( Arr [ i ]. getS (). compareTo ( Arr [ i + 1]. getS ()) > 0) {
aux = Arr [ i ];
Arr [ i ] = Arr [ i + 1];
Arr [ i + 1] = aux ;
}
}
}
}
}
Criterios de soluci
on
En este tipo de problemas es buena opcion 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
Posible soluci
on
1. ClaseA es una lista/conjunto/coleccion de elementos de ClaseB.
2. m1 agrega un elemento a la lista
m2 ordena la lista por el atributo String de ClaseB y en forma ascendente.
c b a
a z i
z b a
Donde cada caracter es un char. Debe crear un programa que ordene alfabeticamente esta matriz, pri-
mero las filas y despues, sin cambiar las filas, las columnas, de tal manera que quede as:
a b c
a b z
a i z
Aunque este problema se puede resolver de manera sucia, resuelvalo pensando que este programa de-
be ser aplicable a cualquier matriz de 3x3.
Criterios de soluci
on
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 estatico. 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 caracter
revisado. Luego es cosa de hacer lo mismo pero ahora para las columnas.
}
}
que recibe una matriz M y un vector Vrepresentado como un arreglo de enterosy retorna el resultado de
M $ V en un arreglo. Puede suponer que M y V siempre tendran dimensiones adecuadas y que los n
umeros en
V no piden estadsticas fuera de rango.
Criterios de soluci
on
Para encontrar la i-esima estadstica de orden de un vector lo que tenemos que hacer es ordenar el arreglo
de menor a mayor. Para esto podemos utilizar cualquier codigo de ordenacion, como por ejemplo selection
sort. Con el arreglo ya ordenado simplemente buscamos en la posicion i-1 y tenemos la i-esima estadstica
de orden.
Luego para implementar el metodo que nos piden tenemos que crear un nuevo arreglo para retornar de tama no
adecuado y luego, con un ciclo, obtener la iesima estadstica de orden de la fila de la matriz correspondiente
seg
un el valor en el arreglo recibido como parametro.
que recibe como entrada un arreglo de n umeros enteros, y retorna un arreglo conteniendo la cadena cre-
ciente mas larga en el arreglo de entrada. Por ejemplo, si lista es un arreglo formado por los 12 elementos
{2, 3, 5, 4, 8, 18, 0, 2, 3, 4, 4, 6}, entonces el arreglo de salida de encontrarCadenaCreciente debe ser el arreglo
de 4 elementos {0, 2, 3, 4}, ya que esta es la cadena creciente mas larga en lista.
Nota: Si existen varias cadenas crecientes en lista que tienen largo maximo, su procedimiento debe retorna
alguna de ellas.
Criterios de soluci
on
Posible soluci
on
public int [] e n c o n t r a r C a d e n a C r e c i e n t e ( int [] lista ) {
int i , aux , inicio , largo ;
boolean entrar ;
i = 0;
aux = 0;
inicio = 0;
largo = 0;
while ( i < lista . length ) {
entrar = true ;
while ( entrar ) {
if ( i == ( lista . length - 1)) {
entrar = false ;
} else if ( lista [ i ] < lista [ i + 1]) {
i ++;
} else {
entrar = false ;
}
}
if (( i - aux ) + 1 > largo ) {
largo = ( i - aux ) + 1;
inicio = aux ;
}
i ++;
aux = i ;
el cual recibe como parametro una lista arreglo en el formato descrito arriba, y ordena esta lista de manera
ascendente. Por ejemplo, si arreglo = 3, 6, 2, 5, -1, 9, 7, 3, entonces despues de invocar al metodo se debe
tener que arreglo = -1, 9, 2, 5, 3, 6, 7, 3, que corresponde al orden ascendente de los n umeros 3, 2, -1, 7
que contena la lista original, junto con los n
umeros correspondientes de repeticiones.
Notese que OrdDup retorna un valor booleano. Como no todo arreglo representa una lista con repeticio-
nes, OrdDup retorna true si arreglo corresponde a una lista con repeticiones, y false en caso contrario. En
el primer caso, el metodo ordena arreglo, mientras que en el segundo lo deja intacto.
Importante: Para resolver esta pregunta puede suponer que arreglo no tiene n umeros repetidos en las
componentes que representan los n umeros de la lista. Por ejemplo, arreglo puede ser 12, 3, 5, 7 y no puede
ser 12, 3, 5, 4, 12, 1 ya que el 12 aparece dos veces. Notese que arreglo puede ser 12, 3, 5, 3 ya que en este
caso no hay repeticiones entre los n umeros de la lista (12 y 5).
Dado lo anterior, para verificar si un arreglo almacena una lista con repeticiones hay que chequear dos
condiciones: el largo del arreglo es par, y el n
umero de repeticiones de cada n umero es mayor que 0. As, por
ejemplo, para los arreglos 2, 3, 5, 2, -1, 3, 8 y 2, 4, 1, 0, el metodo OrdDup debe retornar false.
Criterios de soluci
on
Posible soluci
on
public boolean OrdDup ( int [] arreglo ) {
if ( arreglo . length % 2 != 0) {
return ( false );
} else {
int i , k , aux , cant ;
for ( i = 0; i < arreglo . length / 2; i ++) {
if ( arreglo [2 * i + 1] <= 0) {
return ( false );
}
}
for ( i = 1; i < arreglo . length / 2; i ++) {
aux = arreglo [2 * i ];
cant = arreglo [2 * i + 1];
k = i - 1;
while ( k >= 0 && arreglo [2 * k ] > aux ) {
arreglo [2 * k + 2] = arreglo [2 * k ];
arreglo [2 * k + 3] = arreglo [2 * k + 1];
k = k - 1;
}
arreglo [2 * k + 2] = aux ;
arreglo [2 * k + 3] = cant ;
}
return ( true );
}
}
Los metodos que aparecen a continuacion ya han sido definidos e implementados, no es necesario que conozca
la implementacion, pero s como utilizarlos.
Clase DatosAmigo
Almacena la informacion sobre un amigo: nombre, apellido, celular y email.
Metodos
public DatosAmigo(String no, String ap, int ce, String em) : Constructor de la clase;
recibe el nombre, apellido, celular y email de un amigo.
public String getNombre(): Retorna el nombre del amigo.
public String getApellido(): Retorna el apellido del amigo.
public int getCelular(): Retorna el celular del amigo.
public String getEmail(): Retorna el e-mail del amigo.
Clase Contactos
Almacena la informacion de una lista de contactos.
Atributos
private DatosAmigo[] amigos: Lista de contactos, es un arreglo que almacena los datos de los
amigos.
Metodos
public Contactos(): Constructor de la clase.
public void AgregarAmigo(DatosAmigo da): Permite agregar la informacion de un amigo a la
lista de contactos; automaticamente agranda el arreglo para contener al nuevo amigo.
.
Salida en Consola
Listados de emails
marcos@ing . puc . cl
marenas@ing . puc . cl
Criterios de soluci
on
Posible soluci
on
public void M o s t r a r E m a i l P o r N o m b r e ( String nombre ) {
Usuario . mens ajeConso la ( " Emails por nombre - " + nombre );
for ( int i = 0; i < this . amigos . length ; i ++) {
DatosAmigo am = this . amigos [ i ];
if ( am . getNombre (). e q ua l s I g n o r e C a s e ( nombre )) {
Usuario . mensa jeConso la ( am . getNombre () + " \ t " + am . getApellido ()
+ " \ t " + am . getEmail ());
}
}
}
Criterios de soluci
on
Posible soluci
on
1.
10 25 17 7 15 6 9 12
31
8
6 7 9 10 12 15 17 25
2. El metodo1 ordena el arreglo recibido, para lo cual define un salto (la variable d), y luego compara
cada elemento con el que se encuentra a d de distancia de el en el arreglo. Luego, va disminuyendo
Considerando que existen N tipos de planchas con medidas distintas (largo y ancho), se solicita crear un
programa que determine cual es la medida optima de la plancha con que se debe alimentar la cortadora, para
minimizar el material perdido. El programa debe calcular para cada tipo de plancha, la cantidad de crculos,
el area perdida y luego debe obtener un listado ordenado de menor a mayor material perdido, indicando las
medidas de cada plancha, la cantidad de crculos y la superficie perdida.
Datos entrada:
N: cantidad de tipos de planchas
Largo y ancho de cada uno de los N tipos de plancha en milmetros.
Radio de corte del crculo requerido en milmetros
Datos salida: Listado de todas las planchas ingresada ordenado de menor a mayor superficie perdida
indicando para cada una:
Largo y Ancho de la plancha
Cantidad de crculos obtenidos.
Superficie perdida en milmetros cuadrados
Nota: Los datos de entrada deben ser pedidos al usuario y la informacion de salida debe aparecer en la
consola.
Criterios de soluci
on
Posible soluci
on
Las matrices irregulares de numeros no negativos pueden ser almacenadas en arreglos de la siguiente forma.
Dada una matriz M, cada fila de M es almacenada en posiciones contiguas del arreglo. Estas filas son
almacenadas de manera ordenada, es decir, la fila i-esima de M es almacenada en el arreglo antes que la fila
j-esima de M si i j. Ademas, el n
umero -1 es usado para indicar el fin de una fila. Por ejemplo, la matriz
mostrada arriba es almacenada en el siguiente arreglo:
que recibe como parametros una matriz irregular de n umeros no negativos almacenados en el arreglo M
(como se indica arriba), y las posiciones i, j, y retorna el n
umero que esta en la fila i y columna j de M
(recuerde que la primera fila de una matriz es la numero 0, al igual que para las columnas). Por ejemplo, si
M es el arreglo mostrado arriba, entonces la llamada:
valor(M, 2, 2)
debe entregar como resultado 10, ya que el elemento en la fila 2 y columna 2 de M es 10.
Importante: El metodo valor debe retornar -1 si el parametro i o el parametro j estan fuera de los rangos
de la matriz M. Por ejemplo, si M es la matriz mostrada arriba, las invocaciones valor(M, 3, 0), valor(M, -1,
0), valor(M, 2, 4) deben retornar -1. Ademas, su implementacion debe manejar correctamente el caso en que
una fila no tiene elementos (lo cual aparece en el arreglo como dos n
umeros -1 contiguos).
Criterios de soluci
on
Posible soluci
on
public int numero_filas ( int [] M ) {
int i , num ;
num = 0;
for ( i = 0; i < M . length ; i ++)
if ( M [ i ] == -1)
num ++;
return num ;
}
Por tratarse de una version simplificada, la implementacion que Usted haga resultara en un prototipo que no
es completamente funcional. Sin embargo, su programa debera permitir agregar barcos a su tablero, quitar-
los del mismo, mostrar informacion relevante que de cuenta del estado de una contienda, recibir y procesar
correctamente un ataque, entre otras cosas.
Para la realizacion del laboratorio usted cuenta con la clase Principal, con su respectivo metodo main,
y la clase Oponente, que representa al rival de esta version simplificada del juego, ambas ya implementadas.
Observe que esta clase tiene como u nica finalidad proporcionarle la posibilidad de probar algunos de los
metodos que Usted debera implementar, mediante la generacion de ataques de naturaleza aleatoria.
public Oponente () { }
Usuario . mensaje ( " Bienvenido a \" Combate Naval \" version 0.0.0.1! " );
int largoTablero = Usuario . entero ( " Ingrese el largo del Tablero de Juego : " );
int anchoTablero = Usuario . entero ( " Ingrese el ancho del Tablero de Juego : " );
int maxBarcos = Usuario . entero ( " Ingrese la cantidad maxima de barcos " +
" que se puede agregar al Tablero : " );
while ( maxBarcos *2 > largoTablero || maxBarcos *2 > anchoTablero ) {
Usuario . mensaje ( " La cantidad de barcos no puede ser superior a la " +
" \ nmitad de la dimension mas chica del Tablero de Juego " );
maxBarcos = Usuario . entero ( " Ingrese nuevamente la cantidad maxima de barcos " +
" que se puede agregar al Tablero : " );
}
Tablero tablero = new Tablero ( largoTablero , anchoTablero , maxBarcos );
Oponente rival = new Oponente ();
if ( opcion == 1) {
// Pedimos la informacion al usuario
int tipo = Usuario . entero ( " Ingrese el tipo de barco que desea agregar : " );
int orientacion = Usuario . entero ( " Ingrese su orientacion :\ n (1) " +
" Vertical \ n (2) Horizontal " );
}
}
.
El programa lo dividiremos en 3 subconjuntos incrementales, de acuerdo a las necesidades se
naladas. Se
le recomienda no comenzar con el siguiente subconjunto sino hasta terminar y probar el funcionamiento
correcto del subconjunto actual, a fin de que su desarrollo sea consistente.
Incremento 1
Para completar el primer incremento, debera implementar completamente la clase Barco. A traves de esta
representaremos los barcos que participan del juego. Un barco queda caracterizado por su tipo y su orien-
taci
on dentro del tablero de juego. Ademas, resultara trascendente asociar a un barco tanto la cantidad
de veces que ha sido impactado por un ataque rival, como su estado en un determinado instante: si a un
permanece a flote o se ya se ha hundido.
1. Barco(int tipo, char orientacion) Constructor de la clase. Recibe la inicializacion de sus ca-
ractersticas esenciales. Un barco se modela como una hilera de segmentos. Luego, su ancho es unitario
y su largo quedara definido por el tipo de barco. El largo mnimo para un barco es 2. Su orientacion
puede ser horizontal (H) o vertical (V).
2. void recibirImpacto() Incrementa la cantidad de impactos recibidos por ataques del rival, y
actualiza el estado del barco si dicha cantidad ha alcanzado el maximo admisible seg un el tipo de
barco. Dado que se trata de una version simplificada del juego, el maximo de ataques certeros que
puede recibir un barco equivale a su largo (su tipo), sin importar si un mismo segmento del barco es
atacado mas de una vez por el rival. De esta manera, para destruir un barco no es necesario que sean
Por otro lado, para este incremento debera implementar parcialmente la clase Tablero, que representara la
superficie de juego. Esta clase queda caracterizada por sus dimensiones (largo y ancho) y por la lista de
barcos que han sido creados y agregados al tablero (su flota).
Dado que el juego impide que dos barcos esten ocupando un mismo espacio, debera modelar el tablero
de manera tal que almacene informacion acerca de cuales posiciones se encuentran ocupadas y cuales no.
Entonces, debera crear un arreglo bidimensional inicializado con el valor 1 en todas sus celdas para repre-
sentar el vaco inicial del tablero.
Al agregar un barco al tablero, debera poner en las posiciones correspondientes el ndice del barco den-
tro de la flota. Por ejemplo, el primer barco agregado al tablero de juego utilizara el ndice 0 dentro de la
lista, por lo que todas las posiciones que cubra este barco en el tablero de juego, deberan contener el valor
0 en vez del valor 1.
El siguiente ejemplo le permitira entender mejor la situacion. Suponga que las dimensiones del tablero
son 8 de largo por 10 de ancho. Luego, se agrega un barco de tipo 3 con orientaci on H en la posicion (3,2),
y otro de tipo 5 con orientaci
on V en la posicion (0,6). En tal caso, el arreglo bidimensional quedara de
la siguiente forma:
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 0 0 0 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
La clase Tablero debera tener los siguientes metodos:
1. Tablero(int filas, int columnas, int barcos) Constructor de la clase. Recibe las dimensio-
nes de la superficie de juego, y la cantidad maxima de barcos que pueden ser agregados al tablero. En
la implementacion dada del metodo main observara que este u ltimo n
umero debe cumplir con cierta
restriccion.
2. agregarBarco(Barco barco, int fila, int columna) Permite agregar barco al tablero de juego
a partir de la posicion determinada por (fila, columna). Estas coordenadas corresponden directa-
mente a los ndices del arreglo bidimensional, y seg un la orientacion del barco representan el extremo
superior (V) o izquierdo (H) de este. Verifica, de acuerdo a la cantidad maxima de barcos que admite
el tablero, si es posible agregar un nuevo barco al tablero y si el tipo de barco que se desea agregar
es valido y no hay uno igual ya en la flota. Ademas, revisa si las coordenadas son validas, si no so-
brepasara los lmites del tablero segun su orientacion, y si los espacios requeridos para la operacion
estan desocupados. Si no cumple con alguna de estas condiciones, retornara false. En caso contrario,
inserta el barco al final de la lista (o flota) y actualiza las posiciones del arreglo bidimensional con el
numero del ndice que ocupo en la lista, y luego retorna true.
3. void mostrarTablero() Muestra en la consola una visualizacion grafica del estado actual del
tablero, similar a la mostrada mas arriba, pero reemplazando al imprimir los 1 por el caracter .
Luego, para cada barco de la flota, muestra la cantidad de impactos recibidos por ataques del rival y,
si corresponde, si ya fue hundido.
Incremento 2
Para completar el segundo incremento, su programa debe complementar la clase Tablero con los siguientes
metodos:
1. boolean hundirBarco(int tipo) Permite quitar un barco del tablero, como tambien de su lista
asociada, solamente seg un el tipo del barco a eliminar dada la caracterstica de que en la flota no puede
haber mas de un barco por cada tipo posible. Si el barco no existe en la flota retorna false. Observe
que al remover un barco de la lista, debe actualizarla de manera que todos los barcos agregados con
posterioridad al que se quiere eliminar sean desplazados dentro de la lista, a fin de que no quede un
espacio vaco en la lista ni se desperdicie un ndice. En relacion a esto u
ltimo, no olvide hacer lo propio
con la representacion de la flota en el arreglo bidimensional, disminuyendo los ndices de los barcos que
correspondan en una unidad. Finalmente, retorna true.
2. void mostrarEstadoFlota() Muestra en la consola el estado de la flota. Para ello, crea un arreglo
auxiliar con los barcos activos de la flota (aquellos que a
un sobreviven), y lo ordena crecientemente seg
un
la cantidad de impactos que a un pueden recibir. Finalmente, muestra un resumen como el siguiente:
Los barcos de la Flota a un activos son:
Barco Tipo 4 ha recibido 1 impactos
Barco Tipo 5 ha recibido 3 impactos
Barco Tipo 3 ha recibido 2 impactos
Incremento 3
Para completar el tercer incremento, su programa debe agregar los siguientes metodos a la clase Tablero:
Criterios de soluci
on
Posible soluci
on
// Dependiendo de la orientacion y el tipo del barco que se quiere agregar , revisamos que " alcance "
// a ser incluido en la posicion deseada
if ( barco . getOri entacio n () == V ) {
if ( fila + barco . getTipo () > superficie . length )
return false ;
}
else { // barco . getOrien tacion () == H
if ( columna + barco . getTipo () > superficie [0]. length )
return false ;
}
// Como a esta altura ya se han superado con exito las restricciones de factibilidad ,
// agregamos el barco al tablero ...
if ( barco . getOri entacio n () == V ) {
for ( int i = 0; i < barco . getTipo (); i ++)
superficie [ fila + i ][ columna ] = cantid adBarco s ;
}
else { // barco . getOrien tacion () == H
for ( int i = 0; i < barco . getTipo (); i ++)
superficie [ fila ][ columna + i ] = cantid adBarco s ;
}
// ... y a la flota
flota [ cant idadBarc os ] = barco ;
cantidadBar cos ++;
return true ;
}
// Lo quitamos de la flota ( corremos un espacio " a la izquierda " a todos los barcos agregados
// con posterioridad al barco impactado por el enemigo )...
for ( int i = indice ; i < cantidadBarcos -1; i ++)
flota [ i ] = flota [ i +1];
cantidadBarcos - -;
return true ;
}
public void m o s t r a r E s t a d o F l o t a () {
Usuario . mens ajeConso la ( " " );
// Ocupamos un arreglo auxiliar a fin de no alterar nuestra flota original
Barco [] barcosActivos ;
int activos = 0;
Para la realizacion del ejercicio usted cuenta con 3 clases ya implementadas que se detallan a continua-
cion.
private int id ;
private String nombre ;
private int puntaje ;
int opcion = 0;
// Menu de opciones
while ( opcion != 4) {
opcion = Usuario
. entero ( " Ingrese opcion :\ n1 : Listar segun puntajes \ n2 : Intercambiar novatos \ n3 : " +
" Listar todos los novatos \ n4 : Salir " );
while ( opcion < 1 || opcion > 4)
opcion = Usuario
. entero ( " OPCION INVALIDA \ nIngrese opcion :\ n1 : Listar segun puntajes \ n2 : " +
" Intercambiar novatos \ n3 : Listar todos los novatos \ n4 : Salir " );
switch ( opcion ) {
case 2:
int n1Id = Usuario
. entero ( " Ingrese primer novato a intercambiar " );
int n2Id = Usuario
. entero ( " Ingrese segundo novato a intercambiar " );
apg . i n t e r c a m b i a r N o v a t o s ( apg . getNovato ( n1Id ) ,
apg . getNovato ( n2Id ));
break ;
case 3:
apg . i m p r i m i r L i s t a C o m p l e t a ();
default :
break ;
}
}
}
}
.
El programa lo dividiremos en 3 subconjuntos incrementales, de acuerdo a las necesidades se
naladas. Se
le recomienda no comenzar con el siguiente subconjunto sino hasta terminar y probar el funcionamiento
correcto del subconjunto actual, a fin de que su desarrollo sea consistente.
Incremento 1
Para completar el primer incremento, debera implementar parte de la clase ArmaPaquetesGrupos, la cual
permitira realizar las tareas previamente descritas. Utiliza intensivamente la clase Novato, que ya viene
implementada y cuyos metodos podra apreciar en el respectivo archivo .java; NO LA MODIFIQUE. A
continuacion se detallan los metodos que debera tener ArmaPaquetesGrupos para este primer incremento:
1. public ArmaPaquetesGrupos(int gruposPorPqte, int nroPaquetes) Constructor de la clase.
gruposPorPqte especifica el n umero maximo de grupos que tendra cada paquete, nroPaquetes espe-
cifica el maximo de paquetes en los que se dividira a los novatos.
2. public Novato[] ordenarLista(Novato[] listaNovatos) Ordena la lista de novatos seg
un pun-
taje de forma decreciente1 . Retorna un arreglo unidimensional de tipo Novato.
3. public void armarGrupos(Novato[] listaNovatos) Dado un arreglo de objetos de tipo Novato2 ,
define a que paquete y grupo pertenece cada novato. Para cumplir esta tarea, Ud. debera tener como
atributo de esta clase un arreglo bidimensional de tipo int denominado relNovatoGrupo, donde el
primer ndice represente el Id del novato3 , y el segundo corresponda al n
umero de paquete, ambos
numerados desde el cero. El valor almacenado en cada celda de relNovatoGrupo[id][paquete] co-
rresponde al n umero de grupo asignado. Para poder llenar la matriz anterior, debemos determinar
primero a que paquete pertenece cada alumno, y luego asignarle un n umero de grupo valido para ese
paquete.
Para armar un paquete, la idea es que todos tengan personas de todos los rangos de puntajes
(altos, medios y bajos). Para efectos de este ejercicio, el n
umero de paquete para cada novato se
calcula as:
#paquete = (indexOrden) %(nroP aquetes)
donde:
1O sea, de mayor a menor puntaje. No se preocupe ante igualdades de puntaje entre 2 o m as alumnos; para esos casos,
resuelva segun le parezca. Puede utilizar algoritmos de ordenaci on tales como BubbleSort, InsertSort o SelectionSort.
2 Que previamente haya sido retornado por el m etodo ordenarLista(..)
3 Revise la implementacion de la clase Novato. Ella tiene 3 atributos: int id, que hace las veces de n
umero de alumno; String
nombre, que es el nombre completo del alumno; e int puntaje, que corresponde al puntaje ponderado de ingreso a la carrera
#grupo = ((#novatosP aquete) %(gruposP orP qte) + 1) + (#paquete) (gruposP orP qte)
donde:
#novatosPaquete especifica la cantidad de novatos del paquete correspondiente, a los cuales
ya se les ha asignado grupo4 .
gruposPorPqte corresponde al atributo especificado en el constructor de la clase.
#paquete es el n umero de paquete calculado previamente para el novato en cuestion.
Asuma para este calculo que habra suficientes alumnos para que exista el n
umero de grupos por
paquetes se
nalado al momento de la creacion de la clase.
1 0 0 0 0
0 3 0 0 0
0 0 0 0 9
0 0 0 0 10
2 0 0 0 0
0 0 5 0 0
0 0 0 7 0
0 4 0 0 0
0 0 0 8 0
0 0 6 0 0
Las filas representan a los novatos (indexados por su Id), y las columnas representan a los paque-
tes (indexados por su n umero). Por ejemplo, podemos ver que la segunda fila corresponde al alumno
con Id = 1. Si nos desplazamos hacia la derecha por esta misma fila, vemos que todos los n
umeros son
0, salvo uno (en este caso, el 3, que corresponde a su n
umero de grupo). Podemos tambien revisar que
la columna asociada a esta celda es la que corresponde al n
umero de paquete (en este caso, como es la
segunda columna, corresponde al paquete 1). Note que un novato puede pertenecer a un solo grupo y
a un solo paquete.
4. public void imprimirListaCompleta() Imprime en consola la lista completa de alumnos, orde-
nada decrecientemente por puntaje. Un ejemplo de output para un alumno es el siguiente:
id: 8 nombre: VICENCIO ALBERTO puntaje: 818
Al final de la lista, se debe imprimir el n
umero de alumnos mostrados en consola (por ejemplo: ** Se
encontraron 20 registros)
5. Debe agregar metodos para poder obtener los atributos que debe tener la clase (getters).
1. public Novato getNovato(int id) Retorna un objeto de tipo Novato si el id existe en la lista
de novatos, null si no.
2. public int getNroPqte(Novato n) retorna el n
umero de paquete asociado al novato, -1 si no
existe (si n es igual a null).
3. public int getNroGrupo(Novato n) retorna el n
umero de grupo asociado al novato, -1 si no existe
(si n es igual a null).
Ademas debera mejorar el metodo imprimirListaCompleta(), para que el output de cada novato incluya
tambien el n
umero de grupo. Un ejemplo es el siguiente:
id: 8 nombre: VICENCIO ALBERTO puntaje: 818 grupo : 1
Recuerde que la clase Novato NO posee atributos que especifiquen su n umero de paquete o grupo, por lo
que debera realizar su b
usqueda en la matriz que relaciona a los novatos con los paquetes y grupos.
Incremento 3
Para completar el tercer incremento, su programa debe agregar los siguientes metodos a la clase ArmaPaquetesGrupos:
1. public void listaSegunRangos(int menor,int mayor) Muestra en consola una lista con los
alumnos que se encuentren en el rango de puntajes especificado por menor y mayor(ambos inclusive).
El formato es una lnea por alumno, con los mismos datos que muestra imprimirListacompleta().
Debe mostrar al final de la lista el n
umero de alumnos estan dentro del rango de puntajes (por ejemplo,
** Se encontraron 9 registros).
2. public void intercambiarNovatos(Novato n1, Novato n2) Permite intercambiar de grupo a
dos novatos. Para llevar a cabo esta operacion, los dos alumnos deben ser del mismo paquete, pero no
pertenecer al mismo grupo. Este metodo debe validar tales casos, informando con un mensaje que no
se pudo realizar el intercambio.
Criterios de soluci
on
Posible soluci
on
import iic1103Packa ge .*;
public class A r m a P a q u e t e s G r u p o s {
// Constructor
public A r ma P a q u e t e s G r u p o s ( int gruposPorPqte , int nroPaquetes ) {
this . gruposPorPqte = gruposPorPqte ;
this . nroPaquetes = nroPaquetes ;
}
public Novato [] g e t L i s t a O r d e n a d a () {
}
}
}
listaOrdenada = listaNovatos ;
return listaNovatos ;
}
}
Usuario . mens ajeConso la ( " ** Se encontraron " + cu entaAcie rtos
+ " registros " );
}
if ( n1 == null || n2 == null ) {
Usuario . mensaje ( " Uno de los novatos no existe . Ingrese novatos que existan " );
return ;
}
// Buscamos los grupos de cada novato
int grupon1 = getNroGrupo ( n1 );
int grupon2 = getNroGrupo ( n2 );
int pqten1 = getNroPqte ( n1 );
int pqten2 = getNroPqte ( n2 );
if ( grupon1 == grupon2 ) {
Usuario . mensaje ( " No se pueden intercambiar porque son del mismo grupo " );
return ;
}
if ( pqten1 != pqten2 ) {
Usuario . mensaje ( " No se pueden intercambiar porque son de distinto paquete " );
return ;
}
int aux = relNova toGrupo [ n1 . getId ()][ pqten1 ];
relNovatoGr upo [ n1 . getId ()][ pqten1 ] = relNov atoGrup o [ n2 . getId ()][ pqten1 ];
relNovatoGr upo [ n2 . getId ()][ pqten1 ] = aux ;
Para la realizacion del ejercicio usted cuenta con la clase Principal ya implementada y que se muestra a
continuacion.
Incremento 1
Para completar el primer incremento, debera implementar la clase Mueble por completo, la cual representara a
un mueble dentro de su programa. Cada mueble se caracterizara por su nombre, un ancho y un alto. A
continuacion se detallan los metodos que debera tener esta clase.
1. Mueble(String nombre, int ancho, int alto) Constructor de la clase. Recibe la inicializacion
de sus caractersticas.
2. int CalcularArea() Retorna el area del mueble, la cual se calcula multiplicando el ancho por el
alto.
Ademas en este incremento debera implementar la clase Habitacion, la cual representara el espacio donde se
deben poner los muebles. Esta clase se caracteriza por un ancho, un alto y por la lista de muebles que se han
incorporado. Como dos muebles no pueden utilizar el mismo espacio debera crear una matriz que permita
saber cuales espacios se encuentran desocupados. Para esto su matriz debe inicializarla con el valor 1 en
todas sus casillas, el cual indicara que la matriz se encuentra vaca. Cuando agregue un mueble debera poner
en las casillas utilizadas por ese mueble el ndice del mueble dentro de la lista de muebles. Por ejemplo, el
primer mueble en agregar utilizara el ndice 0 dentro de la lista, por lo que todas las casillas que este utilice
deberan contener el valor 0 en la matriz.
Por ejemplo, si creo una habitacion de 8 de ancho y 5 de alto, luego agrego un mueble de 3 de ancho y
2 de alto, y luego otro mueble de 1 por 4, la matriz debe quedar de la siguiente forma:
0 0 0 1 1 1 1 1
0 0 0 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1. Habitacion(int ancho, int alto, int maxMuebles) Constructor de la clase. Recibe el ancho y
alto de la habitacion, as como tambien la cantidad maxima de muebles que puede contener.
2. boolean AgregarMueblePosicion(Mueble nuevoMueble, int fila, int col) Permite agregar
un mueble en una posicion determinada. Verifica que la posicion sea valida (se encuentre en los lmites
validos para la habitacion), en caso de no ser valida retorna false. Ademas verifica que sea posible
agregar el mueble en la posicion indicada para lo cual revisa si se encuentran vacos los espacios nece-
sarios seg
un las dimensiones del mueble (la posicion recibida simboliza a la esquina superior izquierda
del mueble). Si es posible agregar el mueble, lo inserta al final de la lista y marca las casillas ocupadas
por este, retornando true.
3. void MostrarHabitacion() Muestra en la consola el estado actual de la habitacion. Primero mues-
tra la matriz segun los valores que posee, reemplazando los 1 por la letra X (al mostrarla se debe
ver de forma similar al ejemplo mostrado anteriormente, pero en vez de 1 deben aparecer X). Luego
muestra la lista de muebles en la habitacion, mostrando para cada uno el ndice que le corresponde y
el nombre.
Incremento 3
Para completar el tercer incremento, su programa debe agregar el siguiente metodo a la clase Habitacion:
Criterios de soluci
on
Posible soluci
on
public class Mueble {
private String nombre ;
private int ancho ;
private int alto ;
public void M o s t r a r M u e b l e s P o r A r e a () {
// Hacemos un arreglo auxiliar , ya que no podemos cambiar el orden del
// arreglo actual
Mueble [] auxMuebles = new Mueble [ numMuebles ];
// Copiamos todos los muebles
for ( int i = 0; i < numMuebles ; i ++) {
auxMuebles [ i ] = listaMuebles [ i ];
}
// Ordenamos el arreglo . En este caso utilizaremos BubbleSort
for ( int i = 0; i < numMuebles - 1; i ++) {
// Buscamos el mayor entre los que quedan
int max = i ;
for ( int j = i + 1; j < numMuebles ; j ++) {
if ( auxMuebles [ j ]. CalcularArea () > auxMuebles [ max ]. CalcularArea ()) {
max = j ;
}
}
// Hacemos el intercambio de los elementos ( Swap )
Mueble aux = auxMuebles [ i ];
auxMuebles [ i ] = auxMuebles [ max ];
auxMuebles [ max ] = aux ;
}
// Mostramos cada uno de los elementos
Usuario . mens ajeConso la ( " Lista de Muebles ordenados por area : " );
for ( int i = 0; i < numMuebles ; i ++) {
Usuario . mensa jeConso la ( auxMuebles [ i ]. getNombre () + " : "
+ auxMuebles [ i ]. CalcularArea ());
}
}
public void M o s t r a r H a b i t a c i o n () {
// Mostramos cada uno de los espacios . Donde aparezca un -1 lo
// reemplazamos por una X
for ( int i = 0; i < espacio . length ; i ++) {
String linea = " " ;
for ( int j = 0; j < espacio [ i ]. length ; j ++) {
if ( espacio [ i ][ j ] == -1) {
linea += X ;
} else {
linea += espacio [ i ][ j ];
}
}
Usuario . mensa jeConso la ( linea );
}
// Mostramos los muebles junto con su indice
for ( int i = 0; i < numMuebles ; i ++) {
Usuario . mensa jeConso la ( i + " " + listaMuebles [ i ]. getNombre ());
}
}
}
Se le pide implementar dos clases: AdminCuentas, y Cuenta. La clase AdminCuentas consistira en un sistema
simple de administracion de cuentas corrientes de un banco; la clase Cuenta, en informacion detallada sobre
una cuenta corriente de una persona.
Ademas, existe una tercera clase, InterfazUsuario, que contiene el main del programa, y que ya esta im-
plementada.
La clase InterfazUsuario, que contiene el main del programa, viene ya implementada y se muestra a con-
tinuacion.
// Menu
boolean salir = false ;
while (! salir ) {
// Muestra menu y obtiene opcion
int opcion = Usuario . entero ( " Elija una opcion :\ n (1) Ver cuentas " +
" \ n (2) Crear cuenta \ n (3) Realizar deposito " +
" \ n (4) Realizar giro \ n (5) Ver detalle y saldo cuenta \ n (6) Salir " );
if ( opcion == 1) { // Ver cuentas
admin . verCuentas ();
} else if ( opcion == 2) { // Crear cuenta
// Obtenemos datos
String nombre = Usuario . texto ( " Ingrese el nombre de la persona : " );
String apellido = Usuario . texto ( " Ingrese el apellido de la persona : " );
String RUT = Usuario . texto ( " Ingrese el RUT de la persona : " );
String clave = Usuario . texto ( " Ingrese una clave para la cuenta : " );
Cuenta nuevaCuenta = new Cuenta ( nombre , apellido , RUT , clave , 5);
Criterios de soluci
on
Posible soluci
on
import iic1103Packa ge .*;
public class Cuenta {
// Atributos
private String nombre ;
private String apellido ;
private String RUT ;
private String clave ;
private int [] depositos ;
private int [] giros ;
/* * Constructor
* @param nuevoNombre el nombre de la persona
* @param nuevoApellido el apellido de la persona
* @param nuevoRUTel RUT de la persona
* @param nuevaClave la clave de la persona
/* * Constructor
* @param maxCant */
public AdminCuentas ( int maxCant ) {
cuentas = new Cuenta [ maxCant ];
cantCuentas = 0;
}
Ademas, existira una tercera clase, InterfazUsuario, que contendra el main del programa, y que ya
vendra implementada.
La clase InterfazUsuario, que contiene el main del programa, vendra viene ya implementada y se muestra
a continuacion.
Criterios de soluci
on
Posible soluci
on
public class Libro {
// Valores del libro
private String nombre ;
private String autor ;
private String ISBN ;
private int fecha ;
private int copias ;
// Retorna autor
public String getAutor () {
return autor ;
}
// Retorna nombre
public String getNombre () {
return nombre ;
}
// Retorna ISBN
public String getISBN () {
return ISBN ;
}
// Retorna la fecha
public int getFecha () {
return fecha ;
}
/* * Constructor
* @param ta m a n o B i b l i o t e c a la cantidad de libros maxima a almacenar */
public Si st e m a B i b l i o t e c a ( int t a m a n o B i b l i o t ec a ) {
listaLibros = new Libro [ t a m a n o B i b li o t e c a ];
numLibros = 0;
}
/* * Reserva un libro .
* @param ISBN el codigo del libro
* @param dia el dia a reservar
* @return */
public boolean reservarLibro ( String ISBN , int dia ) {
Libro libro = b u s c a r L i b r o P o r I S B N ( ISBN );
if ( libro . reservarCopia ( dia )) {
return true ;
} else {
return false ;
}
Se le pide implementar dos clases: AdminNovios y Novios. La clase AdminNovios consistira en un siste-
ma simple de administracion de listas de regalos de novios; la clase Novios, en informacion sobre una pareja
de novios.
Ademas, existiran dos clases mas que vendran implementadas: InterfazUsuario, que contendra el main
del programa, y Regalo, que contendra informacion especfica sobre un regalo dado.
Ayuda: puede que le sirva crear un metodo mas o menos generico para buscar la posicion de algo en un
arreglo, como metodo privado en la clase Novios, para facilitarle el desarrollo de los otros metodos y re-
escribir menos codigo.
/* * Constructor
* @param nuevoNombre el nombre del producto
* @param nuevaCa tegoria la categoria del producto */
public Regalo ( String nuevoNombre , String nu evaCateg oria ) {
nombre = nuevoNombre ;
categoria = nuevaC ategoria ;
}
// Retorna nombre
public String getNombre () {
return nombre ;
}
// Retorna categoria
public String getCategoria () {
return categoria ;
}
}
import iic1103Packa ge .*;
public class I nt er fa z Us ua r io {
// Menu
boolean salir = false ;
while (! salir ) {
// Muestra menu y obtiene opcion
int opcion = Usuario . entero ( " Elija una opcion :\ n (1) Agregar novios " +
" \ n (2) Ver regalos \ n (3) Agregar regalo \ n (4) Comprar regalo \ n (5) Salir " );
if ( opcion == 1) { // Agregar novios
// Obtenemos datos
if ( numNovio != -1) {
// Mostramos regalos
resultados [ numNovio ]. m o s t r a r R e g a l o s N o C o m p r a d o s ( " " );
resultados [ numNovio ]. m o s t r a r R e g a l o s Y a C o m p r a d o s ( " " );
// Obtenemos info del regalo
String nombreRegalo = Usuario . texto ( " Ingrese el nombre del regalo a comprar : " );
// Compramos regalo
if ( resultados [ numNovio ]. comprarRegalo ( nombreRegalo )) {
Usuario . mensaje ( " Se compro regalo " + nombreRegalo
+ " a novios "
+ resultados [ numNovio ]. g etNombr eNovio () + " - "
+ resultados [ numNovio ]. g etNombr eNovia ());
} else {
Usuario . mensaje ( " No se pudo comprar el regalo "
+ nombreRegalo + " a novios "
+ resultados [ numNovio ]. g etNombr eNovio () + " - "
+ resultados [ numNovio ]. g etNombr eNovia ());
}
}
} else if ( opcion == 5) { // Salir
salir = true ;
}
}
}
Criterios de soluci
on
Posible soluci
on
import iic1103Packa ge .*;
public class Novios {
// Info de novios
private String nombreNovio ;
private String nombreNovia ;
// Info de regalos
private Regalo [] noComprados ;
private Regalo [] yaComprados ;
private int ca n tN oC o mp ra do s = 0;
private int ca n tY aC o mp ra do s = 0;
/* * Constructor
* @param nuevoNovio nombre del novio
* @param nuevaNovia nombre de la novia
* @param cantMaxima cantidad maxima de regalos */
public Novios ( String nuevoNovio , String nuevaNovia , int cantMaxima ) {
nombreNovio = nuevoNovio ;
nombreNovia = nuevaNovia ;
noComprados = new Regalo [ cantMaxima ];
yaComprados = new Regalo [ cantMaxima ];
}
/* * Constructor
* @param cantMaxima la cantidad de novios maxima del arreglo */
public AdminNovios ( int cantMaxima ) {
listaNovios = new Novios [ cantMaxima ];
}
Ademas, existira una tercera clase, InterfazUsuario, que contendra el main del programa, y que vendra im-
plementada.
La clase InterfazUsuario, que contiene el main del programa, ya esta implementada y se detalla a conti-
nuacion.
// Menu
boolean salir = false ;
while (! salir ) {
// Muestra menu y obtiene opcion
int opcion = Usuario . entero ( " Elija una opcion :\ n (1) Ver estudiantes " +
" \ n (2) Agregar estudiante \ n (3) Ver notas estudiante " +
" \ n (4) Ver promedio curso \ n (5) Salir " );
if ( opcion == 1) { // Ver estudiantes
admin . verEs tudiant es ();
} else if ( opcion == 2) { // Agregar estudiante
// Obtenemos datos
String nombre = Usuario . texto ( " Ingrese el nombre del estudiante : " );
String apellido = Usuario . texto ( " Ingrese el apellido del estudiante : " );
String codigo = Usuario . texto ( " Ingrese el codigo del curso del estudiante : " );
Estudiante est = new Estudiante ( nombre , apellido , codigo , 4);
// Pide 4 notas y sus ponderaciones
for ( int i = 1; i <= 4; i ++) {
double nota = Usuario . real ( " Ingrese la nota " + i
+ " del estudiante : " );
int ponderacion = Usuario . entero ( " Ingrese la ponderacion "
+ i + " del estudiante : " );
est . setNota (i , nota );
est . se tPonder acion (i , ponderacion );
}
// Agregamos
if ( admin . a g r e g a r E s t u d i a n t e ( est )) {
Usuario . mensaje ( " Estudiante agregado . " );
} else {
Usuario . mensaje ( " Estudiante no agregado . " );
}
} else if ( opcion == 3) { // Ver notas estudiante
// Obtenemos estudiante
String nombre = Usuario . texto ( " Ingrese el nombre o apellido del estudiante : " );
Estudiante [] resultados = admin . b u s c a r E s t u d i a n t e ( nombre );
int posEstudiante = e l e gi r E s t u d i a n t e ( admin , resultados );
// Mostramos
if ( posEstudiante != -1) {
resultados [ posEstudiante - 1]. mostrarNotas ();
} else {
Usuario . mensaje ( " Estudiante no elegido . " );
}
} else if ( opcion == 4) { // Ver promedio curso
// Calculamos el promedio del curso
String codigo = Usuario . texto ( " Ingrese el codigo del curso a revisar : " );
double promedio = admin . c a l c u l a r P r o m e d i o C u r s o ( codigo );
// Mostramos
if ( promedio != -1) {
Usuario . mensaje ( " Promedio del curso " + codigo + " : " + promedio );
} else {
Usuario . mensaje ( " No hay estudiantes con notas en el curso . " );
}
} else if ( opcion == 5) { // Salir
salir = true ;
}
}
}
Criterios de soluci
on
Posible soluci
on
import iic1103Packa ge .*;
public class Estudiante {
private String nombre ;
private String apellido ;
private String codigoCurso ;
private double [] notas ;
private int [] ponderaciones ;
/* * Constructor
* @param nuevoNombre el nombre del estudiante
* @param nuevoApellido el apellido del estudiante
* @param nuevoCodigo el codigo del curso
* @param cantNotas la cantidad de notas que tiene ese curso */
public Estudiante ( String nuevoNombre , String nuevoApellido ,
String nuevoCodigo , int cantNotas ) {
nombre = nuevoNombre ;
apellido = nuevoApellido ;
codigoCurso = nuevoCodigo ;
notas = new double [ cantNotas ];
ponderaciones = new int [ cantNotas ];
// Retorna el nombre
public String getNombre () {
return nombre ;
}
// Retorna el apellido
public String getApellido () {
return apellido ;
}
// Retorna el codigo
public String getCodigo () {
return codigoCurso ;
}
/* * Constructor
* @param maxEstu diantes la cantidad maxima de estudiantes soportada */
public Admi n E s t ud i a n t e s ( int maxEs tudiante s ) {
estudiantes = new Estudiante [ maxE studian tes ];
cantEstudi an t es = 0;
}