Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porCristina Carmona Camacho Modificado hace 6 años
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 Depto. de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur, Bahía Blanca 2017
2
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
En una región se mantienen las temperaturas mínimas registradas en un conjunto de estaciones meteorológicas en un período de n días. Una manera de representar los datos sería mediante un arreglo de dos dimensiones declarado como sigue: float tabla [][]; tabla = new float[nEst][n]; Introducción a la Programación Orientada a Objetos IPOO
3
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Gráficamente un arreglo de dos dimensiones puede verse como una grilla: 1 2 3 4 5 6 -4.0 5.0 11.0 8.0 4.0 -2.0 0.0 1.0 -3.0 -1.0 Cada fila representa a una estación. Cada columna representa a un día del período.
4
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
La operación básica sigue siendo la subindicación. Ahora cuando especificamos sólo un subíndice hacemos referencia a una fila completa: 1 2 3 4 5 6 -4.0 5.0 11.0 8.0 4.0 -2.0 0.0 1.0 -3.0 -1.0 1 2 3 4 5 6 -4.0 5.0 11.0 8.0 4.0 -2.0 0.0 1.0 -3.0 -1.0 tabla[2] Introducción a la Programación Orientada a Objetos IPOO
5
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Para hacer referencia a un elemento particular, por ejemplo, la temperatura mínima del cuarto día de la primera estación meteorológica : 1 2 3 4 5 6 -4.0 5.0 11.0 8.0 4.0 -2.0 0.0 1.0 -3.0 -1.0 1 2 3 4 5 6 -4.0 5.0 11.0 8.0 4.0 -2.0 0.0 1.0 -3.0 -1.0 tabla[0][3] Introducción a la Programación Orientada a Objetos IPOO
6
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Un arreglo de dos dimensiones es en realidad un arreglo cuyas componentes son arreglos. No todas las componentes tienen necesariamente la misma cantidad de elementos. La variable length sigue siendo accesible, tabla.length nos proporciona el número de filas (cuatro). tabla[i].length, nos indica el número de elementos en la fila i. Introducción a la Programación Orientada a Objetos IPOO
7
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
tabla 4 4 4 4 4 4 4 length 7 Introducción a la Programación Orientada a Objetos IPOO
8
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
TempMinRegion <<atributos de instancia>> real [][] tMin <<Constructores>> TempMinRegion(nEst, nDias: entero) <<Comandos>> establecerTemp(e, d: entero, t: real) Requiere nEst>0 y nDias>0 Requiere 0<=e<cantEstaciones() y 1<=d<=cantDias() Observemos que en este diseño la primera estación se referencia con 0 y el primer día con 1. Introducción a la Programación Orientada a Objetos IPOO
9
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
TempMinRegion <<atributos de instancia>> real [][] tMin <<Consultas>> cantEstaciones(): entero cantDias(): entero obtenerTemp(e,d:entero): real contarMayores(t: real): entero mayorPromedioRegion(): real mayorTempDia(d: entero): real estacionesHeladas(): entero Requieren 0<=e<cantEstaciones() y 1<=d<=cantDias() Cuenta la cantidad de estaciones en las que heló Queda pendiente como ejercicio establecer casos de prueba adecuados para verificar cada servicio.
10
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
contarMayores(t: real): entero computa la cantidad de días en los que se produjeron temperaturas mayores a t en la región. mayorPromedioRegion(): real computa el promedio de cada estación y retorna el mayor. mayorTempDia(d: entero): real retorna la mayor temperatura del día d, considerando todas las estaciones. estacionesHeladas(): entero computa en cuántas estaciones se produjeron heladas. Introducción a la Programación Orientada a Objetos IPOO
11
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
class TempMinRegion { /*Cada fila de la matriz representa a una estación y cada columna a un día del período*/ private float [][] tabla; public TempMinRegion(int nEst, int nDias){ //Requiere nEst > 0 y nDias > 0 tabla = new float[nEst][nDias]; } …
12
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public int cantEstaciones () { return tabla.length ; } public int cantDias () { return tabla[0].length ; En este problema todas las filas tienen la misma cantidad de columnas, de modo que cantDias() no necesita recibir como parámetro un número que indique de qué fila se va a retornar la cantidad de columnas. Introducción a la Programación Orientada a Objetos IPOO
13
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public void establecerTemp(int e,int d, float t){ /*Requiere 0<= e < cantEstaciones() y 1<=d<=cantDias()*/ tabla[e][d-1] = t ; } public float obtenerTemp(int e, int d){ /*Requiere 0<=e<cantEstaciones() y 1<=d<=cantDias()*/ return tabla[e][d-1] ; Observemos que el primer día corresponde a subíndice 0 en el arreglo.
14
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Algoritmo contarMayores Recorrer cada día en cada estación Incrementar un contador si la temperatura es mayor a una temperatura dada. Es un recorrido exhaustivo 1 2 3 4 5 6 -4.0 5.0 11.0 8.0 4.0 -2.0 0.0 1.0 -3.0 -1.0
15
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Algoritmo contarMayores DE t DS contador para cada estacion e para cada dia d de la estacion e si la temperatura del día d en la estación e es > t incrementar contador Es una versión refinada del algoritmo anterior donde se identifican claramente las estructuras de control. Introducción a la Programación Orientada a Objetos IPOO
16
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public float contarMayores (float t) { int cont = 0; for (int est=0;est<cantEstaciones();est++) for (int dia=0;dia<cantDias();dia++) if (tabla[est][dia]> t) cont++; return cont; } Un recorrido exhaustivo por estación y luego por día puede implementarse con dos bucles anidados. Observemos que recorremos el arreglo desde la fila 0, columna 0. Introducción a la Programación Orientada a Objetos IPOO
17
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Algoritmo mayorPromedioRegion Considerar que el promedio de la primera estación es el mayor. Calcular el promedio de cada estación, a partir de la segunda, y compararlo con el mayor promedio calculado hasta el momento. Introducción a la Programación Orientada a Objetos IPOO
18
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Algoritmo mayorPromedioRegion DS mayor mayor ← promedio de la primera estación para cada estacion e a partir de la segunda calcular el promedio de la estacion e si promedio de la estacion e > mayor mayor ← promedio de la estación e Introducción a la Programación Orientada a Objetos IPOO
19
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public float mayorPromedioRegion () { float pEst; float mayor = promedioTempMin(0); for (int est=1;est<cantEstaciones();est++){ pEst = promedioTempMin(est); if (pEst>mayor) mayor = pEst; } return mayor; Introducción a la Programación Orientada a Objetos IPOO
20
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
private float promedioTempMin(int e) { float suma = 0; for (int dia=0;dia<cantDias();dia++) suma = suma + tabla [e][dia]; return suma/cantDias(); } Introducción a la Programación Orientada a Objetos IPOO
21
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public float mayorTempDia (int d) { //Requiere 1<=d<=cantDias() float mayor = tabla[0][d-1]; for (int est=1;est<cantEstaciones();est++) if (tabla[est][d-1] > mayor) mayor = tabla[est][d-1] ; return mayor; } Recorre todas las estaciones del día d. Es un recorrido exhaustivo de una columna del arreglo. Introducción a la Programación Orientada a Objetos IPOO
22
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Algoritmo estacionesHeladas DS contador para cada estacion e si heló al menos un dia en e incrementar el contador En el diseño de cada algoritmo buscamos identificar las estructuras de control. “para cada estación” implica un recorrido exhaustivo de todas las filas, puede implementarse con un bucle for. Cada fila no va a ser recorrida exhaustivamente, en cuanto se encuentra un día que heló, se incrementa el contador y el recorrido de esa fila termina. Introducción a la Programación Orientada a Objetos IPOO
23
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public int estacionesHeladas () { /*Cuenta la cantidad de estaciones en las que heló*/ int cont = 0; for (int est=0;est<cantEstaciones();est++) if (huboHeladas(est)) cont++; return cont ; } El recorrido es exhaustivo, todas las estaciones meteorológicas tienen que considerarse. Introducción a la Programación Orientada a Objetos IPOO
24
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
private boolean huboHeladas (int e) { /* Requiere 0<=e<cantEstaciones() */ boolean helada = false; int dia=0; while (dia < cantDias() && !helada){ if ( tabla[e][dia]<=0) helada = true; dia++; } return helada; Cada recorrido sobre una estación meteorológica particular es no exhaustivo. Sí un día helo, el método retorna verdadero.
25
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
Algoritmo estacionesHeladas DS contador para cada estacion e si heló al menos un dia en e incrementar el contador Algoritmo estacionesHeladas DS contador para cada estacion e para cada día de la semana d y mientras no encuentre uno en el que heló en e si heló incrementar contador En la segunda versión no se asume disponible una primitiva, la solución propone dos bucles anidados
26
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public int estacionesHeladas () { /*Cuenta la cantidad de estaciones en las que heló*/ int cont = 0; int j = 0; boolean helada; for (int i=0; i < cantEstaciones(); i++){ j = 0; helada = false; while (j < cantDias() && !helada){ if (tabla[i][j] <= 0){ cont++; helada = true; } j++; return cont ;
27
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public int estacionesHeladas () { /*Cuenta la cantidad de estaciones en las que heló*/ int cont = 0; int j = 0; boolean helada; for (int i=0; i < cantEstaciones(); i++){ j = 0; while (j < cantDias() && !helada){ if (tabla[i][j] <= 0){ cont++; helada = true; } j++; return cont ; ERROR DE APLICACIÓN
28
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public int estacionesHeladas () { /*Cuenta la cantidad de estaciones en las que heló*/ int cont = 0; int j = 0; boolean helada; for (int i=0; i < cantEstaciones(); i++){ j = 0; helada = false; while (j < cantDias() && !helada){ if (tabla[i][j] <= 0){ cont++; } j++; return cont ; ERROR DE APLICACIÓN
29
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
class TestTempMinRegion { public static void main(String[] args) { // Tester para una semana int cant =7; TempMinRegion reg; reg = genTempMinReg(cant) ; System.out.println("Muestra la región "); mostrarTempMinReg(reg) ; System.out.println(“Mayor promedio de la region "+ reg.mayorPromedioRegion()); System.out.println(“Mayor temeratura en el primer día"+ reg.mayorTempDia(1)); System.out.println(“Cantidad de estaciones con heladas "+ reg.estacionesHeladas()); } …
30
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public static TempMinRegion genTempMinReg(int cant) { float t; TempMinRegion e = new TempMinRegion(4,cant); for (int i=0;i< e.cantEstaciones()-1;i++){ for (int j=1;j< e.cantDias();j++){ t = j+i-5; e.establecerTemp (i,j,t) ; } e.establecerTemp(i,e.cantDias(),-i); for (int j=1;j <= e.cantDias()-1;j++){ t = j*2; e.establecerTemp(e.cantEstaciones()-1,j,t); e.establecerTemp(e.cantEstaciones()-1, e.cantDias(),0); return e;
31
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public static void mostrarTempMinReg(TempMinRegion e){ for (int i=0;i< e.cantEstaciones();i++){ for (int j=1;j<= e.cantDias();j++) System.out.print(" "+e.obtenerTemp(i,j)); System.out.println(); }
32
RESUMEN La implementación de cada servicio requiere diseñar adecuadamente un algoritmo. El diseño de cada algoritmo exige aplicar los conceptos de programación estructurada, diseño top-down y refinamiento paso a paso, aprendidos en Resolución de Problemas y Algoritmos. Buscamos soluciones correctas, legibles y eficientes. El recorrido de una estructura de datos como un arreglo implica seleccionar adecuadamente las estructuras de control. Introducción a la Programación Orientada a Objetos IPOO
33
RESUMEN La verificación de cada servicio requiere elegir adecuadamente los casos de prueba. El diseño establece como siempre los compromisos de la clase Cliente y la clase Proveedora. La verificación consiste en testear que cada clase cumple con su compromiso. Algunas modificaciones de diseño provocan cambios solo en la clase Cliente. Otras decisiones de diseño solo afectan a la clase Proveedora. Otras decisiones afectan a ambas. Introducción a la Programación Orientada a Objetos IPOO
34
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
TempMinRegion <<atributos de instancia>> TempMinEstacion [] tabla <<Constructores>> TempMinRegion(nEst, nDias: entero) <<Comandos>> establecerTemp(e, d: entero, t: real) Requiere nEst>0 y nDias>0 Requiere 0<=e<cantEstaciones() y 1<=d<=cantDias() En este diseño la region se modela con un arreglo cuyas componentes mantienen referencias a objetos. Introducción a la Programación Orientada a Objetos IPOO
35
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
TempMinRegion <<atributos de instancia>> TempMinEstacion [] tabla <<Consultas>> cantEstaciones(): entero cantDias(): entero obtenerTemp(e,d:entero): real contarMayores(t: real): entero mayorPromedioRegion(): real mayorTempDia(d: entero): real estacionesHeladas(): entero Requieren 0<=e<cantEstaciones() y 1<=d<=cantDias() Cuenta la cantidad de estaciones en las que heló El cambio en la representación interna de los datos no afecta a la signatura de los servicios.
36
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
class TempMinRegion { private TempMinEstacion[] tabla; public TempMinRegion(int nEst, int nDias){ //Requiere nEst>0 y nDias >0 tabla = new TempMinEstacion[nEst]; for (int est=0;est<nEst;est++) tabla[est] = new TempMinEstacion(nDias); } … Introducción a la Programación Orientada a Objetos IPOO
37
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public int cantEstaciones () { return tabla.length ; } public int cantDias () { return tabla[0].cantDias(); En este problema todas las filas tienen la misma cantidad de columnas, de modo que cantDias() no necesita recibir como parámetro un número que indique de qué fila se va a retornar la cantidad de columnas.
38
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public void establecerTemp(int e,int d, float t){ /* Requiere 0<=e<cantEstaciones() y 1<=d<=cantDias() */ tabla[e].establecerTempMin(d,t); } public float obtenerTemp(int e,int d){ return tabla[e].obtenerTempMin(d); Introducción a la Programación Orientada a Objetos IPOO
39
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public float mayorPromedioRegion () { float pEst; float mayor = tabla[0].promedioTempMin(); for (int est=1;est<cantEstaciones();est++){ pEst= tabla[est].promedioTempMin(); if (pEst>mayor) mayor = pEst; } return mayor; La clase TempMinRegion está asociada a la clase TempMinEstacion, tiene un atributo de esa clase y usa sus servicios.
40
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
class TestTempMinRegion { public static void main(String[] args) { // Tester para una semana int cant =7; TempMinRegion reg; reg = genTempMinReg(cant) ; System.out.println("Muestra la región "); mostrarTempMinReg(reg) ; System.out.println(“Mayor promedio de la region "+ reg.mayorPromedioRegion()); … } Como la representación de los datos está encapsulada, el cambio en la estructura no afecta a las clases que usan a TempMinRegion.
41
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public static TempMinRegion genTempMinReg(int cant) { float t ; TempMinRegion e= new TempMinRegion(4,cant); for (int i=0;i< e.cantEstaciones()-1;i++){ for (int j=1;j< e.cantDias();j++){ t = j+i-5; e.establecerTemp (i,j,t) ; } e.establecerTemp (i,e.cantDias(),-i) ; for (int j=1;j<= e.cantDias()-1;j++){ t = j*2; e.establecerTemp (e.cantEstaciones()-1,j,t); e.establecerTemp (e.cantEstaciones()-1, e.cantDias(),0); return e;
42
CASO DE ESTUDIO: ESTACIÓN METEOROLÓGICA
public static void mostrarTempMinReg (TempMinRegion e){ for (int i=0;i< e.cantEstaciones();i++){ for (int j=1;j<= e.cantDias();j++) System.out.print(“ “ +e.obtenerTemp(i,j) ); System.out.println(); }
43
CE: Estaciones Meteorológicas
public int estacionesHeladas () { /*Cuenta la cantidad de estaciones en las que heló*/ int cont = 0; for (int est=0;est<cantEstaciones();est++) if (huboHeladas (est)) cont++; return cont ; } La implementación de estacionesHeladas no se modifica. El recorrido es exhaustivo, todas las estaciones meteorológicas tienen que considerarse.
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.