0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA
A OBJETOS
Encapsulamiento y Abstracción
Caso de estudio: Estación MeteorológicaDr. Luciano H. Tamargo http://cs.uns.edu.ar/~lt Depto. de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur, Bahía Blanca 2017
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
Introducción a la Programación Orientada a Objetos IPOO - 2017 2
• Encapsulamiento.
• Caso de estudio: Estación Meteorológica.
• Resumen
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
ENCAPSULAMIENTO
• La evolución de los lenguajes de programación está fuertemente ligada a la evolución de las metodologías de desarrollo de software.
• Un lenguaje que soporte la metodología orientada a objetos debe soportar el concepto de
encapsulamiento.
• En la POO el encapsulamiento es el mecanismo que permite esconder los detalles de la implementación de una clase, de modo que las clases que la usan sólo conozcan su funcionalidad.
• Así, una clase puede ser usada como una caja negra, sabiendo qué hace, pero no cómo lo hace.
Introducción a la Programación Orientada a Objetos IPOO - 2017 3
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
MODIFICADORES DE ACCESO
• En Java los modificadores de acceso determinan el encapsulamiento de los miembros de la clase.
• Un miembro que se declara privado sólo puede ser usado dentro de la misma clase.
• Si un miembro se define como público es visible desde el exterior de la clase.
• Declararemos como privados los atributos, de modo que la representación de los datos quede encapsulada.
• Declararemos como públicos los métodos que estén especificados en el diagrama de clases.
• Los métodos auxiliares, en general, los definiremos como privados.
Introducción a la Programación Orientada a Objetos IPOO - 2017 4
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
Introducción a la Programación Orientada a Objetos IPOO - 2017 5
TEMARIO
• Encapsulamiento.
• Caso de estudio: Estación Meteorológica.
• Resumen. 0 1 1 0 0
1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
• En una estación meteorológica se miden y registran valores de distintas variables meteorológicas que luego se usan para hacer predicciones.
• El diseñador del sistema elaboró un diagrama de clases que incluye a una clase TempMinEstacion .
• La clase encapsula a una estructura de datos que mantiene los valores de las temperaturas mínimas de cada día registradas en un período de n días y brinda servicios para:
– Calcular la mayor temperatura registrada.
– Calcular el promedio de las temperaturas.
– Calcular en cuántos días heló . – Decidir si hubo heladas.
Introducción a la Programación Orientada a Objetos IPOO - 2017 6
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
• Mayor = 12
• Promedio = 4,8
• Cantidad de heladas = 2
• Hubo Heladas = si
Introducción a la Programación Orientada a Objetos IPOO - 2017 7
8 3.5 12 -1 3.5 10 -2 0 1 1 0 0
1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
• El diseñador decidió que los datos se mantengan en un arreglo de n componentes, cada una de las cuales corresponde a la temperatura de un día del período.
• El arreglo es una estructura de datos que agrupa a un conjunto de elementos, todos del mismo tipo.
• Como la clase encapsula a la estructura de datos, el arreglo no es visible fuera de la clase TempMinEstacion.
• Las clases Clientes pueden crear objetos de clase TempMinEstacion y enviarles mensajes para calcular el promedio del período, determinar la mayor temperatura, etc.
Introducción a la Programación Orientada a Objetos IPOO - 2017 8
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
• La clase TempMinEstacion no brinda servicios para leer o mostrar datos.
• Toda la entrada y salida se hace desde las clases Clientes.
• TempMinEstacion brinda servicios para establecer el valor que corresponde a la temperatura de un día y retornar la temperatura almacenada para un día dado.
• Desde las clases Clientes el primer día se referencia con el valor 1 y el último día del período corresponde al valor n.
Introducción a la Programación Orientada a Objetos IPOO - 2017 9
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017
10
TempMinEstacion
<<atributos de instancia>>
float [] tMin
<<Constructores>>
TempMinEstacion(cant: entero)
<<Comandos>>
establecerTempMin(d: entero, t: real)
TempMinEstacion(cant: entero) Crea una estructura para mantener las temperaturas de cant días, requiere cant>0
establecerTempMin (d : entero t : real) requiere 1<=d<=cantDias()
La temperatura del día 1 corresponde al subíndice 0 en el arreglo.
8 3.5 12 -1 3.5 10 -2
tMin length 7
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos 11
TempMinEstacion
<<atributos de instancia>>
float [] tMin
<<Consultas>>
obtenerTempMin(d: entero): real cantDias(): entero
mayorTempMin () : real promedioTempMin () : real cantHeladas() : entero huboHeladas () : boolean Todas las consultas que procesan la estructura requieren que se haya asignado una temperatura a cada día.
El primer día es el día 1.
El período tiene al menos un día.
Cuenta la cantidad de días que heló
Decide si hubo heladas Retorna la mayor
temperatura del período Requiere 1<=d<=cantDias()
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
class TempMinEstacion {
/* Todas las consultas que procesan la estructura requieren que se haya asignado una temperatura a cada día. El primer día es el día 1.El período tiene al menos un día.*/
private float [] tMin;
//Constructor
/*Crea una estructura para mantener las temperaturas de cant días, cant>0 */
public TempMinEstacion(int cant){
tMin = new float[cant];
} ...
}
12
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
//Comandospublic void establecerTempMin(int dia, float t){
/*Requiere 1<=día<=cantDias()*/
tMin[dia-1]=t;
}
13
• La temperatura de diacorresponde al subíndice dia - 1 en el arreglo.
• Observemos que no establecemos controles ni requisitos sobre el valor de la temperatura.
Introducción a la Programación Orientada a Objetos IPOO - 2017
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
// Consultaspublic float obtenerTempMin(int dia){
/*Requiere 1<=dia<=cantDias()*/
return tMin[dia-1];
}
public int cantDias(){
return tMin.length;
}
Introducción a la Programación Orientada a Objetos 14 IPOO - 2017
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public float promedioTempMin(){
/*Computa el promedio de temperaturas de un período con al menos un día*/
float prom=0, suma=0;
for (int i=0;i<cantDias();i++) suma=suma+tMin[i];
prom=suma/cantDias();
return prom;
}
Introducción a la Programación Orientada a Objetos 15 IPOO - 2017
Recorrido Exhaustivo
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Algoritmo mayorTempMin DS mayor
mayor temperatura minima del primer día para cada día a partir del segundo
si temperatura mínima del día > mayor mayor temperatura mínima del día
16
• Aunque el algoritmo se plantea para un problema específico puede generalizarse como un patrón reusable.
• El recorrido es independiente de la representación de los datos, siempre que las componentes puedan recorrerse secuencialmente.
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public float mayorTempMin(){
//Retorna la mayor temperatura del período float mayor = tMin[0];
for (int i = 1; i < cantDias(); i++) if (tMin[i] > mayor)
mayor = tMin[i];
return mayor;
}
Introducción a la Programación Orientada a Objetos 17 IPOO - 2017
Verificar con una clase tester considerando que la mayor temperatura sea la primera y la última.
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public float mayorTempMin(){
//Retorna la mayor temperatura del período float mayor = -1000;
for (int i = 0; i < cantDias(); i++) if (i == 0)
mayor = tMin[0];
else
if (tMin[i] > mayor) mayor = tMin[i];
return mayor;
}
18
• Observe que esta solución es correcta y eficiente, pero las estructuras de control no son adecuadas.
• La condición i == 0 siempre se verifica una vez, en la primera iteración.
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
public int cantHeladas(){
//Cuenta la cantidad de días que heló int cant = 0;
for (int i = 0; i<cantDias(); i++) if (tMin[i] <= 0) cant++;
return cant;
}
Introducción a la Programación Orientada a Objetos 19 IPOO - 2017
• Verificar considerando que no haya heladas, que todos los días sean heladas, que el primer día haya helado, que el último haya helado.
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
public boolean huboHeladas(){
/*Retorna true sí algún día heló*/
return cantHeladas() > 0;
}
Introducción a la Programación Orientada a Objetos 20 IPOO - 2017
La solución es correcta pero no eficiente.
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public boolean huboHeladas(){
/*Retorna true si algún día heló */
boolean encontre = false;
int i = 0;
while ((i < cantDias()) && (!encontre)) if (tMin[i] <= 0)encontre = true;
else i++;
return encontre;
}
Introducción a la Programación Orientada a Objetos 21 IPOO - 2017
Verificar considerando que no haya heladas, que todos los días sean heladas, que el primer día haya helado, que sólo el último haya helado.
Recorrido NO Exhaustivo
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
• El arreglo está encapsulado en la clase, todo el acceso desde la clase cliente se realiza a través de los servicios ofrecidos por la clase proveedora.
• La cantidad de elementos del arreglo se define en el momento de la creación y corresponde a la cantidad de días del período.
• Para las clases cliente, el primer día se denota con 1.
• A cada día del período se le ha asignado una temperatura en el momento que se ejecuta una consulta.
• La entrada y salida se realiza desde la clase cliente.
Introducción a la Programación Orientada a Objetos IPOO - 2017 22
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
• Diseñe e implemente una clase tester que brinde un servicio para leer las temperaturas y para probar la funcionalidad de la clase TempMinEstacion.
Introducción a la Programación Orientada a Objetos IPOO - 2017 23
En la página de la materia está disponible una clase tester parcial, queda como ejercicio completarla con casos de prueba adecuados para cada servicios.
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
class TestTempMinEstacion {
public static void main(String[] args) { // Tester para una semana
int cant =7;
TempMinEstacion est;
… }
24
• La variable est mantiene una referencia a un objeto de claseTempMinEstacion.
• La clase TestTempMinEstacion no conoce la
representación interna de los datos, el arreglo no es visible.
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
class TestTempMinEstacion {
public static void main(String[] args) { // Tester para una semana
int cant =7;
TempMinEstacion est;
est = leerTempMinEst(cant) ;
System.out.println("Muestra la estación ");
mostrarTempMinEst(est) ;
System.out.println("Promedio Estación"+
est.promedioTempMin() );
}
25
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
public static TempMinEstacion leerTempMinEst(int cant) { float t ;
TempMinEstacion e = new TempMinEstacion(cant);
for (int i = 1; i <= e.cantDias();i++){
System.out.println("Ingrese la " +
"temperatura del día " + i);
t = ES.leerFloat();
e.establecerTempMin(i,t) ; }
return e;
}
26
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public static TempMinEstacion leerTempMinEst(int cant) { float t ;
TempMinEstacion e;
e = new TempMinEstacion(cant);
…
return e;
}
27
e tMin
7 length
Introducción a la Programación Orientada a Objetos IPOO - 2017
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public static void mostrarTempMinEst (TempMinEstacion e){
for (int i = 1; i <= e.cantDias(); i++) System.out.println(" "+ e.obtenerTempMin(i));
}
Introducción a la Programación Orientada a Objetos 28 IPOO - 2017
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
import java.io.*;
class TesterValoresDesdeArchivo {
public static void main(String[] args) { TempMinEstacion est;
int cantD = 7;
est = iniTemp(7);
mostrarTempMinEst(est);
System.out.println("Promedio periodo = " + est.promedioTempMin());
System.out.println("Mayor minima = " + est.mayorTempMin());
System.out.println("Cantidad de heladas = "+
est.cantHeladas());
}
…
} 29
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public static TempMinEstacion iniTemp (int n) { String ruta = "temp.txt";
TempMinEstacion e = new TempMinEstacion(n);
try {
BufferedReader in =
new BufferedReader(new FileReader(ruta));
String str;
int dia = 1;
while (((str = in.readLine())!= null)&&
(dia <= e.cantDias())){
float f = (float)Float.valueOf(str);
e.establecerTempMin(dia, f);
dia++;
} }
catch (IOException err) { System.out.println ("Error al leer el archivo");
} return e;
}
30
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
• Agregue los siguientes servicios a la clase TempMinEstación
– Computar la cantidad de días en los que la temperatura fue mayor a un valor dado
– Computar la primera temperatura mayor a una dada; si no existe retornar el mismo valor recibido.
– Computar el número de día que corresponde la primera temperatura mayor a una dada, si no existe retornar 0.
– Decidir si hubo al menos dos días seguidos con temperatura mayor a una dada.
Introducción a la Programación Orientada a Objetos IPOO - 2017 31
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017
TempMinEstacion
<<atributos de instancia>>
float [] tMin
<<Consultas>>
contarMayores(t: real):entero primerMayor(t: real): real diaPrimerMayor(t: real): entero
dosSeguidos(t: real): boolean Computa el día en el que se produjo la primera
temperatura mayor a t.
Si no hubo ninguna retorna 0
Decide si hubo al menos dos días seguidos con temperaturas mayores a t
Computa la primera temperatura mayor a t, si no hay una mayor a t
retorna t Computa la cantidad de días
con temperaturas mayores a t
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
• Computar la cantidad de días en los que la temperatura fue mayor a un valor dado.
Introducción a la Programación Orientada a Objetos IPOO - 2017 33
8 3.5 11 -1 13.5 10 -2
• si t=5.5 debe computar 4
• si t=15 debe computar 0
• si t=-5 debe computar 7
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 34
8 3.5 11 -1 13.5 10 -2 t
0 5.5 contador
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 35
8 3.5 11 -1 13.5 10 -2 t
1 5.5 contador
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 36
8 3.5 11 -1 13.5 10 -2 t
1 5.5 contador
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 37
8 3.5 11 -1 13.5 10 -2 t
2 5.5 contador
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 38
8 3.5 11 -1 13.5 10 -2 t
2 5.5 contador
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 39
8 3.5 11 -1 13.5 10 -2 t
3 5.5 contador
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 40
8 3.5 11 -1 13.5 10 -2 t
4 5.5 contador
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 41
8 3.5 11 -1 13.5 10 -2 t
4 5.5 contador
Algoritmo contarMayores DE t
DS contador
para cada día del período si la temperatura es mayor a t
incrementar un contador 0 1 1 0 01 0 0 1 1
1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 42
public int contarMayores(float t){
//Computa la cantidad de temperaturas mayores a t int cont = 0;
for (int i=0;i<cantDias();i++) if (tMin[i] > t)
cont++;
return cont;
}
Recorrido Exhaustivo
t=5.5 2.1
6.2 4.2 -2.0
2.1
2.2 -4.2 9.0
11.1
5.5 -4.2 9.0
0.1
5.5 -4.2 3.0
Algunos Casos de Prueba
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 43
Algoritmo contarMayores DE t
DS contador
para cada día del período si la temperatura es mayor a t
incrementar un contador
public int contarMayores(float t){
//Computa la cantidad de temperaturas mayores a t int cont = 0;
for (int i = 0; i < cantDias(); i++) if (tMin[i] > t)
cont++;
return cont;}
El algoritmo permite identificar las estructuras de control
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
• Planteo Recursivo
– Contar los mayores a t de este período de 7 días requiere contar los mayores de los 6 primeros días
Introducción a la Programación Orientada a Objetos IPOO - 2017 44
8 3.5 11 -1 13.5 10 -2 t 5.5
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
• Planteo Recursivo
– Contar los mayores a t de este período de 6 días requiere contar los mayores de los 6 primeros días y sumar 1
Introducción a la Programación Orientada a Objetos IPOO - 2017 45
8 3.5 11 -1 13.5 10 -2 t 5.5
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
• Planteo Recursivo
– Caso trivial: La cantidad de temperaturas mayores a t en un período vacío, es 0.
– Caso recursivo: La cantidad de
temperaturas mayores a t en un período de n días, es la cantidad de temperaturas mayores a t en n-1 días, más 1 si la temperatura del día n es mayor a t.
– Caso recursivo: La cantidad de
temperaturas mayores a t en un período de n días, es la cantidad de temperaturas mayores a t en n-1 días, si la temperatura del día n no es mayor a t.
Introducción a la Programación Orientada a Objetos IPOO - 2017 46
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public int contarMayores(float t){
/*Computa la cantidad de temperaturas mayores a t*/
return cMayores(t,cantDias());
}
private int cMayores(float t,int n){
int cont=0;
if (n>0)
if (tMin[n-1] > t)
cont = cMayores(t,n-1)+1;
else
cont = cMayores(t,n-1);
return cont;
}
Introducción a la Programación Orientada a Objetos IPOO - 2017 47
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
• Computar la primera temperatura mayor a una dada; si no existe devolver el mismo valor recibido.
Introducción a la Programación Orientada a Objetos IPOO - 2017 48
8 3.5 11 -1 13.5 10 -2 primerMayor(9) computa 11
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
• Computar la primera temperatura mayor a una dada; si no existe devolver el mismo valor recibido.
Introducción a la Programación Orientada a Objetos IPOO - 2017 49
8 3.5 11 -1 13.5 10 -2 primerMayor(9)
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 50
8 3.5 11 -1 13.5 10 -2 primerMayor(9)
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 51
8 3.5 11 -1 13.5 10 -2 primerMayor(9) computa 11 y termina Algoritmo primerMayor
DE t DS pri
para cada día del período y mientras no encuentre una temperatura mayor a t
si la temperatura del día es mayor a t pri = temperatura del día
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 52
8 3.5 11 -1 13.5 10 -2 primerMayor(15) computa 15 y termina Algoritmo primerMayor
DE t DS pri
para cada día del período y mientras no encuentre una temperatura mayor a t
si la temperatura del día es mayor a t pri = temperatura del día
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
public float primerMayor(float t){
/*Computa la primera temperatura mayor a t, si no hay una mayor a t, retorna t*/
float pri = t;
int i = 0; boolean encontro = false;
while (i < cantDias() && !encontro){
encontro = tMin[i] > t;
i++;}
if (encontro) pri = tMin[i-1];
return pri;
}
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
53
8 3.5 11 -1 13.5 10 -2 primerMayor(9) computa 11 y termina primerMayor(15) computa 15 y termina
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
public float primerMayor(float t){
/*Computa la primera temperatura mayor a t, si no hay una mayor a t, retorna t*/
float pri = t;
int i = 0;
while (i < cantDias() && pri == t) if (tMin[i] > t)
pri = tMin[i];
else i++;
return pri;
}
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos 54 IPOO - 2017
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
• Computar el número de día que corresponde la primera temperatura mayor a una dada.
Introducción a la Programación Orientada a Objetos IPOO - 2017 55
8 3.5 11 -1 13.5 10 -2 diaMayor(9)
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 56
8 3.5 11 -1 13.5 10 -2 diaMayor(9)
dia 1
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 57
8 3.5 11 -1 13.5 10 -2 diaMayor(9)
dia 2
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 58
8 3.5 11 -1 13.5 10 -2 diaMayor(9)
Computa 3 dia 3
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 59
8 3.5 11 -1 13.5 10 -2 diaMayor(15)
Computa 0
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Algoritmo diaMayor DE t
DS pri
para cada día del período y mientras no encuentre una temperatura mayor a t si la temperatura del día es mayor a t
pri = día
Introducción a la Programación Orientada a Objetos IPOO - 2017 60
El algoritmo puede generalizarse en un patrón que se reuse para resolver otros problemas.
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
public int diaMayor(float t){
/*Computa el día en el que se produjo la primera temperatura mayor a t. Si no hubo ninguna retorna 0*/
int pri = 0;
int i = 0; boolean encontro = false;
while (i < cantDias() && !encontro){
encontro = tMin[i] > t;
i++;}
if (encontro) pri = i;
return pri;
}
Introducción a la Programación Orientada a Objetos IPOO - 2017 61
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
• Decide si la temperatura de dos días seguidos fue mayor a t.
Introducción a la Programación Orientada a Objetos IPOO - 2017 62
si t=10 debe computar true 14.5 15 1 -1 8.5 10 -2
14.5 5 1 -1 8.5 11 12
14.5 5 1 -1 11.5 10.5 -2
si t=12 debe computar false 14.5 5 10 -1 11.5 10.5 15
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Algoritmo dosSeguidos DE t
para todos los días del período excepto el último y mientras no se verifica la propiedad si la temperatura del día y la del día siguiente son mayores a t
se verifica la propiedad
Introducción a la Programación Orientada a Objetos IPOO - 2017 63
Al implementar esta solución en Java es importante considerar la condición de terminación de la iteración, ya que el último elemento de la estructura no tieneun “siguiente”.
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017 64
public boolean dosSeguidos (float t){
/*Decide si hay dos días seguidos con temperaturas mayores a t*/
boolean dos = false;
for (int i = 0;i < cantDias() - 1 && !dos; i++) if ((tMin[i] > t)&& (tMin[i+1] > t))
dos = true;
return dos;
} Recorrido NO Exhaustivo
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017
65
TempMinEstacion
<<atributos de instancia>>
float [] tMin
<<Constructores>>
TempMinEstacion(cant: entero)
<<Comandos>>
establecerTempMin(d: entero, t: real)
Crea una estructura para mantener las temperaturas
de cant días, requiere cant>0
Requiere 1<=d<=cantDias()
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017
66
TempMinEstacion
<<atributos de instancia>>
float [] tMin
<<Consultas>>
obtenerTempMin(d: entero): real cantDias(): entero
mayorTempMin () : real promedioTempMin () : real cantHeladas() : entero huboHeladas () : boolean
…
equals(e: TempMinEstacion): boolean
Cuenta la cantidad de días que heló
Decide si hubo heladas Retorna la mayor
temperatura del período Requiere 1<=d<=cantDias()
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
67
class Estacion {
public static void main(String[] args) { // Tester para una semana
int cant =7;
float promSur,promNor;
TempMinEstacion estSur,estNor,est;
…
promSur =estSur.promedioTempMin();
promNor =estNor.promedioTempMin();
if (promSur >= promNor) est = estSur;
else est = estNor;
…
} estSur, estNory estmantienen referencias a objetos de claseTempMinEstacion.
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017
TempMinEstacion
<<atributos de instancia>>
float [] tMin
<<Consultas>>
equals(e: TempMinEstacion): boolean
Computa true si y solo sí coinciden las temperaturas de las dos estaciones día a día
2.1
6.2 4.2
2.1
6.2 4.2 9.0
11.1
5.5 -4.2 9.0
0.1
5.5 -4.2 3.0
Algunos Casos de Prueba
11.1
5.5 -4.2 9.0
11.1
5.5 -4.2 9.0
68
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public boolean equals(TempMinEstacion e){
/*Computa true si y solo sí coinciden las temperaturas de las dos estaciones día a día*/
boolean iguales = cantDias()== e.cantDias();
float t; int i = 0;
while (i < cantDias() && iguales){
t = e.obtenerTemperatura(i+1);
iguales = t == tMin[i];
i++;
}
return iguales;
}
• Observe que e es una referencia a un objeto de clase TempMinEstacion, puede recibir cualquiera de los mensajes provistos por la clase.
• La variable tMin mantiene una referencia a un arreglo.
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017
TempMinEstacion
<<atributos de instancia>>
float [] tMin
<<Consultas>>
ultimaMayor(t:real):real
huboMasNMayores(t:real,n:entero) :boolean
huboNmayores(t:real,n:entero) :boolean
Decide si hubo al menos n días con temperaturas
mayores a t.
Decide si hubo exactamente n días
con temperaturas mayores a t.
Computa la última temperatura mayor a t,
si no hay ninguna retorna t
70
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
• Computar la última temperatura mayor a una dada.
Introducción a la Programación Orientada a Objetos IPOO - 2017 71
8 3.5 11 -1 13.5 10 -2 ultimaMayor(9)
Computa 10
11 13.5 10
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public float ultimaMayor(float t){
//Computa la última temperatura mayor a t o t float ult = t;
int i = cantDias() - 1;
while (i >= 0 && ult = t){
if (tMin[i] > t) ult = tMin[i];
else i--;
}
return ult;
}
Introducción a la Programación Orientada a Objetos IPOO - 2017 72
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
• Decidir si hubo al menos n temperaturas mayores a t.
• Se recorre toda la estructura y no se encuentran 3 valores mayores a 5.5.
• Se recorren los cinco primeros elementos, en los cinco primeros días hay 3 temperaturas mayores a 5.5.
• Se recorre toda la estructura, recién al analizar el último día se puede decidir que hay 3 temperaturas mayores a 5.5.
t=5.5 n=3 2.1
6.2 5.5 -2.0
7.2
8.1
2.2 -4.2 9.0 5.5 0.1 6.2 7.0
7.2 t=5.5 n=3
4.0 3.0 9.0 0.1 6.2 7.0
73
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
Algoritmo huboMasNMayores DE t, n
para cada día y mientras no se encuentren n mayores
si la temperatura es mayor a t incrementar un contador
Introducción a la Programación Orientada a Objetos IPOO - 2017 74
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public boolean huboMasNMayores(float t,int n){
/*Decide si hubo al menos n temperaturas mayores a t*/
int cont = 0;
for (int i=0; i < cantDias() && cont < n; i++) if (tMin[i] > t)
cont++;
return cont == n;
}
75
Recorrido NO Exhaustivo t=5.5 n=3 2.1
6.2 5.5 -2.0
8.1
2.2 -4.2 9.0
4.0
0.1
5.5 6.2 7.0
7.2
7.2
3.0 9.0 0.1 6.2 7.0
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
• Cuando quedan solo 4 días por analizar, si la temperatura es menor que 5.5, es posible asegurar que no se cumple la propiedad, sin seguir recorriendo
Introducción a la Programación Orientada a Objetos IPOO - 2017 76
t=5.5 n=4 7.1
4.1 6.5 9.0
1.2
Modificar el código para interrumpir el recorrido cuando es posible asegurar que el arreglo no va a contener n valores mayores a t, aun sin haber llegado al último día.
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public boolean huboMasNMayores(float t,int n){
/*Decide si hubo al menos n temperaturas mayores a t */
}
Introducción a la Programación Orientada a Objetos IPOO - 2017 77
El programador de la clase TempMinEstacion puede cambiar la implementación de los métodos, por ejemplo para mejorar la eficiencia, sin que la modificación afecte a las clases clientes.
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
• Decidir si hubo exactamente n días con temperaturas mayores a t.
Introducción a la Programación Orientada a Objetos IPOO - 2017 78
Algoritmo huboNMayores DE t,n
para cada día y
mientras no se encuentren más de n mayores si la temperatura es mayor a t
incrementar un contador
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
• En este caso la iteración termina cuando es posible asegurar que la propiedad no se va a cumplir.
Introducción a la Programación Orientada a Objetos IPOO - 2017 79
public boolean huboNMayores(float t,int n){
/*Decide si hubo exactamente n temperaturas mayores a t*/
int cont = 0;
for (int i=0;i<cantDias() && cont<n+1;i++) if (tMin[i] > t)
cont++;
return cont==n;
}
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
METEOROLÓGICA
• Observemos que hay tres estados posibles al terminar la iteración:
1. Recorrió el período completo y no encontró n días con temperaturas mayores a t.
2. Recorrió el período completo y encontró exactamente n días con temperaturas mayores a t.
3. Recorrió m días (m < cantDias()) y encontró n+1 temperaturas mayores a t, se puede asegurar que la propiedad NO se cumple, sin terminar el recorrido.
Introducción a la Programación Orientada a Objetos IPOO - 2017 80
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Introducción a la Programación Orientada a Objetos IPOO - 2017
TempMinEstacion
<<atributos de instancia>>
float [] tMin
<<Consultas>>
ultimaMayor(t:real, cant: entero): real huboMasNMayores(t:real,n:entero, cant: entero): boolean
Decide si hubo al menos n días con temperaturas mayores a t, en un período de cant días Requiere n > 0 (solución recursiva)
Computa la última temperatura mayor a t en
un período de cant días, si no hay ninguna retorna t
(solución recursiva)
81
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
• Computar la última temperatura mayor a una dada en un período de cant días.
Introducción a la Programación Orientada a Objetos IPOO - 2017 82
Planteo recursivo
Caso trivial: Si el número de días del período es 0, computa t.
Caso trivial: Si la temperatura que corresponde al día cant es mayor a t, computa la
temperatura de ese día.
Caso recursivo: Si la temperatura que
corresponde al día cant es menor o igual a t, computa la última temperatura mayor a t, en el período de los cant-1 primeros días
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public float ultimaMayor (float t,int cant){
/*Computa la última temperatura mayor a t, en un período de cant días*/
float ult;
if (cant == 0) ult = t;
else
if (tMin[cant-1] > t) ult = tMin[cant-1];
else
ult = ultimaMayor(t,cant-1);
return ult;
}
Introducción a la Programación Orientada a Objetos IPOO - 2017 83
Evalúa si la temperatura del último día del período verifica la propiedad
Invoca recursivamente para computar la última temperatura mayor a t en un
período de cant-1 días
0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
• Decide si hubo al menos n días con temperaturas mayores a t, en un período de cant días.
Introducción a la Programación Orientada a Objetos IPOO - 2017 84
Planteo recursivo
Caso trivial: Si el número de días del período es 0, computa falso
Caso trivial: Si la temperatura del día cant es mayor a t y n es 1, computa true.
Caso recursivo: Si la tempertura del día cant es menor o igual a t, decide si el período de los cant-1 primeros días tiene n temperaturas mayores a t.
Caso recursivo: Si la tempertura del día cant es mayor a t, decide si el período de los cant-1 primeros días tiene n-1 temperaturas mayores a t.