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

EXPRESSÕES ARITMÉTICAS

  • Upload
    brooks

  • View
    43

  • Download
    0

Embed Size (px)

DESCRIPTION

EXPRESSÕES ARITMÉTICAS. Inhaúma Neves Ferraz Departamento de Ciência da Computação Universidade F ederal Fluminense [email protected]. 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 - PowerPoint PPT Presentation

Citation preview

Page 1: EXPRESSÕES ARITMÉTICAS

EXPRESSÕES ARITMÉTICAS

Inhaúma Neves Ferraz

Departamento de Ciência da Computação

Universidade Federal Fluminense

[email protected]

Page 2: EXPRESSÕES ARITMÉTICAS

2

Sumário

DefiniçõesAvaliação de expressõesTransformaçã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

Page 3: EXPRESSÕES ARITMÉTICAS

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

Page 4: EXPRESSÕES ARITMÉTICAS

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.

Page 5: EXPRESSÕES ARITMÉTICAS

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.

Page 6: EXPRESSÕES ARITMÉTICAS

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)

Page 7: EXPRESSÕES ARITMÉTICAS

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

Page 8: EXPRESSÕES ARITMÉTICAS

8

Conversão da forma infixa para pós-fixa A entrada é um vetor infixVect de tokens (strings) de uma expressão infixa

Quando o token for um operando Inclui-lo no final do vetor postfixVect de tokens (strings) que armazena a expressão pós-

fixa correspondente Quando o token for um parênteses ou um operador

Se o token x for “(“ Empilhar o token x em stackVect de tokens (strings)

Se o token x for “)” Repetidamente desempilhar um token y de stackVect e adiciona-lo ao vetor postfixVect

até encontrar “(“ no final da pilha stackVect. Desempilhar então “(“ de stackVect. Se stackVect esvaziar antes de encontrar um “(“, a expressão de entrada não é válida.

Se o token x for um operador Passo 1: Examinar o token y no topo de stackVect. Passo 2: Se(caso 1) stackVect não estiver vazia e (caso 2) y não for “(“ e (caso 3) y

for um operador de precedência igual ou maior do que a de x, desempilhar o token y de stackVect, adiciona-lo ao vetor postfixVect, e ir para o Passo 1 novamente.

Passo 3: Se (caso 1) stackVect estiver vazia ou (caso 2) y for “(“ ou (caso 3) y for um operador de precedência menor do que a de x , adicionar o token x ao vetor postfixVect.

Quando todos os tokens de infixVect tiverem sido processados, repetidamente desempilhar um token y de stackVect e adiciona-lo ao vetor postfixVect até esvaziar a pilha stackVect.

Page 9: EXPRESSÕES ARITMÉTICAS

9

infixVect

postfixVect

( a + b - c ) * d – ( e + f )

Conversão da forma infixa para pós-fixa

stackVect

Page 10: EXPRESSÕES ARITMÉTICAS

10

infixVect

postfixVect

a + b - c ) * d – ( e + f )

(

stackVect

Conversão da forma infixa para pós-fixa

Page 11: EXPRESSÕES ARITMÉTICAS

11

infixVect

postfixVect

+ b - c ) * d – ( e + f )

(

a

stackVect

Conversão da forma infixa para pós-fixa

Page 12: EXPRESSÕES ARITMÉTICAS

12

infixVect

postfixVect

b - c ) * d – ( e + f )

(

a

+

stackVect

Conversão da forma infixa para pós-fixa

Page 13: EXPRESSÕES ARITMÉTICAS

13

infixVect

postfixVect

- c ) * d – ( e + f )

(

a b

+

stackVect

Conversão da forma infixa para pós-fixa

Page 14: EXPRESSÕES ARITMÉTICAS

14

infixVect

postfixVect

c ) * d – ( e + f )

(

a b +

-

Conversão da forma infixa para pós-fixa

stackVect

Page 15: EXPRESSÕES ARITMÉTICAS

15

infixVect

postfixVect

) * d – ( e + f )

(

a b + c

-

Conversão da forma infixa para pós-fixa

stackVect

Page 16: EXPRESSÕES ARITMÉTICAS

16

infixVect

postfixVect

* d – ( e + f )

a b + c -

Conversão da forma infixa para pós-fixa

stackVect

Page 17: EXPRESSÕES ARITMÉTICAS

17

infixVect

postfixVect

d – ( e + f )

a b + c -

*

Conversão da forma infixa para pós-fixa

stackVect

Page 18: EXPRESSÕES ARITMÉTICAS

18

infixVect

postfixVect

– ( e + f )

a b + c - d

*

Conversão da forma infixa para pós-fixa

stackVect

Page 19: EXPRESSÕES ARITMÉTICAS

19

infixVect

postfixVect

( e + f )

a b + c – d *

-

Conversão da forma infixa para pós-fixa

stackVect

Page 20: EXPRESSÕES ARITMÉTICAS

20

infixVect

postfixVect

e + f )

a b + c – d *

-

(

Conversão da forma infixa para pós-fixa

stackVect

Page 21: EXPRESSÕES ARITMÉTICAS

21

infixVect

postfixVect

+ f )

a b + c – d * e

-

(

Conversão da forma infixa para pós-fixa

stackVect

Page 22: EXPRESSÕES ARITMÉTICAS

22

infixVect

postfixVect

f )

a b + c – d * e

-

(

+

Conversão da forma infixa para pós-fixa

stackVect

Page 23: EXPRESSÕES ARITMÉTICAS

23

infixVect

postfixVect

)

a b + c – d * e f

-

(

+

Conversão da forma infixa para pós-fixa

stackVect

Page 24: EXPRESSÕES ARITMÉTICAS

24

infixVect

postfixVect

a b + c – d * e f +

-

Conversão da forma infixa para pós-fixa

stackVect

Page 25: EXPRESSÕES ARITMÉTICAS

25

infixVect

postfixVect

a b + c – d * e f + -

Conversão da forma infixa para pós-fixa

stackVect

Page 26: EXPRESSÕES ARITMÉTICAS

26

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

Page 27: EXPRESSÕES ARITMÉTICAS

27

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.

Page 28: EXPRESSÕES ARITMÉTICAS

28

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

Page 29: EXPRESSÕES ARITMÉTICAS

29

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.

Page 30: EXPRESSÕES ARITMÉTICAS

30

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.

Page 31: EXPRESSÕES ARITMÉTICAS

31

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.

Page 32: EXPRESSÕES ARITMÉTICAS

32

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.

Page 33: EXPRESSÕES ARITMÉTICAS

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

Page 34: EXPRESSÕES ARITMÉTICAS

34

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

Page 35: EXPRESSÕES ARITMÉTICAS

35

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 pilha

Page 36: EXPRESSÕES ARITMÉTICAS

36

a b + c – d * e f + -

postfixVect

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

stackVect

Situação inicial

Page 37: EXPRESSÕES ARITMÉTICAS

37

a b + c – d * e f + -

postfixVect

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

stackVect

a

Empilhado o operando a

Page 38: EXPRESSÕES ARITMÉTICAS

38

a b + c – d * e f + -

postfixVect

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

stackVect

a

b

Empilhado o operando b

Page 39: EXPRESSÕES ARITMÉTICAS

39

a b + c – d * e f + -

postfixVect

Desempilhados operandos a e bOperador + aplica-se a a e b

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

stackVect

Page 40: EXPRESSÕES ARITMÉTICAS

40

a b + c – d * e f + -

postfixVect

Empilhado o resultado a + b

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

stackVect

a + b

Page 41: EXPRESSÕES ARITMÉTICAS

41

a b + c – d * e f + -

postfixVect

Empilhado o operando c

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

stackVect

a + b

c

Page 42: EXPRESSÕES ARITMÉTICAS

42

a b + c - d * e f + -

postfixVect

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

stackVect

Desempilhados operandos (a + b) e cOperador - aplica-se a (a + b) e c

Page 43: EXPRESSÕES ARITMÉTICAS

43

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)

Page 44: EXPRESSÕES ARITMÉTICAS

44

a b + c – d * e f + -

postfixVect

Empilhado o operando d

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

stackVect

a + b - c

d

Page 45: EXPRESSÕES ARITMÉTICAS

45

a b + c – d * e f + -

postfixVect

Desempilhados (a+b-c) e dOperador * aplica-se a (a+b-c) e d

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

stackVect

Page 46: EXPRESSÕES ARITMÉTICAS

46

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

Page 47: EXPRESSÕES ARITMÉTICAS

47

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

Page 48: EXPRESSÕES ARITMÉTICAS

48

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

Page 49: EXPRESSÕES ARITMÉTICAS

49

a b + c – d * e f + -

postfixVect

Desempilhados operandos e e fOperador + aplica-se a e e f

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

stackVect

(a + b - c) * d

Page 50: EXPRESSÕES ARITMÉTICAS

50

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

Page 51: EXPRESSÕES ARITMÉTICAS

51

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

Page 52: EXPRESSÕES ARITMÉTICAS

52

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)

Page 53: EXPRESSÕES ARITMÉTICAS

53

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