Programação III / Estruturas de Dados Enunciado do Trabalho Prático 1. Objectivo Pretende-se implementar uma base de dados que sirva para ajudar uma agência de viagens a planear as viagens a realizar pelos seus clientes, durante o ano de 2014. A ideia base é a seguinte: a agência de viagens elabora viagens, cada uma caraterizada por uma sequência de destinos/deslocações; após a conclusão do plano de cada viagem, esta é colocada à disposição dos seus clientes para que se possam inscrever nela; à medida que os clientes se vão inscrevendo na viagem, são colocados numa fila de espera e posteriormente afetados à viagem correspondente. Em traços gerais, poder-se-à inserir clientes, destinos e viagens (indicando, neste último caso, a sequência de deslocações e os clientes envolvidos); cancelar viagens; registar a desistência de um cliente de uma viagem; efectuar pesquisas sobre viagens (realizadas num período do ano ou por um cliente); inscrição em viagens; etc.. 2. Conceitos e princípios Cada viagem é efetuada por um grupo de (um ou mais) clientes e consiste numa sequência de, pelo menos, duas deslocações. Uma deslocação ocorre numa data (caracterizada pelo mês e pelo dia) e tem um destino (identificado por uma localidade e um país). Para simplificar, assume-se que todas as viagem têm origem em Portugal. Por exemplo, uma viagem de ida e volta a Paris, realizada pela Maria Santos e pelo Manuel Silva, seria associada a um grupo de dois clientes (a Maria Santos e o Manuel Silva) e a uma sequência de duas deslocações: no dia 7 de Abril o destino seria Paris, em França; no dia 15 de Abril o destino seria Lisboa, em Portugal. Considera-se que cada deslocação numa viagem é totalmente efetuada num dia, ocupando completamente esse dia (i.e., uma pessoa parte e chega no mesmo dia, mas não pode realizar mais do que uma deslocação por dia). As datas de início e de conclusão de uma viagem são as datas da primeira e da última deslocação, respetivamente. O sistema deverá garantir que, - todos os clientes e destinos referidos nas diferentes operações foram previamente inseridos (exceto nas respectivas operações de inserção); 1 - o percurso induzido pela sequência de deslocações é cronologicamente possível; - ninguém está simultaneamente em dois lugares distintos. Para este efeito, o sistema deverá ignorar qualquer operação de inserção que tente violar estas regras. 3. Entrada e saída A aplicação deverá funcionar de forma a permitir buscar dados a ficheiros de entrada (clientes, localidades e viagens já construídas) e/ou permitir a entrada de novos dados (usando um menu específico para tal). Antes de terminar, a aplicação deverá permitir guardar todas as movimentações efetuadas em ficheiros, caso seja essa a intensão do utilizador. 3.1. Sintaxe Pretende-se que a interface da aplicação seja muito simples. Em todas as operações apresentadas na Secção 4, a saída é uma mensagem, especificando-se quais as mensagens possíveis em cada caso. A mensagem a devolver deverá ser a primeira (da sequência dada) que corresponde a uma afirmação verdadeira. Note que nenhuma destas operações deve produzir qualquer efeito na base de dados, se a mensagem devolvida não for a última (que informa que a operação foi efectuada com sucesso). No caso das pesquisas (Secção 4.6 e 4.7), as linhas que correspondem à entrada deverão sempre ocorrer na saída. As restantes linhas dependem da existência da informação pesquisada. As operações de pesquisa produzem uma listagem de viagens, cujo formato deverá ser sempre igual. Se a listagem for vazia, ou seja, quando não existirem viagens nas condições especificadas, a saída deverá ser exactamente igual à entrada. Se a listagem não for vazia, dever-se-à começar por repetir as linhas da entrada. 3.2. Estruturas de dados Para tratar dos clientes deverá ser construída e implementada um EAD Lista denominada por “CLIENTE”. O tipo de dados usado será um estrutura com os seguintes campos: ID Cliente (NIF, CC, BI, ou outro), Nome, Morada, E-mail e Telefone. Devem ser implementadas todas as operações estudadas nas aulas. Para tratar dos destinos deverá ser construída e implementada um EAD Lista denominada por “DESTINO”. O tipo de dados usado será um estrutura com os seguintes 2 campos: ID Destino (código postal, ou outro), Localidade, País e Número de locais a visitar. Devem ser implementadas todas as operações estudadas nas aulas. Para tratar das viagens deverá ser construída e implementada um EAD Lista denominada por “VIAGEM”. O tipo de dados usado será um estrutura com os seguintes campos: ID Viagem, Sequência de Deslocações (Mês, Dia e ID Destino) e Sequência de clientes (ID Cliente). As deslocações devem estar ordenadas cronologicamente e os clientes ordenados alfabeticamente. Devem ser implementadas todas as operações estudadas nas aulas. Para tratar as inscrições nas viagens deverá ser construída e implementada uma EAD Fila denominada “INSCRIÇÃO_EM_VIAGEM” para cada viagem já planeada. O tipo de dados usado será um estrutura com os seguintes campos: ID Viagem e ID Cliente. Devem ser implementadas todas as operações estudadas nas aulas. 3.3. Tipo e dimensões dos dados Não existe qualquer restrição relativamente ao número máximo de entidades inseridos na base de dados: clientes, destinos (i.e., pares [localidade, país]), total de viagens, de clientes que viajam juntos (dimensão dos grupos), de deslocações numa viagem, de viagens efetuadas por um cliente, etc.. 3.4. Correção da entrada Poderá admitir que a entrada está sintaticamente correta, mas não deverá assumir que ela está logicamente correta. Por exemplo, poder-se-à pedir a listagem das viagens efetuadas entre 15 de novembro e 31 de fevereiro (com duas fontes de erro) ou a listagem das viagens realizadas em janeiro por um cliente inexistente. 4. Operações a implementar Todas as operações inerentes à EAD Lista e à EAD Fila deverão ser implementadas. No entanto, só algumas é que devem estar inseridas no menu da aplicação como opções desta. A seguir referem-se algumas das operações que devem pertencer ao menu da aplicação. 4.1. Inserção de um Cliente – Entrada cliente 3 – Saída mensagem de inserção de cliente, que pode ser: - “Cliente existente.” - “Inserção de cliente com sucesso.” - Inserção de um novo cliente, identificado pelo nome cliente. - Os clientes devem ser inseridos por ordem alfabética dos seus nomes. 4.2. Remoção de um cliente – Entrada cliente – Saída mensagem de remoção de cliente, que pode ser: - “Cliente inexistente.” - “Remoção de cliente com sucesso.” - Remoção do cliente cliente da lista de clientes. 4.3. Alteração dos dados de um cliente – Entrada cliente – Saída mensagem de alteração dos dados de cliente, que pode ser: - “Cliente inexistente.” - “Alteraçaõ dos dados do cliente com sucesso.” - Alteração dos dados do cliente cliente. 4.4. Consulta dos dados de um cliente – Entrada cliente – Saída mensagem de consulta dos dados de cliente, que pode ser: - “Cliente inexistente.” - ID cliente, Nome, Morada, E-mail, Telefone - Mostra toda a informação associada ao cliente cliente. 4 4.5. Inserção de um Destino – Entrada destino – Saída mensagem de inserção de destino, que pode ser: - “Destino existente.” - “Inserção de destino com sucesso.” - Inserção de um novo destino, identificado por destino. - Os destinos devem ser inseridos por ordem alfabética dos nomes dos países e, em caso de igualdade, pelos nomes das localidades. 4.6. Remoção de um Destino – Entrada destino – Saída mensagem de retirada de destino, que pode ser: - “Destino inexistente.” - “Remoção de destino com sucesso.” - Remoção do destino destino da lista de destinos. 4.7. Alteração dos dados de um destino – Entrada destino – Saída mensagem de alteração dos dados de destino, que pode ser: - “Destino inexistente.” - “Alteração de dados de destino com sucesso.” - Alteração dos dados associados ao destino destino. 4.8. Consulta dos dados de um destino – Entrada destino 5 – Saída mensagem de consulta dos dados de destino, que pode ser: - “Destino inexistente.” - ID destino, Localidade, País, Número locais a visitar - Mostra toda a informação associada ao destino destino. 4.9. Inserção de uma Viagem – Entrada (M deslocações e N clientes) ID viagem (pode ser atribuído automaticamente ou verificar existência) Sequência de deslocações (deslocação 1, deslocação 2, …, deslocação M), em que cada deslocação é formado por: mês, dia e destino Grupo de clientes (cliente 1, cliente 2, …, cliente N) – Saída mensagem de inserção de viagem, que pode ser: - “Data(s) inexistente(s).” - “Percurso cronologicamente impossível.” (Sequência de deslocações não ordenada por ordem estritamente crescente) - “Percurso inválido.” (Número insuficiente de deslocações, deslocações seguidas com o mesmo destino, ...). - “Destino(s) inexistente(s).” - “Cliente(s) inexistente(s).” - “Cliente(s) indisponível(eis).” (Sobreposição com outra viagem) - “Inserção de viagem com sucesso.” - Inserção de uma nova viagem composta pelo seu ID viagem (indicado ou atribuído automaticamente), pela sequência de deslocações especificada e efetuada pelo grupo de clientes indicado. Se o ID viagem for indicado, deve ser verificado a sua validade (existência). - As viagens devem ser inseridas ordenadas cronologicamente pela data de início e, em caso de igualdade desta, pela data de conclusão. - Garante-se que o ID viagem é único, que as sequências de deslocações e de clientes nunca são vazias. 6 4.10. Cancelamento (remoção) de uma Viagem – Entrada mês, dia; viagem – Saída mensagem de cancelamento de viagem, que pode ser: - “Data inexistente.” - “Viagem inexistente.” - “Cancelamento de viagem com sucesso.” - Remoção da viagem viagem com data de início no dia dia do mês mês. 4.11. Alteração dos dados de uma Viagem – Entrada viagem – Saída mensagem de alteração dos dados de viagem, que pode ser: - “Viagem inexistente.” - “Alteração dos dados de viagem com sucesso.” - Alteração dos dados associados à viagem viagem. 4.12. Consulta dos dados de uma Viagem – Entrada viagem – Saída mensagem de desistência de cliente, que pode ser: - “Viagem inexistente.” - apenas as datas inicial e final mês_inicial, dia_inicial; mês_final; dia_final - descrição mínima (último destino da viagem e clientes) mês_final, dia_final; localidade; país cliente1; cliente2; … - descrição detalhada (todos as deslocação e clientes) mês, dia; localidade; país … mês, dia; localidade; país 7 cliente1; cliente2; … - Mostra toda a informação da viagem viagem (3 formas de mostrar a informação). - A sequência de deslocações da viagem viagem deverá estar ordenada cronologicamente e a sequência de clientes deverá respeitar a ordem alfabética. 4.13. Desistência (remoção) de um Cliente de uma Viagem – Entrada cliente; viagem – Saída mensagem de desistência de cliente, que pode ser: - “Cliente inexistente.” - “Viagem inexistente.” - “Desistência de viagem com sucesso.” - Remover da viagem viagem o cliente cliente do grupo de clientes desta viagem. 4.14. Pesquisa das Viagens efetuadas num Intervalo de Tempo – Entrada mês_inicial, dia_inicial; mês_final, dia_final – Saída (considerando K viagens) a) igual à da entrada (apenas as datas inicial e final de cada viagem): mês_inicial, dia_inicial; mês_final; dia_final → viagem 1 ... mês_inicial, dia_inicial; mês_final; dia_final → viagem K b) descrição mínima (último destino da viagem e clientes): viagem 1 mês_final, dia_final; localidade; país cliente1; cliente2; … ... viagem K mês_final, dia_final; localidade; país cliente1; cliente2; … c) descrição detalhada (todos as deslocação e clientes): viagem 1 mês, dia; localidade; país → deslocação 1 8 ... mês, dia; localidade; país → deslocação final cliente1; cliente2; … ... viagem K mês, dia; localidade; país → deslocação 1 ... mês, dia; localidade; país → deslocação final cliente1; cliente2; … - Mostra toda a informação das viagens realizadas (iniciadas e concluídas) entre o dia dia_inicial do mês mês_inicial e o dia dia_final do mês mês_final. - As viagens deverão aparecer ordenadas cronologicamente pela data de início e, em caso de igualdade desta, pela data de conclusão. No âmbito de cada viagem, a sequência de deslocações deverá estar ordenada cronologicamente e a sequência de clientes deverá respeitar a ordem alfabética. 4.15. Pesquisa das Viagens efetuadas num Mês por um Cliente – Entrada mês; cliente – Saída (semelhante a “Pesquisa das Viagens efetuadas num Intervalo de Tempo”) - Mostra toda a informação sobre as viagens realizadas (i.e., iniciadas e concluídas) durante o mês mês pelo cliente cliente. - As viagens deverão aparecer ordenadas cronologicamente pela data de início. No âmbito de cada viagem, a sequência de deslocações deverá estar ordenada cronologicamente e a sequência de clientes deverá respeitar a ordem alfabética. 4.16. Inscrição em viagem – Entrada cliente; viagem – Saída mensagem de inscrição de cliente em viagem, que pode ser: - “Viagem inexistente.” - “Cliente inexistente.” 9 - “Inscrição em viagem com sucesso.” - Efetua a inscrição do cliente cliente na viagem viagem planeada pela agência de viagem; após a inscrição o cliente é inserido numa EAD Fila em que cada elemento é composto por (viagem, cliente). 4.17. Distribuição clientes por viagem – Entrada inscrições_viagens (fila) – Saída mensagem de distribuição dos clientes pelas viagens, que pode ser (para cada elemento da fila): - “Viagem inexistente.” (erro na introdução do código da viagem) - “Cliente inexistente.” (erro na introdução do código de cliente) - “Inserção de cliente em viagem com sucesso.” - Efetua a distribuição dos clientes inscritos nas viagens pelas respetivas viagens; ou seja, insere o cliente cliente na lista de clientes da viagem viagem. - No final, a fila de inscrições fica vazia. 4.18. Remoção de uma deslocação numa viagem – Entrada viagem, deslocação – Saída mensagem de remoção de deslocação de viagem, que pode ser: - “Viagem inexistente.” - “Deslocação inexistente.” - “Remoção de deslocação de viagem com sucesso.” - Remoção de deslocação deslocação da viagem viagem. 4.19. Total de viagens planeadas pela agência de viagens – Entrada – Saída mensagem sobre o total de viagens planeadas, que pode ser: - “Total de viagens: ???” - Mostra o total de viagens planeadas pela agência de viagens. 10 4.20. Total de clientes de uma viagem – Entrada viagem – Saída mensagem sobre o total de clientes de uma viagem, que pode ser: - “Viagem inexistente.” - “Total de clientes: ???” - Mostra o total de clientes associados à viagem viagem. 4.21. Total de deslocações (destinos) de uma viagem – Entrada viagem – Saída mensagem sobre o total de deslocações de uma viagem, que pode ser: - “Viagem inexistente.” - “Total de deslocações/destinos da viagem: ???” - Mostra o total de deslocações que compoem a viagem viagem. 4.22. Total de viagens efetuadas por um cliente – Entrada cliente – Saída mensagem sobre o total de viagens efetuadas por um cliente, que pode ser: - “Cliente inexistente.” - “Total de viagens efetuadas pelo cliente: ???” - Mostra o total de viagens efetuadas pelo cliente cliente. 4.23. Operações de gestão da aplicação - Abrir ficheiro da base de dados - Guardar os dados da base de dados no ficheiro correspondente, após atualização - Guardar os dados da base de dados noutro ficheiro - Sair da aplicação - ... 11