Avaliação de expressões. Prof: Sérgio Souza Costa

Documentos relacionados
Pilha. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof. Gustavo Batista

SCC 202 Algoritmos e Estruturas de Dados I. Pilhas (Stacks) (implementação dinâmica)

Pilha. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof. Gustavo Batista

Avaliação de Expressões

Prof. Jesus José de Oliveira Neto

Algoritmos e Estrutura de Dados Aula 08 Pilhas

Estruturas de Dados Pilhas, Filas, Listas

Estruturas de Dados Pilhas, Filas e Deques

Estruturas de Dados Pilhas, Filas, Listas

Pilha. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Melhores momentos AULA 14

Pilhas e Filas. Nádia Félix e Hebert Coelho

Lista 02: Pilhas & Filas

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

2 Aplicação Pilha: Avaliador de Expressões Simples

Exemplos. Alocação Dinâmica de Pilhas. Pilhas. Pilhas. Implementação Seqüencial X Encadeada. SCE 182 Algoritmos e Estruturas de Dados I

Tipo de Dados Abstractos: Pilha (stack)

Programação Estruturada

Notações: in, pré e posfixada

Estrutura de Dados: Pilhas. Unidade I:

Linguagens de Programação I

SCC Algoritmos e Estruturas de Dados I

Fundamentos de Programação

Introdução à Programação

Algoritmos e Estruturas de Dados 2007/2008

ESTRUTURA DE DADOS PILHA

Carlos Eduardo Batista. Centro de Informática - UFPB

ALGORITMOS E ESTRUTURAS DE DADOS Terceiro Trabalho Prático Recursividade e Pilhas

FUNDAÇÃO EDUCACIONAL DE ITUIUTABA

Linguagem de Programação. Thiago Leite Francisco Barretto

Algoritmos e Estruturas de Dados I

Computação 2. Aula Profª. Fabiany Listas Duplamente Encadeadas

10.1. Aula 10: Pilhas. O conceito de pilha. Algoritmos de inserção e remoção. Exemplo: Notação Polonesa

Algoritmos e Estruturas de Dados 2005/2006

UNIVERSIDADE DE SÃO PAULO INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO

Desenvolvimento de Aplicações Desktop

C Operadores e Expressões

Estrutura de Dados Básica

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais:

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

Algoritmos e Programação

Algoritmos e Programação

Introdução à Programação. Expressões Booleanas e Comandos Condicionais

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

LINGUAGEM C: VARIÁVEIS E EXPRESSÕES

Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados

Revisão: Tipo Abstrato de Dados Recursividade

ALGORITMOS em linguagem C

Algoritmos e Estruturas de Dados

Algoritmos e Estruturas de Dados I 01/2013. Vetores e Recursividade. Pedro O.S. Vaz de Melo

CONDICIONAL / de SELEÇÃO / de DECISÃO

Prof. A. G. Silva. 28 de agosto de Prof. A. G. Silva INE5603 Introdução à POO 28 de agosto de / 1

Linguagens de Programação

UNIVERSIDADE FEDERAL DO PAMPA CAMPUS BAGÉ ALGORITMOS E PROGRAMAÇÃO. Estruturas de condição. Prof. Alex Camargo

Comandos de Controle do Programa

K&R: Capitulo 2 IAED, 2012/2013

Linguagem C. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

Comandos em C (cont.)

Lógica de Programação I

Algoritmos e Estruturas de dados

Introdução à Programação em C Input / Output

Pilhas Filas e Listas

Universidade Estadual de Mato Grosso do Sul Ciência da Computação Algoritmos e Estruturas de Dados I (AED-I) Prof. Nilton

INF 1007 Programação II

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

EXPRESSÕES RELACIONAIS

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: Operadores relacionais e lógicos estruturas condicionais If...

Pilhas e Filas. Prof. Walteno Martins Parreira Júnior.

ESTRUTURAS DE DADOS E ALGORITMOS II ANTONIO RAMOS DE CARVALHO JÚNIOR PILHAS

Curso de C. Estruturas Condicionais

EXPRESSÕES ARITMÉTICAS PARTE 1

UNIVERSIDADE DE SÃO PAULO ICMC SCC 202 Algoritmos e Estrutura de Dados I - 2º Semestre 2010 Profa. Sandra Maria Aluísio;

RESUMO DE CONCEITOS BÁSICOS DE C

3. Linguagem de Programação C

Tipos, Literais, Operadores

Tipos, Literais, Operadores

CONTROLE DE FLUXO. Algoritmos e Programação. Prof. Alceu Britto Slides cedidos pelo Prof. Edson J. R. Justino (PUCPR) Aula 9 e 10

Árvores Binárias e Busca. Jeane Melo

Comandos de Decisão Parte I

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Primeiro Curso de Programação em C 3 a Edição

INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

Tipos de Dados Simples (Continuação)

Programação Aplicada à Engenharia

Pilhas. Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1

Introdução à Linguagem C++

Programação. MEAer e LEE. Bertinho Andrade da Costa. Instituto Superior Técnico. Argumentos da linha de comando Funções recursivas

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

LINGUAGEM C: COMANDOS DE CONTROLE CONDICIONAL

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

Linguagem C: Elementos fundamentais

Tipos abstratos de dados; pilhas e filas

Computação Eletrônica. Tipos de dados, constantes, variáveis, operadores e expressões. Prof: Luciano Barbosa

Linguagem de Programação I. Aula 06 Linguagem C: Tipos de Dados

SCC Algoritmos e Estruturas de Dados I

Transcrição:

Avaliação de expressões Prof: Sérgio Souza Costa

Avaliação de expressões Como efetuar o cálculo de uma expressão em um computador? A / B * (D + C)

Avaliação de expressões - Notações

Avaliação de expressões - Notações Infixa: A + (B*C) / D

Avaliação de expressões - Notações Infixa: A + (B*C) / D Posfixa (polonesa reversa): A B C * + D /

Avaliação de expressões - Notações Infixa: A + (B*C) / D Posfixa (polonesa reversa): A B C * + D / Préfixa (polonesa): + A / * B C D

Notação Infixa Operadores entre operandos. 4 + 6 * 8

Notação Infixa Operadores entre operandos. 4 + 6 * 8 Como decidir quais operadores são avaliados primeiros?

Notação Infixa Operadores entre operandos. 4 + 6 * 8 Como decidir quais operadores são avaliados primeiros?

Notação Infixa - Avaliação Operadores entre operandos. 4 + 6 * 8 Como decidir quais operadores são avaliados primeiros? Abordagem usual é usar as mesmas regras da matemática. Caso a prioridade seja a mesma, avalia-se da esquerda para direita Parenteses tem precedência sobre todos operadores.

Notação Infixa - Precedência Quando usamos a notação infixa é importante sabermos a ordem de precedência dos operadores, por exemplo, abaixo temos uma lista ordenada dos operadores por ordem de precedência. () [] ->! ~ ++ -- * & (tipo) sizeof() * / % + - >> << < <= >= > ==!= & ^ &&? () : () = += -= *=

Notação Polonesa É fácil observar que devido a estas regras, o algoritmo para avaliar expressões na notação infixa não é muito trivial. O matemático polonês Jan Łukasiewicz criou uma notação em torno de 1920 que elimina a necessidade de regras. Ficou sendo conhecida como notação polonesa. Não é muito usado na matemática convencional, mas muito usado nas ciências da computação.

Notação Polonesa e Polonesa Reversa Notação Polonesa ou Prefixa, os operadores aparecem antes dos operandos. + A B Notação Polonesa reversa ou Pósfixa, os operadores aparecem logo após os operandos. A B +

Algoritmos

Notação Posfixa A avaliação de expressões nesta notação é a mais simples. Percorrendo uma expressão da esquerda para direita, sabemos que ele deve operar os dois últimos valores encontrados.

Notação posfixa Considerem a seguinte expressão 73+5*. Expressão Elemento Ação Pilha 73+5* P:[] 3+5* 7 Empilhar P:[7] +5* 3 Empilhar P:[3,7] 5* + Desempilha 3 Desempilha 7 Empilha 3+7 P:[7] P:[] P:[10] * 5 Empilhar P:[5,10] * Desempilha 5 Desempilha 10 Empilha 5*10 P:[10] P:[] P:[50] Se a pilha tiver mais de um elemento, erro, caso contrário retorna o único valor da pilha.

Atividade Simulem a avaliação da seguinte expressão 3 5 2 * * 6 /

Atividade Escrevam o algoritmo que avalia uma expressão na notação posfixa. Considere uma expressão simples, somente o operador + e cada valor contem apenas um caracter de 0 a 9. Considerem tambem que a expressão é sempre válida. Por exemplo: Notação posfixa 12+ Notação prefixa 1+2

Solução Uma versão simplificada para a avaliação de expressão posfixa: int avalia_expressao (char s[]) { int t; Stack p = stack_init(); while (*s) { switch (*s) { case '+': push (&p, pop (&p) + pop (&p)); break; default: push (&p, *s - '0' ) ; } s++; } return pop (&p); }

Notação infixa para posfixa Dada uma expressão na notação infixa, podemo convertê-la para posfixa.

Notação infixa para posfixa Dada uma expressão na notação infixa, podemo convertê-la para posfixa. Versão simplificada: Cada valor também tem apenas um caracter. Ela é sempre válida. E não existe prioridade de operadores, todas operações estaram dentro de parenteses. Por exemplo: 4 + 5 + 6 equivale ((4 + 5) + 6 )

Notação infixa para posfixa Dado uma expressão totalmente parentetizada: Algoritmo: Percorrer a expressão da esquerda para direita, e para cada caracter faça: Parenteses de abertura ignorar Se for operando, copiar para expressão de saida Se for operador, aguardar na pilha Se for fechamento de abertura, copiar o ultimo operador acessado.

Notação infixa para posfixa Para a expressão ( (3 + 5) + 9 ): Simbolo Ação Pilha Saída ( ignora P:[] ( ignora P:[] 3 copia P:[] 3 + aguarda P:[+] 3 5 copia P:[+] 3 5 ) desempilha + copia p:[] p:[] 3 5 3 5 + + aguarda P:[+] 3 5 + 9 copia P:[+] 3 5 + 9 ) desempilha + copia p:[] 3 5 + 9 3 5 + 9 +

Atividade Simulem a conversão da seguinte expressão para forma posfixa: (5 * (8 + 2))

Atividade Codifiquem o algoritmo que realiza a conversão entre infixa e posfixa.

Solução Uma versão simplificada: char* infixtoposfix (char s[]) { char* iter; char* saida = malloc (50*sizeof (char)); iter = saida; Stack p = stack_init(); while (*s) { switch (*s) { case '(': break; case '+': push(&p, *s); break; case ')': *(iter++) = pop (&p); break; default: *(iter++) = *s; break; } s++; } *iter = '\0'; } return saida;

Atividades Testem e concluem os algoritmos para avaliação de expressão posfixa e para conversão entre as notações infixa e posfixa. Para a conversão, considerem as prioridades entre os operadores. Próxima aula será no laboratório.