Faça a especificação de um sistema de controle de reservas de um clube que aluga quadras poliesportivas usando TAD.
Passo 1
Este exercício pede para a gente especificar, via TAD (Tipo Abstrato de Dados), um sistema de controle de reservas de quadras poliesportivas em um clube. O conteúdo é projeto de TADs, e vamos precisar definir os tipos abstratos (Quadra, Reserva, SistemaReservas), suas operações (construtores, observadores, modificadores) e os axiomas que garantem o comportamento esperado.
Passo 2
Definir o TAD Quadra com: · Tipo abstrato: Quadra · Construtores: criaQuadra(id: String, tipo: String): Quadra · Observadores: getId(q: Quadra): String getTipo(q: Quadra): String · Axioma principal: getId(criaQuadra(i,t)) = i e getTipo(criaQuadra(i,t)) = t.
Definir o TAD Reserva com: · Tipo abstrato: Reserva · Construtores: criaReserva(idRes: String, quadra: Quadra, data: Date, horaInicio: Time, horaFim: Time, cliente: String): Reserva · Observadores: getResId(r: Reserva): String getQuadra(r: Reserva): Quadra getData(r: Reserva): Date getHoraInicio(r: Reserva): Time getHoraFim(r: Reserva): Time getCliente(r: Reserva): String · Axiomas: cada observador extrai o campo correspondente do construtor.
Definir o TAD SistemaReservas com: · Tipo abstrato: SistemaReservas · Construtores: criaSistema(): SistemaReservas · Modificadores: adicionaQuadra(s: SistemaReservas, q: Quadra): SistemaReservas removeQuadra(s: SistemaReservas, q: Quadra): SistemaReservas fazReserva(s: SistemaReservas, r: Reserva): SistemaReservas cancelaReserva(s: SistemaReservas, idRes: String): SistemaReservas · Observadores: listaQuadras(s: SistemaReservas): Set<Quadra> listaReservas(s: SistemaReservas): Set<Reserva> quadrasDisponiveis(s: SistemaReservas, data: Date, horaInicio: Time, horaFim: Time): Set<Quadra> · Axiomas básicos: – Em criaSistema, listaQuadras = ∅ e listaReservas = ∅. – Em adicionaQuadra, listaQuadras novo = listaQuadras velho ∪ {q}. – Em removeQuadra, listaQuadras novo = listaQuadras velho \ {q} e elimina reservas associadas. – Em fazReserva, só adiciona r se não houver conflito de horário com mesmas quadra e data. – Em cancelaReserva, listaReservas novo = listaReservas velho \ {res com id = idRes}.
Definir o TAD Reserva com: · Tipo abstrato: Reserva · Construtores: criaReserva(idRes: String, quadra: Quadra, data: Date, horaInicio: Time, horaFim: Time, cliente: String): Reserva · Observadores: getResId(r: Reserva): String getQuadra(r: Reserva): Quadra getData(r: Reserva): Date getHoraInicio(r: Reserva): Time getHoraFim(r: Reserva): Time getCliente(r: Reserva): String · Axiomas: cada observador extrai o campo correspondente do construtor.
Definir o TAD SistemaReservas com: · Tipo abstrato: SistemaReservas · Construtores: criaSistema(): SistemaReservas · Modificadores: adicionaQuadra(s: SistemaReservas, q: Quadra): SistemaReservas removeQuadra(s: SistemaReservas, q: Quadra): SistemaReservas fazReserva(s: SistemaReservas, r: Reserva): SistemaReservas cancelaReserva(s: SistemaReservas, idRes: String): SistemaReservas · Observadores: listaQuadras(s: SistemaReservas): Set<Quadra> listaReservas(s: SistemaReservas): Set<Reserva> quadrasDisponiveis(s: SistemaReservas, data: Date, horaInicio: Time, horaFim: Time): Set<Quadra> · Axiomas básicos: – Em criaSistema, listaQuadras = ∅ e listaReservas = ∅. – Em adicionaQuadra, listaQuadras novo = listaQuadras velho ∪ {q}. – Em removeQuadra, listaQuadras novo = listaQuadras velho \ {q} e elimina reservas associadas. – Em fazReserva, só adiciona r se não houver conflito de horário com mesmas quadra e data. – Em cancelaReserva, listaReservas novo = listaReservas velho \ {res com id = idRes}.
Passo 3
Com esses TADs e axiomas, garantimos a integridade das operações de cadastro de quadras e reservas, verificação de disponibilidade e cancelamento. A especificação fica completa e pronta para servir de base a uma implementação concreta.
Resposta
TAD Quadra
Construtor:
· criaQuadra(id: String, tipo: String): Quadra
Observadores:
· getId(q: Quadra): String
· getTipo(q: Quadra): String
Axiomas:
· getId(criaQuadra(i,t)) = i
· getTipo(criaQuadra(i,t)) = t
Construtor:
· criaQuadra(id: String, tipo: String): Quadra
Observadores:
· getId(q: Quadra): String
· getTipo(q: Quadra): String
Axiomas:
· getId(criaQuadra(i,t)) = i
· getTipo(criaQuadra(i,t)) = t
TAD Reserva
Construtor:
· criaReserva(idRes: String, quadra: Quadra, data: Date, horaInicio: Time, horaFim: Time, cliente: String): Reserva
Observadores:
· getResId(r: Reserva): String
· getQuadra(r: Reserva): Quadra
· getData(r: Reserva): Date
· getHoraInicio(r: Reserva): Time
· getHoraFim(r: Reserva): Time
· getCliente(r: Reserva): String
Axiomas:
· getResId(criaReserva(i,q,d,hi,hf,c)) = i (e similar para os outros campos)
Construtor:
· criaReserva(idRes: String, quadra: Quadra, data: Date, horaInicio: Time, horaFim: Time, cliente: String): Reserva
Observadores:
· getResId(r: Reserva): String
· getQuadra(r: Reserva): Quadra
· getData(r: Reserva): Date
· getHoraInicio(r: Reserva): Time
· getHoraFim(r: Reserva): Time
· getCliente(r: Reserva): String
Axiomas:
· getResId(criaReserva(i,q,d,hi,hf,c)) = i (e similar para os outros campos)
TAD SistemaReservas
Construtor:
· criaSistema(): SistemaReservas
Modificadores:
· adicionaQuadra(s: SistemaReservas, q: Quadra): SistemaReservas
· removeQuadra(s: SistemaReservas, q: Quadra): SistemaReservas
· fazReserva(s: SistemaReservas, r: Reserva): SistemaReservas
· cancelaReserva(s: SistemaReservas, idRes: String): SistemaReservas
Observadores:
· listaQuadras(s: SistemaReservas): Set<Quadra>
· listaReservas(s: SistemaReservas): Set<Reserva>
· quadrasDisponiveis(s: SistemaReservas, data: Date, horaInicio: Time, horaFim: Time): Set<Quadra>
Axiomas principais:
· listaQuadras(criaSistema()) = ∅
· listaReservas(criaSistema()) = ∅
· listaQuadras(adicionaQuadra(s,q)) = listaQuadras(s) ∪ {q}
· listaQuadras(removeQuadra(s,q)) = listaQuadras(s) \ {q}, listaReservas(removeQuadra(s,q)) filtra sem reservas de q
· fazReserva(s,r) adiciona r a listaReservas(s) se não houver conflito de data/hora na mesma quadra
· cancelaReserva(s,idRes) remove reserva com getResId = idRes de listaReservas(s)
Construtor:
· criaSistema(): SistemaReservas
Modificadores:
· adicionaQuadra(s: SistemaReservas, q: Quadra): SistemaReservas
· removeQuadra(s: SistemaReservas, q: Quadra): SistemaReservas
· fazReserva(s: SistemaReservas, r: Reserva): SistemaReservas
· cancelaReserva(s: SistemaReservas, idRes: String): SistemaReservas
Observadores:
· listaQuadras(s: SistemaReservas): Set<Quadra>
· listaReservas(s: SistemaReservas): Set<Reserva>
· quadrasDisponiveis(s: SistemaReservas, data: Date, horaInicio: Time, horaFim: Time): Set<Quadra>
Axiomas principais:
· listaQuadras(criaSistema()) = ∅
· listaReservas(criaSistema()) = ∅
· listaQuadras(adicionaQuadra(s,q)) = listaQuadras(s) ∪ {q}
· listaQuadras(removeQuadra(s,q)) = listaQuadras(s) \ {q}, listaReservas(removeQuadra(s,q)) filtra sem reservas de q
· fazReserva(s,r) adiciona r a listaReservas(s) se não houver conflito de data/hora na mesma quadra
· cancelaReserva(s,idRes) remove reserva com getResId = idRes de listaReservas(s)