Programação Orientada para Objectos
ISCTE
Ano lectivo 2000/2001
2º Semestre
Problema 2
Notas:
- Os casos omissos neste enunciado deverão ser esclarecidos junto de um dos
docentes da disciplina.
- Resolvido
em grupo (ver página da disciplina). Os grupos são os mesmos do
Problema 1.
- Resolução
entregue pessoalmente a um dos docentes da disciplina até às 18:30h de 27
de Abril de 2001.
- Resolução
entregue em disquete, devidamente identificada, contendo apenas
os ficheiros onde se encontra o código, o respectivo ficheiro de
construção (
Makefile) e os ficheiros de dados necessários
para efectuar um teste do programa desenvolvido, acompanhada por uma
listagem dos ficheiros fonte (contendo código C++). Use o modelo
fornecido: StarOffice, Word,
ou RTF.
Deve também enviar uma mensagem de correio electrónico com os ficheiros de código fonte (.H,
.C e _impl.H, caso existam) para Luis.Nunes@iscte.pt.
- Imprima
o código em C++ sempre de uma forma bem legível: use sempre um tipo não
proporcional (e.g., Courier) e, caso seja possível fazê-lo, imprima em
papel reciclado, frente-e-verso.
- A
entrega de resoluções fora do prazo implica a penalização de um (1)
valor por dia útil de atraso, não se aceitando resoluções entregues com
mais do que 5 dias úteis de atraso (i.e., depois das 18:30h de dia 4 de Maio de 2001).
- A
não observação dos modos de entrega descritos acima poderá ser
penalizada.
- Exija ao docente a entrega de um recibo comprovativo da entrega do
trabalho. Este recibo é a única prova que tem da entrega do seu
trabalho.
1 Objectivo
A pensão de D. Matilde na Ericeira está a crescer e ela, de modo a ter tudo
muito bem organizado, decidiu usar um sistema informático para gerir as
reservas de quartos. Isto deu-lhe um certo trabalho, pois teve de compreender
bem as características e funcionalidades que lhe eram importantes e descrevê-las de
uma maneira objectiva. Assim ela chegou às seguintes conclusões:
- Os quartos podem ser individuais ou duplos, ter minibar e ter casa de banho
privada, têm um dado preço por dia, são identificados por
uma cadeia de caracteres e podem estar livres ou ocupados.
- Estando ocupados, é necessário guardar no sistema os dados relativos à ocupação
de cada quarto: data de início da ocupação, data prevista de fim da
ocupação e nome do cliente.
- Naturalmente, as reservas têm uma data de início e uma data de fim, o
nome do cliente e um código (cadeia de caracteres) que as identifica.
- Está a pensar fazer umas obras, pelo que ela deseja que o sistema possibilite
o aumento ou diminuição do número de quartos.
A informação sobre os quartos encontra-se num ficheiro (quartos.txt)
com o seguinte formato (os comentários não fazem parte do ficheiro):
5
// Número de quartos.
I01 // Identificador
do quarto.
individual // Tipo de quarto.
sim // Tem WC?
sim // Tem
minibar?
30 // Preço
em euros.
ocupado // Livre ou ocupado?
2001 // Data de entrada (só existe se o
quarto está ocupado)
3
30
2001 // Data de saída (só existe se o
quarto está ocupado)
4
8
Laurinda Luz // Nome do cliente (só existe se o quarto está
ocupado)
I02 // Identificador
do quarto.
individual // Tipo de quarto.
sim // Tem WC?
sim // Tem
minibar?
30 // Preço
em euros.
livre // Livre ou
ocupado?
D03 // Identificador
do quarto.
duplo // Tipo de quarto.
sim // Tem WC?
sim // Tem
minibar?
50 // Preço
em euros.
ocupado // Livre ou ocupado?
2001 // Data de entrada (só existe se o
quarto está ocupado)
3
30
2001 // Data de saída (só existe se o
quarto está ocupado)
4
13
Tiago Serpa // Nome do cliente (só existe se o quarto está
ocupado)
D11
// Identificador do quarto.
duplo // Tipo de quarto.
não // Tem WC?
não // Tem
minibar?
40 // Preço
em euros.
livre // Livre ou
ocupado?
D12 // Identificador
do quarto.
duplo // Tipo de quarto.
não // Tem WC?
não // Tem
minibar?
40 // Preço
em euros.
livre // Livre ou
ocupado?
A informação sobre as reservas (reservas.txt) encontra-se num ficheiro com o seguinte
formato:
5
// Número de quartos.
I01
// Identificador
do quarto.
0
// Número
de reservas.
I02
// Identificador
do quarto.
2
// Número
de reservas.
R2
// Código de reserva.
2001 // Início.
3
30
2001 // Fim.
4
1
Paulo Diogo // Nome do cliente.
R3
// Código
de reserva.
2001 // Início.
4
1
2001 // Fim.
4
7
Susana Estrela // Nome do cliente.
D03 // Identificador
do quarto.
0 // Número
de reservas.
D11
// Identificador do quarto.
1 // Número
de reservas
R4
// Código
de reserva.
2001 // Início.
7
2
2001 // Fim.
7
8
João Rico // Nome do cliente.
D12
// Identificador
do quarto.
1 // Número
de reservas.
R5
// Código
de reserva.
2001 // Início.
7
2
2001 // Fim.
7
8
Benjamim Rapaz // Nome do
cliente.
O sistema deve permitir as seguintes funcionalidades:
- Adicionar um novo quarto (não pode haver identificadores repetidos).
Quando um quarto é adicionado está livre.
- Remover um quarto dado o seu identificador. Não se pode remover um quarto
ocupado ou com reservas.
- Reservar um quarto. No acto da reserva o cliente deve especificar quais as
datas de início e
de fim da estadia. A data de fim tem de ser posterior à data de início e a
data de início posterior ou igual à data actual. Em seguida, devem ser exibidos no ecrã os quartos
que verifiquem as datas especificadas, por ordem decrescente do preço.
Nesta altura deve ser possível
ao cliente não escolher qualquer dos quartos, pois pode não estar
interessado nas condições oferecidas. Caso o cliente queira efectivamente
reservar o quarto deve ser
perguntado qual o seu nome, sendo por fim realizada a
reserva e exibido o seu código no ecrã. Não se podem
realizar reservas sobrepostas para o mesmo quarto.
- Anular uma reserva dado o código de reserva.
- Fazer check-in. Quando o cliente chega à pensão deve dar o seu código
de reserva. Isto implica que o estado do quarto reservado passe a ocupado, sejam
transferidos os dados necessários da reserva para a ocupação e a reserva eliminada.
- Listar no ecrã todos os quartos por ordem crescente de preço.
- Listar no ecrã todos os quartos por ordem crescente de preço, dado o seu
tipo - individual ou duplo - (se houver quartos com o mesmo
preço, devem vir ordenados por identificador).
- Listar no ecrã todos os quartos por ordem crescente de preço, dado se
têm ou não WC (se houver quartos com o mesmo
preço, devem vir ordenados por identificador).
- Guardar o estado do sistema (quartos, ocupações e reservas) nos
ficheiros.
- Sair do programa. Quando é escolhida a opção de sair do programa deve
ser perguntado ao utilizador se quer guardar o estado do sistema, mas apenas
se os dados (quartos, ocupações e reservas) tiverem sido alterados desde a
leitura do ficheiro ou desde a última vez que os dados foram guardados.
Se um cliente não fizer check-in até ao final do dia de início da reserva,
esta deve ser anulada e o sistema deve emitir uma mensagem como a seguinte:
Deve ser cobrado ao cliente Joaquim dos Anzóis um dia de ocupação
e foi anulada a reserva código R7.
Os check-out devem realizados automaticamente quando o dia final da
ocupação for atingido. O quarto passa a livre e a ocupação é eliminada.
Deve ser mostrado o preço da estadia.
2 Processamento de datas
Para guardar datas pode recorrer à classe Data definida no
espaço nominativo Utilitarios::DataTempo da biblioteca Utilitarios.
Esta biblioteca é parte integrante da distribuição Pacotes-0.2.tar.gz.
A sua documentação está disponível quer em PDF
quer em HTML.
Esta classe permite fazer as operações usuais com datas. Em
particular permite alternar duma forma simples entre datas actuais obtidas do
sistema e datas actuais pedidas ao utilizador do programa. Esta
possibilidade é fundamental para permitir o teste do programa sem ter de se
esperar vários dias...
Para garantir o comportamento adequado do programa, antes da execução de
cada opção do menu deve ser verificada a data actual e tomadas as acções
previstas no enunciado. Por outro lado o menu do programa deve conter
opções para:
- Actualizar. Limita-se a verificar a data actual e agir em
conformidade.
- Tornar datas actuais automáticas, i.e., fornecidas pelo sistema.
- Tornar datas actuais manuais, i.e., pedidas ao utilizador.
3 Requisitos de implementação
- Não devem haver quaisquer restrições ao número de quartos da pensão
(excepto a de o computador não ter memória suficiente para armazenar todos
os registos).
- Devem existir as classes: Quarto, Reserva, Ocupacao e
GestorDeQuartos.
Podem ser criadas outras classes sempre que necessário.
- Os quartos devem ser variáveis dinâmicas.
- As reservas devem ser variáveis dinâmicas.
- Sempre que numa classe for necessária uma forma de ler a sua informação
de um canal ligado a uma "base de dados" (tipicamente um
ficheiro), deve-se criar um procedimento membro carrega() para esse
efeito. Pode também existir um construtor que carregue a informação
de um canal de entrada.
- Sempre que numa classe for necessária uma forma de escrever a sua informação
num canal ligado a uma "base de dados" (tipicamente um ficheiro),
deve-se criar um procedimento membro guarda() para esse efeito.
- Sempre que numa classe for necessária uma forma de ler a sua informação
de um canal ligado a um humano (tipicamente um canal ligado ao teclado),
deve-se criar um operador de extracção operator >> () para
esse efeito.
- Sempre que numa classe for necessária uma forma de mostrar a sua informação
num canal ligado a um humano (tipicamente um canal ligado ao ecrã), deve-se
criar um operador de inserção operator << () para esse
efeito.
- Os formatos admitidos para os pares carrega()/guarda() e
operator >> ()/operator << () não têm de ser
semelhantes. O procedimento guarda() deve escrever num
formato fácil de ser lido posteriormente pelo procedimento carrega().
O operador << deve mostrar num formato agradável aos humanos
e o operador >> deve ler num formato que seja intuitivo e fácil
de indicar pelos humanos.
- As classes devem estar munidas dos construtores e operadores adequados à
resolução do problema em questão.
- Antes de terminar o programa devem-se destruir todas as variáveis dinâmicas
entretanto construídas com o operador new.
- Coloque todas as ferramentas específicas da gestão da pensão dentro
de um espaço nominativo GestaoDeQuartos. O módulo da lista
(se optar por não usar as listas da biblioteca padrão) não deve
estar neste espaço nominativo. O módulo do programa principal também
não.
4 Avaliação
Será avaliado neste trabalho:
- O bom desenho das classes (encapsulamento, métodos apropriados,
responsabilidades atribuídas às classes que as devem ter, etc.).
- A clareza, simplicidade e legibilidade do código.
- O cumprimento dos requisitos de implementação.
- O funcionamento do programa de acordo com os objectivos explicados acima.
- A explicação clara (em comentários no código) das opções de
implementação que foram discutidas no grupo e a razão da escolha da opção
implementada.
A interface com o utilizador deverá ser o mais simples possível. Não se
valorizam interfaces sofisticadas.