Prévia do material em texto
Universidade Federal da Bahia Instituto de Matemática Departamento de Ciência da Computação MAT A57 – Laboratório de Programação 1 – Turma 01 – Prof Italo Valcy 1º Trabalho prático – 2013.1 – 22/Jul/2013 Calculadora simplificada (TC – Tiny Calculator) Tarefa Nesse trabalho o aluno deverá implementar uma aplicação em C que funcionará como um interpretador de operações matemáticas simplificado, similar a uma calculadora. Além das operações matemáticas convencionais, essa calculadora será capaz de salvar o resultado de um cálculo (valor atual do display) em uma variável definida pelo usuário e também a executar laços de repetições, conforme definido pelo usuário. Para a implementação do sistema TC, você deve seguir algumas premissas indicadas abaixo: • O programa deve ler as instruções de cálculo, definidas abaixo, tanto através da entrada padrão, quanto a partir de um arquivo informado como argumento de linha de comando; • O programa deve efetuar alocação dinâmica de memória para armazenar os valores de um cálculo quando solicitado pelo usuário; • O programa deve estar bem estruturado, com funções para tratar cada funcionalidade e com arquivos separando seus módulos (e.g. interface de linha de comando, cálculos, tratamento de arquivos, etc.) As operações que o sistema TC deve implementar são as seguintes (tags entre devem ser substituídos por valores/nomes apropriados): 1. CLD: Clear Display – Zera o valor acumulado no acumulador (display); 2. SET : atribui um valor ao acumulador, sobre-escrevendo-o, seja um valor direto ou um valor armazenado em determinada variável; 3. ADD : adiciona um valor ao total acumulado, seja um valor direto ou um valor armazenado em determinada variável, salvando o resultado no acumulador; 4. SUB : subtrai um valor do total acumulado, seja um valor direto ou um valor armazenado em determinada variável, salvando o resultado no acumulador; 5. MUL : multiplica o total acumulado por um valor, seja um valor direto ou um valor armazenado em determinada variável, salvando o resultado no acumulador; 6. DIV : divide o total acumulado por um valor, seja um valor direto ou um valor armazenado em determinada variável, salvando o resultado no acumulador. Deve-se ter cuidado com divisões por zero, elas não devem ser de fato executadas. Ao encontrar uma divisão por zero, deve-se imprimir um erro na tela (“ERR: divisao por zero”), mantendo o valor do acumulador antigo; 7. POW : potenciação do total acumulado (base) por um valor (expoente), seja um valor direto ou um valor armazenado em determinada variável, salvando o resultado no acumulado. A operação de potenciação aceita números inteiros positivos e negativos como expoente; caso a base seja zero e o expoente seja zero, deve-se imprimir um erro na tela (“ERR: potenciacao invalida”), mantendo o valor do acumulador antigo; 8. SQRT: calcula a raiz quadrada do acumulador, salvando o resultado no acumulador. Caso o valor acumulado, antes de efetuar a operação de raiz quadrada, seja negativo, deve-se imprimir um erro na tela (“ERR: raiz quadrada invalida”), mantendo o valor do acumulador antigo; 9. REP : repete determinada instrução determinado número de vezes, seja o número de vezes informado diretamente ou um valor armazenado em determinada variável. A instrução pode ser qualquer uma das seguintes (vistas anteriormente): ADD, SUB, MUL, DIV, POW, SQRT. 10. STOD : Store Display – Salva o valor acumulado no acumulador (display) em uma variável informada pelo usuário. 11. PRINT: imprime no terminal o valor do acumulador, com duas (2) casas decimais; 12. OFF: encerra a execução da calculadora TC. Acerca das variáveis: • O nome das variaveis será composto apenas por letras minúsculas (de “a” a “z”), com no máximo 32 letras. Caso o usuário tente declarar uma variável fora desse formato, deve-se imprimir um erro no terminal (“ERR: nome de variavel invalido”) e manter o valor do acumulador anterior; • Toda variável deve ser preenchida (instrução STOD) antes de ser usada. Caso o usuário tente usar uma variável que não foi preenchida anteriormente, deve-se imprimir um erro no terminal (“ERR: variavel nao definida”) e manter o valor do acumulador anterior; Observações gerais: • O acumulador sempre começa com valor zero; • Cada uma das instruções acima possui alguns argumentos ou nenhum. Ao detectar uma instrução com quantidade errada de argumentos, ou ainda uma instrução não definida acima, deve-se imprimir um erro no terminal (“ERR: instrucao invalida”) e manter o valor do acumulador anterior; • Uma linha de instrução conterá no máximo 1024 caracteres, incluindo seus argumentos; • Cada instrução é separada de seus argumentos através de espaços (um ou muitos) ou tabulações/tabs (um ou muitos); • Ao ler as instruções de um arquivo, a instrução de finalização da calculadora é opcional. Caso ela apareça antes do final do arquivo, ela deve encerrar o programa conforme seu comportamento normal. Exemplos de execução Execução 01: Entrada: Saída ./tc CLD SET 8.8 ADD 0.5 SUB 0.3 SUB -9 STOD qualquernome CLD SET 5 MUL qualquernome PRINT REP 6 ADD 10 90.00 1.20 STOD salvaacumulador SET 3 STOD xxxxx SET 5 STOD numerocinco SET salvaacumulador REP xxxxx DIV numerocinco PRINT OFF Execução 02: Considere a existência do arquivo “/tmp/entrada1.tc” com o seguinte conteúdo: ADD 50 REP 4 ADD 10 POW 2 STOD xyz SET 10 POW 3 REP 8 ADD 100 SUB 99 ADD xyz SQRT PRINT Entrada: Saída ./tc /tmp/entrada1.tc 99.00 Observações O trabalho é em grupo de até três alunos. O grupo deve entregar o código-fonte diretamente compilável, sem a necessidade de instalação de IDEs específicas ou outros programas além do compilador. Data de entrega: 30/08/2013, até às 23:59 (horário de Brasília). O trabalho deve ser entregue por e- mail, para o endereço do professor (italo@dcc.ufba.br). No dia 02/09/2013 e 09/09/2013, o grupo deverá apresentar o código-fonte para o professor e acompanhar os testes de execução. Cada grupo terá 20 minutos. A cada dia, será sorteado a ordem de apresentação. Observação: somente serão aceitos trabalhos feitos utilizando-se um dos seguintes compiladores: • C: gcc ou djgpp Não serão aceitos trabalhos em outros compiladores. Erros ocasionados por utilização de outros compiladores serão considerados erros do trabalho.