!"#$%&'(&)! + ,%$#%!(!)&$- ,$% $./0'$1 & (234562 753898:5; 7<=<> Qu vamos a aprender en este nivel: Utilizar estructuras contenedoras de tamao fijo para almacenar una secuencia de valores (simples u objetos) Utilizar estructuras contenedoras de tamao variable para almacenar una secuencia de objetos Utilizar instrucciones iterativas para manipular estructuras contenedoras Crear una clase completa en java utilizando eclipse
Caso de estudio No. 1: Las notas de un curso Las notas de un curso En el curso hay 12 estudiantes De cada estudiante se tiene la nota definitiva (un valor entre 0.0 y 5.0) Se quiere construir un programa que permita: 1. Cambiar la nota de un estudiante 2. Calcular el promedio del curso 3. Establecer el nmero de estudiantes que estn por encima de dicho promedio Interfaz usuario Requerimientos Funcionales Nombre R1 Cambiar una nota Resumen Permite cambiar la nota definitiva de un estudiante del curso Entradas 1. El estudiante a quien se quiere cambiar la nota 2. La nueva nota del estudiante Resultado Se ha asignado al estudiante la nueva nota. Requerimientos Funcionales Nombre R2 Calcular el promedio Resumen Permite calcular la nota promedio de los estudiantes del curso Entradas Ninguna Resultado El promedio de las notas de los doce estudiantes del curso Requerimientos Funcionales Nombre R3 Calcular el nmero de estudiantes por encima del promedio Resumen Permite saber cuntos estudiantes tienen una nota superior a la nota promedio del curso Entradas Ninguna Resultado Nmero de estudiantes con nota mayor al promedio del curso Modelo de la Clase double nota1; double nota2; double nota3; double nota4; double nota5; double nota6; double nota7; double nota8; double nota9; double nota10; double nota11; double nota12; Curso Modelo de la Clase double nota1; double nota2; double nota3; double nota4; double nota5; double nota6; double nota7; double nota8; double nota9; double nota10; double nota11; double nota12; Curso double nota1; double nota2; double nota3; double nota4; double nota5; double nota6; double nota7; double nota8; double nota9; double nota10; double nota11; double nota12; double nota13; double nota14; double nota15; Curso double nota1; double nota2; double nota3; double nota4; double nota5; double nota6; double nota7; double nota8; double nota9; . . . double nota100; Curso Solucin: Contenedora double nota1; double nota2; double nota3; double nota4; double nota5; double nota6; double nota7; double nota8; double nota9; double nota10; double nota11; double nota12; Curso double notas =
Curso 0 1 2 3 4 5 6 7 8 9 10 11 UN SOLO ATRIBUTO LLAMADO notas Arreglo = contenedora de tamao fijo 0 1 2 3 4 5 6 7 8 9 10 11 3.5 5.0 4.5 2.5 4.5 2.5 3.5 4.0 2.0 1.5 3.5 5.0 notas = notas[0] notas[4] notas[7] notas[11] Cada posicin del arreglo (casilla) se utiliza como una variable
notas[5] = 3.0; i = 2; if ( notas[ i ] > 4.0) notas[10] = notas[3]; if (notas[11] == notas[0]) notas[0] = 2.0; else notas[0] = notas[11];
Declaracin de un arreglo public class Curso { //Constantes public final static int TOTAL_EST = 12;
//Atributos private double[ ] notas;
} Declaracin de un arreglo public class Curso { //Constantes final public static int TOTAL_EST = 12;
//Atributos private double[ ] notas;
} Se declara una constante para fijar el tamao del arreglo TODOS los elementos del arreglo son del MISMO TIPO Inicializacin de un arreglo public Curso { notas = new double [TOTAL_EST]; } El espacio en memoria (una cajita por posicin del arreglo) queda reservada. El valor de los elementos del arreglo es indefinido al comienzo. Para consultar el nmero de elementos del arreglo: length notas.length Si se trata de acceder a una casilla con ndice menor que 0 o mayor que el nmero mximo de casillas (en este caso 12) java.lang.ArrayIndexOutOfBoundsException Para dar valores a los elementos del arreglo public void ponerNotasEnCero ( ) { notas[0] = 0; notas[1] = 0; notas[2] = 0; notas[3] = 0; notas[4] = 0; notas[5] = 0; notas[6] = 0; notas[7] = 0; notas[8] = 0; notas[9] = 0; notas[10] = 0; notas[11] = 0; }
Para calcular el promedio de las notas del curso public double promedio ( ) { double suma;
suma = notas[0] + ;
return suma; }
Para calcular el promedio de las notas del curso public double promedio ( ) { double suma;
Instrucciones repetitivas Preparacin del ciclo La condicin es verdadera? Ejecuta las instrucciones del cuerpo del ciclo si no Termina el ciclo inicio Ejecucin de una instruccin repetitiva Ejecucin de una instruccin repetitiva public double promedio ( ) { double suma = 0.0; int indice = 0;
Inicio de las variables de trabajo: Indice para movernos en el arreglo Acumulado de la suma de las notas Para calcular el promedio de las notas del curso public double promedio ( ) { double suma = 0.0; int indice = 0;
Condicin para continuar: Cualquier expresin lgica Para calcular el promedio de las notas del curso public double promedio ( ) { double suma = 0.0; int indice = 0;
Cuerpo del ciclo: Instrucciones que se van a repetir en cada iteracin Para calcular el promedio de las notas del curso public double promedio ( ) { double suma = 0.0; int indice = 0;
Avance del ciclo: Incremento del ndice que indica la posicin del arreglo en la que estamos en un momento dado Para calcular el promedio de las notas del curso public double promedio ( ) { double suma = 0.0;
for ( int indice = 0; indice < TOTAL_EST; indice ++ ) { suma += notas[ indice ]; }
suma = suma / TOTAL_EST;
return suma; }
Inicio de las variables de trabajo: Indice para movernos en el arreglo Acumulado de la suma de las notas Para calcular el promedio de las notas del curso public double promedio ( ) { double suma = 0.0;
for ( int indice = 0; indice < TOTAL_EST; indice ++ ) { suma += notas[ indice ]; }
suma = suma / TOTAL_EST;
return suma; }
Condicin para continuar: Cualquier expresin lgica Para calcular el promedio de las notas del curso public double promedio ( ) { double suma = 0.0;
for ( int indice = 0; indice < TOTAL_EST; indice ++ ) { suma += notas[ indice ]; }
suma = suma / TOTAL_EST;
return suma; }
Cuerpo del ciclo: Instrucciones que se van a repetir en cada iteracin Para calcular el promedio de las notas del curso public double promedio ( ) { double suma = 0.0;
for ( int indice = 0; indice < TOTAL_EST; indice ++ ) { suma += notas[ indice ]; }
suma = suma / 1 TOTAL_EST;
return suma; }
Avance del ciclo: Incremento del ndice que indica la posicin del arreglo en la que estamos en un momento dado Tarea No. 2 - Calcular el nmero de estudiantes que sacaron una nota entre 3.0 y 5.0 public int cuantosPasaron ( ) {
}
Tarea No. 2 - Calcular la mayor nota del curso public int mayorNota ( ) {
}
Tarea No. 2 - Contar el nmero de estudiantes que sacaron una nota inferior a la del estudiante que est en la posicin del arreglo que llega como parmetro. Suponga que el parmetro posEst tiene un valor entre 0 y TOTAL_EST-1 public int cuantosPeoresQue ( int posEst ) {
}
Tarea No. 2 - Aumentar en un 5% todas las notas del curso, sin que ninguna de ellas sobrepase el valor de 5.0 public void hacerCurva ( ) {
}
Patrones de recorrido de arreglos Patrn de recorrido total Se usa cuando se necesita recorrer TODO el arreglo Ejemplos: Calcular la suma de TODAS las notas del curso
Patrn de recorrido total for ( int indice = 0; indice < arreglo.length; indice++) { <cuerpo del ciclo> } Indice para movernos en el arreglo empieza en CERO Patrn de recorrido total for ( int indice = 0; indice < arreglo.length; indice++) { <cuerpo del ciclo> } Condicin para continuar: ndice menor que la longitud del arreglo Patrn de recorrido total for ( int indice = 0; indice < arreglo.length; indice++) { <cuerpo del ciclo> } Avance: incremento en 1 del ndice Ejemplo public void hacerCurva ( ) { for ( int i = 0; i < notas.length; i++) { if ( notas[ i ] < 2.0 ) notas[ i ] = notas[ i ] * 1.1; } } Indice empieza en CERO Mientras ndice menor que la longitud del arreglo Incremento en 1 del ndice Patrn de recorrido total con acumulado Se usa cuando se necesita recorrer TODO el arreglo y adems ACUMULAR o CALCULAR alguna propiedad sobre TODOS los elementos. Ejemplos: Contar cuntos estudiantes pasaron Calcular el promedio
Patrn de recorrido total con acumulado Decisiones a tomar: Cmo acumular? Cmo inicializar el acumulado? Condicin para cambiar el acumulado? Cmo cambiar el acumulado?
Ejemplo public int cuantosPasaron ( ) { int cuantos = 0; for ( int i = 0; i < notas.length; i++) { if ( notas[ i ] >= 3.0 ) cuantos++; } return cuantos; } Cmo acumular?
R/ Con una variable Ejemplo public int cuantosPasaron ( ) { int cuantos = 0; for ( int i = 0; i < notas.length; i++) { if ( notas[ i ] >= 3.0 ) cuantos++; } return cuantos; } Cmo inicializar el acumulado?
R/ En cero o en un valor adaptado al problema Ejemplo public int cuantosPasaron ( ) { int cuantos = 0; for ( int i = 0; i < notas.length; i++) { if ( notas[ i ] >= 3.0 ) cuantos++; } return cuantos; } Condicin para cambiar el acumulado?
R/ En este ejemplo, cuando el elemento que se est revisando sea mayor o igual a 3 Ejemplo public int cuantosPasaron ( ) { int cuantos = 0; for ( int i = 0; i < notas.length; i++) { if ( notas[ i ] >= 3.0 ) cuantos++; } return cuantos; } Cmo modificar el acumulado?
R/ En este ejemplo, incrementndolo en 1 Tarea No. 3: Modificar las notas de los estudiantes de la siguiente manera: a todos los que obtuvieron mas de 4 les quita 0.5. A todos los que obtuvieron menos de 2.0, les aumenta 0.5. A todos los dems, les deja la nota sin modificar public void cambiarNotas ( ) {
}
Tarea No. 3: Retornar la menor nota del curso public double menorNota ( ) {
}
Tarea No. 3: Indicar en qu rango hay mas notas en el curso: rango 1 de 0.0 a 1.99, rango 2 de 2.0 a 3.49, rango 3 de 3.5 a 5.0 public int rangoConMasNotas ( ) {
}
Patrn de recorrido parcial Se usa cuando NO se necesita recorrer TODO el arreglo Existe una condicin que debemos verificar en cada iteracin para saber si debemos detener el ciclo o volver a repetirlo Ejemplos: Decidir si al menos un estudiante sac 5.0 Buscar el primer estudiante con nota igual a cero
Patrn de recorrido parcial for ( int indice = 0; indice < arreglo.length && !<condicion>; indice++) { <cuerpo del ciclo> } Indice para movernos en el arreglo empieza en CERO Patrn de recorrido parcial for ( int indice = 0; indice < arreglo.length && !<condicion>; indice++) { <cuerpo del ciclo> } Condicin para continuar: ndice menor que la longitud del arreglo Y (&&) no se cumple una condicin Patrn de recorrido parcial for ( int indice = 0; indice < arreglo.length && !<condicion>; indice++) { <cuerpo del ciclo> } Avance: incremento en 1 del ndice Patrn de recorrido parcial for ( int indice = 0; indice < arreglo.length && !<condicion>; indice++) { <cuerpo del ciclo> } A veces la condicin puede ser difcil de calcular SOLUCION Patrn de recorrido parcial
boolean termino = false; for ( int indice = 0; indice < arreglo.length && !termino; indice++) { <cuerpo del ciclo> if ( <ya se cumpli el objetivo>) termino = true; } Calcular la condicin dentro del ciclo y utilizar una variable auxiliar (centinela) Ejemplo public boolean alguienConCinco ( ) { boolean termino = false; for ( int i = 0; i < notas.length && !termino; i++) { if ( notas[ i ] == 5.0 ) termino = true; } return termino; } 0 1 2 3 4 5 6 7 8 9 10 11 3.5 4.5 3.5 5.0 4.5 2.5 3.5 4.0 2.0 1.5 3.5 5.0 notas = Otra posibilidad: con while y sin centinela public boolean alguienConCinco ( ) { int i = 0; while ( i < notas.length && notas[ i ] != 5.0 ) { i++; } if ( i == notas.length) return false; else return true; } 0 1 2 3 4 5 6 7 8 9 10 11 3.5 4.5 3.5 5.0 4.5 2.5 3.5 4.0 2.0 1.5 3.5 5.0 notas = Otra posibilidad: con while y sin centinela public boolean alguienConCinco ( ) { int i = 0; while ( i < notas.length && notas[ i ] != 5.0 ) { i++; } return ( i < notas.length ); } 0 1 2 3 4 5 6 7 8 9 10 11 3.5 4.5 3.5 5.0 4.5 2.5 3.5 4.0 2.0 1.5 3.5 5.0 notas = Patrn de recorrido parcial con acumulado Se usa cuando NO se necesita recorrer TODO el arreglo, sino hasta que se cumpla una condicin y adems Se necesita ACUMULAR o CALCULAR alguna propiedad sobre los elementos.
Ejemplo con acumulado public void subirTresNotas( ) { int numNotas = 0; boolean termino = false;
for ( int i = 0; i < notas.length && !termino; i++) { if ( notas[ i ] == 1.5 ) { numNotas++; notas[ i ] = 2.5; } if ( numNotas == 3 ) termino = true; } } Encontrar las primeras TRES notas de 1.5 y asignarles 2.5. Una variable para contar cuntas notas de 1.5 se han subido a 2.5 Ejemplo con acumulado public void subirTresNotas( ) { int numNotas = 0; boolean termino = false;
for ( int i = 0; i < notas.length && !termino; i++) { if ( notas[ i ] == 1.5 ) { numNotas++; notas[ i ] = 2.5; } if ( numNotas == 3 ) termino = true; } } Encontrar las primeras TRES notas de 1.5 y asignarles 2.5. Una variable centinela para parar el ciclo cuando ya se hayan subido 3 notas Ejemplo con acumulado public void subirTresNotas( ) { int numNotas = 0; boolean termino = false;
for ( int i = 0; i < notas.length && !termino; i++) { if ( notas[ i ] == 1.5 ) { numNotas++; notas[ i ] = 2.5; } if ( numNotas == 3 ) termino = true; } } Encontrar las primeras TRES notas de 1.5 y asignarles 2.5. Ciclo desde la primera posicin del arreglo, mientras NO haya llegado al final y NO se haya cumplido la condicin del centinela Ejemplo con acumulado public void subirTresNotas( ) { int numNotas = 0; boolean termino = false;
for ( int i = 0; i < notas.length && !termino; i++) { if ( notas[ i ] == 1.5 ) { numNotas++; notas[ i ] = 2.5; } if ( numNotas == 3 ) termino = true; } } Encontrar las primeras TRES notas de 1.5 y asignarles 2.5. Si la nota actual (de la posicin i) es 1.5, subirla a 2.5 e incrementar el contador de notas Ejemplo con acumulado public void subirTresNotas( ) { int numNotas = 0; boolean termino = false;
for ( int i = 0; i < notas.length && !termino; i++) { if ( notas[ i ] == 1.5 ) { numNotas++; notas[ i ] = 2.5; } if ( numNotas == 3 ) termino = true; } } Encontrar las primeras TRES notas de 1.5 y asignarles 2.5. Si ya se han subido TRES notas de 1.5, entonces poner el centinela en true para acabar el ciclo Otra posibilidad sin centinela public void subirTresNotas( ) { int numNotas = 0;
for ( int i = 0; i < notas.length && numNotas < 3; i++) { if ( notas[ i ] == 1.5 ) { numNotas++; notas[ i ] = 2.5; } } } Encontrar las primeras TRES notas de 1.5 y asignarles 2.5. Se pone la condicin de continuacin directamente en el ciclo Ejemplo con acumulado public int tercerCinco( ) { int cuantosCincos = 0; int posicin = 0; boolean termino = false; for ( int i = 0; i < notas.length && !termino; i++) { if ( notas[ i ] == 5.0 ) cuantosCincos++; if ( cuantosCincos == 3 ) { termino = true; posicion = i; } } return posicion; } Mtodo que retorna la posicin en el arreglo de la tercera nota con valor 5.0 Dos variables para acumular la informacin Ejemplo con acumulado public int tercerCinco( ) { int cuantosCincos = 0; int posicin = 0; boolean termino = false; for ( int i = 0; i < notas.length && !termino; i++) { if ( notas[ i ] == 5.0 ) cuantosCincos++; if ( cuantosCincos == 3 ) { termino = true; posicion = i; } } return posicion; } Mtodo que retorna la posicin en el arreglo de la tercera nota con valor 5.0 Variable centinela del ciclo Ejemplo con acumulado public int tercerCinco( ) { int cuantosCincos = 0; int posicin = 0; boolean termino = false; for ( int i = 0; i < notas.length && !termino; i++) { if ( notas[ i ] == 5.0 ) cuantosCincos++; if ( cuantosCincos == 3 ) { termino = true; posicion = i; } } return posicion; } Mtodo que retorna la posicin en el arreglo de la tercera nota con valor 5.0 Condicin con el centinela Ejemplo con acumulado public int tercerCinco( ) { int cuantosCincos = 0; int posicin = 0; boolean termino = false; for ( int i = 0; i < notas.length && !termino; i++) { if ( notas[ i ] == 5.0 ) cuantosCincos++; if ( cuantosCincos == 3 ) { termino = true; posicion = i; } } return posicion; } Mtodo que retorna la posicin en el arreglo de la tercera nota con valor 5.0 Condicin para cambiar el acumulado Ejemplo con acumulado public int tercerCinco( ) { int cuantosCincos = 0; int posicin = 0; boolean termino = false; for ( int i = 0; i < notas.length && !termino; i++) { if ( notas[ i ] == 5.0 ) cuantosCincos++; if ( cuantosCincos == 3 ) { termino = true; posicion = i; } } return posicion; } Mtodo que retorna la posicin en el arreglo de la tercera nota con valor 5.0 Condicin para cambiar el centinela y salir del ciclo 0 1 2 3 4 5 6 7 8 9 10 11 5.0 4.5 3.5 5.0 4.5 5.0 3.5 4.0 2.0 1.5 3.5 5.0 notas = Tarea No. 4: Remplazar todas las notas del curso por 0.0 hasta que aparezca la primera nota superior a 3.0 public void notasACero ( ) {
}
Tarea No. 4: Calcular el nmero mnimo de notas del curso necesarias para que la suma supere el valor 30, recorrindolas desde la posicin 0 en adelante. Si al sumar todas las notas no se llega a ese valor, el mtodo debe retornar -1 public int sumadasDanTreinta ( ) {
}
Tarea No. 4: Calcular el nmero mnimo de notas del curso necesarias para que la suma supere el valor 30, recorrindolas desde la posicin 0 en adelante. Si al sumar todas las notas no se llega a ese valor, el mtodo debe retornar -1 public int sumadasDanTreinta ( ) { double sumaNotas = 0; int cuantasNotas = 0; boolean termino = false;
for ( int i = 0; i < notas.length && !termino; i++) { sumaNotas += notas[ i ]; cuantasNotas++; if (sumaNotas >= 30) termino = true; } if (i == notas.lenght) return -1; else return cuantasNotas; }
Caso de estudio: El Avin Interfaz usuario Modelo del Mundo Constantes Constantes Arreglo con 42 sillas Arreglo con 8 sillas Asociacin opcional La clase Avion public class Avion { //Constantes public final static int SILLAS_EJECUTIVAS = 8; public final static int SILLAS_ECONOMICAS = 42;
La clase Silla public class Silla { // Constantes public final static int CLASE_EJECUTIVA = 1; public final static int CLASE_ECONOMICA = 2; public final static int VENTANA = 1; public final static int CENTRAL = 2; public final static int PASILLO = 3;
// Atributos private int numero; private int clase; private int ubicacion; private Pasajero pasajero; }
La clase Pasajero public class Pasajero { // Atributos private int cedula; private String nombre; }
Un objeto de la clase Avin podra verse as Tarea No.6 Hacer la declaracin de la clase Pasajero public class Pasajero { //----------------------------------- // Atributos //-----------------------------------
//----------------------------------- // Constructor //----------------------------------- public Pasajero( int unaCedula, String unNombre ) {
}
Tarea No.6 Hacer la declaracin de la clase Pasajero public class Pasajero { //----------------------------------- // Mtodos //----------------------------------- public int darCedula( ) {
}
public String darNombre( ) {
} } Tarea No.7 Completar la declaracin de la clase Silla public class Silla { //------------------------------------------- // Constantes //------------------------------------------- public final static int CLASE_EJECUTIVA = 1; public final static int CLASE_ECONOMICA = 2; public final static int VENTANA = 1;
//------------------------------------------- // Atributos //------------------------------------------- private int numero; private int clase; private int ubicacion; private Pasajero pasajero; Tarea No.7 Completar la declaracin de la clase Silla public class Silla { public Silla( int num, int clas, int ubica ) { numero = num; clase = clas; ubicacion = ubica; pasajero = null; }
public void asignarPasajero( Pasajero pas ) {
} Tarea No.7 Completar la declaracin de la clase Silla public void desasignarSilla ( ) {
}
public boolean sillaAsignada( ) {
}
public int darNumero( ) {
} Tarea No.7 Completar la declaracin de la clase Silla public int darClase( ) {
}
pubic int darUbicacion( ) {
}
public Pasajero darPasajero( ) {
} La clase Avion public class Avion { //Constantes public final static int SILLAS_EJECUTIVAS = 8; public final static int SILLAS_ECONOMICAS = 42;
Mtodo constructor de la clase Avion public Avion( ) { // Crea las sillas ejecutivas y economicas sillasEjecutivas = new Silla[SILLAS_EJECUTIVAS]; sillasEconomicas = new Silla[SILLAS_ECONOMICAS];
sillasEjecutivas[ 0 ] = new Silla( 1, Silla.CLASE_EJECUTIVA, Silla.VENTANA ); sillasEjecutivas[ 1 ] = new Silla( 2, Silla.CLASE_EJECUTIVA, Silla.PASILLO ); sillasEjecutivas[ 2 ] = new Silla( 3, Silla.CLASE_EJECUTIVA, Silla.PASILLO ); sillasEjecutivas[ 3 ] = new Silla( 4, Silla.CLASE_EJECUTIVA, Silla.VENTANA ); sillasEjecutivas[ 4 ] = new Silla( 5, Silla.CLASE_EJECUTIVA, Silla.VENTANA ); sillasEjecutivas[ 5 ] = new Silla( 6, Silla.CLASE_EJECUTIVA, Silla.PASILLO ); sillasEjecutivas[ 6 ] = new Silla( 7, Silla.CLASE_EJECUTIVA, Silla.PASILLO ); sillasEjecutivas[ 7 ] = new Silla( 8, Silla.CLASE_EJECUTIVA, Silla.VENTANA );
sillasEconomicas[ 0 ] = new Silla( 9, Silla.CLASE_ECONOMICA, Silla.PASILLO ); sillasEconomicas[ 1 ] = new Silla( 10, Silla.CLASE_ECONOMICA, Silla.CENTRAL );
} Un objeto de la clase Avin podra verse as Preguntas frecuentes Cmo se hace el llamado a un mtodo de un objeto que est en el arreglo?
R// sillasEjecutivas[ 3 ].sillaAsignada( )
Los objetos que estn en el arreglo se pueden guardar en una variable ? R// SI. Silla sillaTemp = sillasEjecutivas [ 0 ];
Volvamos al arreglo de notas public int cuantosPasaron ( ) { int contador = 0;
for ( int i = 0; i < notas.length; i++ ) { if ( notas [ i ] >= 3.0 ) contador++; }
return contador; }
Contar cuntas notas estn por encima de 3.0 (o sea cuntos estudiantes pasaron) FACIL !!! Pasemos al avin En qu se parece al caso anterior (cuantosPasaron) ?
En qu se diferencia? Cul es el arreglo en este problema ?
Qu estamos buscando ? Contar cuntas sillas ejecutivas estn libres (o sea no asignadas) Transformacin public int cuantosPasaron ( ) {
}
Caso de las notas del curso (mtodo de la clase Curso) Caso avin (mtodo de la clase Avion) public int cuantasSillasEjecutivasLibres ( ) {
}
Transformacin public int cuantosPasaron ( ) { int contador = 0;
}
Caso de las notas del curso (mtodo de la clase Curso) Caso avin (mtodo de la clase Avion) public int cuantasSillasEjecutivasLibres ( ) {
}
Transformacin public int cuantosPasaron ( ) { int contador = 0;
}
Caso de las notas del curso (mtodo de la clase Curso) Caso avin (mtodo de la clase Avion) public int cuantasSillasEjecutivasLibres ( ) { int contador = 0;
}
Transformacin public int cuantosPasaron ( ) { int contador = 0;
for ( int i = 0; i < notas.length; i++ )
}
Caso de las notas del curso (mtodo de la clase Curso) Caso avin (mtodo de la clase Avion) public int cuantasSillasEjecutivasLibres ( ) { int contador = 0;
}
Transformacin public int cuantosPasaron ( ) { int contador = 0;
for ( int i = 0; i < notas.length; i++ )
}
public int cuantasSillasEjecutivasLibres ( ) { int contador = 0;
for ( int i = 0; i < sillasEjecutivas.length; i++ )
}
Caso de las notas del curso (mtodo de la clase Curso) Caso avin (mtodo de la clase Avion) Transformacin public int cuantosPasaron ( ) { int contador = 0;
for ( int i = 0; i < notas.length; i++ ) { if ( notas [ i ] >= 3.0 ) contador++; }
}
public int cuantasSillasEjecutivasLibres ( ) { int contador = 0;
for ( int i = 0; i < sillasEjecutivas.length; i++ )
}
Caso de las notas del curso (mtodo de la clase Curso) Caso avin (mtodo de la clase Avion) Transformacin public int cuantosPasaron ( ) { int contador = 0;
for ( int i = 0; i < notas.length; i++ ) { if ( notas [ i ] >= 3.0 ) contador++; }
}
public int cuantasSillasEjecutivasLibres ( ) { int contador = 0;
for ( int i = 0; i < sillasEjecutivas.length; i++ ) { if ( sillasEjecutivas[ i ].sillaAsignada( ) == false ) contador++; }
}
Caso de las notas del curso (mtodo de la clase Curso) Caso avin (mtodo de la clase Avion) Transformacin public int cuantosPasaron ( ) { int contador = 0;
for ( int i = 0; i < notas.length; i++ ) { if ( notas [ i ] >= 3.0 ) contador++; }
return contador;
}
public int cuantasSillasEjecutivasLibres ( ) { int contador = 0;
for ( int i = 0; i < sillasEjecutivas.length; i++ ) { if ( sillasEjecutivas[ i ].sillaAsignada( ) == false ) contador++; }
}
Caso de las notas del curso (mtodo de la clase Curso) Caso avin (mtodo de la clase Avion) Transformacin public int cuantosPasaron ( ) { int contador = 0;
for ( int i = 0; i < notas.length; i++ ) { if ( notas [ i ] >= 3.0 ) contador++; }
return contador;
}
public int cuantasSillasEjecutivasLibres ( ) { int contador = 0;
for ( int i = 0; i < sillasEjecutivas.length; i++ ) { if ( sillasEjecutivas[ i ].sillaAsignada( ) == false ) contador++; }
return contador;
}
Caso de las notas del curso (mtodo de la clase Curso) Caso avin (mtodo de la clase Avion) Ahora con variables auxiliares public int cuantosPasaron ( ) { int contador = 0; double notaAux;
for ( int i = 0; i < notas.length; i++ ) { notaAux = notas[ i ]; if ( notaAux >= 3.0 ) contador++; }
return contador;
}
public int cuantasSillasEjecutivasLibres ( ) { int contador = 0; Silla sillaAux;
for ( int i = 0; i < sillasEjecutivas.length; i++ ) { sillaAux = sillasEjecutivas[ i ]; if ( sillaAux.sillaAsignada( ) == false ) contador++; }
return contador;
}
Caso de las notas del curso (mtodo de la clase Curso) Caso avin (mtodo de la clase Avion) En la clase AVION:
Contar cuntas sillas de clase econmica tienen ubicacin VENTANA public int contarVentanasEconomica ( ) {
}
En la clase AVION:
Contar cuntas sillas de clase econmica tienen ubicacin VENTANA public int contarVentanasEconomica ( ) { int contador = 0; Silla sillaAux;
for ( int i = 0; i < sillasEconomicas.length; i++ ) { sillaAux = sillasEconomicas[ i ]; if ( sillaAux.darUbicacion( ) == Silla.VENTANA) contador++; }
return contador;
En la clase AVION:
Contar cuntas sillas de clase econmica tienen una ubicacin dada (que se recibe como parmetro) public int contarSillasEconomicasEnUbicacion ( int ubi ) {
}
En la clase AVION:
Contar cuntas sillas de clase econmica tienen una ubicacin dada (que se recibe como parmetro) public int contarSillasEconomicasEnUbicacion ( int ubi ) { int contador = 0; Silla sillaAux;
for ( int i = 0; i < sillasEconomicas.length; i++ ) { sillaAux = sillasEconomicas[ i ]; if ( sillaAux.darUbicacion( ) == ubi ) contador++; }
return contador;
En la clase AVION:
Informar (verdadero o falso) si un pasajero dado se encuentra en la clase ejecutiva del avin (la cdula del pasajero se recibe como parmetro)
public boolean existePasajeroEjecutivo ( int ced )
AYUDAS: 1. Es un patrn de recorrido parcial 2. Utilice el mtodo darPasajero( ) de la clase Silla para obtener el pasajero de una silla 3. Recuerde que una silla puede o no estar asignada (una silla est asignada cuando su pasajero existe. Una silla NO est asignada cuando su pasajero no existe (es null)) 4. Utilice el mtodo darCedula( ) de la clase Pasajero, para obtener el nmero de cdula del pasajero de una silla
En la clase AVION:
Informar (verdadero o falso) si un pasajero dado se encuentra en la clase ejecutiva del avin (la cdula del pasajero se recibe como parmetro) public bool existePasajeroEjecutivo( int ced ) {
}
Caso de estudio: Tienda de Libros Contenedoras de tamao variable o vectores (ArrayList) Interfaz usuario Modelo del Mundo La tienda tiene un carrito de compras Nmero indeterminado de objetos Cada compra hace referencia a un libro del catlogo En el carrito puede haber cero o ms tems de compra Un objeto de la clase TiendaLibros podra verse as La clase TiendaLibros public class TiendaLibros { //Atributos private ArrayList catalogo; private CarroCompras carrito; }
La clase Libro public class Libro { // Atributos private String titulo; private String isbn; private int precio; }
La clase CarroCompras public class CarroCompras { // Atributos private ArrayList itemsCompra; }
La clase ItemCompra public class ItemCompra { // Atributos private Libro libro; private int cantidad; }
Contenedoras de tamao variable o vectores (ArrayList) Contenedoras de tamao variable o vectores Se usan cuando NO conocemos el tamao de la contenedora (cantidad de elementos que se van a guardar)
Para implementarlas en Java es necesario utilizar una clase de Java que se llama ArrayList (se encuentra en el paquete java.util) Diferencias entre arreglos y vectores Tamao fijo
Permite almacenar elementos de tipo simple (int, float, double) y objetos
Para implementarlos en java, existe una sintaxis especial: [ ]: para obtener un elemento del arreglo length: para conocer la longitud Tamao variable
NO permite almacenar elementos de tipo simple (int, float, double), SOLO objetos Para implementarlos en java debemos utilizar una clase especial de java (ArrayList). Para manipular un vector se utiliza entonces la misma sintaxis que utilizamos para manejar cualquier otra clase (llamado a mtodos) ARREGLOS VECTORES Declaracin de un vector import java.util.*;
public class TiendaLibros { private ArrayList catalogo;
private CarroCompras carrito;
} Se importa el paquete de java donde se encuentra la clase ArrayList Declaracin de un vector import java.util.*;
public class TiendaLibros { private ArrayList catalogo;
private CarroCompras carrito;
} catalogo es un vector Declaracin de un vector import java.util.*;
public class TiendaLibros { private ArrayList catalogo;
private CarroCompras carrito;
} carrito es un objeto de la clase CarroCompras Declaracin de un vector import java.util.*;
public class CarroCompras { private ArrayList itemsCompra;
} Se importa el paquete de java donde se encuentra la clase ArrayList itemsCompra es un vector Inicializacin y tamao de un vector
public TiendaLibros( ) { catalogo = new ArrayList( ); carrito = new CarroCompras( ); } En el mtodo constructor de la clase TiendaLibros Inicializacin y tamao de un vector
public TiendaLibros( ) { catalogo = new ArrayList( ); carrito = new CarroCompras( ); } Se usa la misma sintaxis que para crear un objeto de cualquier clase (new)
No se dice cuntos elementos va a tener el vector. El tamao inicial es 0 (cero).
No se dice de que tipo son los objetos que se van a guardar en l Para conocer el nmero de elementos que hay en un vector isEmpty( ) - Es un mtodo que retorna verdadero si el vector no tiene elementos, y falso en caso contrario. size( ) Es un mtodo que retorna el nmero de elementos que hay en el vector En la clase La expresin Se interpreta TiendaLibros catalogo.size( ) TiendaLibros catalogo.size( ) == 10 TiendaLibros catalogo.isEmpty( ) == true
Catalogo.isEmpty( ) CarroCompras itemsCompra.size( ) Patrn de recorrido total for ( int i = 0; i < notas.length; i++) { <cuerpo del ciclo> } En arreglos En vectores for ( int i = 0; i < catalogo.size( ); i++) { <cuerpo del ciclo> } Acceso a los elementos de un vector vector.get ( pos ) Mtodo get de la clase ArrayList Parmetro que indica la posicin del elemento que se quiere obtener Nombre del vector Ejemplo en la clase TiendaLibros public int inventario( ) { int sumaPrecios = 0; Libro libroAux;
for ( int i = 0; i < catalogo.size( ); i++) { libroAux = ( Libro ) catalogo.get( i ); sumaPrecios += libroAux.darPrecio( ); } return sumaPrecios; } Variable auxiliar o temporal de tipo Libro Ejemplo en la clase TiendaLibros public int inventario( ) { int sumaPrecios = 0; Libro libroAux;
for ( int i = 0; i < catalogo.size( ); i++) { libroAux = ( Libro ) catalogo.get( i ); sumaPrecios += libroAux.darPrecio( ); } return sumaPrecios; } Recorrido total hasta el final del vector catalogo Ejemplo en la clase TiendaLibros public int inventario( ) { int sumaPrecios = 0; Libro libroAux;
for ( int i = 0; i < catalogo.size( ); i++) { libroAux = ( Libro ) catalogo.get( i ); sumaPrecios += libroAux.darPrecio( ); } return sumaPrecios; } Obtencin del elemento de la posicin i del vector Ejemplo en la clase TiendaLibros public int inventario( ) { int sumaPrecios = 0; Libro libroAux;
for ( int i = 0; i < catalogo.size( ); i++) { libroAux = ( Libro ) catalogo.get( i ); sumaPrecios += libroAux.darPrecio( ); } return sumaPrecios; } Se especifica el tipo del objeto Ejemplo en la clase TiendaLibros public int inventario( ) { int sumaPrecios = 0; Libro libroAux;
for ( int i = 0; i < catalogo.size( ); i++) { libroAux = ( Libro ) catalogo.get( i ); sumaPrecios += libroAux.darPrecio( ); } return sumaPrecios; } Llamado al mtodo darPrecio del libroAux Agregar un elemento al final de un vector vector.add ( objeto ) Mtodo add de la clase ArrayList Parmetro que es el objeto que se va a agregar al vector Nombre del vector Insertar un elemento en una posicin dada dentro de un vector vector.add ( indice, objeto ) Mtodo add de la clase ArrayList Parmetro que es el objeto que se va a insertar en el vector Nombre del vector Parmetro que indica la posicin donde se va a insertar el elemento Ejemplo en la clase TiendaLibros public void agregarTresLibros( ) { Libro libroAux1 = new Libro(Cien aos de soledad, 98657, 15000); Libro libroAux2 = new Libro(La inmortalidad, 23758, 23800); Libro libroAux3 = new Libro(El perfume, 5759308, 42100);
catalogo.add( libroAux1 ); catalogo.add( libroAux2 ); catalogo.add( 1, libroAux3 ); } Remplazar un elemento en un vector vector.set ( indice, objeto ) Mtodo set de la clase ArrayList Parmetro que es el nuevo objeto que va a remplazar el anterior en el vector Nombre del vector Parmetro que indica la posicin donde se va a remplazar el elemento Ejemplo en la clase TiendaLibros public void intercambiar( int pos1, int pos2 ) { Libro libroAux1; Libro libroAux2;
libroAux1 = (Libro) catalogo.get( pos1 ); libroAux2 = (Libro) catalogo.get( pos2 ); catalogo.set( pos1, libroAux2 ); catalogo.set( pos2, libroAux1 ); } Eliminar un elemento de un vector vector.remove ( indice ) Mtodo remove de la clase ArrayList Nombre del vector Parmetro que indica la posicin del elemento que se desea eliminar Tarea No. 10 - En la clase TiendaLibros:
Localizar un libro en el catalogo, dado su ISBN (que se recibe como parmetro). Si no lo encuentra, el mtodo debe retornar null public Libro buscarLibro ( String isbn) {
}
Tarea No. 10 - En la clase TiendaLibros:
Adicionar un libro en el catlogo, si no existe ya un libro con ese ISBN. Utilice el mtodo anterior para identificar el caso en el cual ya hay un libro con ese ISBN. El libro que se desea adicionar se recibe como parmetro. public void adicionarLibroCatalogo ( Libro nuevoLibro) {
}
Tarea No. 11 - En la clase CarroCompras:
Adicionar una cantidad de ejemplares de un libro al pedido actual. El mtodo debe considerar el caso en el que el libro ya se encuentre en el pedido, caso en el cual solo debe incrementar el nmero de ejemplares. Si el libro no se encuentra, el mtodo debe crear un nuevo item ItemCompra. El libro que se desea adicionar, as como la cantidad se reciben como parmetros. public void adicionarCompra ( Libro lib, int cant) {
}
Tarea No. 11 - En la clase CarroCompra:
Calcular el monto total de la compra del usuario. Para esto debe tener en cuenta el precio de cada libro y el nmero de ejemplares de cada uno que hay en el pedido. public int calcularValorTotalCompra ( ) {
}
Tarea No. 11 - En la clase CarroCompra:
Eliminar del pedido el libro que tiene el ISBN dado como parmetro. Si no hay ningn libro con ese ISBN, el mtodo no hace nada. public void borrarItemCompra( String isbn) {
}
Patrn de doble recorrido Se usa cuando por CADA ELEMENTO del arreglo se debe hacer un recorrido COMPLETO Ejemplos: Encontrar la nota que aparece un mayor nmero de veces en el curso
Patrn de doble recorrido for ( int indice1 = 0; indice1 < arreglo.length; indice1++) { for (int indice2 = 0; indice2 < arreglo.length; indice2++) { <cuerpo del ciclo interno> } <cuerpo del ciclo externo> } 2 ciclos 2 ndices Patrn de doble recorrido for ( int indice1 = 0; indice1 < arreglo.length; indice1++) { for (int indice2 = 0; indice2 < arreglo.length; indice2++) { <cuerpo del ciclo interno> } <cuerpo del ciclo externo> } 0 1 2 3 4 5 6 7 8 9 10 11 5.0 4.5 3.5 5.0 4.5 5.0 3.5 4.0 2.0 1.5 3.5 5.0 notas = indice1: avanza lentamente Indice2: avanza rpidamente. Cada vez que ndice1 se incrementa en una unidad, indice2 recorre TODO el arreglo Ejemplo public double masVecesAparece( ) { Qu hacer ??? } Encontrar la nota que aparece un mayor nmero de veces en el curso 0 1 2 3 4 5 6 7 8 9 10 11 5.0 4.5 3.5 5.0 4.5 5.0 3.5 4.0 2.0 1.5 3.5 5.0 notas = Ejemplo public double masVecesAparece( ) { double notasMasVecesAparece = 0.0; for ( int i = 0; i < notas.length; i++) { for (int j = 0; j < notas.length; j++) { <cuerpo del ciclo interno> } <cuerpo del ciclo externo> } return notaMasVecesAparece; } Encontrar la nota que aparece un mayor nmero de veces en el curso El resultado lo vamos a dejar en una variable llamada notasMasVecesAparece, la cual retornamos al final del mtodo Ejemplo public double masVecesAparece( ) { double notasMasVecesAparece = 0.0; for ( int i = 0; i < notas.length; i++) { for (int j = 0; j < notas.length; j++) { <cuerpo del ciclo interno> } <cuerpo del ciclo externo> } return notaMasVecesAparece; } Encontrar la nota que aparece un mayor nmero de veces en el curso Armamos la estructura del mtodo a partir del esqueleto del patrn. Utilizamos las variables i y j para llevar los ndices de cada uno de los ciclos Ejemplo public double masVecesAparece( ) { double notasMasVecesAparece = 0.0; for ( int i = 0; i < notas.length; i++) { for (int j = 0; j < notas.length; j++) { <cuerpo del ciclo interno> } <cuerpo del ciclo externo> } return notaMasVecesAparece; } Encontrar la nota que aparece un mayor nmero de veces en el curso Hay dos problemas para resolver: 1) Contar el nmero de veces que aparece en el arreglo el valor que est en la casilla i 2) Encontrar el mayor valor entre los calculados por el primer problema public double masVecesAparece( ) { double notaMasVecesAparece = 0.0;
for ( int i = 0; i < notas.length; i++) { for (int j = 0; j < notas.length; j++) { <contar cuantas veces aparece } la nota buscada (notas [ i ])> } <verificar si es la nota mas frecuente> } return notaMasVecesAparece; } Ejemplo Encontrar la nota que aparece un mayor nmero de veces en el curso Hay dos problemas para resolver: 1) Contar el nmero de veces que aparece en el arreglo el valor que est en la casilla i 2) Encontrar el mayor valor entre los calculados por el primer problema Primer problema: contar el nmero de veces que aparece en el arreglo el valor que est en la casilla i public double masVecesAparece( ) { double notasMasVecesAparece = 0.0; for ( int i = 0; i < notas.length; i++) { double notaBuscada = notas[ i ]; int contador = 0;
for (int j = 0; j < notas.length; j++) { if ( notas[ j ] == notaBuscada ) contador++; } <verificar si es la nota mas frecuente> } return notaMasVecesAparece; } Dejamos en la variable notaBuscada, la nota para la cual queremos contar el nmero de ocurrencias. La inicializamos con la nota de la casilla i. Primer problema: contar el nmero de veces que aparece en el arreglo el valor que est en la casilla i public double masVecesAparece( ) { double notasMasVecesAparece = 0.0; for ( int i = 0; i < notas.length; i++) { double notaBuscada = notas[ i ]; int contador = 0;
for (int j = 0; j < notas.length; j++) { if ( notas[ j ] == notaBuscada ) contador++; } <verificar si es la nota mas frecuente> } return notaMasVecesAparece; } Usamos una segunda variable llamada contador para acumular all el nmero de veces que aparece la nota buscada. Primer problema: contar el nmero de veces que aparece en el arreglo el valor que est en la casilla i public double masVecesAparece( ) { double notasMasVecesAparece = 0.0; for ( int i = 0; i < notas.length; i++) { double notaBuscada = notas[ i ]; int contador = 0;
for (int j = 0; j < notas.length; j++) { if ( notas[ j ] == notaBuscada ) contador++; } <verificar si es la nota mas frecuente> } return notaMasVecesAparece; } En el ciclo interno, vamos a contar cuntas veces aparece la nota buscada. Se incrementa el contador cada vez que notaBuscada sea igual a notas[ j ]. Segundo problema: Encontrar el mayor valor entre los calculados por el primer problema public double masVecesAparece( ) { double notaMasVecesAparece = 0.0; int numeroVecesAparece = 0; for ( int i = 0; i < notas.length; i++) { double notaBuscada = notas[ i ]; int contador = 0; for (int j = 0; j < notas.length; j++) { if ( notas [ j ] == notaBuscada ) contador++; } if ( contador > numeroVecesAparece) { notasMasVecesAparece = notaBuscada; numeroVecesAparece = contador; } } return notaMasVecesAparece; } Usamos esta variable para indicar la nota que hasta el momento aparece mas veces Segundo problema: Encontrar el mayor valor entre los calculados por el primer problema public double masVecesAparece( ) { double notaMasVecesAparece = 0.0; int numeroVecesAparece = 0; for ( int i = 0; i < notas.length; i++) { double notaBuscada = notas[ i ]; int contador = 0; for (int j = 0; j < notas.length; j++) { if ( notas [ j ] == notaBuscada ) contador++; } if ( contador > numeroVecesAparece) { notasMasVecesAparece = notaBuscada; numeroVecesAparece = contador; } } return notaMasVecesAparece; } Usamos esta variable para contar cuntas veces aparece la nota notaMasVecesAparece Segundo problema: Encontrar el mayor valor entre los calculados por el primer problema public double masVecesAparece( ) { double notaMasVecesAparece = 0.0; int numeroVecesAparece = 0; for ( int i = 0; i < notas.length; i++) { double notaBuscada = notas[ i ]; int contador = 0; for (int j = 0; j < notas.length; j++) { if ( notas [ j ] == notaBuscada ) contador++; } if ( contador > numeroVecesAparece) { notasMasVecesAparece = notaBuscada; numeroVecesAparece = contador; } } return notaMasVecesAparece; } Definimos el caso en el cual debemos cambiar el acumulado: si encontramos un valor que aparezca mas veces que el que tenamos hasta el momento (contador > numeroVecesAparece) debemos actualizar los valores de las variables Conclusin Para resolver un problema que implique doble recorrido: Primero debemos identificar los dos problemas que queremos resolver (uno con cada ciclo) Luego, debemos tratar de resolverlos independientemente, usando los patrones de recorrido total o parcial Si para resolver el problema, se necesita un tercer ciclo anidado, debemos escribir mtodos separados que ayuden a resolver cada problema individualmente (nivel 4), porque la solucin directa es muy compleja y propensa a errores. Tarea No. 5: Calcular una nota del curso tal que la mitad de las notas sean menores o iguales a ella. Si hay varias que lo cumplan, puede retornar cualquiera. public double notaMediana ( ) {
}
Ahora con la Tienda de Libros public boolean hayDobleTitulo( ) { Qu hacer ??? } Tarea: Informar (verdadero o falso) si en el catlogo de la tienda de libros hay dos libros con el mismo ttulo Ahora con la Tienda de Libros public boolean hayDobleTitulo( ) {
} Tarea: Informar (verdadero o falso) si en el catlogo de la tienda de libros hay dos libros con el mismo ttulo