• No se han encontrado resultados

Introducción a la Programación Orientada a Objetos

N/A
N/A
Protected

Academic year: 2021

Share "Introducción a la Programación Orientada a Objetos"

Copied!
22
0
0

Texto completo

(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

INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA

A OBJETOS

Encapsulamiento y Abstracción

Caso de estudio: Estación Meteorológica

Dr. 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

(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

• 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

(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

METEOROLÓGICA

//Comandos

public 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

// Consultas

public 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.

(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

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.

(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

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

(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

• 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

(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

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

(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

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

(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

• 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

(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

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.

(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

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

(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

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

(13)

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

(14)

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.

Referencias

Documento similar

que hasta que llegue el tiempo en que su regia planta ; | pise el hispano suelo... que hasta que el

Para ello, trabajaremos con una colección de cartas redactadas desde allí, impresa en Évora en 1598 y otros documentos jesuitas: el Sumario de las cosas de Japón (1583),

dente: algunas decían que doña Leonor, &#34;con muy grand rescelo e miedo que avía del rey don Pedro que nueva- mente regnaba, e de la reyna doña María, su madre del dicho rey,

Tras establecer un programa de trabajo (en el que se fijaban pre- visiones para las reuniones que se pretendían celebrar los posteriores 10 de julio —actual papel de los

Consecuentemente, en el siglo xviii hay un cambio en la cosmovi- sión, con un alcance o efecto reducido en los pueblos (periferia), concretados en vecinos de determinados pueblos

La campaña ha consistido en la revisión del etiquetado e instrucciones de uso de todos los ter- mómetros digitales comunicados, así como de la documentación técnica adicional de

La recuperación histórica de la terciaria dominica sor María de Santo Domingo en los últimos años viene dada, principalmente, por causa de su posible influjo sobre personajes

Volviendo a la jurisprudencia del Tribunal de Justicia, conviene recor- dar que, con el tiempo, este órgano se vio en la necesidad de determinar si los actos de los Estados