Introduccin a la Programacin Orientada a Objetos Encapsulamiento
Introducción a la Programación Orientada a Objetos Encapsulamiento y Abstracción Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR 2019 IPOO 2 cuatrimestre Sonia Rueda
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. IPOO 2 cuatrimestre Encapsulamiento
En Java los modificadores de acceso determinan 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. IPOO 2 cuatrimestre Modificadores de Acceso
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 Temp. Min. Estacion. 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 2 cuatrimestre Caso de Estudio: Estación Meteorológica
Caso de Estudio: Estación Meteorológica 3. 5 12 -1 3. 5 10 -2 Mayor = 12 Promedio = 4, 8 Cantidad de heladas = 2 Hubo Heladas = si Una manera de representar los datos es mediante un arreglo declarado como: El arreglo es una estructura de datos, agrupa a una secuencia de elementos, todos del mismo tipo. IPOO 2 cuatrimestre 8
Caso de Estudio: Estación Meteorológica float t. Min[]; Gráficamente : 0 1 -4. 0 5. 0 1 2 2 3 11. 0 8. 0 3 4 4 5 6 8. 0 4. 0 -2. 0 5 6 7 Cada elemento representa la temperatura mínima de un día del período. Establecemos un mapeo entre el día y el subíndice.
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<constructores>> Temp. Min. Estacion (cant : entero) <<comandos>> establecer. Temp. Min (d: entero, t : real) Temp. Min. Estacion (cant : entero) Crea una estructura para mantener las temperaturas de cant días, requiere cant>0 establecer. Temp. Min (d : entero t : real) requiere 1<=d<=cant. Dias() La temperatura del día 1 corresponde al subíndice 0 en el arreglo. 8 t. Min length 3. 5 12 7 -1 3. 5 10 -2
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. Como la clase encapsula a la estructura de datos, el arreglo no es visible fuera de la clase Temp. Min. Estacion. Las clases Clientes pueden crear objetos de clase Temp. Min. Estacion 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 2 cuatrimestre Caso de Estudio: Estación Meteorológica
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<consultas>> obtener. Temp. Min(d : entero): real cant. Dias () : entero mayor. Temp. Min () : real promedio. Temp. Min () : real cant. Heladas() : entero hubo. Heladas () : 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. obtener. Temp. Min(d: entero) : real Requiere 1<=d<=cant. Dias() mayor. Temp. Min () : real Retorna la mayor temperatura del período cant. Heladas() : entero Cuenta la cantidad de días que heló hubo. Heladas () : boolean Retorna true si heló algún día
La clase Temp. Min. Estacion no brinda servicios para leer o mostrar datos. Toda la entrada y salida se hace desde las clases Clientes. Temp. Min. Estacion 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 2 cuatrimestre Caso de Estudio: Estación Meteorológica
Caso de Estudio: Estación Meteorológica class Temp. Min. Estacion { /* 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 [] t. Min; //Constructor /*Crea una estructura para temperaturas de cant días, cant>0 */ mantener las public Temp. Min. Estacion(int cant) { t. Min= new float[cant] ; }. . . }
Caso de Estudio: Estación Meteorológica //Comandos public void establecer. Temp. Min(int dia, float t){ /*Requiere 1<=dia<=cant. Dias()*/ t. Min[dia-1]=t; } La temperatura de dia corresponde al subíndice dia-1 en el arreglo. Observemos que no establecemos controles ni requisitos sobre el valor de la temperatura.
Caso de Estudio: Estación Meteorológica // Consultas public float obtener. Temp. Min(int dia){ /*Requiere 1<=dia<=cant. Dias()*/ return t. Min[dia-1]; } public int cant. Dias(){ return t. Min. length; }
Caso de Estudio: Estación Meteorológica public float promedio. Temp. Min(){ /*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<cant. Dias(); i++) suma=suma+t. Min[i]; prom=suma/cant. Dias(); return prom; Recorrido Exhaustivo }
Caso de Estudio: Estación Meteorológica Calcular la mayor temperatura entre las mínimas Algoritmo mayor. Temp. Min DS mayor temperatura minima del primer día para cada día a partir del segundo si temperatura mínima del día > mayor temperatura mínima del día 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.
Caso de Estudio: Estación Meteorológica public float mayor. Temp. Min(){ /*Retorna la mayor temperatura del período*/ float mayor=t. Min[0]; for (int i=1; i<cant. Dias(); i++) if (t. Min[i]>mayor) mayor=t. Min[i]; return mayor; } Verificar con una clase tester considerando que la mayor temperatura sea la primera y la última
Caso de Estudio: Estación Meteorológica Calcular la mayor temperatura entre las mínimas Caso trivial: En un período de 1 día la temperatura máxima es la única registrada Caso recursivo: En un período de n días la temperatura máxima es el mayor valor entre la temperatura del n-ésimo día y la máxima de los n-1 días anteriors.
Caso de Estudio: Estación Meteorológica public float mayor. Temp. Min(int n){ /*Retorna la mayor temperatura del período*/ float mayor=0; if (n==1) mayor=t. Min[0]; else { float aux = mayor. Temp. Min(n-1); if (t. Min[n-1] < aux) mayor = aux; else mayor = t. Min[n-1]; } return mayor; } Verificar con una clase tester considerando que la mayor temperatura sea la primera y la última
Caso de Estudio: Estación Meteorológica public int cant. Heladas(){ //Cuenta la cantidad de días que heló int cant=0; for (int i=0; i<cant. Dias(); i++) if (t. Min[i]<0) cant++; return cant; } 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
Caso de Estudio: Estación Meteorológica Calcular la cantidad de heladas Caso trivial: En un período de 1 día si ese día heló la cantidad de heladas es 1 sino es 0 Caso recursivo: En un período de n días la cantidad de heladas es igual a la cantidad de heladas de los n-1 días anteriores más 1 si el nésimo día heló, sino es igual a la cantidad de heladas de los n-1 días anteriores.
Caso de Estudio: Estación Meteorológica public boolean hubo. Heladas(){ /*Retorna verdadero si algún día heló*/ return cant. Heladas() > 0; } Observemos que la solución es correcta pero no eficiente
Caso de Estudio: Estación Meteorológica public boolean hubo. Heladas(){ /*Retorna true si algún día heló */ boolean encontre=false; int i=0; while ((i<cant. Dias()) && (!encontre)) if (t. Min[i]<0)encontre=true; else i++; return encontre; Recorrido NO Exhaustivo } 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
Caso de Estudio: Estación Meteorológica Decidir hubo al menos una helada. Caso trivial: En un período de 1 día si ese día heló, entonces hubo heladas, sino no hubo Caso recursivo: En un período de n días hubo heladas si heló en el último día o hubo heladas en los n-1 días anteriores.
Caso de Estudio: Estación Meteorológica • El arreglo está encapsulado, 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.
Caso de Estudio: Estación Meteorológica class Test { public static void main(String[] args) { // Tester para una semana int cant =7; Temp. Min. Estacion est; … } La variable est mantiene una referencia a un objeto de clase Temp. Min. Estacion. La clase Test. Temp. Min. Estacion no conoce la representación interna de los datos, el arreglo no es visible.
Caso de Estudio: Estación Meteorológica class Test { public static void main(String[] args) { // Tester para una semana int cant =7; Temp. Min. Estacion est; est = leer. Temp. Min. Est(cant) ; System. out. println("Muestra la estación mostrar. Temp. Min. Est(est) ; "); System. out. println("Promedio Estación"+ est. promedio. Temp. Min() ); }
Caso de Estudio: Estación Meteorológica public static Temp. Min. Estacion leer. Temp. Min. Est(int cant) { float t ; Temp. Min. Estacion e= new Temp. Min. Estacion(cant); for (int i=1; i<= e. cant. Dias(); i++){ System. out. println("Ingrese la "+ "temperatura del día "+i); t = ES. leer. Float(); e. establecer. Temp. Min (i, t) ; } return e; }
Caso de Estudio: Estación Meteorológica public static Temp. Min. Estacion leer. Temp. Min. Est(int cant) { float t ; Temp. Min. Estacion e; e = new Temp. Min. Estacion(cant); … return e; } t. Min e length 7
Caso de Estudio: Estación Meteorológica public static void mostrar. Temp. Min. Est (Temp. Min. Estacion e){ for (int i=1; i<= e. cant. Dias(); i++) System. out. println(" " + e. obtener. Temp. Min(i)); }
Caso de Estudio: Estación Meteorológica class Estacion { public static void main(String[] args) { // Tester para una semana int cant =7; float prom. Sur, prom. Nor; Temp. Min. Estacion surur, norteor, est; surur = leer. Temp. Min. Est(cant) ; norteor = leer. Temp. Min. Est(cant) ; prom. Sur =surur. promedio. Temp. Min(); prom. Nor =norteor. promedio. Temp. Min(); if (prom. Sur >= prom. Nor) est = surur; else est = norteor; … } surur, norteor y est mantienen referencias a objetos de clase Temp. Min. Estacion.
Caso de Estudio: Estación Meteorológica import java. io. *; class Tester. Valores. Desde. Archivo { public static void main (String[] args) { Temp. Min. Estacion est; int cant. D = 7; est = ini. Temp(7); mostrar. Temp. Min. Est(est); System. out. println("Promedio periodo = "+ est. promedio. Temp. Min()); System. out. println("Mayor minima est. mayor. Temp. Min()); = "+ System. out. println("Cantidad de heladas = "+ est. cant. Heladas()); } … }
Caso de Estudio: Estación Meteorológica public static Temp. Min. Estacion ini. Temp (int n) { String ruta="temp. txt"; Temp. Min. Estacion e = new Temp. Min. Estacion(n); try { Buffered. Reader in = new Buffered. Reader(new File. Reader(ruta)); String str; int dia= 1; while (((str = in. read. Line())!= null)&& (dia<=e. cant. Dias())){ float f= (float)Float. value. Of(str); e. establecer. Temp. Min (dia, f) ; dia++; } } catch (IOException err) { System. out. println ("Error al leer el archivo"); } return e; }
Caso de Estudio: Estación Meteorológica Agregue los siguientes servicios a la clase Temp. Min. Estació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 días seguidos con temperatura mayor a una dada
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<consultas>> contar. Mayores(t: real): entero primer. Mayor(t: real): real dia. Primer. Mayor(t: real): entero dos. Seguidos(t: real): boolean contar. Mayores(t: real): entero Computa la cantidad de días con temperaturas mayores a t primer. Mayor(t: real): real Computa la primera temperatura mayor a t, si no hay una mayor a t retorna t dia. Primer. Mayor(t: real): entero Computa el día en el que se produjo la primera temperatura mayor a t Si no hubo ninguna retorna 0 dos. Seguidos(t: real): boolean Decide si hubo al menos días seguidos con temperaturas mayores t
Caso de Estudio: Estación Meteorológica • Computar la cantidad de días en los que la temperatura fue mayor a un valor dado 8 3. 5 11 -1 13. 5 10 si t=5. 5 debe computar 4 si t=15 debe computar 0 si t=-5 debe computar 7 -2
Caso de Estudio: Estación Meteorológica 8 3. 5 t contador 11 5. 5 0 -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica 8 3. 5 t contador 11 5. 5 1 -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica 8 3. 5 t contador 11 5. 5 1 -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica 8 3. 5 t contador 11 5. 5 2 -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica 8 3. 5 t contador 11 5. 5 2 -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica 8 3. 5 t contador 11 5. 5 3 -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica 8 3. 5 t contador 11 5. 5 4 -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica Algoritmo contar. Mayores DE t DS contador para cada día del período si la temperatura es mayor a t incrementar un contador 8 3. 5 t contador 11 5. 5 4 -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica public int contar. Mayores(float t){ //Computa la cantidad de temperaturas mayores a t int cont = 0; for (int dia=0; dia<cant. Dias(); dia++) if (t. Min[dia] > t) cont++; return cont; Recorrido exhaustivo } Algunos Casos de Prueba t=5. 5 6. 2 2. 1 4. 2 -2. 0 5. 5 11. 1 -4. 2 9. 0 2. 2 2. 1 -4. 2 9. 0 5. 5 0. 1 3. 0 -4. 2
Caso de Estudio: Estación Meteorológica Algoritmo contar. Mayores DE t DS contador para cada día del período si la temperatura es mayor a t incrementar un contador El algoritmo permite identificar las estructuras de control. public int contar. Mayores(float t){ //Computa la cantidad de temperaturas mayores a t int cont = 0; for (int dia=0; dia<cant. Dias(); dia++) if (t. Min[dia] > t) cont++; return cont; }
Caso de Estudio: Estación Meteorológica Planteo Recursivo Contar los mayores a t del período de 7 días requiere contar los mayores de los 6 primeros días 8 3. 5 t 5. 5 11 -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica Planteo Recursivo Contar los mayores a t del período de 6 días requiere contar los mayores de los 6 primeros días y sumar 1 8 3. 5 t 5. 5 11 -1 13. 5 10 -2
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.
Caso de Estudio: Estación Meteorológica public int contar. Mayores(float t){ /*Computa la cantidad de temperaturas mayores a t*/ return c. Mayores(t, cant. Dias()); } private int c. Mayores(float t, int n){ int cont=0; if (n>0) if (t. Min[n-1] > t) cont = c. Mayores(t, n-1)+1; else cont = c. Mayores(t, n-1); return cont; }
Caso de Estudio: Estación Meteorológica • Computar la primera temperatura mayor a una dada; si no existe devolver el mismo valor recibido. 8 3. 5 11 -1 13. 5 10 primer. Mayor(9) computa 11 -2
Caso de Estudio: Estación Meteorológica • Computar la primera temperatura mayor a una dada; si no existe devolver el mismo valor recibido. 8 3. 5 11 -1 primer. Mayor(9) 13. 5 10 -2
Caso de Estudio: Estación Meteorológica 8 3. 5 11 -1 primer. Mayor(9) 13. 5 10 -2
Caso de Estudio: Estación Meteorológica Algoritmo primer. Mayor 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 8 3. 5 11 -1 13. 5 10 -2 primer. Mayor(9) computa 11 y termina
Caso de Estudio: Estación Meteorológica Algoritmo primer. Mayor 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 8 3. 5 11 -1 13. 5 10 -2 primer. Mayor(15) computa 15 y termina
Caso de Estudio: Estación Meteorológica public float primer. Mayor(float t){ /*Computa la primera temperatura mayor a t, si no hay una mayor a t, retorna t*/ float pri = t; int dia=0; boolean encontro=false; while (dia < cant. Dias() && !encontro){ encontro = t. Min[dia] > t; dia++; } if (encontro) pri = t. Min[dia-1]; return pri; } 8 3. 5 11 -1 13. 5 10 primer. Mayor(9) retorna 11 primer. Mayor(15) retorna 15 -2
Caso de Estudio: Estación Meteorológica public float primer. Mayor(float t){ /*Computa la primera temperatura mayor a t, si no hay una mayor a t, retorna t*/ float pri = t; int dia=0; while (dia < cant. Dias() && pri == t) if (t. Min[dia] > t) pri = t. Min[dia]; else dia++; return pri; }
Caso de Estudio: Estación Meteorológica • Computar el número de día que corresponde la primera temperatura mayor a una dada. Si en ningún día del período la temperatura es mayor a la dada, retorna 0. 8 3. 5 11 dia. Mayor(9) -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica dia 1 8 3. 5 11 dia. Mayor(9) -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica dia 2 8 3. 5 11 dia. Mayor(9) -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica dia 3 8 3. 5 11 dia. Mayor(9) Computa 3 -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica 8 3. 5 11 dia. Mayor(15) Computa 0 -1 13. 5 10 -2
Caso de Estudio: Estación Meteorológica Algoritmo dia. Mayor 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 El algoritmo puede generalizarse en un patrón que se reuse para resolver otros problemas.
Caso de Estudio: Estación Meteorológica public int dia. Mayor(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 dia=0; boolean encontro=false; while (dia < cant. Dias() && !encontro){ encontro = t. Min[dia] > t; dia++; } if (encontro) pri = dia; return pri; }
Caso de Estudio: Estación Meteorológica • Decide si la temperatura de dos días seguidos fue mayor a t. 14. 5 15 1 -1 8. 5 10 -2 14. 5 5 1 -1 8. 5 11 12 14. 5 5 1 -1 12. 5 10. 5 -2 si t=10 debe computar true 14. 5 5 10 -1 12. 5 10. 5 15 si t=12 debe computar false Introducción a la Programación Orientada a Objetos
Caso de Estudio: Estación Meteorológica Algoritmo dos. Seguidos 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 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 tiene un “siguiente”.
Caso de Estudio: Estación Meteorológica public boolean dos. Seguidos (float t){ /*Decide si hay dos días seguidos con temperaturas mayores a t*/ boolean dos=false; for (int dia=0; dia<cant. Dias()-1 &&!dos; dia++) if ((t. Min[dia]>t)&&(t. Min[dia+1]>t)) dos = true; return dos; Recorrido no exhaustivo }
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<consultas>> obtener. Temp. Min(d : entero): real cant. Dias () : entero mayor. Temp. Min () : real promedio. Temp. Min () : real cant. Heladas() : entero hubo. Heladas () : boolean … equals(e: Temp. Min. Estacion): boolean equals(e: Temp. Min. Estacion) : boolean Computa true si y solo sí coinciden las temperaturas de las dos estaciones día a día
Caso de Estudio: Estación Meteorológica Algunos Casos de Prueba 6. 2 2. 1 4. 2 9. 0 5. 5 11. 1 -4. 2 9. 0 5. 5 0. 1 3. 0 -4. 2
Caso de Estudio: Estación Meteorológica public boolean equals(Temp. Min. Estacion e){ /*Computa true si y solo sí coinciden las temperaturas de las dos estaciones día a día*/ boolean iguales=cant. Dias()== e. cant. Dias(); float t; int i=0; while (i < cant. Dias() && iguales){ t = e. obtener. Temp. Min(i+1); iguales = t == t. Min[i]; i++; } return iguales; } Observe que e es una referencia a un objeto de clase Temp. Min. Estacion, puede recibir cualquiera de los mensajes provistos por la clase. La variable t. Min mantiene una referencia a un arreglo.
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<consultas>> ultima. Mayor(t: real): real hubo. Mas. NMayores(t: real, n: entero) : boolean hubo. Nmayores(t: real, n: entero) : boolean Computa la última temperatura mayor a t, si no hay ninguna retorna t 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.
Caso de Estudio: Estación Meteorológica • Computa la última temperatura mayor a t, si no hay ninguna retorna t 8 3. 5 11 -1 13. 5 10 ultima. Mayor(9) Computa 10 -2
Caso de Estudio: Estación Meteorológica public float ultima. Mayor(float t){ /*Computa la última temperatura mayor a t o t*/ float ult= t; int dia=cant. Dias()-1; while (dia >= 0 && ult = t){ if (t. Min[dia] > t) ult = t. Min[dia]; else dia--; } return ult; }
Caso de Estudio: Estación Meteorológica • Decidir si hubo al menos n temperaturas mayores a t 7. 2 6. 2 2. 1 5. 5 t=5. 5 n=3 -2. 0 Se recorre toda la estructura y no se encuentran 3 valores mayores a 5. 5 7. 2 2. 2 8. 1 -4. 2 9. 0 5. 5 0. 1 6. 2 7. 0 t=5. 5 n=3 Se recorren los cinco primeros elementos, en los cinco primeros días hay 3 temperaturas mayores a 5. 5 4. 0 3. 0 9. 0 0. 1 6. 2 7. 0 Se recorre toda la estructura, recién al analizar el último día se puede decidir que hay 3 temperaturas mayores a 5. 5
Caso de Estudio: Estación Meteorológica Algoritmo hubo. Mas. NMayores DE t, n para cada día y mientras no se encuentren n mayores a t si la temperatura del dia es mayor a t incrementar un contador
Caso de Estudio: Estación Meteorológica public boolean hubo. Mas. NMayores(float t, int n){ /*Decide si hubo al menos n temperaturas mayores a t*/ int cont = 0; for (int i=0; i<cant. Dias()&&cont<n; i++) if (t. Min[i] > t) cont++; Recorrido no exhaustivo return cont==n; t=5. 5 n=3 } 7. 2 6. 2 2. 1 5. 5 -2. 0 7. 2 2. 2 8. 1 -4. 2 9. 0 5. 5 4. 0 3. 0 9. 0 0. 1 6. 2 7. 0
Caso de Estudio: Estación Meteorológica t=5. 5 n=4 1. 2 4. 1 7. 1 6. 5 9. 0 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 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.
Caso de Estudio: Estación Meteorológica public boolean hubo. Mas. NMayores(float t, int n){ /*Decide si hubo al menos n temperaturas mayores a t */ } El programador de la clase Temp. Min. Estacion 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.
Caso de Estudio: Estación Meteorológica • Decidir si hubo exactamente n días con temperaturas mayores a t Algoritmo hubo. NMayores 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
Caso de Estudio: Estación Meteorológica public boolean hubo. NMayores(float t, int n){ /*Decide si hubo exactamente n temperaturas mayores a t*/ int cont = 0; for (int i=0; i<cant. Dias() && cont<n+1; i++) if (t. Min[i] > t) cont++; return cont==n; } En este caso la iteración termina cuando es posible asegurar que la propiedad no se va a cumplir.
Caso de Estudio: Estación 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<cant. Dias()) y encontró n+1 temperaturas mayores a t, se puede asegurar que la propiedad NO se cumple, sin terminar el recorrido.
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<consultas>> ultima. Mayor(t: real): real hubo. Mas. NMayores(t: real, n: entero, cant: entero) : boolean Computa la última temperatura mayor a t en un período de cant días, si no hay ninguna retorna t (solución recursiva) 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)
Caso de Estudio: Estación Meteorológica • Computa la última temperatura mayor a t, si no hay ninguna retorna t 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
Caso de Estudio: Estación Meteorológica private float ultima. Mayor (float t){ /*Computa la última temperatura mayor a t, en un período de cant días*/ return ult. Mayor(t, cant. Dias()); }
Caso de Estudio: Estación Meteorológica private float ult. Mayor (float t, int cant){ float ult; if (cant==0) Evalúa si la temperatura del último día ult = t; del período verifica la propiedad else if (t. Min[cant-1] > t) ult = t. Min[cant-1]; else ult = ultima. Mayor(t, cant-1); return ult; Invoca recursivamente para computar la } última temperatura mayor a t en un período de cant-1 días
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 Planteo recursivo Caso trivial: En un período de un día computa false si la temerpatura fue menor a t y true en caso contrario Caso trivial: En un período de cant días con cant mayor a 1 computa true si la temperatura del día cant es mayor a t 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 mayora t, decide si el período de los cant-1 primeros días tiene n-1 temperaturas mayores a t.
Caso de Estudio: Estación Meteorológica public boolean hubo. NMayores (float t, int n, int cant){ /*Decide si hubo al menos n días con temperaturas mayores a t, en un período de cant días */ boolean hubo; if (cant==0) hubo = false; else if (t. Min[cant-1] > t) if(n==1) hubo = true; else hubo = hubo. NMayores(t, n-1, cant-1); else hubo = hubo. NMayores(t, n, cant-1); return hubo; }
Caso de Estudio: Estación Meteorológica t. Min[cant-1] denota la temperatura del último día hubo = hubo. NMayores(t, n-1, cant-1); hubo toma el valor verdadero si hay n-1 temperaturas mayores a t, en el período de cant-1 días El planteo recursivo, como el algoritmo escrito en lenguaje informal, es una herramienta durante el diseño de la solución. Es conveniente familiarizarse con esta herramienta cuando los problemas son simples, de modo que al enfrentar problemas complejos estemos habituados a usarla. Una vez implementada la solución, es posible introducir algunos cambios, para mejorar la eficiencia, manteniendo la estructura del planteo.
Caso de Estudio: Estación Meteorológica public boolean hubo. NMayores (float t, int n, int cant){ /*Decide si hubo al menos n días con temperaturas mayores a t, en un período de cant días */ boolean hubo; if (cant<n) hubo = false; else if (t. Min[cant-1] > t) if(n==1) hubo = true; else hubo = hubo. NMayores(t, n-1, cant-1); else hubo = hubo. NMayores(t, n, cant-1); return hubo; }
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<consultas>> hubo. NCon. Mayores(t: real, n: entero) : boolean periodo. Mas. Largo(t: real): entero Decide si hubo al menos n días consecutivos con temperaturas mayores a t. Requiere n>0 Computa la cantidad de días del período más largo con temperaturas mayores a t en días consecutivos.
Caso de Estudio: Estación Meteorológica public boolean hubo. NCon. Mayores(float t, int n){ /*Decide si hubo al menos n temperaturas consecutivas mayores a t*/ } Dado el siguiente registro de temperaturas 5. 5 11. 1 8. 2 4. 0 6. 1 si t=5. 5 y n = 2 debe computar true si t=5. 5 y n = 3 debe computar false si t=-5 y n = 10 debe computar false -0. 2
Caso de Estudio: Estación Meteorológica 2. 5 11. 1 8. 2 4. 0 si t=4. 5 y n = 3 0. 1 -0. 2 4. 8 5. 2 5. 1 -0. 2
Caso de Estudio: Estación Meteorológica 2. 5 11. 1 8. 2 4. 0 si t=4. 5 y n = 3 cont 1 0. 1 -0. 2 4. 8 5. 2 5. 1 -0. 2
Caso de Estudio: Estación Meteorológica 2. 5 11. 1 8. 2 4. 0 si t=4. 5 y n = 3 cont 2 0. 1 -0. 2 4. 8 5. 2 5. 1 -0. 2
Caso de Estudio: Estación Meteorológica 2. 5 11. 1 8. 2 4. 0 si t=4. 5 y n = 3 cont 0 0. 1 -0. 2 4. 8 5. 2 5. 1 -0. 2
Caso de Estudio: Estación Meteorológica 2. 5 11. 1 8. 2 4. 0 si t=4. 5 y n = 3 cont 0 0. 1 -0. 2 4. 8 5. 2 5. 1 -0. 2
Caso de Estudio: Estación Meteorológica 2. 5 11. 1 8. 2 4. 0 si t=4. 5 y n = 3 cont 0 0. 1 -0. 2 4. 8 5. 2 5. 1 -0. 2
Caso de Estudio: Estación Meteorológica 2. 5 11. 1 8. 2 4. 0 si t=4. 5 y n = 3 cont 1 0. 1 -0. 2 4. 8 5. 2 5. 1 -0. 2
Caso de Estudio: Estación Meteorológica 2. 5 11. 1 8. 2 4. 0 si t=4. 5 y n = 3 cont 2 0. 1 -0. 2 4. 8 5. 2 5. 1 -0. 2
Caso de Estudio: Estación Meteorológica 2. 5 11. 1 8. 2 4. 0 0. 1 -0. 2 si t=4. 5 y n = 3 cont 3 Se satisface la propiedad 4. 8 5. 2 5. 1 -0. 2
Caso de Estudio: Estación Meteorológica 2. 5 11. 1 8. 2 4. 0 0. 1 -0. 2 si t=4. 5 y n = 4 cont 3 No se satisface la propiedad 4. 8 5. 2 5. 1 -0. 2
Caso de Estudio: Estación Meteorológica Algoritmo hubo. NCon. Mayores DE t, n para cada día del período y mientras no se verifique la propiedad si la temperatura es mayor a t incrementa el contador sino empieza a contar nuevamente Observemos que hemos establecido una condición muy general para la iteración. La estructura de este algoritmo modela la solución de muchos problemas.
Caso de Estudio: Estación Meteorológica Algoritmo hubo. NCon. Mayores DE t, n para cada día del período y mientras no se encuentren n temperaturas consecutivas mayores a t si la temperatura es mayor a t incrementa el contador sino empieza a contar nuevamente
Caso de Estudio: Estación Meteorológica Algoritmo hubo. NCon. Mayores DE t, n para cada día del período y mientras el contador es menor a n si la temperatura es mayor a t incrementa el contador sino empieza a contar nuevamente Esta versión es más refinada y más específica que las anteriores. La traducción a Java es más directa.
Caso de Estudio: Estación Meteorológica public boolean hubo. NCon. Mayores(float t, int n){ /*Decide si hubo al menos n temperaturas consecutivas mayores a t*/ int cont = 0; for (int i=0; i<cant. Dias()&&cont < n; i++) if (t. Min[i] > t) cont++; else Recorrido no exhaustivo cont = 0; return cont==n; } Establecer Casos de Prueba considerando especialmente que las n temperaturas mayores a t estén en las primeras posiciones o en las últimas de la estructura.
Caso de Estudio: Estación Meteorológica public int periodo. Mas. Largo(float t){ /*Computa la cantidad de días del período más largo con temperaturas mayores a t en días consecutivos */ int cont = 0; int max =0; for (int i=0; i<cant. Dias(); i++) if (t. Min[i] > t) cont++; else{ if (cont > max) max = cont; cont = 0; ANALIZAR PARA QUÉ } CASOS LA SOLUCIÓN NO return max; ES CORRECTA }
Caso de Estudio: Estación Meteorológica Analizar bajo que circunstancias es posible interrumpir el recorrido y decidir que la secuencia hallada hasta el momento es la más larga, aun cuando no se llegó al final.
Caso de Estudio: Estación Meteorológica class Test. Mayores. Valores. Fijos { public static void main(String[] args) { Temp. Min. Estacion est; int cant. D =10; est=new Temp. Min. Estacion(cant. D); establecer. Temp. Min(1, -1); establecer. Temp. Min(2, 6); establecer. Temp. Min(3, 12); establecer. Temp. Min(4, 5); establecer. Temp. Min(5, 8); establecer. Temp. Min(6, 12); establecer. Temp. Min(7, 7); establecer. Temp. Min(8, 4); establecer. Temp. Min(9, -1); establecer. Temp. Min(10, 5);
Caso de Estudio: Estación Meteorológica System. out. println("Cantidad mayores a 5 = "+ est. contar. Mayores(5)); System. out. println("Hay 5 mayores a 5 = "+ est. hubo. Mas. NMayores(5, 5)); System. out. println("Hay 8 mayores a 5 = "+ est. hubo. Mas. NMayores(5, 8)); System. out. println("Hay 3 mayores a 10 = "+ est. hubo. Mas. NMayores(10, 3)); System. out. println("Hay 3 consecutivos mayores a 5 “ + est. hubo. NCon. Mayores(5, 3)); System. out. println("Hay 5 consecutivos mayores a 5 "+ est. hubo. NCon. Mayores(5, 5)); System. out. println("Periodo mas largo a 5 "+ est. periodo. Mas. Largo(3)); } }
Continuamos con el ejemplo de la estación meteorológica en la cual se miden y registran valores de distintas variables meteorológicas. El diseñador del sistema elaboró un diagrama de clases que incluye a una clase Temp. Min. Estacion. 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 procesarla. El diseñador decidió que la estructura sea un arreglo de n componentes, cada una de las cuales corresponde a la temperatura de un día del período. Introducción a la Programación Orientada a Objetos IPOO 2 cuatrimestre Caso de Estudio: Estación Meteorológica
Como la clase encapsula a la estructura de datos, el arreglo no es visible fuera de la clase Temp. Min. Estacion. Las clases Clientes pueden crear objetos de clase Temp. Min. Estacion y enviarles mensajes para computar valores. La clase Temp. Min. Estacion no brinda servicios para leer o mostrar datos. Toda la entrada y salida se hace desde las clases Clientes. 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 2 cuatrimestre Caso de Estudio: Estación Meteorológica
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<constructores>> Temp. Min. Estacion (cant : entero) <<comandos>> establecer. Temp. Min (d: entero, t : real) Temp. Min. Estacion (cant : entero) Crea una estructura para mantener las temperaturas de cant días, requiere cant>0 establecer. Temp. Min (d : entero t : real) requiere 1<=d<=cant. Dias() La temperatura del día 1 corresponde al subíndice 0 en el arreglo. 8 t. Min length 3. 5 12 7 -1 3. 5 10 -2
Caso de Estudio: Estación Meteorológica boolean hubo. Mas. NMayores(float t, int n) Decide si hubo al menos n temperaturas mayores a t boolean hubo. NMayores(float t, int n) Decide si hubo exactametne n temperaturas mayores a t boolean hubo. NCon. Mayores(float t, int n) Decide si hubo al menos n temperaturas consecutivas mayores a t Introducción a la Programación Orientada a Objetos IPOO 2 cuatrimestre La interpretación del diseño es fundamental para implementar correctamente cada funcionalidad. Los siguientes servicios son diferentes aun cuando la especificación es similar:
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<consultas>> mayor. Amplitud(): real hubo. Mayor. Amplitud(t: real): boolean todas. Amplitudes. Crecientes(): boolean Computa la mayor amplitud térmica entre 2 días consecutivos, requiere que el período tenga al menos 2 días. Decide si hubo alguna amplitud térmica entre días consecutivos, mayor a t. Decide si todas las amplitudes térmicas entre días consecutivos son crecientes, requiere que el período tenga al menos 2 días. Establecer Casos de Prueba para cada servicio
Caso de Estudio: Estación Meteorológica mayor. Amplitud(): float 2. 5 7. 5 8. 0 4. 0 cant. Dias() es 7 -2. 0 -2. 2 3. 2
Caso de Estudio: Estación Meteorológica mayor. Amplitud(): float 2. 5 7. 5 8. 0 4. 0 -2. 0 cant. Dias() es 7 Primera amplitud 5. 0 -2. 2 3. 2
Caso de Estudio: Estación Meteorológica mayor. Amplitud(): float 2. 5 7. 5 8. 0 4. 0 -2. 0 cant. Dias() es 7 Primera amplitud 5. 0 Segunda amplitud 0. 5 -2. 2 3. 2
Caso de Estudio: Estación Meteorológica mayor. Amplitud(): float 2. 5 7. 5 8. 0 4. 0 -2. 2 3. 2 cant. Dias() es 7 Primera amplitud 5. 0 Segunda amplitud 0. 5 Mayor amplitud 5. 0
Caso de Estudio: Estación Meteorológica mayor. Amplitud(): float 2. 5 7. 5 8. 0 4. 0 -2. 2 3. 2 cant. Dias() es 7 Primera amplitud 5. 0 Segunda amplitud 0. 5 Mayor amplitud 5. 0 Tercera amplitud 4. 0 Mayor amplitud 5. 0
Caso de Estudio: Estación Meteorológica mayor. Amplitud(): float 2. 5 7. 5 8. 0 4. 0 -2. 2 3. 2 cant. Dias() es 7 Primera amplitud 5. 0 Segunda amplitud 0. 5 Mayor amplitud 5. 0 Tercera amplitud 4. 0 Mayor amplitud 5. 0 Cuarta amplitud 6. 0 Mayor amplitud 6. 0
Caso de Estudio: Estación Meteorológica Algoritmo mayor. Amplitud Calcula la amplitud entre los días Compara y elige la mayor Calcula la amplitud entre los días Compara la última calculada con la elige la mayor 1 y 2 2 y 3 3 y 4 mayor y 4 y 5 mayor y 5 y 6 mayor y Debemos refinar esta versión identificando las estructuras de control.
Caso de Estudio: Estación Meteorológica Algoritmo mayor. Amplitud DS mayor calcula amplitud entre los días 1 y 2 para cada día a partir del segundo amplitud calcula amplitud con el día siguiente si amplitud > mayor amplitud
Caso de Estudio: Estación Meteorológica public float mayor. Amplitud(){ /*Computa la mayor amplitud térmica entre 2 días consecutivos, requiere que el período tenga al menos 2 días*/ float may=Math. abs(t. Min[0]-t. Min[1]); for (int i=1; i<cant. Dias()-1; i++) if (Math. abs(t. Min[i]-t. Min[i+1]) > may) may = Math. abs(t. Min[i]-t. Min[i+1]); return may; Recorrido Exhaustivo }
Caso de Estudio: Estación Meteorológica public float mayor. Amplitud(){ /*Computa la mayor amplitud térmica entre 2 días consecutivos, requiere que el período tenga al menos 2 días*/ float may=amplitud(0); for (int i=1; i<cant. Dias()-1; i++) if (amplitud(i)>may) may = amplitud(i); return may; } private float amplitud (int i) { return Math. abs(t. Min[i]-t. Min[i+1]; }
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<consultas>> mayor. Amplitud(): real hubo. Mayor. Amplitud(t: real): boolean todas. Amplitudes. Crecientes(): boolean Computa la mayor amplitud térmica entre 2 días consecutivos, requiere que el período tenga al menos 2 días. Decide si hubo alguna amplitud térmica entre días consecutivos, mayor a t. Decide si todas las amplitudes térmicas entre días consecutivos son crecientes, requiere que el período tenga al menos 2 días.
Caso de Estudio: Estación Meteorológica hubo. Mayor. Amplitud(): boolean 2. 5 5. 5 8. 0 2. 0 cant. Dias() es 7 t=5 -2. 0 -2. 2 3. 2
Caso de Estudio: Estación Meteorológica hubo. Mayor. Amplitud(): boolean 2. 5 5. 5 8. 0 2. 0 cant. Dias() es 7 t=5 -2. 0 -2. 2 3. 2
Caso de Estudio: Estación Meteorológica hubo. Mayor. Amplitud(): boolean 2. 5 5. 5 8. 0 2. 0 cant. Dias() es 7 t=5 -2. 0 -2. 2 3. 2
Caso de Estudio: Estación Meteorológica hubo. Mayor. Amplitud(): boolean 2. 5 5. 5 8. 0 2. 0 cant. Dias() es 7 t=5 true -2. 0 -2. 2 3. 2
Caso de Estudio: Estación Meteorológica hubo. Mayor. Amplitud(): boolean 2. 5 5. 5 8. 0 2. 0 cant. Dias() es 7 t=8 -2. 0 -2. 2 3. 2
Caso de Estudio: Estación Meteorológica Algoritmo hubo. Mayor. Amplitud DE t para cada día del periodo y mientras NO se verifique la propiedad amplitud calcula amplitud con el día siguiente si amplitud > t se verifica la propiedad Nuevamente la condición de corte de la iteración es muy general. El algoritmo en sí mismo es muy general, la estructura podría no ser un arreglo
Caso de Estudio: Estación Meteorológica public boolean hubo. Mayor. Amplitud(float t){ //Decide si hay una amplitud mayor a t boolean hubo= false; for (int i=0; i< cant. Dias()-1 && !hubo; i++) hubo = Math. abs(t. Min[i]-t. Min[i+1]) > t; return hubo; } Recorrido NO Exhaustivo
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<consultas>> mayor. Amplitud(): real hubo. Mayor. Amplitud(t: real): boolean todas. Amplitudes. Crecientes(): boolean Computa la mayor amplitud térmica entre 2 días consecutivos, requiere que el período tenga al menos 2 días. Decide si hubo alguna amplitud térmica entre días consecutivos, mayor a t. Decide si todas las amplitudes térmicas entre días consecutivos son crecientes, requiere que el período tenga al menos 2 días.
Caso de Estudio: Estación Meteorológica todas. Amplitudes. Crecientes(): boolean 2. 5 5. 5 8. 7 0. 0 cant. Dias() es 7 -2. 0 -2. 2 3. 2
Caso de Estudio: Estación Meteorológica todas. Amplitudes. Crecientes(): boolean 2. 5 5. 5 8. 7 0. 0 cant. Dias() es 7 -2. 0 -2. 2 3. 2
Caso de Estudio: Estación Meteorológica todas. Amplitudes. Crecientes(): boolean 2. 5 5. 5 8. 7 0. 0 cant. Dias() es 7 -2. 0 -2. 2 3. 2
Caso de Estudio: Estación Meteorológica todas. Amplitudes. Crecientes(): boolean 2. 5 5. 5 8. 7 0. 0 cant. Dias() es 7 -2. 0 -2. 2 3. 2
Caso de Estudio: Estación Meteorológica todas. Amplitudes. Crecientes(): boolean 2. 5 5. 5 8. 7 0. 0 cant. Dias() es 7 false -2. 0 -2. 2 3. 2
Caso de Estudio: Estación Meteorológica todas. Amplitudes. Crecientes(): boolean 2. 5 2. 8 3. 5 1. 0 cant. Dias() es 7 true 5. 0 10. 2 2. 2
Caso de Estudio: Estación Meteorológica Algoritmo todas. Amplitudes. Crecientes amplitud calcula amplitud entre el primer y el segundo día para cada par de días del periodo a partir del segundo y mientras se verifique la propiedad a calcula amplitud con el día siguiente si amplitud >= a NO se verifica la propiedad sino amplitud a
Caso de Estudio: Estación Meteorológica public boolean todas. Amplitudes. Crecientes(){ //Requiere un período de al menos 2 dias boolean todas= true; float a 1=Math. abs(t. Min[0]-t. Min[1]); for (int i=1; i<cant. Dias()-1&&todas; i++){ float a 2 = Math. abs(t. Min[i]-t. Min[i+1]); if (a 1 >= a 2) todas = false; a 1 = a 2; } Recorrido NO Exhaustivo return todas; }
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min Requieren la misma cantidad de temperaturas en las dos estaciones Cuenta en cuántos días la diferencia absoluta entre las temperaturas de las dos estaciones es mayor a t <<consultas>> mayores. Diferencias (tme: Temp. Min. Estacion, t: real ) : entero hay. Diferencia. Mayor (tme: Temp. Min. Estacion, t: real) : boolean mayor. Diferencia (tme: Temp. Min. Estacion ) : real menor. Entre. Estaciones (tme: Temp. Min. Estacion): Temp. Min. Estacion Decide si en dos estaciones, en algún día, la diferencia absoluta entre temperaturas es mayor a t Reciben y/o retornan un objeto de la clase Temp. Min. Estacion Genera una estación con la menor temperatura mínima de cada día, entre dos estaciones dadas Computa la mayor diferencia absoluta entre dos estaciones en el mismo día.
Caso de Estudio: Estación Meteorológica //Comandos public void establecer. Temp. Min(int dia, float t){ /*Requiere 1<=d<=cant. Dias() */ t. Min[dia-1]=t; } // Consultas public float obtener. Temp. Min(int dia){ /*Requiere 1<=d<=cant. Dias() */ return t. Min[dia-1]; }
Caso de Estudio: Estación Meteorológica boolean mayores. Diferencias (Temp. Min. Estacion tme, float t) 6 12 -2 8 7. 5 -1 4. 5 5 4 2 5 8. 5 10 11 Si t = 5 mayor. Temp. Min debe retornar 3
Caso de Estudio: Estación Meteorológica boolean mayores. Diferencias (Temp. Min. Estacion tme, float t) 6 12 -2 8 7. 5 -1 4. 5 5 4 2 5 8. 5 10 11 Si t = 5 mayor. Temp. Min debe retornar 3 para cada día d del período t 1 temperatura del día d de Estación 1 la estación que recibe el mensaje t 2 temperatura del día d de Estación 2 la estación que pasa como parámetro si abs(t 1 -t 2) > t cont+1
Caso de Estudio: Estación Meteorológica 6 12 -2 8 7. 5 -1 4. 5 5 4 2 5 8. 5 10 11 Si t = 5 mayor. Temp. Min debe retornar 3 para t 1 t 2 si cada día d del período t. Min[d] tme. obtener. Temp. Min(d+1) abs(t 1 -t 2) > t cont+1 • t. Min es un arreglo las componentes se acceden usando un subíndice. • tme es un objeto de clase Temp. Min. Estacion, las componentes se acceden con los servicios provistos por la clase
Caso de Estudio: Estación Meteorológica public int mayores. Diferencias(Temp. Min. Estacion tme, float t ){ /*Cuenta en cuantos días la diferencia absoluta entre las temperaturas de las dos estaciones es mayor a t. Requiere la misma cantidad de temperaturas en las dos estaciones*/ int cont = 0; float t 1, t 2; for (int d = 0; d<cant. Dias() ; d++){ t 1 = t. Min[d]; t 2 = tme. obtener. Temp. Min(d+1); if(Math. abs(t 1 -t 2)> t) cont++; } return cont; }
Caso de Estudio: Estación Meteorológica class Test. Temp. Min. Estacion { public static void main(String[] args) { int cant. D =0; cant. D = leer. Cant. Dias () ; Temp. Min. Max. Estacion sur, norte; sur = leer. Temp. Est(cant. D) ; norte = leer. Temp. Est(cant. D) ; System. out. println("Muestra la estación "); mostrar. Temp. Est(sur) ; mostrar. Temp. Est(norte) ; int dif = sur. mayores. Diferencias(norte, 5); System. out. println("Diferencias mayores a 5 = "+ dif); … }
Caso de Estudio: Estación Meteorológica norte 6 tme t. Min length 5 sur t. Min 12 -2 8 7. 5 0 4. 5 7 4 length 2 5 8. 5 10 11 7 public int mayores. Diferencias(Temp. Min. Estacion tme, float t ){ … } int dif = sur. mayores. Diferencias(norte, 5);
Caso de Estudio: Estación Meteorológica norte 6 tme t. Min length 5 sur t. Min 12 -2 8 7. 5 0 4. 5 7 4 length 2 5 8. 5 10 7 public int mayores. Diferencias(Temp. Min. Estacion tme, float t ){ … } Ambiente de referenciamiento en el bucle for de mayores. Diferencias (solo variables): t. Min, tme, t, t 1, t 2, cont, d 11
Caso de Estudio: Estación Meteorológica public int mayores. Diferencias(Temp. Min. Estacion tme, float t ){ /*Cuenta en cuantos días la diferencia absoluta entre las temperaturas de las dos estaciones es mayor a t Requiere la misma cantidad de temperaturas en las dos estaciones */ int cont = 0; for (int d = 0; d<cant. Dias() ; d++) if(Math. abs(t. Min[d]-tme. obtener. Temp. Min(d+1))>t) cont++; return cont; } Si la clase cliente no cumple con la responsabilidad de que las dos estaciones tengan la misma cantidad de elementos se va a producir un error de aplicación o de ejecución (si la cantidad de días de tme es menor que cant. Dias()).
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<consultas>> mayores. Diferencias (tme: Temp. Min. Estacion, t: real ) : entero hay. Diferencia. Mayor (tme: Temp. Min. Estacion, t: real) : boolean mayor. Diferencia (tme: Temp. Min. Estacion ) : real menor. Entre. Estaciones (tme: Temp. Min. Estacion): Temp. Min. Estacion Requieren la misma cantidad de temperaturas en las dos estaciones Cuenta en cuántos días la diferencia absoluta entre las temperaturas de las dos estaciones es mayor a t Decide si en dos estaciones, en algún día, la diferencia absoluta entre temperaturas es mayor a t Computa la mayor diferencia absoluta entre dos estaciones, en el mismo día. Genera una estación con la menor temperatura mínima de cada día, entre dos estaciones dadas
Caso de Estudio: Estación Meteorológica boolean hay. Diferencia. Mayor (Temp. Min. Estacion tme, float t) 6 12 -2 8 7. 5 -1 4. 5 5 4 2 5 8. 5 10 11 Si t = 5 retorna true
Caso de Estudio: Estación Meteorológica boolean hay. Diferencia. Mayor (Temp. Min. Estacion tme, float t) 6 12 -2 8 7. 5 -1 4. 5 5 4 2 5 8. 5 10 11 Si t = 10 retorna false
Caso de Estudio: Estación Meteorológica public boolean hay. Diferencia. Mayor(Temp. Min. Estacion tme, float t ){ /*Decide si en dos estaciones en algún día la diferencia absoluta entre temperaturas es > t Requiere la misma cantidad de temperaturas en las dos estaciones */ boolean hay = false; for (int d = 0; d<cant. Dias() && !hay; d++) if(Math. abs(t. Min[d]tme. obtener. Temp. Min(d+1))> t) hay = true; return hay; } La clase Proveedora puede establecer una excepción para considerar el caso de que la clase Cliente no cumpla con su responsabilidad.
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<consultas>> mayores. Diferencias (tme: Temp. Min. Estacion, t: real ) : entero hay. Diferencia. Mayor (tme: Temp. Min. Estacion, t: real) : boolean mayor. Diferencia (tme: Temp. Min. Estacion ) : real menor. Entre. Estaciones (tme: Temp. Min. Estacion): Temp. Min. Estacion Requieren la misma cantidad de temperaturas en las dos estaciones Cuenta en cuántos días la diferencia absoluta entre las temperaturas de las dos estaciones es mayor a t Decide si en dos estaciones, en algún día, la diferencia absoluta entre temperaturas es mayor a t Computa la mayor diferencia absoluta entre dos estaciones, en el mismo día. Genera una estación con la menor temperatura mínima de cada día, entre dos estaciones dadas
Caso de Estudio: Estación Meteorológica real mayor. Diferencia(Temp. Min. Estacion tme) 6 12 -2 8 7. 5 -1 4. 5 5 4 2 5 8. 5 10 11 retorna 11
Caso de Estudio: Estación Meteorológica public float mayor. Diferencia (Temp. Min. Estacion tme){ /*Computa la mayor diferencia absoluta entre dos estaciones en el mismo día, asume que se registraron por lo menos días. Requiere la misma cantidad de temperaturas en las dos estaciones */ float mayor = 0; for (int d = 0; d<cant. Dias(); d++) if(Math. abs(t. Min[d]-tme. obtener. Temp. Min(d+1))> mayor) mayor = Math. abs(t. Min[d]tme. obtener. Temp. Min(d+1)); return mayor; }
Caso de Estudio: Estación Meteorológica Temp. Min. Estacion float [] t. Min <<consultas>> mayores. Diferencias (tme: Temp. Min. Estacion, t: real ) : entero hay. Diferencia. Mayor (tme: Temp. Min. Estacion, t: real) : boolean mayor. Diferencia (tme: Temp. Min. Estacion ) : real menor. Entre. Estaciones (tme: Temp. Min. Estacion): Temp. Min. Estacion Requieren la misma cantidad de temperaturas en las dos estaciones Cuenta en cuántos días la diferencia absoluta entre las temperaturas de las dos estaciones es mayor a t Decide si en dos estaciones, en algún día, la diferencia absoluta entre temperaturas es mayor a t Computa la mayor diferencia absoluta entre dos estaciones, en el mismo día. Genera una estación con la menor temperatura mínima de cada día, entre dos estaciones dadas
Caso de Estudio: Estación Meteorológica boolean mayor. Diferencia(Temp. Min. Estacion tme) 6 12 -2 8 7. 5 -1 4. 5 5 4 2 5 8. 5 10 11 4 -2 5 7. 5 -1 4. 5 retorna 5
Caso de Estudio: Estación Meteorológica public Temp. Min. Estacion menor. Entre. Estaciones(Temp. Min. Estacion tme){ /*Genera una Estación con la menor temperatura mínima de cada día entre dos estaciones dadas. Requiere la misma cantidad de temperaturas en las dos estaciones*/ Temp. Min. Estacion t. Menor = new Temp. Min. Estacion(cant. Dias()); for (int d = 0; d<cant. Dias() ; d++) if(t. Min[d]<tme. obtener. Temp. Min(d+1)) t. Menor. establecer. Temp. Min(d+1, t. Min[d]); else t. Menor. establecer. Temp. Min (d+1, tme. obtener. Temp. Min(d+1)); return t. Menor; }
Caso de Estudio: Estación Meteorológica Aunque la programación es una actividad creativa, la estrategia de reconocer la analogía entre problemas aparentemente diferentes, favorece el proceso de resolución. Hemos propuesto un conjunto de patrones de algoritmos que pueden usarse para hallar la solución de distintos problemas. Introducción a la Programación Orientada a Objetos
- Slides: 161