2º Trabalho Prático de Programação II
1. Organização e calendário
- O trabalho deverá ser
começado a realizar imediatamente após
disponibilização do enunciado.
- O relatório final, com quatro páginas A4 no máximo, as
listagens (com as páginas numeradas), bem como uma
disquete com o programa (que será depois devolvida),
deverão ser entregues até às 15 horas do dia 12 de Junho de 1998 na recepção da entrada
principal do ISCTE para colocação no cacifo do Eng.
Manuel Menezes de Sequeira (cacifo 202), ou entregues,
até à mesma data e hora, a qualquer dos docentes da
cadeira.
- A listagem, para além de numerada, deverá ser impressa
num tipo não proporcional (recomenda-se o Courier
New).
- O relatório consistirá
numa breve explicação do funcionamento (interno) do
programa (aspectos relevantes da implementação,
tais como as estruturas de dados e os algoritmos
utilizados, bem como uma explicação da estruturação
em módulos e funções utilizada) e justificações para as opções
tomadas.
- A interface com o utilizador
deverá ser suficientemente clara para não ser
necessário qualquer manual de utilização.
- Valorizam-se interfaces
simples e claras. Interfaces sofisticadas não são
valorizadas: evite perder tempo com o que é acessório.
- Este trabalho é uma continuação
do primeiro trabalho da cadeira.
- O código deverá ser
devidamente organizado e comentado:
- O programa deverá
ser dividido em funções com utilidades bem
definidas. Cada função deverá ter cerca de 10
linhas. Em caso algum ultrapassará um página de
listagem (cerca de 70 linhas).
- As funções devem
ser organizadas em módulos duma forma
apropriada.
- O módulo principal
deverá possuir o seguinte cabeçalho:
/*
* Programa: aluger.c
*
* Descricao: ...
*
* Notas:
*
* Autores:
* Nome e numero dos autores, ISCTE.
*/
- Os restantes
módulos (e ficheiros de cabeçalho respectivos)
deverão possuir o seguinte cabeçalho:
/*
* Modulo: listas.c (ou listas.h)
*
* Descricao: Modulo de listas.
*
* Notas:
*
* Autores:
* Nome e numero dos autores, ISCTE.
*/
- Cada função
deverá possuir o seguinte cabeçalho (E e S
significam entrada e saída respectivamente):
/*
* Funcao: Linsere()
*
* Accao: Insere um elemento numa lista.
*
* Parametros:
* lista (E/S) - lista onde o elemento será inserido.
* elemento (E) - o elemento a inserir na lista.
*
* Devolve: ...
*/
- Devem ser comentadas
todas as zonas do programa de mais difícil
compreensão. Podem ser utilizados os seguintes
estilos de comentário:
/* Comentario de uma linha... */
/*
* Ou de varias linhas, acerca de um conjunto de
* instrucoes:
*/
int i;
double x;
i = 10; /* inicialização de i */
- Evite as variáveis
globais.
2. Especificação
2.1 Objectivo
Desenvolva em ANSI C um programa de gestão de
reservas/alugueres para uma empresa de aluguer de automóveis. O
programa deverá manter a seguinte informação e proporcionar as
funcionalidades mínimas indicadas:
- Informação sobre a frota existente
- Deverá manter-se um registo das viaturas da empresa
incluindo a seguinte informação sobre cada viatura:
- matrícula,
- data de aquisição,
- modelo e
- classe (3 classes).
- Por exemplo:
- Classe 1:
- Ford Ka,
- Renault Twingo,
- Fiat Cinquecento e
- Opel Corsa.
- Classe 2:
- Ford Mondeo,
- Renault Megane,
- Fiat Bravo e
- Opel Vectra.
- Classe 3:
- Ford Scorpio,
- Renault Safrane,
- Fiat Marea e
- Opel Omega.
- Pretendem-se as seguintes funcionalidades mínimas:
- inserir nova viatura,
- remover uma viatura e
- listar informação de todas as viaturas.
- Informação sobre reservas e alugueres
- Deverá manter-se um registo de reservas e alugueres,
sendo cada reserva caracterizada pela seguinte
informação:
- viatura (identificada pela sua matrícula),
- modelo,
- categoria,
- período de aluguer,
- cliente e
- estado (i.e., reserva, reserva pendente ou
aluguer).
- Pretendem-se as seguintes funcionalidades mínimas:
- Face a um pedido de reserva por parte de um
cliente, determinar que viaturas se encontram
disponíveis para o período pretendido. Esta
consulta deverá ser suficientemente flexível
para que o cliente possa especificar o modelo ou
apenas a classe de viatura que pretende. Se
houver uma viatura disponível para o período
pretendido procede-se então à inserção da
reserva. Caso não haja nenhuma viatura
disponível que satisfaça a especificação do
cliente, deverão ser-lhe apresentadas
alternativas de entre as viaturas da mesma classe
que estejam disponíveis. Se não houver
alternativas deve considerar-se o pedido de
aluguer como pendente e sujeito a eventuais
desistências por parte de outros clientes.
- anular reservas de clientes que desistiram ou que
não efectuaram o levantamento das viaturas no
primeiro dia do período pretendido (é
necessário que o programa considere a data
corrente), e
- actualizar a informação sobre
reservas/alugueres quando:
- um contrato de aluguer é concretizado,
- uma reserva é anulada ou
- uma viatura é devolvida à agência.
- Nos casos de anulação de reservas ou de
devolução antecipada de veículos, devem-se
considerar as reservas pendentes e satizfazê-las
se possível.
- Determinação do preço
- Deverá ser possível determinar o preço do aluguer de
uma viatura. O preço é função da classe da viatura
alugada e do número de dias de aluguer. A definição do
preçário fica ao critério dos alunos. Devem-se prever
multas para devoluções atrasadas ou antecipadas.
2.2 Concretização
- Nas reservas pendentes não deverá estar informação
sobre uma viatura específica. As reservas pendentes
referem-se ou a uma classe ou, alternativamente, a um
dado modelo de viatura.
- As estruturas de dados utilizadas para armazenar
informação sobre as viaturas e sobre reservas e
alugueres devem ser implementadas utilizando listas
duplamente ligadas genéricas e memória dinâmica.
As listas devem ser manipuladas por intermédio de iteradores.
Não deve haver qualquer restrição quanto ao número de
veículos ou reservas e alugueres (excepto, é claro, a
memória disponível).
- Devem ser utilizados ficheiros binários para armazenar a
informação relevante no final da execução do programa
e para carregar a informação no início da sua
execução.
- Para simplificar considerou-se no enunciado que alugueres
e reservas estariam armazenados na mesma estrutura de
dados. Nada impede que os alunos considerem outras
soluções.
- Devem-se usar a representação de datas e as funções
para a sua manipulação definidas pelo ANSI C (veja-se o
ficheiro de cabeçalho "time.h").
- O programa deve resistir a más utilizações! Proteja as
leituras e valide os valores obtidos.
2.3 Estruturação
O programa deverá ser dividido
em módulos. Por
exemplo:
- Módulo principal, com a
função main().
- Módulo das listas.
- Módulo dos registos
de veículos.
- Módulo dos registos de alugeres e reservas.
- Módulo das funções de
leitura do teclado.
- Módulo de funções de
escrita de menus e leitura de opções.
- Módulo de operações sobre
datas e horas e tempos de duração.