510 likes | 651 Vues
Caso de Estudio: Temperaturas Mínimas Encapsulamiento. Defina una clase TempMinEstacion que encapsule la representación de las temperaturas mínimas registradas en una estación meteorológica en un período y brinde operaciones para: Retornar la mayor temperatura registrada
E N D
Caso de Estudio: Temperaturas Mínimas Encapsulamiento • Defina una clase TempMinEstacion que encapsule la representación de las temperaturas mínimas registradas en una estación meteorológica en un período y brinde operaciones para: • Retornar la mayor temperatura registrada • Calcular el promedio de las temperaturas • Contar en cuántos días heló • Decidir si hubo heladas • Si se registran las temperaturas mínimas para n días, el primer día se nombra como 0 y el último como n-1 Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento • Representaremos las temperaturas mínimas del período mediante un arreglo de números reales. • El arreglo está encapsulado en una clase TempMinEstacion, todo el acceso a la estructura se hace dentro de la clase. • Las clases clientes no conocen la representación de los datos. • Las operaciones visibles permiten calcular el promedio, la cantidad de heladas, etc. • Los cambios en la representación no afectan a las clases clientes, en tanto no cambien las operaciones. Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento TempMinEstacion float [] S Crea una estructura para mantener las temperaturas de cant días <<constructores>> TempMinEstacion (cant : entero) <<comandos>> establecerTempMin (d : entero t : real) Requiere un valor válido para d Observemos que el valor 0 representa una temperatura válida. Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento TempMinEstacion Requiere un valor válido para d float [] S <<consultas>> obtenerTempMin(d : entero):real cantDias () : entero mayorTempMin () : real promedioTempMin () : real cantHeladas() : entero huboHeladas () : boolean Calcula el mayor valor Cuenta la cantidad de días que heló Decide si hubo heladas Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento class TempMinEstacion { private float [] tMin; //Constructor // Crea una estructura para mantener las temperaturas // de cierta cantidad de días y las inicializa en 0 public TempMinEstacion(int cant) { tMin= new float[cant]; inicializarTemp(); } ... } Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento class TempMinEstacion { private float [] tMin; //Comandos private void inicializarTemp(){ for (int i=0;i<tMin.length;i++) tMin[i]=0; } ... } Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento Algoritmo promedioTempMin DS: promedio de las temperaturas promedio = 0 Para cada dia promedio = promedio + temperatura de ese dia promedio = promedio / cantDias Devolver promedio Introducción a la Programación Orientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento class TempMinEstacion { private float [] tMin; ... // Consultas public float promedioTempMin(){ //… float prom=0, suma=0; for (int i=0;i<tMin.length;i++) suma=suma+tMin[i]; prom=suma/tMin.length; return prom; } … } Recorrido Exhaustivo Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento Algoritmo mayorTempMin DS: mayor temperatura min mayor = temp del primer dia Para cada dia a partir del segundo dia Si la temp del dia actual > mayor mayor = temp del dia actual Devolver mayor Introducción a la Programación Orientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento class TempMinEstacion { private float [] tMin; ... // Consultas public float mayorTempMin(){ //… float mayor=tMin[0]; for (int i=1;i<tMin.length;i++){ if (tMin[i]>mayor) mayor=tMin[i]; } return mayor; } … } Verificar considerando que la mayor temperatura sea la primera y la última Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento Algoritmo cantHeladas DS: Cantidad de heladas cant = 0 Para cada dia Si la temperatura del dia < 0 cant = cant +1 Devolver cant Introducción a la Programación Orientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento class TempMinEstacion { private float [] tMin; ... // Consultas public int cantHeladas(){ //… int cant=0; for (int i=0;i<tMin.length;i++) if (tMin[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: Temperaturas Mínimas Encapsulamiento Algoritmo huboHeladas DS: Verdadero si hubo heladas, falso en caso contrario hayHelada = falso Para cada dia mientras NO hayHelada hayHelada = temperatura del dia < 0 Devolver hay Introducción a la Programación Orientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento class TempMinEstacion { private float [] tMin; ... // Consultas public boolean huboHeladas(){ //… boolean encontre=false; int i=0; while ((i<tMin.length) && (!encontre)) if (tMin[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 Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento • El arreglo queda encapsulado en una clase, todo el acceso desde la clase cliente se realiza a través de los servicios ofrecidos por la clase proveedora. • El primer día se denota con 0. • La estructura está completa y la cantidad de elementos se define en el momento de la creación • Todos los elementos ya están ingresados cuando empieza el procesamiento • La entrada y salida se realiza desde la clase cliente. Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Tester Diseñe e implementeunaclase tester quebrinde un serviciopara leer lastemperaturas y paraprobar la funcionalidad de la claseTempMinEstacion 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. Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Tester 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() ); … } Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Tester class TestTempMinEstacion { public static TempMinEstacion leerTempMinEst(int cant) { float t ; TempMinEstacion e= new TempMinEstacion(cant); for (int i=0;i< e.cantDias();i++){ System.out.println("Ingrese la temperatura del día "+i); t = ES.leerFloat(); e.establecerTempMin (i,t) ; }; return e; } Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Tester class TestTempMinEstacion { public static TempMinEstacion leerTempMinEst(int cant) { float t ; TempMinEstacion e= new TempMinEstacion(cant); … return e; } tMin e length 7 Introducción a la Programación Orientada a Objetos Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Tester class TestTempMinEstacion { public static void mostrarTempMinEst (TempMinEstacion e){ for (int i=0;i< e.cantDias(); i++) System.out.println(" "+e.obtenerTempMin(i) ); } } Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas TempMinEstacion float [] tMin Requiere que dia sea válido <<Comandos>> establecerTempMin (dia : entero t : real) <<Consultas>> obtenerTempMin(dia : entero):real La clase cliente es responsable de asegurar que dia esté dentro del período Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Responsabilidades class TempMinEstacion { private float [] tMin; //Comandos public void establecerTempMin(int dia, float t){ /*Requiere que dia sea consistente con la cantidad de días del período*/ tMin[dia]=t; } … } Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Responsabilidades class TempMinEstacion { private float [] tMin; // Consultas public float obtenerTempMin(int dia){ float t){ /*Requiere que dia sea consistente con la cantidad de días del período*/ return tMin[dia]; } public int cantDias(){ return tMin.length; } … } Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Encapsulamiento • Defina una clase TempMinEstacion que encapsule la representación de las temperaturas mínimas registradas en una estación meteorológica en un período y brinde operaciones para: • Retornar la mayor temperatura registrada • Calcular el promedio de las temperaturas • Contar en cuántos días heló • Decidir si hubo heladas • Retornar la primera temperatura mayor a una dada; si no existe devolver el mismo valor recibido. • Retornar el número de día que corresponde a la primera helada del período, si no heló retorna 0. • Si se registran las temperaturas mínimas para n días, el primer día se nombra como 0 y el último como n-1 Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Responsabilidades TempMinEstacion float [] tMin Retorna la primera temperatura mayor a t o t <<consultas>> primerMayor(t:real): real diaPrimerMayor(t:real): entero Retorna el día en el que se produjo la primera tempertatura mayor a t Si no hubo ninguna retorna -1 Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas TempMinEstacion Cuenta la cantidad de días en las que las temperaturas fueron mayores a t. float [] tMin <<consultas>> contarMayores(t:real):entero 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. Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas TempMinEstacion float [] tMin Decide si hubo al menos n días consecutivos con temperaturas mayores a t. <<consultas>> huboNConMayores(t:real,n:entero) :boolean periodoMasLargo(t:real):entero Computa la cantidad de días del período más largo con temperaturas mayores a t en días consecutivos. Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas public int contarMayores(float t){ //Cuenta las temperaturas mayores a t } Dado el siguiente registro de temperaturas 5.5 11.1 -4.2 9.0 0.1 -0.2 si t=5.5 debe computar 2 si t=15 debe computar 0 si t=-5 debe computar 6 Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Algoritmo contarMayores DE: temp DS: cant de dia donde la temperatura > temp cant =0 Para cada dia Si temperatura del dia actual > temp cant = cant +1 Devolver cant Introducción a la Programación Orientada a Objetos
Caso de Estudio: Temperaturas Mínimas public int contarMayores(float t){ //Cuenta las temperaturas mayores a t int cont = 0; for (int i=0;i<cantDias();i++) if (tMin[i] > t) cont++; return cont; } Recorrido exhaustivo Algunos Casos de Prueba t=5.5 5.5 11.1 -4.2 9.0 6.2 2.1 4.2 -2.0 2.2 2.1 -4.2 9.0 5.5 0.1 -4.2 3.0 Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Algoritmo huboMasNMayores DE: temp, N DS: Verdadero si hubo, falso en caso contrario cant = 0 Para cada dia mientras que cant < N Si temperatura del dia actual > temp cant = cant +1 Devolver cant Introducción a la Programación Orientada a Objetos
Caso de Estudio: Temperaturas Mínimas 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; } Recorrido no exhaustivo t=5.5 n=3 Algunos Casos de Prueba 8.5 11.1 7.2 6.2 2.1 5.5 -2.0 7.2 2.2 8.1 -4.2 9.0 5.5 0.1 6.2 7.0 9.0 0.1 6.2 7.0 4.0 3.0 Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Algoritmo huboNMayores DE: temp, N DS: Verdadero si hubo, falso en caso contrario cant = 0 Para cada dia mientras que cant <= N Si temperatura del dia actual > temp cant = cant +1 Devolver (cant == N) Introducción a la Programación Orientada a Objetos
Caso de Estudio: Temperaturas Mínimas 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; } Recorrido no exhaustivo 7.2 2.2 8.1 6.2 9.0 5.5 0.1 6.2 7.0 t=5.5 n=3 Cuandoconttoma valor 4 termina la iteración Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas public boolean huboNConMayores(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 0.1 -0.2 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 Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Algoritmo huboNConMayores DE: temp, N DS: Verdadero si hubo, falso en caso contrario cont = 0 Para cada dia mientras que cont < N Si temperatura del dia actual > temp cont = cont + 1 Sino cont = 0 Devolver cont == N Introducción a la Programación Orientada a Objetos
Caso de Estudio: Temperaturas Mínimas public boolean huboNConMayores(float t,int n){ /*Decide si hubo al menos n temperaturas consecutivas mayores a t*/ int cont = 0; for (int i=0;i<cantDias()&&cont < n;i++) if (tMin[i] > t) cont++; else cont = 0; return cont==n; } Recorrido no exhaustivo 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. Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas TempMinEstacion float [] tMin Retorna la mayor amplitud térmica entre 2 días consecutivos, asume que se registraron por lo menos dos días <<consultas>> mayorAmplitud():real huboMayorAmplitud(t:real):boolean todasAmplitudesCrecientes():boolean 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 Establecer Casos de Prueba para cada servicio Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Algoritmo mayorAmplitud Requiere: periodo de al menos 2 dias DS: Devuelve la mayor amplitud mayor = |T0 – T1| Para cada dia entre el segundo y el ante ultimo Si |Ti – Ti+1| > mayor mayor = |Ti – Ti+1| Devolver mayor Introducción a la Programación Orientada a Objetos
Caso de Estudio: Temperaturas Mínimas public float mayorAmplitud(){ //Requiere un período de al menos 2 dias float may=Math.abs(tMin[0]-tMin[1]); for (int i=1;i<cantDias()-1; i++) if (Math.abs(tMin[i]-tMin[i+1]) > may) may = Math.abs(tMin[i]-tMin[i+1]); return may; } Recorrido Exhaustivo Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Algoritmo todasAmplitudesCrecientes Requiere: periodo de al menos 2 dias DS: Verdadero si son crecientes, falso caso contrario todasCreci = verdadero ampAnterior = |T0 – T1| Para cada dia excepto el ultimo mientras todasCreci ampActual = |Ti – Ti+1| todasCreci = ampAnterior < ampActual ampAnterior = ampActual Devolver todasCreci Introducción a la Programación Orientada a Objetos
Caso de Estudio: Temperaturas Mínimas public boolean todasAmplitudesCrecientes(){ //Requiere un período de al menos 2 dias boolean todas= true; float a1=Math.abs(tMin[0]-tMin[1]); for (int i=1;i<cantDias()-1 && todas;i++){ float a2 = Math.abs(tMin[i]-tMin[i+1]); todas = a1 < a2; a1 = a2; } return todas; } Recorrido NO Exhaustivo Introducción a la ProgramaciónOrientada a Objetos
Caso de Estudio: Temperaturas Mínimas Requieren la misma cantidad de temperaturas en las dos estaciones TempMinEstacion float [] tMin Cuenta en cuántos días la diferencia absoluta entre las temperaturas de las dos estaciones es mayor a t <<consultas>> mayoresDiferencias (tme:TempMinEstacion, t:real ) : entero hayDiferenciaMayor (tme:TempMinEstacion, t: real) : boolean mayorDiferencia (tme:TempMinEstacion ) :real menorEntreEstaciones (tme:TempMinEstacion): TempMinEstacion Decide si en dos estaciones en algún día la diferencia absoluta entre temperaturas es mayor a t Retorna la mayor diferencia absoluta entre dos estaciones en el mismo día, asume que se registraron por lo menos dos días Retorna una Estación con la menor temperatura mínima de cada día entre dos estaciones dadas Reciben y/o retornan un objeto de la clase TempMinEstacion
Caso de Estudio: Temperaturas Mínimas 6 12 -2 8 7.5 0 4.5 5 4 2 5 8.5 10 11 para cada día d del período t1 temperatura del día d de Estación 1 la estación que recibe el mensaje t2 temperatura del día d de Estación 2 la estación que pasa como parámetro si abs(t1-t2) > t contcont+1
Caso de Estudio: Temperaturas Mínimas 6 12 -2 8 7.5 0 4.5 5 4 2 5 8.5 10 11 para cada día d del período t1 tMin[d] t2 tme.obtenerTempMin(d) si abs(t1-t2) > t contcont+1 • tMines un arreglolascomponentes se accedenusando un subíndice. • tmees un objeto de claseTempMinEstacion, lascomponentes se acceden con los serviciosprovistospor la clase
Caso de Estudio: Temperaturas Mínimas public int mayoresDiferencias(TempMinEstacion 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 t1,t2; for (int d = 0; d<cantDias() ; d++){ t1=tMin[d]; t2 = tme.obtenerTempMin(d); if(Math.abs(t1-t2)> t) cont++; } return cont; }
Caso de Estudio: Temperaturas Mínimas public int mayoresDiferencias(TempMinEstacion 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<cantDias() ; d++) if(Math.abs(tMin[d]-tme.obtenerTempMin(d))> t) cont++; return cont; } Observe que 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 cantDias()).
Caso de Estudio: Temperaturas Mínimas estN 6 12 -2 8 7.5 0 4.5 tMin length 7 tme 5 4 2 5 8.5 10 11 estS tMin length 7
Caso de Estudio: Temperaturas Mínimas public boolean hayDiferenciaMayor(TempMinEstacion 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<cantDias() && !hay; d++) if(Math.abs(tMin[d]-tme.obtenerTempMin(d))> t) hay = true; return hay; }
Caso de Estudio: Temperaturas Mínimas public float mayorDiferencia (TempMinEstacion tme){ /*Retorna la mayor diferencia absoluta entre dos estaciones, en el mismo día asume que se registraron por lo menos dos días Requiere la misma cantidad de temperaturas en las dos estaciones */ float mayor = 0; for (int d = 0; d<cantDias(); d++) if(Math.abs(tMin[d]-tme.obtenerTempMin(d))> mayor) mayor = Math.abs(tMin[d]-tme.obtenerTempMin(d)); return mayor; }