Programa de laboratório: máquina de calcular com memória; Descrição sucinta: ********* ******* Cada aluno deverá desenvolver um programa que calcula as quatro operações básicas (adição, subtração, multiplicação e divisão) sobre um par de números inteiros, além de algumas operações extras. Além disso, o programa deverá ser capaz de armazenar em memória temporária cinco números, se o usuário assim desejar. Deve ser possível empregar esses números em operações subsequentes. Descrição detalhada: ********* ********* Seu programa deve manter cinco posições de memória que poderão ser usadas pelo usuário para guardar resultados de operações. Esses resultados poderão ser empregados pelo usuário como operandos em operações posteriores. As posições de memória devem se chamar MEM1, MEM2, MEM3, MEM4 e MEM5 e, inicialmente, cada uma deverá ter o valor 0 como conteúdo. O programa funcionará como um sistema simples de linha de comando que espera instruções do usuário sobre o que fazer. Enquanto espera que o usuário digite algo, o programa apresenta a linha de comando '> '. Inicialmente, o usuário poderá fornecer nove comandos: OPER - o usuário informa ao programa que deseja fazer um cálculo. Uma vez que o usuário digite 'OPER' na linha de comando, o programa pede que ele forneça o primeiro operando, o operador e o segundo operando, faz a operação solicitada e apresenta o resultado. Por exemplo, se o usuário digitar > OPER operand1> 4 operator> + operand2> 3 (lembrando que, na sequência de entradas acima, '> ', 'operand1> ', 'operand2>' e 'operator' são apresentados pelo próprio programa. O usuário forneceu apenas OPER, 4, + e 3 como entrada) O programa deve apresentar na tela o resultado: = 7 Além das quatro operações, o programa também deve ser capaz de calcular a raiz quadrada de um número, elevá-lo a uma potência arbitrária e calcular seu fatorial. O operador de potenciação deve ser a palavra 'pow', o de fatorial a palavra 'fac' e o de raiz quadrada a palavra 'sqrt'. Por exemplo: > OPER operand1> 2 operator> pow operand2> 10 Neste caso, o programa responde com = 1024 Note que tanto fatorial quanto a raiz quadrada são operações unárias, o seja, recebem apenas um operando. O programa deve ser capaz de perceber isso. Por exemplo, se o usuário fornecer: > OPER operand1> 1024 operator> sqrt o programa não deve exibir a linha 'operand2>'. Ao invés disso, deve fornecer o resultado da operação: = 32 Similarmente para o fatorial: > OPER operand1> 5 operator> fac = 120 (* resposta do programa *) É possível que o usuário use o conteúdo de uma posição de memória como operando em uma operação. Por exemplo, se ele quiser o usar o valor armazenado na memória MEM4: > OPER operand1> MEM4 operator> + operand2> 3 Neste caso, o programa deve usar o valor armazenado na posição de memória MEM4 como primeiro operando da adição e fornecer o resultado de acordo. Deve ser possível inclusive fazer operações envolvendo apenas valores armazenados em memória, como por exemplo: > OPER operand1> MEM1 operator> + operand2> MEM2 Obs: no caso de o usuário pedir para o programa calcular uma divisão por zero, o programa deve simplesmente avisar que aquele o resultado da operação é um número indefinido. Resposta similar deve ser fornecida no caso de o usuário solicitar que seja calculada a raiz quadrada ou o fatorial de um número negativo. STORE - guarda o resultado da última operação realizada em uma memória temporária. Uma vez que o usuário digite o comando 'STORE', o programa deve perguntar em qual posição de memória o usuário deseja armazenar o valor. O usuário deve responder informando o nome da posição que ele deseja usar. Por exemplo, depois de o usuário digitar > OPER operand1> 4 operator> + operand2> 3 e o programa responder = 7 se o usuário digitar > STORE position> MEM3 o programa armazenará em MEM3 o valor 7. Uma operação posterior pode usar o valor armazendo em MEM3 como operando. Por exemplo: > OPER operand1> 33 operator> / operand> MEM3 deve fornecer como resultado: = 4 Lembrando que o programa deve usar sempre divisão inteira. EXIT - sai do programa. CLEAR - limpa a tela. Os cinco comandos restantes simplesmente imprimem o conteúdo das cinco posições de memória. Cada comando corresponde ao nome de uma memória: Por exemplo: > OPER operand1> 3 operator> + operand1> 2 = 5 (* resultado fornecido pelo programa *) > STORE position> MEM2 > OPER operand1> 4 operator> * operator> MEM2 = 20 (* resultado fornecido pelo programa *) > STORE position> MEM3 > MEM2 = 5 (* resultado fornecido pelo programa *) > MEM3 = 20 (* resultado fornecido pelo programa *) Para testar seu programa, use os três conjuntos de entradas seguintes: Conjunto 1: ********** OPER 15 + 34 OPER 23 * 46 EXIT Conjunto 2: ********** OPER 10 + 23 STORE MEM1 OPER 2 * MEM1 STORE MEM2 CLEAR OPER MEM2 / MEM1 EXIT Conjunto 3: ********** OPER 54 / MEM1 OPER -54 / 9 STORE MEM1 OPER MEM1 pow 3 STORE MEM2 MEM1 MEM2 OPER -1 * MEM2 CLEAR STORE MEM3 OPER MEM3 sqrt STORE MEM3 OPER -15 + MEM3 STORE MEM4 OPER MEM4 fac EXIT Dica: **** - Para implementar o operador de raiz quadrada, use a função SQRT de Pascal (explicada no item 10 da Lista de Exercícios 1). SQRT devolve um valor real e não um inteiro. Para obter um número inteiro a partir de um número real (descartando-se sua parte decimal), use a função TRUNC. Esta função funciona de maneira similar à função INT, explicada no item 12 da Lista de Exercícios 1, só que devolve um número do tipo inteiro, ao invés de um real. - Para implementar o operador de fatorial, é recomendável definir um procedimento separado responsável por essa tarefa, para organizar melhor o seu código. - Para fazer este trabalho, será útil empregar algumas variáveis do tipo string, uma sequência de caracteres. A declaração de uma variável desse tipo funciona como qualquer outra: var texto1 :string; var texto2 :string; Operações como atribuição e comparação de igualdade também funcionam com strings: texto1 = 'lalala'; texto2 = 'lololo'; if texto 1 = texto2 then writeln('Iguais') else writeln('Diferentes'); Para ler um string a partir do teclado, recomendamos que vocês utilizem o comando readln. O comando read tem algumas peculiaridades que tornam o seu uso um pouco mais complicado, quando variáveis do tipo string sao empregadas.