Está en la página 1de 165

ALGORITMICA Y PROGRAMACION POR OBJETOS I

Nivel 3
Manejando grupos de atributos

Marcela Hernndez Hoyos

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 Resumen Entradas 1. 2. El estudiante a quien se quiere cambiar la nota La nueva nota del estudiante R1 Cambiar una nota Permite cambiar la nota definitiva de un estudiante del curso

Resultado Se ha asignado al estudiante la nueva nota.

Requerimientos Funcionales
Nombre Resumen Entradas Ninguna Resultado El promedio de las notas de los doce estudiantes del curso R2 Calcular el promedio Permite calcular la nota promedio de los estudiantes del curso

Requerimientos Funcionales
Nombre Resumen Entradas Ninguna Resultado Nmero de estudiantes con nota mayor al promedio del curso R3 Calcular el nmero de estudiantes por encima del promedio Permite saber cuntos estudiantes tienen una nota superior a la nota promedio del curso

Modelo de la Clase
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;

Modelo de la Clase
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; 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;

Solucin: Contenedora
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; Curso double notas =
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

notas =

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[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; }
TODOS los elementos del arreglo son del MISMO TIPO

Se declara una constante para fijar el tamao del arreglo

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 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; suma = notas[0] + notas[1] + notas[2] + notas[3] + notas[4] + notas[5] + notas[7] + notas[8] + notas[9] + notas[10] + notas[11]; suma = suma / TOTAL_EST; return suma; }

Para calcular el promedio de las notas del curso public double promedio ( )
{ double suma = 0.0; int indice = 0; suma += notas[ indice ]; indice++; suma += notas[ indice ]; indice++; suma += notas[ indice ]; indice++; (9 veces ms)

suma = suma / TOTAL_EST; return suma; }

Para calcular el promedio de las notas del curso public double promedio ( )
{ double suma = 0.0; int indice = 0; suma += notas[ indice ]; indice++; suma += notas[ indice ]; indice++; suma += notas[ indice ]; indice++; (9 veces ms)

Paso que se repite

suma = suma / TOTAL_EST; return suma; }

Para calcular el promedio de las notas del curso public double promedio ( )
{ double suma = 0.0; int indice = 0; suma += notas[ indice ]; indice++; suma += notas[ indice ]; indice++; suma += notas[ indice ]; indice++; (9 veces ms) suma = suma / TOTAL_EST; suma = suma / TOTAL_EST; return suma; return suma; } } public double promedio ( ) { double suma = 0.0; int indice = 0; while ( indice < TOTAL_EST ) { suma += notas[ indice ]; indice++; }

Para calcular el promedio de las notas del curso public double promedio ( )
{ double suma = 0.0; int indice = 0; suma += notas[ indice ]; indice++; suma += notas[ indice ]; indice++; suma += notas[ indice ]; indice++; (9 veces ms) suma = suma / TOTAL_EST; suma = suma / TOTAL_EST; return suma; return suma; } } public double promedio ( ) { double suma = 0.0; int indice = 0; while ( indice < TOTAL_EST ) { suma += notas[ indice ]; indice++; }

Instrucciones repetitivas

Ejecucin de una instruccin repetitiva


inicio Preparacin del ciclo

La condicin es verdadera?

no

Termina el ciclo

si Ejecuta las instrucciones del cuerpo del ciclo

Ejecucin de una instruccin repetitiva


public double promedio ( ) { double suma = 0.0; int indice = 0; while ( indice < TOTAL_EST ) { suma += notas[ indice ]; indice++; } suma = suma / TOTAL_EST; return suma; }

while y for
<inicio> while ( <condicin> ) { <cuerpo> <avance> } for (<inicio>; <condicin>; <avance>) { <cuerpo> }

Para calcular el promedio de las notas del curso


public double promedio ( ) { double suma = 0.0; int indice = 0; while ( indice < TOTAL_EST ) { suma += notas[ indice ]; 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; int indice = 0; while ( indice < TOTAL_EST ) Condicin para continuar: Cualquier expresin lgica { suma += notas[ indice ]; indice++; } suma = suma / TOTAL_EST; return suma; }

Para calcular el promedio de las notas del curso


public double promedio ( ) { double suma = 0.0; int indice = 0; while ( indice < TOTAL_EST ) { suma += notas[ indice ]; Cuerpo del ciclo: Instrucciones que se van a repetir en indice++; cada iteracin } suma = suma / TOTAL_EST; return suma; }

Para calcular el promedio de las notas del curso


public double promedio ( ) { double suma = 0.0; int indice = 0; while ( indice < TOTAL_EST ) { suma += notas[ indice ]; Avance del ciclo: indice++; Incremento del ndice que indica la } suma = suma / TOTAL_EST; return suma; }

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;
Inicio de las variables de trabajo: Indice para movernos en el arreglo Acumulado de la suma de las notas

for ( int indice = 0; indice < TOTAL_EST; indice ++ ) { suma += notas[ indice ]; } suma = suma / TOTAL_EST; return suma; }

Para calcular el promedio de las notas del curso


public double promedio ( ) { double suma = 0.0;
Condicin para continuar: Cualquier expresin lgica

for ( int indice = 0; indice < TOTAL_EST; indice ++ ) { suma += notas[ indice ]; } suma = suma / TOTAL_EST; return suma; }

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 ]; Cuerpo del ciclo: } suma = suma / TOTAL_EST; return suma; }

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 ++ ) { Avance del ciclo: suma += notas[ indice ]; Incremento del ndice que indica la } suma = suma / 1 TOTAL_EST; return suma; }

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


Indice para movernos en el arreglo empieza en CERO

for ( int indice = 0; indice < arreglo.length; indice++) { <cuerpo del ciclo> }

Patrn de recorrido total


Condicin para continuar: ndice menor que la longitud del arreglo

for ( int indice = 0; indice < arreglo.length; indice++) { <cuerpo del ciclo> }

Patrn de recorrido total


Avance: incremento en 1 del ndice

for ( int indice = 0; indice < arreglo.length; indice++) { <cuerpo del ciclo> }

Ejemplo
Indice empieza en CERO Mientras ndice menor que la longitud del arreglo Incremento en 1 del ndice

public void hacerCurva ( ) { for ( int i = 0; i < notas.length; i++) { if ( notas[ i ] < 2.0 ) notas[ i ] = notas[ i ] * 1.1; } }

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


Indice para movernos en el arreglo empieza en CERO

for ( int indice = 0; indice < arreglo.length && !<condicion>; indice++) { <cuerpo del ciclo> }

Patrn de recorrido parcial


Condicin para continuar: ndice menor que la longitud del arreglo Y (&&) no se cumple una condicin

for ( int indice = 0; indice < arreglo.length && !<condicion>; indice++) { <cuerpo del ciclo> }

Patrn de recorrido parcial


Avance: incremento en 1 del ndice

for ( int indice = 0; indice < arreglo.length && !<condicion>; indice++) { <cuerpo del ciclo> }

Patrn de recorrido parcial


A veces la condicin puede ser difcil de calcular
for ( int indice = 0; indice < arreglo.length && !<condicion>; indice++) { <cuerpo del ciclo> }

SOLUCION

Patrn de recorrido parcial


Calcular la condicin dentro del ciclo y utilizar una variable auxiliar (centinela)

boolean termino = false; for ( int indice = 0; indice < arreglo.length && !termino; indice++) { <cuerpo del ciclo> if ( <ya se cumpli el objetivo>) termino = true; }

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

notas =

3.5

4.5

3.5

5.0

4.5

2.5

3.5

4.0

2.0

1.5

3.5

5.0

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

notas =

3.5

4.5

3.5

5.0

4.5

2.5

3.5

4.0

2.0

1.5

3.5

5.0

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 ); }

10

11

notas =

3.5

4.5

3.5

5.0

4.5

2.5

3.5

4.0

2.0

1.5

3.5

5.0

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


Encontrar las primeras TRES notas de 1.5 y asignarles 2.5. 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; } } Una variable para contar cuntas notas de 1.5 se han subido a 2.5

Ejemplo con acumulado


Encontrar las primeras TRES notas de 1.5 y asignarles 2.5. 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; } } Una variable centinela para parar el ciclo cuando ya se hayan subido 3 notas

Ejemplo con acumulado


Encontrar las primeras TRES notas de 1.5 y asignarles 2.5. 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; } } 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


Encontrar las primeras TRES notas de 1.5 y asignarles 2.5. 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; } }

Si la nota actual (de la posicin i) es 1.5, subirla a 2.5 e incrementar el contador de notas

Ejemplo con acumulado


Encontrar las primeras TRES notas de 1.5 y asignarles 2.5. 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; } }

Si ya se han subido TRES notas de 1.5, entonces poner el centinela en true para acabar el ciclo

Otra posibilidad sin centinela


Encontrar las primeras TRES notas de 1.5 y asignarles 2.5.

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; Se pone la condicin de } continuacin } directamente en el ciclo }

Ejemplo con acumulado


Mtodo que retorna la posicin en el arreglo de la tercera nota con valor 5.0
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; }

Dos variables para acumular la informacin

Ejemplo con acumulado


Mtodo que retorna la posicin en el arreglo de la tercera nota con valor 5.0
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; }

Variable centinela del ciclo

Ejemplo con acumulado


Mtodo que retorna la posicin en el arreglo de la tercera nota con valor 5.0
public int tercerCinco( ) { int cuantosCincos = 0; Condicin con el centinela 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; }

Ejemplo con acumulado


Mtodo que retorna la posicin en el arreglo de la tercera nota con valor 5.0
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; }

Condicin para cambiar el acumulado

Ejemplo con acumulado


Mtodo que retorna la posicin en el arreglo de la tercera nota con valor 5.0
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; 0 1 2 3 }

Condicin para cambiar el centinela y salir del ciclo

10

11

notas =

5.0

4.5

3.5

5.0

4.5

5.0

3.5

4.0

2.0

1.5

3.5

5.0

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 ( ) {

Caso de estudio: El Avin

Interfaz usuario

Modelo del Mundo


Constantes

Arreglo con 42 sillas

Arreglo con 8 sillas

Constantes

Asociacin opcional

La clase Avion
public class Avion { //Constantes public final static int SILLAS_EJECUTIVAS = 8; public final static int SILLAS_ECONOMICAS = 42; //Atributos private Silla[] sillasEjecutivas; private Silla[] sillasEconomicas; }

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; //Atributos private Silla[] sillasEjecutivas; private Silla[] sillasEconomicas; }

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


Contar cuntas notas estn por encima de 3.0 (o sea cuntos estudiantes pasaron) public int cuantosPasaron ( ) { int contador = 0; for ( int i = 0; i < notas.length; i++ ) { if ( notas [ i ] >= 3.0 ) contador++; } return contador; }

FACIL !!!

Pasemos al avin
Contar cuntas sillas ejecutivas estn libres (o sea no asignadas) En qu se parece al caso anterior (cuantosPasaron) ?

En qu se diferencia?
Cul es el arreglo en este problema ?

Qu estamos buscando ?

Transformacin
Caso de las notas del curso (mtodo de la clase Curso)
public int cuantosPasaron ( ) {

Caso avin (mtodo de la clase Avion)


public int cuantasSillasEjecutivasLibres ( ) {

Transformacin
Caso de las notas del curso (mtodo de la clase Curso)
public int cuantosPasaron ( ) { int contador = 0;

Caso avin (mtodo de la clase Avion)


public int cuantasSillasEjecutivasLibres ( ) {

Transformacin
Caso de las notas del curso (mtodo de la clase Curso)
public int cuantosPasaron ( ) { int contador = 0;

Caso avin (mtodo de la clase Avion)


public int cuantasSillasEjecutivasLibres ( ) { int contador = 0;

Transformacin
Caso de las notas del curso (mtodo de la clase Curso)
public int cuantosPasaron ( ) { int contador = 0; for ( int i = 0; i < notas.length; i++ )

Caso avin (mtodo de la clase Avion)


public int cuantasSillasEjecutivasLibres ( ) { int contador = 0;

Transformacin
Caso de las notas del curso (mtodo de la clase Curso)
public int cuantosPasaron ( ) { int contador = 0; for ( int i = 0; i < notas.length; i++ )

Caso avin (mtodo de la clase Avion)


public int cuantasSillasEjecutivasLibres ( ) { int contador = 0; for ( int i = 0; i < sillasEjecutivas.length; i++ )

Transformacin
Caso de las notas del curso (mtodo de la clase Curso)
public int cuantosPasaron ( ) { int contador = 0; for ( int i = 0; i < notas.length; i++ ) { if ( notas [ i ] >= 3.0 ) contador++; }

Caso avin (mtodo de la clase Avion)


public int cuantasSillasEjecutivasLibres ( ) { int contador = 0; for ( int i = 0; i < sillasEjecutivas.length; i++ )

Transformacin
Caso de las notas del curso (mtodo de la clase Curso)
public int cuantosPasaron ( ) { int contador = 0; for ( int i = 0; i < notas.length; i++ ) { if ( notas [ i ] >= 3.0 ) contador++; }

Caso avin (mtodo de la clase Avion)


public int cuantasSillasEjecutivasLibres ( ) { int contador = 0; for ( int i = 0; i < sillasEjecutivas.length; i++ ) { if ( sillasEjecutivas[ i ].sillaAsignada( ) == false ) contador++; }

Transformacin
Caso de las notas del curso (mtodo de la clase Curso)
public int cuantosPasaron ( ) { int contador = 0; for ( int i = 0; i < notas.length; i++ ) { if ( notas [ i ] >= 3.0 ) contador++; } return contador;

Caso avin (mtodo de la clase Avion)


public int cuantasSillasEjecutivasLibres ( ) { int contador = 0; for ( int i = 0; i < sillasEjecutivas.length; i++ ) { if ( sillasEjecutivas[ i ].sillaAsignada( ) == false ) contador++; }

Transformacin
Caso de las notas del curso (mtodo de la clase Curso)
public int cuantosPasaron ( ) { int contador = 0; for ( int i = 0; i < notas.length; i++ ) { if ( notas [ i ] >= 3.0 ) contador++; } return contador;

Caso avin (mtodo de la clase Avion)


public int cuantasSillasEjecutivasLibres ( ) { int contador = 0; for ( int i = 0; i < sillasEjecutivas.length; i++ ) { if ( sillasEjecutivas[ i ].sillaAsignada( ) == false ) contador++; } return contador;

Ahora con variables auxiliares


Caso de las notas del curso (mtodo de la clase Curso)
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;

Caso avin (mtodo de la clase Avion)


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;

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 una ubicacin dada (que se recibe como parmetro) public int contarVentanasEconomicasEnUbicacion ( int ubi ) {

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 )


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 ) {

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

indice1: avanza lentamente

notas =

5.0

4.5

3.5

5.0

4.5

5.0

3.5

4.0

2.0

1.5

3.5

5.0
Indice2: avanza rpidamente. Cada vez que ndice1 se incrementa en una unidad, indice2 recorre TODO el arreglo

Ejemplo
Encontrar la nota que aparece un mayor nmero de veces en el curso

public double masVecesAparece( ) { Qu hacer ??? }


0 1 2 3 4 5 6 7 8 9 10 11

notas =

5.0

4.5

3.5

5.0

4.5

5.0

3.5

4.0

2.0

1.5

3.5

5.0

Ejemplo
Encontrar la nota que aparece un mayor nmero de veces en el curso

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; }

El resultado lo vamos a dejar en una variable llamada notasMasVecesAparece, la cual retornamos al final del mtodo

Ejemplo
Encontrar la nota que aparece un mayor nmero de veces en el curso

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; }

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
Encontrar la nota que aparece un mayor nmero de veces en el curso

public double masVecesAparece( ) { double notasMasVecesAparece = 0.0; for ( int i = 0; i < notas.length; i++) Hay dos problemas para { resolver: for (int j = 0; j < notas.length; j++) 1) Contar el nmero de veces { que aparece en el arreglo el valor que est en la <cuerpo del ciclo interno> casilla i } 2) Encontrar el mayor valor <cuerpo del ciclo externo> entre los calculados por el } primer problema return notaMasVecesAparece; }

Ejemplo
Encontrar la nota que aparece un mayor nmero de veces en el curso

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; }

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++; } } 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++; } } 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++; } } 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 el avin


Tarea: Informar (verdadero o falso) si en la clase ejecutiva del avin hay dos personas con la misma cdula

public boolean hayDobleCedulaEjecutiva( ) { Qu hacer ??? }

Ahora con el avin


Tarea: Informar (verdadero o falso) si en la clase ejecutiva del avin hay dos personas con la misma cdula
public boolean hayDobleCedulaEjecutiva( ) {

Ahora en cualquier clase (econmica o ejecutiva)


Tarea: Informar (verdadero o falso) si en el avin (en cualquier clase) hay dos personas con la misma cdula
public boolean hayDobleCedula( ) {

Contenedoras de tamao variable o vectores (ArrayList) Caso de estudio: Tienda de Libros

Interfaz usuario

Modelo del Mundo


Cada compra hace referencia a un libro del catlogo

La tienda tiene un carrito de compras

Nmero indeterminado de objetos

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


ARREGLOS 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

VECTORES 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)

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 CarroCompra carrito; }

catalogo es un vector

Declaracin de un vector
import java.util.*; public class TiendaLibros { private ArrayList catalogo; private CarroCompra carrito; }
carrito es un objeto de la clase CarroCompra

Declaracin de un vector
import java.util.*;
Se importa el paquete de java donde se encuentra la clase ArrayList

public class carroCompras { private ArrayList itemsCompra; }

itemsCompra es un vector

Inicializacin y tamao de un vector


En el mtodo constructor de la clase public TiendaLibros( ) TiendaLibros { catalogo = new ArrayList( ); carrito = new CarroCompra( ); }

Inicializacin y tamao de un vector


public TiendaLibros( ) { catalogo = new ArrayList( ); carrito = new CarroCompra( ); }

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
La expresin catalogo.size( ) catalogo.size( ) == 10 catalogo.isEmpty( ) == true Catalogo.isEmpty( ) itemsCompra.size( ) Se interpreta

En la clase TiendaLibros TiendaLibros TiendaLibros

CarroCompras

Patrn de recorrido total


En arreglos for ( int i = 0; i < notas.length; i++) { <cuerpo del ciclo> } En vectores for ( int i = 0; i < catalogo.size( ); i++) { <cuerpo del ciclo> }

Acceso a los elementos de un vector


Nombre del vector

vector.get ( pos )
Mtodo get de la clase ArrayList Parmetro que indica la posicin del elemento que se quiere obtener

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( ); } Llamado al return sumaPrecios; mtodo darPrecio }
del libroAux

Agregar un elemento al final de un vector


Nombre del vector

vector.add ( objeto )
Mtodo add de la clase ArrayList Parmetro que es el objeto que se va a agregar al vector

Insertar un elemento en una posicin dada dentro de un vector


Nombre del vector Parmetro que indica la posicin donde se va a insertar el elemento

vector.add ( indice, objeto )


Mtodo add de la clase ArrayList Parmetro que es el objeto que se va a insertar en el vector

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


Nombre del vector Parmetro que indica la posicin donde se va a remplazar el elemento

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

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


Nombre del vector

vector.remove ( indice )
Mtodo remove de la clase ArrayList 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) {