Introduccin a la Programacin Orientada a Objetos Encapsulamiento
Introducción a la Programación Orientada a Objetos Encapsulamiento y Abstracción Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR 2019 IPOO 2 cuatrimestre 2019 Sonia Rueda
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 T [] Contacto cant: entero << Constructores>> Libreta_Contactos(max: entero) <<Comandos>> nuevo(nc: Contacto) eliminar(c: Contacto) <<Consultas>> cant. Contactos(): entero esta. Llena(): boolean pertenece(c: Contacto): boolean intercalar(l: Libreta_Contactos): Libreta_Contactos Contacto nombre: String nro. Movil: String nro. Fijo: String email: String <<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 capacidad para max elementos*/ public Libreta_Contactos(int max) { T= new Contacto[max]; cant = 0; }
Caso de Estudio: Libreta de Contactos lib T 0 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 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 = pos. Insercion(nc, cant); arrastrar. Dsp (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 pos. Insercion (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 = pos. Insercion (nc, --n); return pos; }
Caso de Estudio: Libreta de Contactos private void arrastrar. Dsp (int pos, int n){ if (n > 0){ T[pos+n] = T[pos+n-1]; arrastrar. Dsp(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 Libreta_Contactos T [] Contacto cant: entero << Constructores>> Libreta_Contactos(max: entero) <<Comandos>> nuevo(nc: Contacto) eliminar(c: Contacto) <<Consultas>> cant. Contactos(): entero esta. Llena(): entero pertenece(c: Contacto): boolean intercalar(l: Libreta_Contactos): Libreta_Contactos Contacto nombre: String nro. Movil: String nro. Fijo: String email: String <<Constructor>> Contacto (n: String) <<Comandos>> <<Consultas>> igual(c: Contacto): boolean mayor(c: Contacto): boolean ¿Y si la libreta tiene quedar ordenada por nro. Movil? ¿Qué cambios hay que hacer en Libreta_Contactos?
Caso de Estudio: Libreta de Contactos Libreta_Contactos T [] Contacto cant: entero << Constructores>> Libreta_Contactos(max: entero) <<Comandos>> nuevo(nc: Contacto) eliminar(c: Contacto) <<Consultas>> cant. Contactos(): entero esta. Llena(): entero pertenece(c: Contacto): boolean intercalar(l: Libreta_Contactos): Libreta_Contactos Contacto nombre: String nro. Movil: String nro. Fijo: String email: String ciudad: String Contacto. Corporativo empresa: String ¿Si se especializa la clase Contacto? ¿Qué cambios hay que hacer en Libreta_Contactos?
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 = pos. Elemento (c, cant); if (pos < cant){ arrastrar. Ant(pos, cant-pos-1); cant--; } }
Caso de Estudio: Libreta de Contactos Libreta_Contactos T [] Contacto cant: entero << Constructores>> Libreta_Contactos(max: entero) <<Comandos>> nuevo(nc: Contacto) eliminar(c: Contacto) <<Consultas>> cant. Contactos(): entero esta. Llena(): entero pertenece(c: Contacto): boolean intercalar(l: Libreta_Contactos): Libreta_Contactos Contacto nombre: String nro. Movil: String nro. Fijo: String email: String <<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
La búsqueda binaria requiere que la estructura esté ordenada y consiste en partirla en mitades, considerando que el elemento buscado puede ser: • igual al que está en el medio • menor que el que está en el medio • mayor que el que está en el medio Introducción a la Programación Orientada a Objetos Búsqueda en una estructura ordenada
3 Si busco el número 17 ÉXITO 12 Mitad 17 22 23 45 Introducción a la Programación Orientada a Objetos Búsqueda en una estructura ordenada
3 Si busco el número 23 12 Mitad Descarto la primera mitad y busco en la segunda 17 22 23 45 Introducción a la Programación Orientada a Objetos Búsqueda en una estructura ordenada
3 12 Si busco el número 23 ÉXITO 17 22 Mitad 23 45 Introducción a la Programación Orientada a Objetos Búsqueda en una estructura ordenada
3 Si busco el número 21 Descarto la primera mitad y busco en la segunda 12 Mitad 17 22 23 45 Introducción a la Programación Orientada a Objetos Búsqueda en una estructura ordenada
3 Si busco el número 21 Descarto la segunda mitad y busco Mitad en la primera 12 17 22 23 45 Introducción a la Programación Orientada a Objetos Búsqueda en una estructura ordenada
3 12 Si busco el número 21 NO ESTÁ 17 Mitad 22 23 45 Introducción a la Programación Orientada a Objetos 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 sino si el elemento que está en la mitad es menor al buscado Descartar la primera mitad Buscar en la segunda mitad sino Refinamos la Descartar la segunda mitad solución Buscar en la primera mitad Introducción a la Programación Orientada a Objetos Búsqueda en una estructura ordenada
Algoritmo Búsqueda. Binaria DE ini, fin, Elem Mitad (ini+fin)/2 si Lmitad = Elem EXISTE El algoritmo es si ini >= fin independiente NO EXISTE del lenguaje de sino implementación si Lmitad < Elem ini = mitad+1 Buscar. Binaria ini, fin, Elem sino fin = mitad-1 Busqueda. Binaria ini, fin, Elem Introducción a la Programación Orientada a Objetos 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 Búsqueda en una estructura ordenada
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 9 11 40 42 47 50
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 9 11 40 42 47 50
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 9 11 40 42 47 50
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 11 40 42 47 50
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 11 40 42 47 50
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 6 11 40 42 47 50
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 6 11 40 42 47 50
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 6 11 40 42 47 50 9
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 6 11 40 42 47 50 9
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 6 11 40 42 47 50 9 11
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 6 11 40 42 47 50 9 11
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 6 11 40 42 47 50 9 11 25
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 6 11 40 42 47 50 9 11 25
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 6 11 40 42 47 50 9 11 25 40
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 6 11 40 42 47 50 9 11 25 40 42 47 50
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 6 11 40 42 47 50 9 11 25 40 42 47 50
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 6 11 40 42 47 50 9 11 25 40 42 47 50 55
Intercalar dos estructuras ordenadas 5 6 3 25 55 60 72 3 5 9 6 11 40 42 47 50 9 11 25 40 42 47 50 55 60 72
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 quedan de la segunda colección en la nueva Sino Insertar los elementos 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 i 1 0 i 2 0 k 0 mientras i 1 < n 1 y i 2 < n 2 si L 1 i 1 es menor que L 2 i 2 insertar Li 1 en Nuevak i 1++ k++ sino insertar Li 2 en Nuevak i 2++ k++ Insertar el resto ¿Qué ocurre si un elemento pertenece a las dos estructuras? Modifique el algoritmo para que solo se inserte uno de los elementos. Introducción a la Programación Orientada a Objetos Intercalar dos estructuras ordenadas
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: Nómina de Pacientes Nomina_Pacientes T [] Paciente cant: entero << Constructores>> Nomina_Pacientes(max: entero) <<Comandos>> nuevo(p: Paciente) eliminar(p: Paciente) <<Consultas>> cant. Pacientes(): entero cant. Pacientes. OS(os: String): entero esta. Llena(): entero pertenece(c: Marcador): boolean intercalar(l: Nomina_Pacientes): Nomina_Pacientes ¿Qué métodos cambian? Paciente tipo. Doc: char nro. Doc: entero fecha. Nac: Fecha nombre: String os: String <<Constructor>> Paciente () <<Comandos>> <<Consultas>> igual (c: Paciente): boolean mayor (c: Paciente): boolean
Caso de Estudio: Libreta de Marcadores Libreta_Marcadores T [] Marcador cant: entero << Constructores>> Libreta_Marcadores(max: entero) <<Comandos>> nuevo(nm: Marcador) eliminar(c: Marcador) <<Consultas>> cant. Marcadores(): entero esta. Llena(): entero pertenece(c: Marcador): boolean intercalar(l: Libreta_Marcadores): Libreta_Marcadores Marcador … <<Constructor>> Marcador (n: String) <<Comandos>> <<Consultas>> mayor (c: Marcador): boolean ¿Qué métodos cambian si puede haber repetidos?
Caso de Estudio: Agenda de Turnos Agenda T [] Turno cant: entero << Constructores>> Agenda(max: entero) <<Comandos>> agendar(t: Turno): boolean eliminar(t: Turno) <<Consultas>> cant. Turnos(): entero esta. Llena(): entero cant. Turnos. OSFecha(f: Fecha, o: String) : entero esta. Libre(d: Fecha, h: Horario): boolean Turno dia: Fecha hora: Horario paciente: Paciente <<Constructor>> Turno (d: Fecha, h: Horario, p: Paciente) <<Comandos>> <<Consultas>> obtener. Paciente(): Paciente igual (t: Turno): boolean mayor (t: Turno): boolean Paciente tipo. Doc: char nro. Doc: entero fecha. Nac: Fecha nombre: String os: String
Caso de Estudio: Agenda de Turnos Agenda T [] Turno cant: entero << Constructores>> Agenda(max: entero) <<Comandos>> agendar(t: Turno): boolean eliminar(t: Turno) <<Consultas>> cant. Turnos(): entero esta. Llena(): entero cant. Turnos. OSFecha(f: Fecha, o: String) : entero esta. Libre(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 capacidad para max elementos*/ public Agenda(int max) { T= new Turno[max]; cant = 0; }
Caso de Estudio: Agenda de Turnos Dr. Perez : Agenda 0 length 100 Agenda Dr. Perez = Agenda(100);
Caso de Estudio: Agenda de Turnos Dr. Gomez : Agenda 0 length 150 Agenda Dr. Gomez = Agenda(150);
Caso de Estudio: Agenda de Turnos Dr. Gomez un. Turno : Agenda : Turno : Paciente 1 … length 150 Dr. Gomez. agendar(un. Turno);
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 agenda. Dr. Perez 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 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 = pos. Mayoro. Igual(turno); if (T[pos]. mayor(turno)){ arrastrar. Dsp (pos); T[pos] = turno; cant++; agendo = true; } return agendo; }
Caso de Estudio: Agenda de Turnos private int pos. Mayoro. Igual (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 < cant. Turnos() && !salir){ if (T[pos]. mayor(turno)|| T[pos]. igual(turno)) salir = true; else pos++; } } private void arrastrar. Dsp (int pos){ for (int i=cant. Turnos(); i>pos; i--) T[i] = T[i-1]; }
Caso de Estudio: Agenda de Turnos private int cant. Turnos. OSFecha (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<cant. Turnos(); i++){ pac = T[i]. obtener. Paciente(); if (T[i]. obtener. Fecha. equals(f) && pac. obtener. OS(). equals(o)) cont++; } return cont; } Esta solución no es eficiente
Caso de Estudio: Agenda de Turnos Algoritmo cant. Turnos. OSFecha 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 Nomina. Pacientes T [] Paciente cant: entero << Constructores>> Nomina. Pacientes(max: entero) <<Comandos>> ingresar(t: Turno): boolean <<Consultas>> cant. Pacientes(): entero esta. Llena(): entero esta. Paciente(t: char, n: entero) : boolean Paciente tipo. Doc: char nro. Doc: entero fecha. Nac: Fecha nombre: String os: String 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 : Agenda : nomina : Turno : Paciente 1 … … length 150 500
- Slides: 88