Engenharia Informática Engenharia Electrónica e Computadores Introdução à Programação I. Introdução O objectivo deste trabalho é desenvolver um programa para a gestão de marcações de bilhetes de avião na linguagem de programação JAVA. II. Descrição genérica O programa a desenvolver deve permitir adicionar, anular voos e listar todos os voos disponíveis. Cada voo é identificado por um código e pelos campos origem, destino, data (dia, mês e ano), hora de partida, duração, tipo do avião e capacidade (número máximo de passageiros). Além disso cada voo têm associado uma lista de marcações. Cada marcação é definida pelo número do lugar, primeiro e último nome e um número de telefone de contacto do passageiro. O programa deve permitir a marcação de passagens num determinado voo. O utilizador deve ter acesso às operações disponíveis através de uma sequência estruturada de menus.
III. Especificações do projecto Depois da descrição genérica do programa apresentam-se as especificações que o vosso projecto têm de obrigatoriamente cumprir. As especificações foram divididas em menús e ficheiros. Toda a formatação dos menús e diálogos a realizar com o utilizador deverá ter lugar em modo de texto simples. É proibida a utilização de interfaces gráficas. Os ficheiros podem ser gerados utilizando um editor de texto (p.e. notepad) ou o próprio programa. A. Menu Principal O programa deve possuir um menu principal com o seguinte formato: 1. Ajuda 2. Gestão de voos 3. Marcação de passagens 4. Saída do programa Introduza a opção pretendida: A opção 1 deverá listar no monitor um ficheiro de texto ajuda.txt com o manual de utilização do programa. Este manual de utilização deverá conter a seguinte informação: Objectivos Como utilizar o programa (incluindo o arranque) Descrição da saída dos resultados do programa Visita guiada das funcionalidades do programa B. Menu Gestão de Voos Quando o utilizador seleccionar a opção 2 deverá ser visualizado o seguinte menu: 1. Listagens dos voos existentes 2. Criação de voo 3. Anulação de voo 4. Menu Principal Introduza a opção pretendida:
A opção 1 deverá permitir a listagem de todos os voos existentes. Para cada voo o programa deverá imprimir no écran o código do voo, a origem e o destino em letras maiúsculas, a data de partida (no formato dia/mês/ano), a hora de partida e a duração do voo (no formato hora:minutos), o tipo de avião e a capacidade. Os voos devem estar ordenados pelo dia e hora de partida. Por exemplo: TP123 LIS MAD 23/11/2000 14:15 2:50 B737 160 TP123B LIS MAD 23/11/2000 14:30 5:20 B737 160 AF943 ORY JFK 27/12/2000 11:00 10:00 A340 250 A opção 2 deverá permitir a criação de um voo. Neste caso deve ser pedido ao utilizador todas as informações relativas ao voo em causa, nomeadamente: Código Origem Destino Data de partida (dia, mês e ano) Hora de partida Duração do voo Capacidade O código de voo deverá ser sempre diferente. É da responsabilidade do programa garantir que o código do voo é sempre diferente, isto é, caso o código de voo já exista o programa deverá pedir um novo código de voo. Para a origem e destino do voo deverão ser utilizados códigos de três letras (para alguns exemplos ver o anexo 1). Para a data, o programa deverá pedir ao utilizador separadamente o dia, mês e ano. Para a hora de partida e para a duração o programa deverá pedir ao utilizador separadamente a hora e os minutos. Todos os dados introduzidos pelo utilizador devem ser verificados se são válidos ou não. Caso não o sejam o programa deve pedir ao utilizador que introduza os dados errados novamente. Por exemplo, se o utilizador escrever 24 quando o programa pedir o mês, o programa deverá indicar que o mês não é válido e pedir o mês novamente.
A opção 3 deverá pedir ao utilizador o código do voo e eliminá-lo da lista de voos correspondentes. A opção 4 deverá retornar ao menu principal. C. Menu Gestão de Marcações Quando o utilizador seleccionar a opção 3 no menu principal deverá ser visualizado o seguinte menu: 1. Efectuar uma marcação 2. Listar todas as marcações de um dado voo 3. Anular uma marcação (implementação opcional) 4. Menu principal Introduza a opção pretendida: Para efectuar uma marcação (opção 1), o programa deverá pedir ao utilizador a origem, destino e data do voo. De seguida o programa, deverá listar todos os voos que correspondam ao trajecto especificado. Caso exista o trajecto pretendido, o utilizador deverá então seleccionar o voo pela introdução do código (de voo). Se este voo se encontrar com todos os lugares preenchidos (lotação esgotada) o programa deverá pedir ao utilizador que seleccione outro voo. De seguida, o programa deve pedir ao utilizador: Primeiro Nome Apelido Número de telefone Número do lugar pretendido Caso o lugar já esteja ocupado, o programa deverá informar esse facto ao utilizador e pedir outro numero de lugar. Quando o utilizador seleccionar a opção 2, o programa deverá pedir o código do voo e listar todos os passageiros (lugar, primeiro nome, apelido e n.º de telefone) que tenham feito uma marcação nesse voo. A lista de passageiros deve estar ordenada pelo número de lugar que ocupam. Por exemplo:
Marcações do voo TP123: 010 João Ascenso 211000000 020 Luís Esteves 212000000 024 António Gonçalves 213000000 100 Alpeshkumar Ranchordas 214000000 101 José Braz 215000000 110 Carlos Santos 217000000 130 Paula Miranda 218000000 A opção 4 deverá retornar ao menu principal. Implementação opcional (obrigatória para notas superiores a 17) Além de todas as especificações já descritas, o programa deverá ser capaz de anular marcações de voos. Para implementar esta opção o programa, após a marcação de um voo, deverá fornecer ao utilizador um código de reserva único (o código deverá ser único no conjunto de todos os voos). Este código poderá ser utilizado posteriormente para se poder realizar a anulação de uma reserva. Nota: Devem modificar os formatos dos ficheiros para realizar esta opção. As opções que tomarem para realizar esta funcionalidade deverão estar bem documentadas. IV. Ficheiros Deverão existir dois ficheiros, um com a lista de voos e outro com a lista de passageiros. O ficheiro de voos deverá ter o nome "voos.txt". Cada voo será representado por uma linha do ficheiro com o formato descrito na Figura 1. <ficheiro>::=<linhas> <linhas>::=<linha> <linha><linhas> <linha>::=<código><espaço><origem><espaço><destino><espaço><dia><espaço> <mês><espaço><ano><espaço><horas><doispontos><minutos><espaço><horas>
<doispontos><minutos><espaço><tipo><espaço><capacidade> <código_voo>::=<letra> <letra><código_voo> <origem>::=<letragr><letragr><letragr> <destino>::=<letragr><letragr><letragr> <dia>::= <digito3><digito> <mês>::= <digito1><digito> <ano>::= <digito><digito><digito><digito> <horas>::=<digito1><digito> <minutos>::=<digito5><digito> <tipo>::=<letra><digito><digito><digito> <capacidade>::= <digito><digito><digito> <digito>::=0 1 2 3 4 5 6 7 8 9 <digito5>::=0 1 2 3 4 5 <digito3>::=0 1 2 3 <digito1>::=0 1 <espaço>::= BRANCO <doispontos>::= : <letra>::=<letrag> a b c d e f g h i j k l m n o p q r s t u x y z <letrag>::= A B C D E F G H I J K L M N O P Q R S T U X Y Z Figura 1 - BNF do ficheiro voos.txt Nota: EOL representa o caracter de fim de linha; BRANCO representa o caracter com o código ASCII número 32 (decimal). O ficheiro de marcações deverá ter o nome "marca.txt" e deverá seguir a especificação BNF da Figura 2. <ficheiro>::=<linhas> <linhas>::=<linha> <linha><linhas> <linha>::=<código_voo>eol<numero_do_lugar><eol><telefone><espaço> <último-nome><espaço><primeiro-nome> <numero_do_lugar>::=<digito><digito><digito> <último-nome >::=<letra> <letra><último-nome> <primeiro-nome >::=<letra> <letra><primeiro-nome>
Figura 2 BNF do ficheiro marca.txt Nota: Alguns símbolos não terminais indicados na Figura 1 foram previamente definidos na Figura 2. De modo a guardar a informação entre duas execuções do programa, toda a informação (voos e listas de passageiros) deverá ser registada nestes dois ficheiros de texto sempre que o programa termina. De igual modo, no início, o programa deverá ler (caso existam) os dois ficheiros de texto criados anteriormente, de modo a inicializar as estruturas de dados existentes em memória. Os ficheiros não necessitam de estar ordenados. Nota: O vosso programa deve ler qualquer ficheiro que obedeça ao formato anteriormente definido. Programas que escrevam ou leiam ficheiros com formatos diferentes serão penalizados. Durante a avaliação o programa poderá ser testado com ficheiros escritos pelos docentes. V. Fases do Projecto Antes de começar a programação propriamente dita, deve-se primeiro compreender o projecto anteriormente descrito. Caso haja algumas dúvidas, utilize o bom senso para resolver questões em aberto ou dúvidas que tenha sobre o enunciado. Não complique desnecessariamente a solução. Caso tenha dúvidas pertinentes consulte um docente da disciplina ou utilize o e-group para esclarecer a sua dúvida. A segunda fase consiste em estruturar o trabalho, de modo que consiga obter no final um programa bem implementado e a funcionar completamente. Deste modo, aconselhamos os alunos a estruturarem o projecto nas seguintes fases: A. FASE 1 Esta fase consiste na implementação das seguintes funcionalidades, por esta ordem: Visualização do menu principal, de gestão de voos e de marcações (incluindo a selecção das opções) Implementação da opção 1, 2 e 3 do menu de gestão de voos sem a utilização de ficheiros. Implementação da opção de ajuda do Menu Principal.
Após conclusão desta fase, o trabalho deve ser entregue a funcionar ao Prof. da aula de laboratório na semana de 16 a 20 de Dezembro. Os grupos que entreguem o trabalho durante esta semana recebem uma bonificação de 1 valor na nota final. B. FASE 2 Esta fase nunca deve ser implementada sem o funcionamento completo de todas as funcionalidades da fase 1. Nesta fase, deve-se concluir a implementação das seguintes funcionalidades: Leitura e escrita do ficheiro voos.txt Implementação da opção 1, 2 do menu de gestão de marcações. Leitura e escrita do ficheiro marca.txt C. FASE 3 (Implementação opcional) Só quando todas as funcionalidades da fase 1 e 2 estiverem implementadas com sucesso, se deve implementar a opção 3 do menu de gestão de marcações. Esta opção só será considerada para avaliação se as restantes funcionalidades estiverem correctas. Nota: A adopção desta solução não garante uma nota superior a 17. Esta dependerá sempre da qualidade do código, das soluções adoptadas e do resultado da discussão. D. Para todas as fases Antes de implementar qualquer funcionalidade do projecto, devem organizar e estruturar o vosso programa de uma forma adequada ao problema em causa. Nomeadamente que classes devem ser definidas, quais são os métodos que cada uma deve conter e quais são os dados que cada uma delas deve possuir. Nesta fase, também devem ser definidos os algoritmos que permitem realizar cada uma das operações. Só depois deste trabalho realizado é que devem começar a fase de programação propriamente dita. Nota: Apesar de não ser obrigatório cumprirem o que anteriormente foi descrito, se optarem por seguirem esta metodologia o vosso projecto será realizado com ½ do esforço e do tempo necessário!!!
VI. Entrega do projecto Os projectos são realizados por grupos de dois alunos. Para realizarem o projecto têm de entregar a ficha de projecto preenchida a um docente da disciplina. O prazo para entrega da ficha do projecto é uma semana após a divulgação do enunciado do projecto. A entrega do trabalho deverá incluir uma listagem (comentada) em papel e um relatório. Deverá ainda ser entregue uma diskette ou CD incluindo estes elementos (o relatório em Microsoft Word) e os ficheiros de teste eventualmente necessários ao teste do programa. O relatório, deverá ter no máximo cinco páginas A4 e deverá limitar-se a incluir informação ou comentários que sejam considerados úteis para a avaliação do trabalho, nomeadamente: i) Descrição genérica do trabalho realizado, nomeadamente se cumpriram todas as especificações e se existem algumas limitações. ii) Algoritmo geral do programa iii) Descrição das classes usadas iv) Algoritmos relevantes A disquete ou CD deverá ser entregue conjuntamente com o relatório do projecto e a listagem do programa (que deverão ser agrafados ou encadernados) e inseridos dentro de uma capa plástica. A data de entrega, os nomes e números e turma dos autores do projecto, devem estar claramente visíveis na capa do projecto. Projectos entregues sem ser nestas condições serão penalizados com um desconto de até 2 valores. A data de entrega do projecto deverá ser confirmada por um dos docentes da disciplina, mediante a respectiva assinatura. VII. Avaliação A data de entrega final do projecto é 13 de Janeiro de 2003. Atrasos na entrega dos projectos serão penalizados com 1 valor por cada dia de atraso. Projectos entregues após as 17:00 do dia 18 de Janeiro serão classificados com zero. As orais realizar-se-ão nos dias 21 e 22 de Janeiro. Cada aluno será avaliado durante 15 minutos por um júri constituído por dois docentes. A falta à oral ou o atraso, injustificados, implicam a anulação do projecto. As discussões individuais dos projecto não incidirão apenas sobre o programa apresentado. Pretende-se sobretudo apurar a
capacidade do aluno produzir o tipo de código que apresentou no projecto. Caso seja detectada uma inconsistência neste aspecto, a nota atribuída será necessariamente zero. Os projectos não terão datas alternativas de entrega em 2ª época. Todos os projectos serão sujeitos a um controlo rigoroso: projectos semelhantes, ainda que não iguais, serão classificados com zero. Em relação ao código produzido, sugere-se que se baseiem no GUIA PARA CODIFICAÇÃO EM JAVA. Serão penalizados os desvios às regras de codificação indicadas no guia, sendo de salientar os seguintes aspectos: Nomes de variáveis pouco sugestivos, Paragrafação incorrecta, Falta de comentários, quando necessário. As cotações para avaliação do projecto serão distribuídas da seguinte forma: Avaliação do programa (70%) o Funcionalidades implementadas com sucesso o Funcionalidades implementadas sem sucesso o Leitura e escrita dos ficheiros (obedecem à sintaxe BNF definida?) o Ordenação dos dados o Qualidade da interface textual de menus o Qualidade da apresentação dos resultados no ecrã e ficheiro o Introdução de dados via teclado o Estruturas para armazenamento de dados Avaliação do relatório (20%) Avaliação geral do projecto (10%)
VIII. Apêndice A - Exemplos de códigos de partidas/chegadas Cidade, País Atenas, Grécia Auckland, Nova Zelândia Bankok, Tailândia Bruxelas, Belgica Budapeste, Hungria Chicago, EUA Copenhaga, Dinamarca Estocolmo, Suécia Estugarda, Alemanha Faro, Portugal Florença, Itália Frankfurt, Alemanha Funchal, Madeira Genebra, Suiça Hamburgo, Alemanha Hong Kong Instanbul, Turquia Joanesburgo, África do Sul Lanzarote, Spain Lisboa, Portugal Londres(Heathrow), Inglaterra Manchester, Inglaterra Milão, Itália Munique, Alemanha Nova York, EUA Paris, França Porto, Portugal Roma, Itália Código ATH AKL BKK BRU BUD ORD CPH STO STR FAO FLR FRA FNC GVA HAM HKG IST JNB ACE LIS LHR MAN LIN MUC JFK ORY OPO FCO
Tel Aviv, Israel Toronto, Canada Vancouver, Canada Veneza, Itália Viena, Áustria Zurique, Suiça TLV YYZ YVR VCE VIE ZRH