A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

EXPRESSÕES ARITMÉTICAS Inhaúma Neves Ferraz Departamento de Ciência da Computação Universidade Federal Fluminense

Apresentações semelhantes


Apresentação em tema: "EXPRESSÕES ARITMÉTICAS Inhaúma Neves Ferraz Departamento de Ciência da Computação Universidade Federal Fluminense"— Transcrição da apresentação:

1 EXPRESSÕES ARITMÉTICAS Inhaúma Neves Ferraz Departamento de Ciência da Computação Universidade Federal Fluminense

2 2 Sumário Definições Avaliação de expressões Transformação de expressões infixas em pós-fixas Algoritmo com bastante abstração Exemplo Declaração de funções auxiliares Avaliação de expressões pós-fixas Algoritmo com bastante abstração Exemplo

3 3 Definições Uma expressão aritmética é composta de operandos, operadores e delimitadores. As operações são definidas por seus operadores. A ordem de avaliação das operações depende dos delimitadores e da prioridade dos operadores. As expressões aritméticas podem ser representas por 3 tipos de notação. Infixa Pré-fixa Pós-fixa

4 4 Avaliação de expressões (1) A avaliação de expressões na forma pós-fixa é bastante simplificada por diversas razões: Não há necessidade de emprego de delimitadores; A prioridade dos operadores deixa de ser relevante; As expressões podem ser analisadas fazendo uma varredura do início para o final armazenando os operandos em uma pilha, aplicando os operadores sobre os elementos da pilha e empilhando os resultados das operações efetuadas.

5 5 Avaliação de expressões (2) A avaliação de expressões aritméticas pode ser feita transformando as expressões infixas, familiares aos seres humanos, em expressões pós-fixas e, a seguir, avaliando o resultado das expressões pós-fixas obtidas. Para a transformação de expressões aritméticas infixas em pós-fixas e sua avaliação é conveniente definir diversas funções auxiliares.

6 6 Transformação de expressões aritméticas infixas em pós-fixas Esta transformação será mostrada da seguinte maneira: Inicialmente será apresentado um algoritmo com bastante abstração Será apresentado um exemplo Finalmente serão apresentadas as declarações de funções utilizadas em um algoritmo com pouca abstração (para implementação)

7 Transformação de expressões infixas em pós-fixas

8 8 Conversão da forma infixa para pós-fixa (algoritmo com bastante abstração) A entrada é um vetor infixVect de tokens (strings) de uma expressão infixa A saída é um vetor postficVect de tokens (strings) que armazena a expressão infixa correspondente Utilizar uma pilha stackVector de tokens para armazenar operadores Os tokens são operandos, operadores e delimitadores O processamento consistem em uma repetição que analisa cada token de entrada e gerencia a pilha e a transferência para a saída A repetição continua enquanto não ocorrer erro e não terminar a expressão infixa Quando todos os tokens de infixVect tiverem sido processados, repetidamente desempilhar um token de stackVect e adicioná-lo a postfixVect até esvaziar stackVect

9 9 Conversão da forma infixa para pós-fixa (passos da repetição) Caso o token seja: um operando Incluí-lo no final do vetor postfixVect um ( Empilhar o token x em stackVect um ) Repetidamente desempilhar um token de stackVect e adicioná-lo ao vetor postfixVect até encontrar ( no final da pilha stackVect Desempilhar ( de stackVect Se stackVect esvaziar antes de encontrar um (, a expressão de entrada não é válida. um operador Se stackVect estiver vazia ou o token de entrada tiver prioridade maior do que a operador topo de pilha Empilhar o token de entrada. Caso contrário desempilhar o token de stackVect, adicioná-lo ao vetor postfixVect Repetir a comparação do token de entrada com o novo topo de pilha

10 10 infixVect postfixVect ( a + b - c ) * d – ( e + f ) Conversão da forma infixa para pós-fixa stackVect

11 11 infixVect postfixVect a + b - c ) * d – ( e + f ) ( stackVect Conversão da forma infixa para pós-fixa

12 12 infixVect postfixVect + b - c ) * d – ( e + f ) ( a stackVect Conversão da forma infixa para pós-fixa

13 13 infixVect postfixVect b - c ) * d – ( e + f ) ( a + stackVect Conversão da forma infixa para pós-fixa

14 14 infixVect postfixVect - c ) * d – ( e + f ) ( a b + stackVect Conversão da forma infixa para pós-fixa

15 15 infixVect postfixVect c ) * d – ( e + f ) ( a b + - Conversão da forma infixa para pós-fixa stackVect

16 16 infixVect postfixVect ) * d – ( e + f ) ( a b + c - Conversão da forma infixa para pós-fixa stackVect

17 17 infixVect postfixVect * d – ( e + f ) a b + c - Conversão da forma infixa para pós-fixa stackVect

18 18 infixVect postfixVect d – ( e + f ) a b + c - * Conversão da forma infixa para pós-fixa stackVect

19 19 infixVect postfixVect – ( e + f ) a b + c - d * Conversão da forma infixa para pós-fixa stackVect

20 20 infixVect postfixVect ( e + f ) a b + c – d * - Conversão da forma infixa para pós-fixa stackVect

21 21 infixVect postfixVect e + f ) a b + c – d * - ( Conversão da forma infixa para pós-fixa stackVect

22 22 infixVect postfixVect + f ) a b + c – d * e - ( Conversão da forma infixa para pós-fixa stackVect

23 23 infixVect postfixVect f ) a b + c – d * e - ( + Conversão da forma infixa para pós-fixa stackVect

24 24 infixVect postfixVect ) a b + c – d * e f - ( + Conversão da forma infixa para pós-fixa stackVect

25 25 infixVect postfixVect a b + c – d * e f + - Conversão da forma infixa para pós-fixa stackVect

26 26 infixVect postfixVect a b + c – d * e f + - Conversão da forma infixa para pós-fixa stackVect

27 27 infixVect postfixVect ( a + b * c ) * d – ( e + f ) Conversão da forma infixa para pós-fixa stackVect

28 28 infixVect postfixVect a + b * c ) * d – ( e + f ) ( stackVect Conversão da forma infixa para pós-fixa

29 29 infixVect postfixVect + b * c ) * d – ( e + f ) ( a stackVect Conversão da forma infixa para pós-fixa

30 30 infixVect postfixVect b * c ) * d – ( e + f ) ( a + stackVect Conversão da forma infixa para pós-fixa

31 31 infixVect postfixVect * c ) * d – ( e + f ) ( a b + stackVect Conversão da forma infixa para pós-fixa

32 32 infixVect postfixVect c ) * d – ( e + f ) ( a b + Conversão da forma infixa para pós-fixa stackVect *

33 33 infixVect postfixVect ) * d – ( e + f ) ( a b c + Conversão da forma infixa para pós-fixa stackVect *

34 34 infixVect postfixVect ) * d – ( e + f ) ( a b c * + Conversão da forma infixa para pós-fixa stackVect

35 35 infixVect postfixVect * d – ( e + f ) a b c * + Conversão da forma infixa para pós-fixa stackVect

36 36 infixVect postfixVect d – ( e + f ) a b c * + * Conversão da forma infixa para pós-fixa stackVect

37 37 infixVect postfixVect – ( e + f ) a b c * + d * Conversão da forma infixa para pós-fixa stackVect

38 38 infixVect postfixVect ( e + f ) a b c * + d * - Conversão da forma infixa para pós-fixa stackVect

39 39 infixVect postfixVect e + f ) a b c * + d * - ( Conversão da forma infixa para pós-fixa stackVect

40 40 infixVect postfixVect + f ) a b c * + d * e - ( Conversão da forma infixa para pós-fixa stackVect

41 41 infixVect postfixVect f ) a b c * + d * e - ( + Conversão da forma infixa para pós-fixa stackVect

42 42 infixVect postfixVect ) a b c * + d * e f - ( + Conversão da forma infixa para pós-fixa stackVect

43 43 infixVect postfixVect a b c * + d * e f + - Conversão da forma infixa para pós-fixa stackVect

44 44 infixVect postfixVect a b c * + d * e f + - Conversão da forma infixa para pós-fixa stackVect

45 45 Funções auxiliares Transformação de expressões aritméticas infixas em pós-fixas isoperand isdigit prio expon oper orcd postfix Avaliação de expressões aritméticas pós-fixas eval

46 46 Transformação de expressões aritméticas infixas em pós-fixas (1) isoperand Recebe um caractere, ou token, e retorna verdadeiro (TRUE) quando o caractere não for +, -, *, /,, (, ). isdigit Recebe um caractere, ou token, e retorna TRUE quando o token for numérico.

47 47 Transformação de expressões aritméticas infixas em pós-fixas (2) prio Recebe um token, que seja operador e retorna 1 caso o operador seja + ou - 2 caso o operador seja * ou / 3 caso o operador seja ^ 0 em caso contrário expon Recebe dois reais e retorna o valor do primeiro real elevado à potencia igual ao segundo real oper Recebe um token (operador) e dois reais (operandos) e retorna o resultado da aplicação do operador aos dois operandos

48 48 Transformação de expressões aritméticas infixas em pós-fixas (3) prcd Recebe dois tokens, representando operadores e retorna TRUE quando o primeiro operador tem precedência sobre o segundo operador ao aparecer à esquerda deste último em uma expressão infixa sem parênteses. Casos particulares ocorrem com o tratamento de parênteses.

49 49 Transformação de expressões aritméticas infixas em pós-fixas (4) Regras de tratamento de precedência de parênteses Ao entrar um ) saem todos os elementos até encontrar um (. Ambos os delimitadores são descartados.

50 50 Transformação de expressões aritméticas infixas em pós-fixas (5) postfix Recebe dois strings. O primeiro string (de entrada) representa uma expressão aritmética sob a forma infixa. O segundo string serve para retornar uma expressão aritmética na forma pós-fixa. O string de entrada é varrido do início até o final. Se o token do string de entrada for um operando é imediatamente copiado para o string de saída Se o token de entrada for um operador, enquanto houver operadores empilhados com precedência maior do que o operador de entrada, estes operadores que estavam empilhados são transferidos para a expressão de saída O operador de entrada é empilhado. Ao término da varredura os operadores são desempilhados e copiados para a expressão de saída Os delimitadores não são transferidos para o string de saída.

51 51 Avaliação de expressões aritméticas pós- fixas eval Recebe um string que representa uma expressão infixa e faz uma varredura do início para o final do string Se o token corrente for um operando deve ser empilhado sob a forma de real Se o token corrente for um operador devem ser desempilhados dois operandos sobre os quais o operador vá atuar O resultado da aplicação do operador aos operandos é empilhado Ao término da varredura do string a função retorna o topo da pilha

52 Avaliação de expressões pós- fixas

53 53 Avaliação de expressões aritméticas pós-fixas Esta avaliação será mostrada da seguinte maneira: Inicialmente será apresentado um algoritmo com bastante abstração Será apresentado um exemplo

54 54 Avaliação de expressões aritméticas pós-fixas Ler os tokens de um vetor de tokens (strings) postfixVect contendo uma expressão pós-fixa Quando o token for um operando Empilhá-lo em stackVect Quando o token for um operador Desempilhar de stackVect dois operandos Aplicar o operador aos dois operandos desempilhados de stackVect obtendo um valor (novo operando) Empilhar em stackVect o valor obtido da aplicação do operador aos operandos desempilhados Ao término da varredura do string de postfixVect a função retorna o topo da pilh a

55 55 a b + c – d * e f + - postfixVect Avaliação de expressões pós-fixas stackVect Situação inicial

56 56 a b + c – d * e f + - postfixVect Avaliação de expressões pós-fixas stackVect a Empilhado o operando a

57 57 a b + c – d * e f + - postfixVect Avaliação de expressões pós-fixas stackVect a b Empilhado o operando b

58 58 a b + c – d * e f + - postfixVect Desempilhados operandos a e b Operador + aplica-se a a e b Avaliação de expressões pós-fixas stackVect

59 59 a b + c – d * e f + - postfixVect Empilhado o resultado a + b Avaliação de expressões pós-fixas stackVect a + b

60 60 a b + c – d * e f + - postfixVect Empilhado o operando c Avaliação de expressões pós-fixas stackVect a + b c

61 61 a b + c - d * e f + - postfixVect Avaliação de expressões pós-fixas stackVect Desempilhados operandos (a + b) e c Operador - aplica-se a (a + b) e c

62 62 a b + c - d * e f + - postfixVect Avaliação de expressões pós-fixas stackVect a + b - c Empilhado o resultado (a + b - c)

63 63 a b + c – d * e f + - postfixVect Empilhado o operando d Avaliação de expressões pós-fixas stackVect a + b - c d

64 64 a b + c – d * e f + - postfixVect Desempilhados (a+b-c) e d Operador * aplica-se a (a+b-c) e d Avaliação de expressões pós-fixas stackVect

65 65 a b + c – d * e f + - postfixVect Empilhado o operando (a+b-c) * d Avaliação de expressões pós-fixas stackVect (a + b - c) * d

66 66 a b + c – d * e f + - postfixVect Empilhado o operando e Avaliação de expressões pós-fixas stackVect (a + b - c) * d e

67 67 a b + c – d * e f + - postfixVect Empilhado o operando f Avaliação de expressões pós-fixas stackVect (a + b - c) * d e f

68 68 a b + c – d * e f + - postfixVect Desempilhados operandos e e f Operador + aplica-se a e e f Avaliação de expressões pós-fixas stackVect (a + b - c) * d

69 69 a b + c – d * e f + - postfixVect Empilhado operando e + f Avaliação de expressões pós-fixas stackVect (a + b - c) * d e + f

70 70 a b + c – d * e f + - postfixVect Desempilhados operandos (a+b-c)*d e (e+ f) Operador - aplica-se a (a+b-c)*d e (e+ f) Avaliação de expressões pós-fixas stackVect

71 71 a b + c – d * e f + - postfixVect Empilhado (a + b - c) * d – (e + f) Avaliação de expressões pós-fixas stackVect (a + b - c) * d – (e + f)

72 72 a b + c – d * e f + - postfixVect Saída obtida Desempilhar (a + b - c) * d – (e + f) Avaliação de expressões pós-fixas stackVect


Carregar ppt "EXPRESSÕES ARITMÉTICAS Inhaúma Neves Ferraz Departamento de Ciência da Computação Universidade Federal Fluminense"

Apresentações semelhantes


Anúncios Google