La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

IPOO 2 cuatrimestre 2015 Departamento de Ciencias e Ingeniería

Presentaciones similares


Presentación del tema: "IPOO 2 cuatrimestre 2015 Departamento de Ciencias e Ingeniería"— Transcripción de la presentación:

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

2 Caso de Estudio: Estación Meteorológica
En una estación meteorológica se miden y registran valores de distintas variables meteorológicas que luego se usan para hacer predicciones. El diseñador del sistema elaboró un diagrama de clases que incluye a una clase TempMinEstacion . La clase encapsula a una estructura de datos que mantiene los valores de las temperaturas mínimas de cada día registradas en un período de n días y brinda servicios para: Calcular la mayor temperatura registrada Calcular el promedio de las temperaturas Calcular en cuántos días heló Decidir si hubo heladas IPOO 2 cuatrimestre 2015 Introducción a la Programación Orientada a Objetos

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

4 Caso de Estudio: Estación Meteorológica
class TempMinEstacion { /* Todas las consultas que procesan la estructura requieren que se haya asignado una temperatura a cada día. El primer día es el día 1.El período tiene al menos un día.*/ private float [] tMin; //Constructor /*Crea una estructura para mantener las temperaturas de cant días, cant>0 */ public TempMinEstacion(int cant) { tMin= new float[cant] ; } //Comandos public void establecerTempMin(int dia, float t){ /*Requiere 1<=dia<=cantDias()*/ tMin[dia-1]=t; } // Consultas public float obtenerTempMin(int dia){ return tMin[dia-1];} public int cantDias(){ return tMin.length;} …} class Test { public static void main(String[] args) { TempMinEstacion junio,julio; junio = leerTempMinEst(30); julio = leerTempMinEst(31); System.out.println("Junio "); mostrarTempMinEst(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 Caso de Estudio: Estación Meteorológica
public int contarMayores(float t){ /*Computa la cantidad de temperaturas mayores a t*/ return cMayores(t,cantDias()); } private int cMayores(float t,int n){ int cont=0; if (n>0) if (tMin[n-1] > t) cont = cMayores(t,n-1)+1; else cont = cMayores(t,n-1); return cont; Recorrido Exhaustivo

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

8 CE: Estaciones Meteorológicas
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 [][]; La siguiente instrucción crea la estructura de datos: tabla = new float[nEst][n];

9 CE: Estaciones Meteorológicas
Gráficamente un arreglo de dos dimensiones puede verse como una grilla: Cada fila representa a una estación. Cada columna representa a un día del período.

10 CE: Estaciones Meteorológicas
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: tabla[2]

11 CE: Estaciones Meteorológicas
Para hacer referencia a un elemento particular, por ejemplo la temperatura mínima del cuarto día de la primera estación meteorológica: tabla[0][3]

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

13 CE: Estaciones Meteorológicas
TempMinRegion real [][] tabla TempMinRegion(nEst, nDias: entero) Requiere nEst>0 y nDias>0 <<constructor>> TempMinRegion(nEst,nDias: entero) <<comandos>> establecerTemp(e,d : entero, t : real) establecerTemp(e,d : entero, t : real) 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.

14 CE: Estaciones Meteorológicas
TempMinRegion real [][] tabla <<consultas>> 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){ 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 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; } 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.

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) Requiere nEst>0 y nDias>0 <<constructor>> TempMinRegion(nEst,nDias: entero) <<comandos>> establecerTemp(e,d : entero, t : real) establecerTemp(e,d : entero, t : real) Requiere 0<=e<cantEstaciones() y 1<=d<=cantDias() En este diseño la región se modela con un arreglo cuyas componentes mantienen referencias a objetos. La clase TempMinRegion está asociada a TempMinEstación, tiene un atributo cuyas componentes son de tipo clase TempMinEstación.

38 CE: Estaciones Meteorológicas
TempMinRegion TempMinEstacion [] tabla <<consultas>> 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() El cambio en la representación interna de los datos no afecta a la signatura de los servicios.

39 CE: Estaciones Meteorológicas
class TempMinRegion { //atributos private TempMinEstacion[] tabla; //Constructor public TempMinRegion (int nEst, int nDias) { //Requiere nEst>0 y nDias >0 for (int est=0;est<nEst;est++) tabla[est] = new TempMinEstacion(nDias); } La clase TempMinEstacion es la clase proveedora. La clase TempMinRegion es la clase cliente de TempMinEstacion.

40 CE: Estaciones Meteorológicas
public int cantEstaciones () { return tabla.length ; } public int cantDias () { return tabla[0].cantDias(); tabla es ahora un arreglo cuyas componentes son objetos de tipo clase TempMinEstacion tabla[0] es una referencia a un objeto de clase TempMinEstacion, de modo que puede recibir cualquiera de los mensajes que corresponden a servicios provistos por la clase TempMinEstacion

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){ return tabla[e].obtenerTempMin(d) ; tabla es un arreglo, tabla[e] es una referencia a un objeto de tipo clase TempMintEstacion.

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, si tabla[est] recibe el mensaje promedioTempMin ejecutará el método provisto por su clase. .

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 (tabla[est].huboHeladas ()) cont++; return cont ; } tabla[est] mantiene una referencia a un objeto de clase TempMinEstacion, cuando recibe el mensaje huboHeladas ejecuta el método provisto por su clase. .

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

45 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;

46 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(); }

47 Curso de Lectura Comprensiva de Inglés
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 "IPOO 2 cuatrimestre 2015 Departamento de Ciencias e Ingeniería"

Presentaciones similares


Anuncios Google