CES11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Prticas
- Slides: 57
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2016 Capítulo III Pilhas
Objetivos do Lab 3: n Ler uma expressão na forma parentética; por exemplo, a expressão: tem a seguinte forma parentética: n Transformar, usando uma pilha, a parentética numa polonesa equivalente: ^ n Calcular, usando uma pilha, o valor da polonesa
Exercício 3. 1: Obtenção dos átomos de uma expressão aritmética parentética n Sejam expressões do tipo: (((x 1 + x 2) * (x 3 + (x 4 * x 5))) + x 6) também chamadas expressões na forma parentética onde xi é um número inteiro não negativo com um ou mais dígitos decimais, onde os operadores são somente “+” e “*”, e onde todas as operações são colocadas entre parênteses n Átomos de uma expressão como essas são os seus números, seus operadores e seus parêntesis
n Um átomo é uma entidade contendo dois campos: o tipo e um eventual atributo n Um átomo pode ser de um dos seguintes tipos: - NUM (abrev. de número): quando ele for um número inteiro OPER (abrev. de operador): quando ele for um dos caracteres ‘+’ ou ‘*’ ABPAR (abrev. de abre-parêntesis): quando ele for o caractere ‘(’ FPAR (abrev. de fecha-parêntesis): quando ele for o caractere ‘)’ INVAL (abrev. de átomo inválido): quando ele for qualquer outro caractere
n O eventual atributo de um átomo depende de seu tipo: - n NUM: o atributo é o valor numérico do número OPER: o atributo é o próprio caractere ‘+’ ou ‘*’ ABPAR: o átomo não precisa de atributo FPAR: o átomo também não precisa de atributo INVAL: o atributo é o próprio caractere Tarefa: completar o esqueleto de programa a seguir que: - Lê uma expressão na forma parentética Encontra seus átomos (tipos e atributos), guardando-os numa lista de átomos (vetor de
n Exemplo: os átomos da expressão (13 * (45 + 7) &) serão guardados na seguinte lista de átomos denominada Parentetica: Vetor ABPAR 0 NUM OPER 13 * 1 2 ABPAR 3 NUM OPER NUM 45 + 7 4 5 6 natom FPAR INVAL FPAR & 7 8 9 10 Parentetica n O campo para o atributo de um átomo deverá ser uma union n A seguir, o esqueleto de programa
/* Inclusao de bibliotecas de C #include */ <stdio. h> <stdlib. h> <conio. h> <ctype. h> /* Declaracoes para o tipo logic */ typedef char logic; const logic TRUE = 1, FALSE = 0; /* Definicao dos tipos de atomos #define #define NUM OPER ABPAR FPAR INVAL 1 2 3 4 5 */ A serem usadas nos próximos exercícios
/* Declaracoes de tipos para as expressoes e listas de atomos */ typedef char expressao[50]; Campo valor: Para átomos do tipo NUM typedef union atribatomo; Campo carac: union atribatomo { Para átomos de tipos OPER int valor; char carac; e INVAL }; typedef struct atomo; struct atomo { int tipo; atribatomo atrib; }; typedef struct listaatomos; struct listaatomos { int natom; atomo Vetor[50]; }; tipo atrib O tipo atomo
/* Variaveis globais */ int i; char c; expressao Expr; listaatomos Parentetica; /* Prototipos das funcoes auxiliares */ void char void Armazenar. Parentetica (void); Escrever. Lista. Atomos (listaatomos *); Prox. Nao. Branco (void); Armazenar. Parentetica: armazena os Prox. Carac (void); átomos de Expr na variável global Parentetica Inic. Expr (void); Podem ser escritas outras funções caso sejam convenientes Escrever. Lista. Atomos: escreve todos os átomos de uma lista de átomos Haverá mais uma lista além da Parentetica O argumento é passado por referência
/* Funcao main */ int main() { char c; printf ("Armazenar expressao parentetica? (s/n): "); do c = getche (); while (c!='s' && c!='n' && c!='S' && c!='N'); while (c == 's' || c == 'S') { printf ("nn"); printf ("Digite a expressao: "); setbuf (stdin, NULL); gets (Expr); Armazenar. Parentetica (); Escrever. Lista. Atomos (&Parentetica); printf ("nn. Armazenar expressao parentetica? (s/n): "); do c = getche (); while (c!='s' && c!='n' && c!='S' && c!='N'); } printf ("nn"); printf ("Fim das atividades!"); printf ("nn"); system ("pause"); return 0; }
void Armazenar. Parentetica () { Zerar o número de átomos de Parentetica; Posicionar o cursor de Expr em seu início; Capturar o primeiro caractere não-branco; Enquanto ele não for o ‘ ’ { Preparar para formar um novo átomo; Se o caractere for um dígito { Coletar os outros dígitos; O tipo do átomo é NUM; O atributo é o valor numérico da cadeia formada pelos dígitos coletados; } Se for '+' ou '*' { O tipo do átomo é OPER; O atributo é o próprio caractere; } Diretrizes para a função Armazenar. Parentetica
} } Se for '(' ou ')' { O tipo do átomo é ABPAR ou FPAR; O atributo não é necessário; } Se for qualquer outro caractere { O tipo do átomo é INVAL; O atributo é o próprio caractere; } Armazenar o átomo no final de Parentetica; Acrescentar uma unidade ao número de átomos de Parentetica; Capturar o próximo caractere não-branco; /* Fim do Enquanto */ /* Fim da função Armazenar. Parentetica */ Cuidado com os comandos para percorrer Expr Diretrizes para a função Armazenar. Parentetica
Diretrizes para a função Escrever. Lista. Atomos: Para uma expressão tal como ((12+32)*13 & + 43; )) a função deverá mostrar no vídeo uma tabela semelhante à seguinte: TIPO | ATRIBUTO ----------ABPAR | NUM | 12 OPER | + NUM | 32 FPAR | OPER | * NUM | 13 INVAL | & OPER | + NUM | 43 INVAL | ; FPAR |
/* Funcoes para percorrer a expressao */ char Prox. Nao. Branco () { while (isspace (Expr[i]) || (iscntrl (Expr[i]) && Expr[i] != '