Problema

Gestão de agência de aluguer de automóveis

1  Objectivos

O objectivo deste problema é desenvolver um pequeno programa de gestão de reservas para aluguer de automóveis.

2  Descrição do problema

Pretende-se implementar, em C++, uma aplicação simples para apoio à gestão de uma agência de aluguer de automóveis.  Entre as tarefas passíveis de realização contam-se o registo de novos veículos na frota da agência e a reserva de veículos da frota por parte dos clientes.

Para registar um novo veículo na frota, fornece-se a matrícula, a marca, o modelo, a tarifa diária e a tarifa de fim de semana.  As tarifas devem admitir possibilidade de alteração.

Uma reserva efectua-se fornecendo a matrícula de um veículo da frota e as datas de início e de fim da reserva (ambas inclusive).  Em seguida, o programa deve mostrar o preço total do aluguer e perguntar ao utilizador se o cliente confirma a reserva.  Caso o cliente confirme, devem ser introduzidos o nome do cliente, o tipo de identificação usado pelo cliente e respectivo número do documento de identificação.  É necessário verificar se uma nova reserva para um dado veículo se sobrepõe, ou não, a uma reserva já registada, e, se for o caso, essa tentativa de nova reserva deve ser terminada com o aparecimento de um diagnóstico de erro no ecrã.  O preço de uma reserva cuja data de início é uma sexta-feira e cuja data de fim é a segunda-feira seguinte é igual à tarifa de fim-de-semana.  Nos restantes casos o preço é calculado com base na tarifa diária e no número de dias existentes entre a data de início e de fim da reserva.

O número do documento de identificação deve representar-se como uma cadeia de caracteres e o respectivo tipo indica se se trata de um BI ou de um passaporte.  As datas são representadas pela classe Data pertence à biblioteca Utilitários distribuída no pacote Pacotes.  O manual da biblioteca está disponível em HTML ou em PDF.

3  Resolução

3.1  Requisitos funcionais

O programa implementado deverá ter uma interface com o utilizador exactamente igual à descrita nesta secção.

O programa deverá mostrar o menu

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

no ecrã, permitindo assim ao utilizador escolher entre as operações possíveis.  Quando a opção 0 for escolhida o programa terminará.

Se a opção 1 for escolhida, o programa deve realizar uma nova reserva de veículo tal como descrito acima.

Se a opção 2 for escolhida, o programa deve mostrar todas as reservas com data superior ou igual à data actual.

Se a opção 3 for escolhida, o programa deve perguntar a matrícula do veículo e mostrar todas as suas reservas.

Se a opção 4 for escolhida, o programa deve mostrar as características de todos os veículos.

Caso a opção 5 seja escolhida, o programa deve perguntar a matrícula, a marca, o modelo e os valores respeitantes ao tarifário diário e de fim-de-semana do veículo a registar.

Se for escolhida a opção 6, o programa deve perguntar a matrícula do veículo e quais os novos valores para os tarifários.

Exemplo de execução (em itálico as entradas do utilizador do programa)::

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 5

Matrícula do veículo: 00-00-XX
Marca: Oldsmobile
Modelo: Intrigue
Tarifa diária: 52.5
Tarifa fim-de-semana: 125.5

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 4

Matrícula do veículo: 00-00-XX
Marca: Oldsmobile
Modelo: Intrigue
Tarifa diária: 52.5
Tarifa fim-de-semana: 122.5

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 5

Matrícula do veículo: 00-00-YY
Marca: Ford
Modelo: Focus
Tarifa diária: 40
Tarifa fim-de-semana: 100

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 5

Matrícula do veículo: 00-00-ZZ
Marca: Renault
Modelo: Clio
Tarifa diária: 30
Tarifa fim-de-semana: 75

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 4

Matrícula do veículo: 00-00-XX
Marca: Oldsmobile
Modelo: Intrigue
Tarifa diária: 52.5
Tarifa fim-de-semana: 122.5

Matrícula do veículo: 00-00-YY
Marca: Ford
Modelo: Focus
Tarifa diária: 40
Tarifa fim-de-semana: 100

Matrícula do veículo: 00-00-ZZ
Marca: Renault
Modelo: Clio
Tarifa diária: 30
Tarifa fim-de-semana: 75

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 6

Matrícula do veículo: 00-00-ZZ
Tarifa diária: 32.5
Tarifa fim-de-semana: 79.5

Dados actualizados.

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 2

Não existem reservas.

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 3

Matrícula do veículo: 00-00-CC
Veículo não registado.

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 3

Matrícula do veículo: 00-00-ZZ
O veículo com matrícula 00-00-ZZ não tem reservas.

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 1

Matrícula do veículo: 00-00-WW
Veículo não registado.

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 1

Matrícula do veículo: 00-00-YY
Data inicio de reserva (aaaa mm dd): 2003 04 11
Data fim de reserva (aaaa mm dd): 2003 04 14

O preço desta reserva é de 100.

Confirma (s/n)? s

Nome: António Lisboa
Documento de identificação: bi
Número: 12345678

Reserva efectuada.

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 1

Matrícula do veículo: 00-00-YY
Data inicio de reserva (aaaa mm dd): 2003 04 11
Data fim de reserva (aaaa mm dd): 2003 04 15

Colisão com reserva prévia: reserva anulada.

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 1

Matrícula do veículo: 00-00-ZZ
Data inicio de reserva (aaaa mm dd): 2003 04 07
Data fim de reserva (aaaa mm dd): 2003 04 10

O preço desta reserva é de 130.

Confirma (s/n)? s

Nome: John Doe
Documento de identificação: passaporte
Número: f-13572468

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 2

Matrícula do veículo: 00-00-YY
Data inicio de reserva (aaaa mm dd): 2003 04 11
Data fim de reserva (aaaa mm dd): 2003 04 14
Nome: António Lisboa
Documento de identificação: bi
Número: 12345678

Matrícula do veículo: 00-00-ZZ
Data inicio de reserva (aaaa mm dd): 2003 04 07
Data fim de reserva (aaaa mm dd): 2003 04 10
Nome: John Doe
Documento de identificação: passaporte
Número: f-13572468

1 - Realizar nova reserva

2 - Mostrar reservas
3 - Mostrar reservas de veículo
4 - Mostrar veículos

5 - Registar novo veículo
6 - Alterar tarifário de veículo

0 - Terminar

Opção: 3

Matrícula do veículo: 00-00-ZZ

Marca: Renault
Modelo: Clio

Data inicio de reserva (aaaa mm dd): 2003 04 07
Data fim de reserva (aaaa mm dd): 2003 04 10
Nome: John Doe
Documento de identificação: passaporte
Número: f-13572468

Os casos omissos neste enunciado deverão ser esclarecidos junto de um dos docentes da disciplina.

3.2  Requisitos de implementação

A resolução deste problema deverá recorrer a classes C++, a modularização física e a pacotes (espaços nominativos) sempre que apropriado.  Em particular, deverão existir as classes Veículo, Reserva e GestorDeAgência.  Cada uma destas classes deve corresponder a um diferente módulo físico.  Deverá ainda existir um módulo físico à parte para a função main().  Todas as classes e respectivas operações e todas as rotinas deverão ser devidamente documentadas (incluindo invariantes, para as classes, e pré-condições e condições objectivo, para as operações e rotinas).  As pré-condições, condições objectivo e condições invariantes de classe devem ser verificadas tanto quanto possível usando instruções de asserção.

4  Resolução e entrega