La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo.

Presentaciones similares


Presentación del tema: "0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo."— Transcripción de la presentación:

1 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo de Dato Abstracto Colección ordenada Dr. Luciano H. Tamargo http://cs.uns.edu.ar/~lt Depto. de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur, Bahía Blanca 2015

2 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 TIPO DE DATO ABSTRACTO Un tipo de dato es un conjunto de valores y un conjunto de operaciones definidas para estos valores. Cuando la representación de los datos y la implementación de las operaciones están encapsuladas, el tipo de dato es abstracto. Un tipo de dato abstracto (TDA) define un patrón a partir del cual es posible crear instancias sin conocer la representación interna de los valores ni la implementación de las operaciones. Introducción a la Programación Orientada a Objetos IPOO - 2015 2

3 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: AGENDA DE TURNOS Una Agenda de Turnos de un médico mantiene fecha, hora y paciente al cual se le asigna un turno. 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 agendar es responsable de controlar que no haya dos turnos en el mismo día y hora. Si no puede agregar el nuevo turno retorna false. Introducción a la Programación Orientada a Objetos IPOO - 2015 3

4 Agenda > t [] Turno cant: entero > Agenda(max: entero) > agendar(t: Turno): boolean eliminar(t: Turno) > cantTurnos(): entero estaLlena(): boolean cantTurnosOSFechas(f: Fecha, o: String): entero estaLibre(d: Fecha, h: Horario): boolean Turno dia: Fecha hora: Horario paciente: Paciente > Turno (d:Fecha, h:Horario, p:Paciente) > igual(t: Turno): boolean mayor(t: Turno): boolean Paciente tipoDoc:char nroDoc:entero fechaNac:Fecha nombre: String os:String

5 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: AGENDA DE TURNOS La clave de un objeto es el atributo o los atributos que distinguen a un objeto de otro. El tipo y número de documento puede ser la clave de un paciente, porque no habrá dos pacientes con el mismo tipo y número de documento. El día y hora puede ser la clave de un turno, porque no debería haber en una misma agenda dos turnos con la misma fecha en el mismo horario. 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. Introducción a la Programación Orientada a Objetos IPOO - 2015 5

6 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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

7 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: AGENDA DE TURNOS 7 … length 100 t cant 0 :Agenda Agenda agendaDrPerez = new Agenda(100); agendaDrPerez

8 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: AGENDA DE TURNOS 8 … length 150 t cant 0 :Libreta_Contactos Agenda agendaDrGomez = new Agenda(150); agendaDrGomez

9 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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 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. Introducción a la Programación Orientada a Objetos IPOO - 2015 9

10 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: AGENDA DE TURNOS El servicio agendar tiene que funcionar considerando varios casos diferentes: 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. Introducción a la Programación Orientada a Objetos IPOO - 2015 10

11 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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 11 Observemos que cuando diseñamos el algoritmo nos desentendemos de algunos detalles, por ejemplo retornar un valor booleano Esta solución no es eficiente

12 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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 12 Implementar esta versión del algoritmo

13 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 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 el turno tiene mayor fecha y hora Arrastrar todos los elementos a partir de esa posición Asignar turno a la posición Incrementar cant 13

14 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: AGENDA DE TURNOS public boolean agendar(Turno turno){ //Requiere que la colección no esté llena boolean agendo = false; int pos = posMayoroIgual(turno); if (t[pos].mayor(turno)){ arrastrarDsp(pos); t[pos] = turno; cant++; agendo = true; } return agendo; } Introducción a la Programación Orientada a Objetos IPOO - 2015 14

15 private int posMayoroIgual (Turno turno){ /* Retornar la posición del primer elemento mayor o igual a turno*/ 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]; }

16 16 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; }

17 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 CASO DE ESTUDIO: AGENDA DE TURNOS Algoritmo cantTurnosFecha 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 17 Implementar esta versión del algoritmo

18 NominaPacientes > T [] Paciente cant:entero > NominaPacientes(max:entero) > ingresar(t:Turno):boolean > cantPacientes():entero estaLlena():entero estaPaciente(t:char,n:entero) :boolean Paciente tipoDoc:char nroDoc:entero fechaNac: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.


Descargar ppt "0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 11 1 0 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo."

Presentaciones similares


Anuncios Google