La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Introducción a la Programación Orientada a Objetos Sonia Rueda Encapsulamiento y Abstracción Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD.

Presentaciones similares


Presentación del tema: "Introducción a la Programación Orientada a Objetos Sonia Rueda Encapsulamiento y Abstracción Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD."— Transcripción de la presentación:

1 Introducción a la Programación Orientada a Objetos Sonia Rueda Encapsulamiento y Abstracción Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR 2015 IPOO 2 cuatrimestre 2015

2 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 Caso de Estudio: Estación Meteorológica IPOO 2 cuatrimestre 2015

3 Gráficamente : 0 1 2 3 4 5 6 -4.05.011.08.08.04.0-2.0 1 2 3 4 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. Una manera de representar los datos es mediante un arreglo declarado como: float tMin[]; Caso de Estudio: Estación Meteorológica

4 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] ; } //Comandos public void establecerTempMin(int dia, float t){ /*Requiere 1<=dia<=cantDias()*/ tMin[dia-1]=t; } // Consultas public float obtenerTempMin(int dia){ /*Requiere 1<=dia<=cantDias()*/ return tMin[dia-1];} public int cantDias(){ return tMin.length;} …} Caso de Estudio: Estación Meteorológica class Test { public static void main(String[] args) { TempMinEstacion junio,julio; junio = leerTempMinEst(30); julio = leerTempMinEst(31); System.out.println("Junio "); mostrarTempMinEst(junio) ; System.out.println("Junio "); mostrarTempMinEst(julio) ; System.out.println("Promedio en Junio"+ junio.promedioTempMin() ); }

5 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; } Recorrido Exhaustivo

6 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; } Caso de Estudio: Estación Meteorológica Recorrido Exhaustivo

7 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; } La iteración termina cuando es posible asegurar que la propiedad no se va a cumplir. Caso de Estudio: Estación Meteorológica Recorrido No Exhaustivo

8 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 es mediante un arreglo de dos dimensiones declarado como sigue: float tabla [][]; CE: Estaciones Meteorológicas tabla = new float[nEst][n]; La siguiente instrucción crea la estructura de datos:

9 Gráficamente un arreglo de dos dimensiones puede verse como una grilla: CE: Estaciones Meteorológicas 0 1 2 3 4 5 6 0 -4.05.011.08.08.04.0-2.0 10.00.01.05.00.05.00.0 2 -2.00.05.0-2.011.04.00.0 3 -3.0-2.04.0-1.05.08.011.0 Cada fila representa a una estación. Cada columna representa a un día del período.

10 La operación básica sigue siendo la subindicación, sólo que ahora cuando especificamos sólo un subíndice hacemos referencia a una fila completa: CE: Estaciones Meteorológicas 0 1 2 3 4 5 6 0 -4.05.011.08.08.04.0-2.0 10.00.01.05.00.05.00.0 2 -2.00.05.0-2.011.04.00.0 3 -3.0-2.04.0-1.05.08.011.0 tabla[2]

11 Para hacer referencia a un elemento particular, por ejemplo la temperatura mínima del cuarto día de la primera estación meteorológica: CE: Estaciones Meteorológicas 0 1 2 3 4 5 6 0 -4.05.011.08.08.04.0-2.0 10.00.01.05.00.05.00.0 2 -2.00.05.0-2.011.04.00.0 3 -3.0-2.04.0-1.05.08.011.0 tabla[0][3]

12 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, y tabla[i].length, nos indica el número de elementos en la fila i. CE: Estaciones Meteorológicas

13 TempMinRegion real [][] tabla > TempMinRegion(nEst,nDias: entero) > establecerTemp(e,d : entero, t : real) Observemos que en este diseño la primera estación se referencia con 0 y el primer día con 1. establecerTemp(e,d : entero, t : real) Requiere 0<=e<cantEstaciones() y 1<=d<=cantDias() TempMinRegion(nEst, nDias: entero) Requiere nEst>0 y nDias>0

14 CE: Estaciones Meteorológicas TempMinRegion real [][] tabla > cantEstaciones() : entero cantDias() : entero obtenerTemp (e,d:entero):real contarMayores(t:real):real mayorPromedioRegion():real mayorTempDia (d : entero):real estacionesHeladas () : entero obtenerTemp (e,d:entero):real mayorTempDia (d : entero):real Requieren 0<=e<cantEstaciones() y 1<=d<=cantDias() Queda pendiente como ejercicio establecer casos de prueba adecuados para verificar cada servicio.

15 CE: Estaciones Meteorológicas contarMayores(t:real):real 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 computa el promedio del día d, considerando todas las estaciones estacionesHeladas () : entero computa en cuántas estaciones se produjeron heladas.

16 CE: Estaciones Meteorológicas class TempMinRegion { /*Cada fila de la matriz representa a una estacion 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]; } … }

17 CE: Estaciones Meteorológicas 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.

18 CE: Estaciones Meteorológicas 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.

19 CE: Estaciones Meteorológicas Algoritmo contarMayores Recorrer cada día en cada estación Incrementar un contador si la temperatura es mayor a una temperatura dada 0 1 2 3 4 5 6 0 -4.05.011.08.08.04.0-2.0 10.00.01.05.00.05.00.0 2 -2.00.05.0-2.011.04.00.0 3 -3.0-2.04.0-1.05.08.011.0 Es un recorrido exhaustivo

20 CE: Estaciones Meteorológicas 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.

21 CE: Estaciones Meteorológicas public float contarMayores (float t) { /* Requiere 0<=e<cantEstaciones() */ 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; } Observemos que recorremos el arreglo desde la fila 0, columna 0. Un recorrido exhaustivo por estación y luego por día puede implementarse con dos bucles anidados.

22 CE: Estaciones Meteorológicas 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.

23 CE: Estaciones Meteorológicas 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

24 CE: Estaciones Meteorológicas 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; }

25 CE: Estaciones Meteorológicas private float promedioTempMin(int e) { float suma = 0; for (int dia=0;dia<cantDias();dia++) suma = suma + tabla [e][dia]; return suma/cantDias(); }

26 CE: Estaciones Meteorológicas 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.

27 CE: Estaciones Meteorológicas 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.

28 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 ; } El recorrido es exhaustivo, todas las estaciones meteorológicas tienen que considerarse.

29 CE: Estaciones Meteorológicas 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.

30 CE: Estaciones Meteorológicas public int estacionesHeladas () { /*Cuenta la cantidad de estaciones en las que heló*/ int cont = 0; boolean helada = false; for (int i=0;i<cantEstaciones();i++){ int j= 0; while (j < cantDias() && !helada){ if ( tabla[i][j]<0){ cont++; helada = true; } j++; } } return cont ; } ERROR DE APLICACIÓN

31 CE: Estaciones Meteorológicas public int estacionesHeladas () { /*Cuenta la cantidad de estaciones en las que heló*/ int cont = 0; boolean helada; for (int i=0;i<cantEstaciones();i++){ int j= 0; helada = false; while (j < cantDias() && !helada){ if ( tabla[i][j]<0) cont++; j++; } return cont ; } ERROR DE APLICACIÓN

32 CE: Estaciones Meteorológicas 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 Temperatura en el primer día"+ reg.mayorTempDia(1) ); System.out.println("Cantidad estaciones con heladas "+ reg.estacionesHeladas() ); } … } reg mantiene una referencia a un objeto de clase TempMinRegion.

33 CE: Estaciones Meteorológicas 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; }

34 CE: Estaciones Meteorológicas 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(); }

35 CE: Estaciones Meteorológicas 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.

36 CE: Estaciones Meteorológicas 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.

37 CE: Estaciones Meteorológicas TempMinRegion TempMinEstacion [] tabla > TempMinRegion(nEst,nDias: entero) > establecerTemp(e,d : entero, t : real) establecerTemp(e,d : entero, t : real) Requiere 0<=e<cantEstaciones() y 1<=d<=cantDias() TempMinRegion(nEst, nDias: entero) Requiere nEst>0 y nDias>0 En este diseño la región se modela con un arreglo cuyas componentes mantienen referencias a objetos.

38 CE: Estaciones Meteorológicas TempMinRegion TempMinEstacion [] tabla > cantEstaciones() : entero cantDias() : entero obtenerTemp (e,d:entero):real contarMayores(t:real):real mayorPromedioRegion():real mayorTempDia (d : entero):real estacionesHeladas () : entero El cambio en la representación interna de los datos no afecta a la signatura de los servicios. obtenerTemp (e,d:entero):real mayorTempDia (d : entero):real Requieren 0<=e<cantEstaciones() y 1<=d<=cantDias()

39 CE: Estaciones Meteorológicas class TempMinRegion { private TempMinEstacion[] tabla; public TempMinRegion (int nEst, int nDias){ //Requiere nEst>0 y nDias >0 for (int est=0;est<nEst;est++) tabla[est] = new TempMinEstacion(nDias); } … }

40 CE: Estaciones Meteorológicas 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.

41 CE: Estaciones Meteorológicas 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){ /* Requiere 0<=e<cantEstaciones() y 1<=d<=cantDias() */ return tabla[e].obtenerTempMin(d) ; }

42 CE: Estaciones Meteorológicas 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.

43 CE: Estaciones Meteorológicas 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.

44 CE: Estaciones Meteorológicas 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; }

45 CE: Estaciones Meteorológicas 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(); }

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

47 Extra Suficiencia de Inglés equivalencia con Curso de Lectura Comprensiva de Inglés Averiguar en febrero las fechas de los exámenes de nivelación y las fechas de inscripción en los cursos


Descargar ppt "Introducción a la Programación Orientada a Objetos Sonia Rueda Encapsulamiento y Abstracción Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD."

Presentaciones similares


Anuncios Google