IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería

Slides:



Advertisements
Presentaciones similares
Tipos de Datos Abstractos Vector de Racionales
Advertisements

Reusabilidad La productividad está basada en reusabilidad y extensibilidad El reusabilidad permite desarrollar nuevas aplicaciones a partir de componentes.
El proceso de desarrollo de software
Abstracción de Datos La abstracción es un recurso fundamental en la programación orientada a objetos y está además fuertemente ligado a reusabilidad.
El concepto de clase Con frecuencia un término puede definirse de diferentes maneras según el enfoque. Desde el punto de vista del análisis y el diseño.
Genericidad Los datos de aplicaciones muy diferentes puede modelarse con frecuencia a partir de tipos de datos cuyas operaciones no dependen del tipo de.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tabla.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Colección.
Introducción a la Programación Orientada a Objetos Una clase que modela los atributos y el comportamiento de una colección de objetos, define un tipo de.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Polimorfismo.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Abstracción.
Introducción a la Programación Orientada a Objetos Arreglos de 2 dimensiones TDA Matriz Implementar un TDA Matriz que brinde operaciones para calcular.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Arreglo.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Herencia.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Sonia.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Sonia.
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.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Sonia.
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.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Sonia.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre 2015 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre 2015 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
El celular en los parciales SI o NO
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
Sonia Rueda Herencia y Polimorfismo
Listas Dinámicas.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre 2016 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2015 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
Ordenamiento: Quick Sort
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
Ordenamiento Ordenar una estructura de datos consiste en reacomodar sus elementos de acuerdo a algún criterio. Por ejemplo, los mensajes pueden ordenarse.
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
IPOO 2 cuatrimestre Departamento de Ciencias e Ingeniería
Transcripción de la presentación:

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

Caso de Estudio: Libreta de Contactos Una libreta de contactos mantiene el nombre, número de teléfono móvil, número de teléfono fijo y email de un conjunto de personas u organizaciones. La clase Libreta_Contactos encapsula una colección de elementos de clase Contacto, representada con un arreglo parcialmente ocupado. La cantidad de componentes del arreglo es fija, la cantidad de componentes ligadas es variable. Todas las componentes ligadas están en las primeras cant posiciones. Los elementos se mantienen ordenados alfabéticamente por nombre.

Caso de Estudio: Libreta de Contactos La clase cliente es responsable de controlar que haya lugar en la libreta antes de agregar un nuevo contacto y que no exista un contacto con el mismo nombre que el nuevo. El método pertenece utiliza la estrategia de búsqueda binaria para decidir si la libreta contiene un contacto con el mismo nombre que el contacto que recibe como parámetro. El método intercalar, intercala ordenadamente dos libretas en una sola. Si dos contactos coinciden en el nombre, deja el contacto de la libreta que recibe el mensaje.

Caso de Estudio: Libreta de Contactos Libreta_Contactos Contacto T [] Contacto cant:entero nombre:String nroMovil: String nroFijo:String email:String << Constructores>> Libreta_Contactos(max:entero) <<Comandos>> nuevo(nc:Contacto) eliminar(c:Contacto) <<Consultas>> cantContactos():entero estaLlena():boolean pertenece(c:Contacto):boolean intercalar(l:Libreta_Contactos): Libreta_Contactos <<Constructor>> Contacto (n:String) <<Comandos>> <<Consultas>> igual(c: Contacto):boolean mayor(c: Contacto):boolean

Caso de Estudio: Libreta de Contactos class Libreta_Contactos{ //Atributos de Instancia private Contacto[] T; private int cant; //Constructor /*crea una coleccion con capacidad para max elementos*/ public Libreta_Contactos(int max) { T= new Contacto[max]; cant = 0; }

Caso de Estudio: Libreta de Contactos cant … length 6 Libreta_Contactos lib = Libreta_Contactos(6);

Caso de Estudio: Libreta de Contactos Si la libreta de contactos se mantiene ordenada por nombre, el servicio nuevo no puede implementarse asignando el nuevo contacto a la primera posición libre. Para comprender cómo implementar el servicio nuevo comencemos visualizando la libreta de contactos a través de una grilla con capacidad para 6 contactos

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email   Observemos que la grilla es un modelo con un alto nivel de abstracción, no modelamos objetos y referencias, nos concentramos en el ordenamiento.

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Davini Laura  …   Consideremos que se agrega un nuevo contacto para Davini Laura, como la grilla está vacía el primer contacto ocupa la primera posición en la grilla. Notemos que no interesan los otros atributos porque la libreta se ordena por nombre.

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Davini Laura  …  Polo Leo   Se agrega ahora un nuevo contacto para Polo Leo. Como el nuevo contacto es mayor alfabéticamente a Davini Laura, se agrega al final.

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Davini Laura  …  Polo Leo   Se agrega ahora un nuevo contacto para Avila Mario. Como el nuevo contacto es menor alfabéticamente que Davini Laura, se agrega al principio, arrastrando los que siguen una posición hacia abajo.

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Davini Laura  …  Polo Leo  

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Davini Laura  …  Polo Leo  

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Davini Laura  …  Polo Leo  

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Avila Mario  …  Davini Laura  Polo Leo   Se agrega ahora un nuevo contacto para Parodi Mario. Como el nuevo contacto es menor alfabéticamente que Polo Leo, se agrega en la posición de este contacto, arrastrando a Polo Leo

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Avila Mario  …  Davini Laura  Polo Leo  

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Avila Mario  …  Davini Laura  Parodi Mario  Polo Leo   Se agrega ahora un nuevo contacto para Ramos Marisa. Como el nuevo contacto es mayor alfabéticamente que el último contacto, se agrega al final

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Avila Mario  …  Davini Laura  Parodi Mario  Polo Leo  Ramos Marisa   Se agrega ahora un nuevo contacto para Castro Luis. Como el nuevo contacto es menor alfabéticamente que Davini Laura se arrastran todos los contactos a partir de Davini Laura.

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Avila Mario  …  Davini Laura  Parodi Mario  Polo Leo  Ramos Marisa

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Avila Mario  …  Castro Luis  Davini Laura  Parodi Mario  Polo Leo  Ramos Marisa

Caso de Estudio: Libreta de Contactos El servicio nuevo tiene que funcionar considerando varios casos diferentes: La libreta está vacía el contacto es: Menor a todos Mayor a todos Mayor al primero pero Menor que el último Asumimos que la clase cliente controla que la libreta no está llena.

Caso de Estudio: Libreta de Contactos La grilla nos permite visualizar la libreta de contactos de manera abstracta para mostrar cómo se agrega cada nuevo contacto en cada caso. El diagrama de objetos, que también es una abstracción, es útil para graficar cómo se administra la memoria, pero no es una buena herramienta para diseñar el algoritmo nuevo.

Caso de Estudio: Libreta de Contactos Algoritmo nuevo DE nc Buscar la posición del primer elemento mayor a nc Arrastrar todos los elementos a partir de esa posición Asignar nc a la posición Incrementar la cantidad de contactos public void nuevo(Contacto nc){ /*Requiere que la colección no esté llena y no exista un contacto con ese nombre*/ int pos = posInsercion(nc,cant); arrastrarDsp (pos,cant-pos); T[pos] = nc; cant++; }

Caso de Estudio: Libreta de Contactos Caso trivial: Si la cantidad de elementos es 0, la posición de inserción es 0 Caso trivial: Si nc es mayor que el último nombre, la posición es la última Caso Recursivo: buscar la posición de inserción entre las n-1 componentes private int posInsercion (Contacto nc,int n){ /* Retornar la posición del primer elemento mayor a nc, o 0 si no existe*/ int pos = 0; if (n > 0) if (nc.mayor(T[n-1]) pos = n; else pos = posInsercion (nc,--n); return pos; }

Caso de Estudio: Libreta de Contactos private void arrastrarDsp (int pos,int n){ if (n > 0){ T[pos+n] = T[pos+n-1]; arrastrarDsp(pos,--n); } ¿Qué pasa si ya existe un contacto con ese nombre? Modifique la implementación de nuevo considerando que es su responsabilidad controlar si ya existe un contacto con ese nombre y si es así no agrega nc.

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Avila Mario  …  Castro Luis  Davini Laura  Parodi Mario  Polo Leo  Ramos Marisa Supongamos que se decide eliminar el contacto Castro Luis. Los contactos que siguen deben arrastrarse una posición hacia arriba.

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Avila Mario  …  Davini Laura  Parodi Mario  Polo Leo  Ramos Marisa

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Avila Mario  …  Davini Laura  Parodi Mario  Polo Leo  Ramos Marisa

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Avila Mario  …  Davini Laura  Parodi Mario  Polo Leo  Ramos Marisa

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Avila Mario  …  Davini Laura  Parodi Mario  Polo Leo  Ramos Marisa

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Avila Mario  …  Davini Laura  Parodi Mario  Polo Leo  Ramos Marisa

Caso de Estudio: Libreta de Contactos Nombre Número de Móvil Número Fijo email  Avila Mario  …  Davini Laura  Parodi Mario  Polo Leo  Ramos Marisa

Caso de Estudio: Libreta de Contactos El servicio eliminar tiene que funcionar considerando varios casos diferentes: La libreta está vacía el contacto: No pertenece a la libreta Es el primero Es el último Es Mayor al primero pero Menor que el último Observemos que con la modificación en el comando nuevo no puede haber dos contactos con el mismo nombre

Caso de Estudio: Libreta de Contactos Algoritmo eliminar DE c Buscar la posición del c Si existe Arrastrar los elementos desde posición hasta el último Decrementar la cantidad de contactos public void eliminar(Contacto c){ /*Elimina, si existe, el contacto c */ int pos = posElemento (c,cant); if (pos < cant){ arrastrarAnt(pos,cant-pos-1); cant--; }

Caso de Estudio: Libreta de Contactos Libreta_Contactos Contacto T [] Contacto cant:entero nombre:String nroMovil: String nroFijo:String email:String << Constructores>> Libreta_Contactos(max:entero) <<Comandos>> nuevo(nc:Contacto) eliminar(c:Contacto) <<Consultas>> cantContactos():entero estaLlena():entero pertenece(c:Contacto):boolean intercalar(l:Libreta_Contactos): Libreta_Contactos <<Constructor>> Contacto (n:String) <<Comandos>> <<Consultas>> igual(c: Contacto):boolean mayor(c: Contacto):boolean Busca un contacto con el mismo nombre que c aplicando Búsqueda Binaria

Búsqueda en una estructura ordenada La búsqueda binaria requiere que la estructura esté ordenada y consiste en partirla en mitades, considerando que el elemento buscado puede ser: Introducción a la Programación Orientada a Objetos •igual al que está en el medio •menor que el que está en el medio mayor que el que está en el medio

Búsqueda en una estructura ordenada Introducción a la Programación Orientada a Objetos 3 12 Si busco el número 17 ÉXITO 17 17 Mitad 22 23 45

Búsqueda en una estructura ordenada Introducción a la Programación Orientada a Objetos 3 3 12 12 Si busco el número 23 Descarto la primera mitad y busco en la segunda 17 17 Mitad 22 23 45

Búsqueda en una estructura ordenada Introducción a la Programación Orientada a Objetos 3 12 Si busco el número 23 ÉXITO 17 17 22 Mitad 23 45

Búsqueda en una estructura ordenada Introducción a la Programación Orientada a Objetos 3 3 12 12 Si busco el número 21 Descarto la primera mitad y busco en la segunda Mitad 17 17 22 23 45

Búsqueda en una estructura ordenada Introducción a la Programación Orientada a Objetos 3 12 Si busco el número 21 Descarto la segunda mitad y busco en la primera 17 17 22 23 23 Mitad 45 45

Búsqueda en una estructura ordenada Introducción a la Programación Orientada a Objetos 3 12 Si busco el número 21 NO ESTÁ 17 17 Mitad 22 22 23 45 45

Búsqueda en una estructura ordenada Algoritmo Búsqueda Binaria si el elemento que está en la mitad es el buscado EXISTE sino si hay un solo elemento y no es el buscado NO EXISTE si el elemento que está en la mitad es menor al buscado Descartar la primera mitad Buscar en la segunda mitad Descartar la segunda mitad Buscar en la primera mitad Introducción a la Programación Orientada a Objetos Refinamos la solución

Búsqueda en una estructura ordenada Algoritmo BúsquedaBinaria DE ini,fin,Elem Mitad(ini+fin)/2 si Lmitad = Elem EXISTE si ini >= fin NO EXISTE sino si Lmitad < Elem ini = mitad+1 BuscarBinaria ini,fin,Elem fin = mitad-1 BusquedaBinaria ini,fin,Elem Introducción a la Programación Orientada a Objetos El algoritmo es independiente del lenguaje de implementación

Búsqueda en una estructura ordenada Casos de prueba Cantidad de elementos: 1, 2, 10, 15 Buscar: el primero, el último, menor al primero, mayor al último Introducción a la Programación Orientada a Objetos

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5 6

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5 6

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5 6 9

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5 6 9

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5 6 9 11

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5 6 9 11

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5 6 9 11 25

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5 6 9 11 25

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5 6 9 11 25 40

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5 6 9 11 25 40 42 47 50

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5 6 9 11 25 40 42 47 50

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5 6 9 11 25 40 42 47 50 55

Intercalar dos estructuras ordenadas 5 6 9 11 40 42 47 50 3 25 55 60 72 3 5 6 9 11 25 40 42 47 50 55 60 72

Intercalar dos estructuras ordenadas Algoritmo Intercalar Mientras no lleguemos al final de ninguna colección Comparar elemento a elemento e insertar el menor en una nueva colección Si llegamos al final de la primera colección Insertar los elementos que quedan de la segunda colección en la nueva Sino Insertar los elementos que quedan de la primer colección en la nueva Introducción a la Programación Orientada a Objetos

Intercalar dos estructuras ordenadas Algoritmo Intercalar Crear nueva i1  0 i2  0 k  0 mientras i1 < n1 y i2 < n2 si L1i1 es menor que L2i2 insertar Li1 en Nuevak i1++ k++ sino insertar Li2 en Nuevak i2++ k++ Insertar el resto Introducción a la Programación Orientada a Objetos ¿Qué ocurre si un elemento pertenece a las dos estructuras? Modifique el algoritmo para que solo se inserte uno de los elementos.

Caso de Estudio: Libreta de Contactos Libreta_Contactos Contacto T [] Contacto cant:entero nombre:String nroMovil: String nroFijo:String email:String ciudad:String << Constructores>> Libreta_Contactos(max:entero) <<Comandos>> nuevo(nc:Contacto) eliminar(c:Contacto) <<Consultas>> cantContactos():entero estaLlena():entero pertenece(c:Contacto):boolean intercalar(l:Libreta_Contactos): Libreta_Contactos <<Constructor>> Contacto (n:String) <<Comandos>> <<Consultas>> igual(c: Contacto):boolean mayor(c: Contacto):boolean ¿Qué cambios hay que hacer en Libreta_Contactos?

Caso de Estudio: Libreta de Contactos Libreta_Contactos Contacto T [] Contacto cant:entero nombre:String nroMovil: String nroFijo:String email:String ciudad:String << Constructores>> Libreta_Contactos(max:entero) <<Comandos>> nuevo(nc:Contacto) eliminar(c:Contacto) <<Consultas>> cantContactos():entero estaLlena():entero pertenece(c:Contacto):boolean intercalar(l:Libreta_Contactos): Libreta_Contactos <<Constructor>> Contacto (n:String) <<Comandos>> <<Consultas>> igual(c: Contacto):boolean mayor(c: Contacto):boolean ¿Y si la libreta tienen que quedar ordenada por nroMovil?

Caso de Estudio: Nómina de Pacientes Nomina_Pacientes Paciente T [] Paciente cant:entero tipoDoc:char nroDoc:entero fechaNac:Fecha nombre: String os:String << Constructores>> Nomina_Pacientes(max:entero) <<Comandos>> nuevo(p: Paciente) eliminar(p: Paciente) <<Consultas>> cantPacientes():entero cantPacientesOS(os:String):entero estaLlena():entero pertenece(c:Marcador):boolean intercalar(l: Nomina_Pacientes): Nomina_Pacientes <<Constructor>> Paciente () <<Comandos>> <<Consultas>> igual (c: Paciente):boolean mayor (c: Paciente):boolean ¿Qué métodos cambian?

Caso de Estudio: Libreta de Marcadores Libreta_Marcadores Marcador T [] Marcador cant:entero … << Constructores>> Libreta_Marcadores(max:entero) <<Comandos>> nuevo(nm: Marcador) eliminar(c: Marcador) <<Consultas>> cantMarcadores():entero estaLlena():entero pertenece(c:Marcador):boolean intercalar(l: Libreta_Marcadores): Libreta_Marcadores <<Constructor>> Marcador (n:String) <<Comandos>> <<Consultas>> mayor (c: Marcador):boolean ¿Qué métodos cambian si puede haber repetidos?

Caso de Estudio: Agenda de Turnos Una empresa de desarrollo de software desea ofrecer un sistema de gestión de turnos para médicos. Por cada turno se registra fecha, hora y los datos del paciente. El diseñador define la clase Turno con atributos fecha, hora y paciente. El sistema debe permitir agendar un nuevo turno, controlando que no exista otro con la misma fecha y hora. La clase Agenda encapsula una colección de elementos de clase Turno, representada con un arreglo parcialmente ocupado. Los elementos se mantienen ordenados cronológicamente por fecha y hora y están comprimidos de modo que todas las posiciones libres están al final. El servicio igual de la clase Turno retorna true si el objeto que recibe el mensaje tiene los mismos valores que el parámetro en los atributos dia y hora.

Caso de Estudio: Agenda de Turnos T [] Turno cant:entero dia: Fecha hora: Horario paciente: Paciente << Constructores>> Agenda(max:entero) <<Comandos>> agendar(t:Turno):boolean eliminar(t:Turno) <<Consultas>> cantTurnos():entero estaLlena():entero cantTurnosOSFecha(f:Fecha,o:String) :entero estaLibre(d:Fecha,h:Horario):boolean <<Constructor>> Turno (d:Fecha, h:Horario,p:Paciente) <<Comandos>> <<Consultas>> obtenerPaciente():Paciente igual (t:Turno):boolean mayor (t: Turno):boolean Paciente tipoDoc:char nroDoc:entero fechaNac:Fecha nombre: String os:String

Caso de Estudio: Agenda de Turnos T [] Turno cant:entero << Constructores>> Agenda(max:entero) <<Comandos>> agendar(t:Turno):boolean eliminar(t:Turno) <<Consultas>> cantTurnos():entero estaLlena():entero cantTurnosOSFecha(f:Fecha,o:String) :entero estaLibre(d:Fecha,h:Horario):boolean agendar(t:Turno):boolean retorna true si no existe un turno con la misma fecha y hora que el parámetro en cuyo caso inserta a t ordenadamente. Requiere que la estructura no este llena

Caso de Estudio: Agenda de Turnos class Agenda{ //Atributos de Instancia private Turno[] T; private int cant; /*Constructor crea una coleccion con capacidad para max elementos*/ public Agenda(int max) { T= new Turno[max]; cant = 0; }

Caso de Estudio: Agenda de Turnos DrPerez :Agenda length 100 Agenda DrPerez = Agenda(100);

Caso de Estudio: Agenda de Turnos DrGomez :Agenda length 150 Agenda DrGomez = Agenda(150);

Caso de Estudio: Agenda de Turnos unTurno DrGomez :Agenda :Turno … length :Paciente 1 150 DrGomez.agendar(unTurno);

Caso de Estudio: Agenda de Turnos La clase Agenda_Turnos define un TDA a partir del cual pueden crearse varias instancias. Si la agenda de turnos de un médico se mantiene ordenada de acuerdo a los atributos fecha y hora, el servicio agendar no puede implementarse asignando el nuevo Turno a la primera posición libre. Cada vez que el objeto ligado a agendaDrPerez recibe el mensaje agendar debe verificar si existe un turno con la misma fecha y hora y si no existe, buscar la posición para insertar el nuevo turno.

Caso de Estudio: Agenda de Turnos Los casos de prueba deben permitir verificar si el servicio inserta un nuevo turno correctamente considerando que: La agenda está vacía el Turno es: Menor a todos Mayor a todos Mayor al primero pero Menor que el último Asumimos que la clase cliente controla que la agenda no está llena.

Caso de Estudio: Agenda de Turnos Algoritmo agendar DE turno Buscar un turno en la agenda con la misma fecha y hora que turno si no existe Buscar la posición del primer elemento mayor a turno Arrastrar todos los elementos a partir de esa posición Asignar turno a la posición Incrementar cant Observemos que cuando diseñamos el algoritmo nos desentendemos de algunos detalles, por ejemplo retornar un valor booleano Esta solución no es eficiente

Caso de Estudio: Agenda de Turnos Algoritmo agendar DE turno Buscar un turno en la agenda con la misma fecha y hora que turno si no existe Buscar la posición de inserción desde el final hacia el principio, copiando cada turno en la posición que sigue Asignar turno a la posición Incrementar cant Implementar esta versión del algoritmo

Caso de Estudio: Agenda de Turnos Algoritmo agendar DE turno Buscar un turno con fecha y hora mayor o igual a turno si el turno tiene mayor fecha y hora Arrastrar todos los elementos a partir de esa posición Asignar turno Incrementar cant

Caso de Estudio: Agenda de Turnos Algoritmo agendar DE turno Buscar la posición de un turno con fecha y hora mayor o igual a turno si la fecha y hora del turno en posición es mayor que turno Arrastrar todos los elementos a partir de esa posición Asignar turno a la posición Incrementar cant

Caso de Estudio: Agenda de Turnos public boolean agendar(Turno turno){ /* retorna true si no existe un turno con la misma fecha y hora que el parámetro en cuyo caso inserta a t ordenadamente. Requiere que la estructura no este llena */ boolean agendo = false; int pos = posMayoroIgual(turno); if (T[pos].mayor(turno)){ arrastrarDsp (pos); T[pos] = turno; cant++; agendo = true; } return agendo;

Caso de Estudio: Agenda de Turnos private int posMayoroIgual (Turno turno){ /* Retornar la posición del primer elemento mayor o igual a turno, si no existe ningun elemento mayor o a turno en la colección retorna cant*/ int pos = 0; boolean salir=false; while (pos < cantTurnos() && !salir){ if (T[pos].mayor(turno)|| T[pos].igual(turno)) salir = true; else pos++; } private void arrastrarDsp (int pos){ for (int i=cantTurnos();i>pos; i--) T[i] = T[i-1]; }

Caso de Estudio: Agenda de Turnos private int cantTurnosOSFecha (Fecha f,String o){ /* Computa la cantidad de turnos dados para la fecha f para pacientes de la obra social o*/ Paciente pac; int cont=0; for (int i=0;i<cantTurnos(); i++){ pac = T[i].obtenerPaciente(); if (T[i].obtenerFecha.equals(f) && pac.obtenerOS().equals(o)) cont++; } return cont; Esta solución no es eficiente

Caso de Estudio: Agenda de Turnos Algoritmo cantTurnosOSFecha DE f,o Buscar la posición del primer turno con fecha igual a f o mayor que f Si existe un turno con fecha f Contar todos los turnos que corresponden a pacientes con la obra social o hasta que cambie la fecha Implementar esta versión del algoritmo

Caso de Estudio: Agenda de Turnos NominaPacientes Paciente T [] Paciente cant:entero tipoDoc:char nroDoc:entero fechaNac:Fecha nombre: String os:String << Constructores>> NominaPacientes(max:entero) <<Comandos>> ingresar(t:Turno):boolean <<Consultas>> cantPacientes():entero estaLlena():entero estaPaciente(t:char,n:entero) :boolean Observemos que el sistema completo puede incluir a otras clases que referencien a los objetos de la clase Paciente, por ejemplo, la nómina completa de pacientes.

Caso de Estudio: Agenda de Turnos :nomina :Turno … length … length :Paciente 1 150 500