Departamento de Engenharia Electrotécnica PROGRAMAÇÃO DE MICROPROCESSADORES 2011 / 2012 Mestrado Integrado em Engenharia Electrotécnica e de Computadores 1º ano 2º semestre Trabalho Final Reservas de viagens de avião http://tele1.dee.fct.unl.pt/pm Paulo da Fonseca Pinto
2
1 Introdução O trabalho final consiste numa sequência de procedimentos de dificuldade crescente que tratam de reservas de lugares de avião. O trabalho cobre várias perspectivas: Operações que um operador de transporte aéreo tem de efectuar (Ex. atribuir um tipo de avião a um voo); Operações que um viajante tem de efectuar (Ex. reserva de um lugar num avião) Operações com um caracter mais de programação que foram necessárias para a realização deste enunciado e que se exigem dos alunos para a obtenção de uma classificação mais elevada (Ex. preenchimento automático de uma percentagem da capacidade de um avião) Os alunos devem começar pelo início (evidentemente) fazendo sequencialmente os vários procedimentos. As classificações mostradas são apenas indicativas da classificação que o aluno poderá ter. Outras considerações podem fazer com que a nota seja diferente: avaliação de cada aluno ao longo do semestre nas aulas de laboratório, outras considerações sobre este próprio trabalho, como: qualidade do código; legibilidade; indentação; simplicidade; etc. 2 Ficheiros iniciais 2.1 Airbus3xx Vai-se considerar apenas os aviões da Airbus com corredor único e capacidade inferior a 200 passageiros (a família Airbus 320, que tem quatro tipos). Como sabe, o número de filas de um avião é dependente da vontade do operador (os operadores de baixo custo usam aviões de cada tipo com mais filas, por exemplo). Como o número de filas de cada tipo pode ser variável, existem ficheiros com a estrutura de um dado tipo de avião: Airbus318, Airbus319, Airbus320, e Airbus321. Se existissem duas versões diferentes de um mesmo tipo, por exemplo o Airbus318, existiriam dois ficheiros com a estrutura de cada um deles (por exemplo, Airbus318a e Airbus318b ). Vamos considerar apenas uma estrutura de avião por tipo neste trabalho. O ficheiro Airtbus3xx é um ficheiro de texto e contém em cada linha o número de cadeiras em cada fila, por ordem crescente. Quando existem quatro cadeiras a classe é a executiva. Quando existem seis cadeiras, a classe é a turística. Como pode ver, quando estiver a programar, a capacidade do avião que está a tratar nesse momento varia. Assim, por exemplo, tem de ter um número máximo de posições para tratar o maior avião, mas pode ser que esteja a utilizar os dados que definiu somente em parte. Aconselha-se que tenha duas variáveis com a capacidade real do avião que está a tratar (filas de executiva e filas de turística) e que definirão o máximo de posições a usar nesse momento. Assuma os valores máximos do Airbus321. 3
Os ficheiros criados têm a seguinte estrutura para os quatro aviões (na última coluna estão indicados os números de passageiros sugeridos pela Airbus) Modelo Executiva Turística Filas Lug. Filas Lug. Total Airbus Airbus 318 3 12 16 96 108 107 Airbus 319 4 16 18 108 124 124 Airbus 320 5 20 22 132 152 150 Airbus 321 6 24 27 162 186 185 2.2 Nomes e Apelidos Existem dois ficheiros de texto com nomes próprios Portugueses e Apelidos Portugueses. São ficheiros de texto com os nomes nomes e apelidos e contêm um nome/apelido em cada linha. Considere que o máximo são 900 nomes ou apelidos e que cada um pode estar guardado num vector de 20 posições. Existem outros dois ficheiros com informação não tratada de nomes e apelidos. Foram os ficheiros que foram usados para se produzir os anteriores. Estes ficheiros têm o nome de nomes_original e apelidos_original. Só serão usados se o aluno quiser fazer um trabalho na faixa dos 18 aos 20 valores. Cada tipo de avião tem um ficheiro em tantas linhas como filhas de cadeiras no avião e cada linha tem o número de lugares na respectiva fila. Uma fila com 4 cadeiras pertence à classe executiva e uma fila com seis cadeiras à classe turística. 3 Ficheiros de voos Cada voo tem um ficheiro binário para o descrever. Por exemplo, o voo TP1048 de Lisboa para Barcelona tem um ficheiro com o nome TP1048. Este ficheiro começa com um inteiro com o número do avião (318, 319, 320, ou 321). Depois tem um conjunto de dados para cada lugar. O total desses conjuntos é a dimensão do avião. Por exemplo, se um avião tem 150 lugares, existem 150 conjuntos de dados após o primeiro inteiro. Como se sabe quantos conjuntos são, e de que classe? ATENÇÃO: Depois de se ler o primeiro inteiro, tem de se ir ler o ficheiro Airbus3xx para saber quantos conjuntos de dados estão gravados no ficheiro TP1048, e de que classe são. Aconselha-se os alunos a fazer uma função que lê ficheiros do tipo Airbus3xx e devolva o número de filas de executivo e de turístico. Deste modo, não tem sempre de estar a escrever o código para ler o ficheiro em cada função do menu do programa em que tal for preciso (basta chamar a função). Para cada lugar a informação contante é a seguinte: char ocupado; char nome [100]; char checked_in; int id_bagagem; int id_cod_reserva; 4
Quando um lugar está reservado o valor de ocupado é 1 (inteiro) e a restante informação está preenchida. Quando o lugar está vazio o valor de ocupado é zero (inteiro) e a informação que pode estar nos outros campos é indefinida. Por exemplo: Num avião que tenha 4 filas de executiva e 20 filas de turística, o ficheiro de voo começa com um inteiro com o valor do tipo do avião (cujo ficheiro tem a informação das filas), seguido de 136 estruturas (4x4+6x20) como a de cima tudo em binário. 4 Programa A execução do programa está dividida em quatro grupos de dificuldade crescente. O menu total tem 10 opções e está mostrado em baixo com uma linha de intervalo para identificar os vários grupos Recorda-se os alunos que não é permitido o uso de variáveis globais. Como a variável que vai conter as reservas de um voo é de dimensão muito reduzida, não há necessidade de a declarar como static (ver livro). Negócio Aéreo 0 - Sair do programa 1 - Mostrar a estrutura de um avião 2 - Mostrar a ocupação de um voo 3 - Mostrar o nome dos passageiros com reserva num voo 4 - Efectuar a reserva de um voo com escolha de lugar 5 - Alterar o lugar de uma reserva 6 - Atribuir um avião a um voo específico (abertura de voo) 7 - Preencher um voo com passageiros aleatórios 8 - Histograma de ocupação de voo por tipo de lugar 9 - Geração do ficheiro de nomes e apelidos 5
5 Grupo 1: Manipulação básica de ficheiros e visualização simples de informação O primeiro conjunto de procedimentos consiste nas opções 0 a 3. Elas versam a manipulação básica de ficheiros de texto e binário, como a sua leitura e escrita, assim como a manipulação e visualização básica de dados. A classificação indicativa para os alunos que tenham executado apenas esta parte com sucesso é de 10 a 13 valores. 5.1 Mostrar a estrutura de um avião A primeira opção consiste em mostrar a estrutura de um certo tipo de avião em termos de filas das classes executiva e turística. O programa deve perguntar quais dos A3xx se pretende. Lê esse ficheiro e coloca a informação no ecrã. A mostragem da estrutura de um avião pode ser feita de dois modos: 1. Se o programa for corrido sem parâmetros, mostra o menu e tem de se seleccionar a opção 1 e o programa pede o tipo do avião. 2. Se o programa for corrido com um parâmetro (como está mostrado em baixo) ele lê logo o ficheiro com o nome fornecido, mostra a estrutura e vai depois para o menu. $./tunl A318 O programa deve também poder ser corrido de um modo habitual no Linux para se saber como é a sintaxe dos programas. Ao ser chamado como mostrado em baixo o programa deve escrever os modos como pode ser corrido $./tunl -h 5.2 Mostrar a ocupação de um voo Esta opção mostra os vários lugares do avião para um certo voo (ex. TP1048) indicando quais os livres e os ocupados. Atenção que o número de filas depende do avião que está a ser usado nesse voo e essa indicação aparece no primeiro campo do ficheiro de voo. Tem de ler o ficheiro do tipo de avião primeiro, e depois ler o do voo mostrando a informação no final. 5.3 Mostrar o nome dos passageiros com reservas num voo Esta opção é semelhante à anterior no que diz respeito à obtenção de informação de um voo. O que se pretende agora é que sejam escritos para cada lugar ocupado a fila, a cadeira e o nome da pessoa que vai viajar. 6
6 Grupo 2: Tratamento elaborado de informação O segundo conjunto de procedimentos consiste no manuseamento mais elaborado da informação. A classificação indicativa para os alunos que tenham executado a parte anterior e esta parte é de 13 a 16 valores. 6.1 Efectuar reserva de um voo Esta opção permite reservar um lugar num voo. Obviamente, o voo tem de existir, pelo que o programa deve perguntar o nome do voo (ex. TP1048). Abre o ficheiro para ver que tipo de avião o vai executar, lê o ficheiro do avião para saber a estrutura (opç e depois lê o ficheiro até ao fim. Mostra a ocupação ao utilizador (igual à opção 2) e pergunta a fila e o lugar ao utilizador. Se esse lugar estiver vazio aceita a reserva pedindo a informação necessária. No final escreve o ficheiro com os dados actualizados, mantendo o mesmo nome, evidentemente. 6.2 Alterar o lugar de uma reserva Esta opção permite que um utilizador que já tenha uma reserva possa mudar de lugar. A segurança é feita pedindo ao utilizador o nome e comparando com o nome onde o utilizador diz que está. É muito parecida com a opção anterior, mas em vez de o utilizador indicar um lugar para o reservar para si, indica um lugar onde presumivelmente está e se escrever o nome correcto, deve indicar outro lugar para onde deseja ir. Claro que este novo lugar tem de estar vago (tal como na opção anterior, desta vez). 6.3 Atribuir um avião a um voo (abertura de voo) Esta opção permite criar um voo. Por exemplo, o voo TP1048. O programa deve perguntar o nome do voo que será o nome do ficheiro. Depois deve perguntar o tipo de avião para esse voo. O programa deve ir ler o ficheiro do tipo de avião que foi escolhido para saber quantas filas há e de que classe. Depois deve escrever o inteiro do tipo de avião no ficheiro novo e escrever os dados para todos os lugares indicando que estão vazios. Esta opção deve poder ser executada a partir da linha de comandos do seguinte modo: $./tunl TP1048 A318 7
7 Grupo 3: Tratamento avançado de informação O terceiro conjunto de procedimentos consiste no tratamento avançado de informação. A classificação indicativa para os alunos que tenham executado todas as partes incluindo esta é de 16 a 18 valores. 7.1 Preencher um voo com passageiros aleatórios Esta opção permite encher um voo aleatoriamente. A percentagem de ocupação do avião deve ser determinada aleatoriamente, os lugares onde os passageiros se vão sentar devem ser determinados aleatoriamente, os nomes próprios dos utilizadores assim como os seus apelidos devem ser determinados aleatoriamente a partir dos ficheiros nomes e apelidos, e finalmente os identificadores de bagagem e de reserva também devem ser determinados aleatoriamente. 8
8 Grupo 4: Tratamento muito avançado de informação O quarto e último conjunto de procedimentos consiste na execução de tarefas muito avançadas de manipulação de informação e sua representação gráfica. A classificação indicativa para os alunos que tenham executado todas as partes anteriores e também esta é de 18 a 20 valores. Tenha em atenção o aviso no final desta secção. 8.1 Histograma Esta opção gera um histograma da ocupação de um voo. O programa deve perguntar o nome do voo (ex., TP1048) e deve mostrar a percentagem de ocupação do voo, a percentagem de ocupação dos lugares de executiva, de turística, de lugares à janela, de lugares ao corredor, e finalmente dos lugares do meio. O máximo de asteriscos indicadores dos vários valores deve ser de 70 (ou o comprimento de uma linha no terminal) e deve ser o valor máximo de todos os anteriores. Os outros estão em proporção directa. Esta opção não foi implementada pelo corpo docente no trabalho deste semestre. 8.2 Geração dos ficheiros de nomes e apelidos Esta opção deve ser implementada num programa diferente. O objectivo é usar os ficheiros nomes_original e apelidos_original para gerar os ficheiros nomes e apelidos que são usados na opção7. AVISO: O Regente da disciplina vai comparar o código deste grupo 4 nos trabalhos de todos os alunos que o fizerem. Códigos considerados pelo Regente como semelhantes implicarão que a nota máxima do trabalho seja de 18 valores. Esta decisão não é revogável nem sujeita a recurso. Não arrisque. Programe o trabalho todo individualmente (ou no grupo) e resista ao impulso de ver soluções de outros grupos, ou de ter trocas de ideias com outros grupos de uma forma muito perto da linguagem C. 9
9 Relatório do Trabalho Os alunos devem produzir um relatório do trabalho seguindo as indicações do ficheiro em WORD que está no sítio do trabalho final. Neste semestre as classificações do relatório serão apenas ilustrativas, com as seguintes excepções que implicam reprovação: Um relatório com mais do que uma página. Um relatório muito ilegível e pouco claro. Um relatório sem um mínimo de informação. 10 Postura dos alunos Cada grupo deve ter em consideração o seguinte: Não perca tempo com a estética de entrada e saída de dados; Programe de acordo com os princípios gerais de uma boa codificação (utilização de indentação, apresentação de comentários, uso de variáveis com nomes conformes às suas funções...) e Proceda de modo a que o trabalho a fazer fique equitativamente distribuído pelos dois membros do grupo. 11 Datas Limite A data limite para entrega do trabalho de avaliação é o dia 3 de Junho de 2012, às 18:00 horas por correio electrónico enviado ao docente do laboratório (ver endereços nas páginas da disciplina). Deve ser entregue o ficheiro de código C (.c) e o ficheiro WORD ou PDF com o relatório. Aconselha-se os alunos a contactarem o docente o mais rapidamente possível para marcar a data da discussão, que se realizará nas semanas seguintes. Não são permitidas entregas posteriores, sendo a nota do trabalho de zero valores. Planeie metas ao longo deste período até dia 3 para não deixar acumular trabalho na última semana e com isso prejudicar outras disciplinas (tanto na parte de testes como de trabalhos). Adiante o trabalho para não sofrer muita pressão no final do prazo. Existem quatro semanas de aulas (o mês de Maio) para a execução do trabalho nas aulas de laboratório. Use-as bem para ir avançando no trabalho e executar o mínimo fora das aulas. 10