Curso de Licenciatura em Engenharia Informática Cadeira de Algoritmia Projecto de avaliação 2006/2007. Este projecto visa a criação de um back-end para geração de facturas para um sistema de facturação Web. Num hipotético sistema de facturação Web, uma pessoa introduz dados que deseja ver facturados pela sua empresa, carrega num botão e na página seguinte surge-lhe a factura pronta a imprimir com os respectivos totais. O programa que você vai desenvolver é utilizado pelas páginas que seriam desenvolvidas por outra pessoa, para gerar a factura em si. O seu programa não se preocupa com pedir dados ao utilizador pela Web, e as páginas não se iriam preocupar com gerar a factura: o seu programa faz isso. Página a pedir dados para a factura. Botão de enviar O programa deste projecto. Página que exibe a factura pronta a imprimir. É da responsabilidade das páginas que seriam desenvolvidas por outra pessoa, preocupar-se com o ambiente Web. O seu programa deve simplesmente assumir que está a ser chamado pela linha de comandos. Isto que dizer que os requisitos técnicos serão: O seu programa deve ser escrito em linguagem C padrão, lendo dados do teclado (ou melhor entrada padrão do C stdin) e escrevendo dados para o ecrã (ou melhor saída padrão do C stdout); Todos os dados devem ser lidos com a função scanf() do C; Os dados que vão ser fornecidos ao seu programa estarão em formato ASCII simples no conjunto de caracteres US-ASCII, sendo a saída idêntica (ou seja, não se preocupe com caracteres acentuados, não os use no programa, e não se preocupe com HTML, entity-encoding e outras situações habituais em programação Web);
Durante o desenvolvimento, seria muito útil poder utilizar-se o seu programa para testar e corrigir erros no processo. Assim, a funcionalidade pretendida é a seguinte: O programa deve ler do teclado múltiplas linhas para o descritivo de uma factura. Cada linha deve ser composta de o nome do produto/serviço (campo de texto com um máximo de 50 caracteres, não podendo conter espaços ) o data em que o produto/serviço foi prestado (campo de texto com exactamente 10 caracteres no formato AAAA-MM-DD); o quantidade de unidades compradas/prestadas (campo float/double); o preço total por esta linha do descritivo (sem IVA) (campo float/double); o percentagem do IVA (e.g. 21.0 = 21%) (campo float/double) Não deve haver limite para a quantidade de linhas que uma factura pode ter, enquanto o computador tiver memória livre para as guardar; O programa deve arrancar e começar imediatamente a pedir linhas de descritivo para facturas, sem nenhum menu inicial: isto para que possa ser chamado a partir da linha de comandos por um comando semelhante a programa < descritivo-teste.txt ; O seu programa sabe que já não há mais linhas de descritivo, quando lê o nome do produto/serviço de uma dessas linhas e esse nome é ou (ou seja, quem estiver a usar o programa, termina a lista de descritivo escrevendo apenas um asterisco ou símbolo mais sozinhos numa linha). Se o símbolo terminador for o asterisco, o seu programa termina exibindo no ecrã um cabeçalho ( Factura electrónica ), o descritivo que foi introduzido ( bonito, bem formatado, uma linha de ecrã por linha de descritivo), e ao final exibe o total de IVA, o sub-total dos produtos/serviços sem IVA, e o total final a pagar com a soma desses dois. Se o símbolo terminador for o mais, o seu programa vai agora ler uma série de comandos (strings), um por linha, terminados ao final por um asterisco sozinho. Quando ler o asterisco, o seu programa corre os comandos pela mesma ordem em que foram introduzidos, e sai. Os comandos que ele deve reconhecer são: listar a linha actual do descritivo (inicialmente, a linha actual é a 1ª até ser mudada pelos comandos L ou L-); L avança a linha actual para passar a ser a seguinte (não exibe nada no ecrã nem muda a lista de linhas de descritivo, só muda a linha que será exibida pelo comando ); Isto é para lhe facilitar a vida de forma a que este campo possa ser lido com um %s no scanf().
L- recua a linha actual para passar a ser a anterior (não exibe nada no ecrã nem muda a lista de linhas de descritivo, só muda a linha que será exibida pelo comando ); LT listar todo o descritivo tal como foi introduzido inicialmente, ou tal como ficou ordenado pelo último comando LN, LD, LQ, LP ou LI; LN listar o descritivo ordenado pelo nome do produto/serviço; LD listar o descritivo ordenado pela data de prestação; LQ listar o descritivo ordenado pela quantidade; LP listar o descritivo ordenado pelo preço (sem IVA); LI listar o descritivo ordenado pela percentagem de IVA; D - apaga ( delete ) a linha actual (ver comandos, L e L-), passando a linha actual a ser a que estava à frente desta; I introduzir mais linhas de descritivo à frente das que já existem, voltando para todos os efeitos ao comportamento inicial do programa. Encontra exemplo de utilização na página seguinte deste enunciado. Tal como já deve ter compreendido, espera-se que o programa seja implementado recorrendo ao uso de listas bidireccionais (duplamente ligadas) que guardam estruturas C em cada elemento. Cada ordenação deve alterar permanentemente a lista. O comando de apagar também deve alterar permanentemente a lista. Nota: se tiver dificuldades com o uso de listas, aceita-se que o programa seja implementado com vectores (arrays). No entanto a nota máxima de um projecto com vectores é 14 o que significa que um projecto com vectores que cumpra apenas 50% dos critérios de avaliação tem nota 7! Critérios de avaliação: Quantidade de comandos que foram correctamente implementados; Qualidade do código; Exibir correctamente, caracter a caracter, alguns descritivos de teste que o professor irá usar; À-vontade em relação ao próprio trabalho, durante a apresentação oral do trabalho. O projecto deve ser realizado em grupo e apresentado em grupo. A nota do projecto pode ser diferente para cada elemento do grupo. Um elemento do grupo que não apareça ao mesmo tempo que os restantes para a discussão terá nota zero para a apresentação oral do mesmo, e nota reduzida para os restantes critérios. Boa Sorte! Pedro Freire
Anexo: Exemplos de utilização. Nestes exemplos, o texto que você escreveria está a azul, e o texto que o programa manda para o ecrã está a negro. Factura electronica Sub-total: 1801.00 IVA: 370.21 Total a pagar: 2171.21 L L Portas 2007-01-01 5.0 500.20 21.0%
D LT LD L D I Candeeiros 2007-01-01 3.00 30 21 LT Candeeiros 2007-01-01 3.0 30.00 21.0%