Aritmetica postfissa

Documenti analoghi
Da infissa a Postfissa

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Verificare se un albero binario è bilanciato

Linguaggio C. Esercizio 1

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO III Indice

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Espressioni ed operatori in C

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Esercizi. Stringhe. Stringhe Ricerca binaria

La sintassi del C APPENDICE H

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Informatica 1. Prova di recupero 21 Settembre 2001

Esempio di Prova Scritta

Alberi ed Alberi Binari

Per semplicità eliminiamo le ripetizioni nell'albero.

Esercitazione 12. Esercizi di Ricapitolazione

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Caratteri e stringhe

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Alberi binari. Esercizi su alberi binari

Stringhe e allocazione dinamica della memoria

Algoritmi e basi del C Struttura di un programma

ADT: Abstract Data Type. Quasi ADT. ADT per collezioni di dati (code generalizzate) 04 I tipi di dati astratti (I parte)

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Stringhe. In C le stringhe ben formate sono in realtà array di caratteri terminati sempre da un carattere speciale, \0, detto anche

Esercitazione 5. Procedure e Funzioni Il comando condizionale: switch

Gestione di files Motivazioni

Corso Programmazione 1 Capitolo 01: Concetti Elementari

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

La gestione della memoria dinamica Heap

La gestione dei caratteri in C

ESEMPIO: le variabili LETTURA/SCRITTURA DI VARIABILI. Specifica Leggere da tastiera un intero, un carattere, un float e un double. Stamparli a video.

Appello di Informatica B

Esercizio 1: Puntatori impiegati che sono manager

Tipi elementari, costanti. Tipi di dati. VALORI: un insieme dei valori del tipo OPERAZIONI: per operare su tali valori. Tipi. intero reale carattere

Descrizione delle operazioni di calcolo. Espressioni costanti semplici

Corso di Informatica 1 Esercitazione n. 4

Programmazione I - Laboratorio

Scrittura formattata - printf

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Perché il linguaggio C?

Compito di Fondamenti di Informatica

La struttura dati ad albero binario

Preprocessore, linker e libreria standard

Istruzioni iterative (o cicliche)

Indirizzo di una funzione. Puntatori a funzioni. Definizione di variabili. Definizione di variabili

IL PRIMO PROGRAMMA IN C

Algoritmi di Ricerca. Esempi di programmi Java

Linguaggi di programmazione + laboratorio a.a. 2012/2013

SULL USO DEI CARATTERI. char x; si legge con ( %c,&x) e si stampa con ( %c,x) ma anche con ( %d,x) DUE ESEMPI

Fondamenti di Informatica 2

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

Strutture dati dinamiche in C (II)

Gestione dei file. File di testo e binari

Introduzione alla programmazione in C(++)

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Programmazione I - Laboratorio

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Esercizio: gestione di un conto corrente

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Laboratorio di Algoritmi e Strutture Dati

Corso di Linguaggi di Programmazione

Corso di Fondamenti di Informatica

Laboratorio di architettura degli elaboratori Progetto finale AA 2005/2006

Debug di un programma

Transcript:

Aritmetica postfissa Le espressioni aritmetiche sono normalmente scritte in notazione infissa, cioe in modo tale che i simboli delle operazioni binarie compaiono tra gli oggetti su cui operano. ESEMPIO: 20 + 15 * (100 5) 21 Nella notazione postfissa gli operatori seguono gli oggetti su cui operano ESEMPIO : 20 15 100 5 * + 21 La notazione postfissa è detta polacca inversa (RPN) in omaggio al matematico polacco LUKASIEWICZ che l ha introdotta. Con la notazione polacca otteniamo espressioni aritmetiche che possono essere calcolate mano mano che vengono lette, pur non contenendo parentesi e senza far riferimento alle regole di precedenza degli operatori. Infatti per esempio abc*+ corrisponde a a+b*c mentre ab+c* corrisponde a (a+b)*c

La Hewlett-Packard produce certi modelli di calcolatrici, come quello nell'immagine, che usa esclusivamente la RPN, per la velocità di calcolo che si ottiene. Si vada alla pagina http://www.hp.com/calculators/news/rpn.html per verificare la semplicità d uso della RPN.

Notazione polacca: definizione Un espressione aritmetica in notazione polacca e una qualunque serie di operandi aritmetici x, y, e operatori binari op (+,-,*,/) che si può formare mediante le regole seguenti: 1. ogni operando x è un espressione aritmetica in notazione polacca 2. se p1 e p2 sono espressioni aritmetiche in notazione polacca e op è un operatore aritmetico allora anche p1p2 op è un espressione aritmetica in notazione polacca ESEMPI: p1 = 48 63 + ( che corrisponde a 48+63 ) p2 = 52 4 * (che corrisponde a 52 * 4) p3 = p1 p2 - (che corrisponde a p1-p2)

Notazione polacca: regola di calcolo 1. scandisci l espressione da sinistra a destra fino a che raggiungi il primo operatore 2. applica l operatore ai due operandi alla sua sinistra, sostituisci il risultato nell espressione al posto di operandi e operatore ESEMPIO: 20 15 100 5 - * + 21 20 15 95 * + 21 20 1425 + 21 1445 21 1424

algoritmo per valutare un espressione in notazione polacca 1. scandisci l espressione da sinistra a destra. appena leggi un operando compi il passo 2. appena leggi un operatore compi il passo 3. 2. impila l operando nella pila degli operandi 3. rimuovi dalla pila l operando in cima e salvalo in op1, rimuovi dalla pila l operando in cima e salvalo in op2, applica l operatore a op2 e op1 e impila il risultato in cima alla pila. Esempio: 20 15 100 5 * + 21 5 100 15 20 95 15 20 1425 21 20 1445 1445 1424

Pila.h polacca.h #include polacca.c main.c Pila.c

Aritmetica postfissa, implementazione: file polacca.h enum tokent {add,subtract,multiply,divide,integer,ill}; /* i tokens in un espressione */ typedef enum tokent tokentype; Le istruzioni di controllo sulle precondizioni sono omesse nel codice per non appesantire le definizione. Lo studente le aggiunga! int valutapolacca (char* espr); /*prec: espr!= NULL && espr!= \0 && espr è in RPN. postc: restituisce il valore di espr. */ tokentype leggi (char ** espr,int *tokenvalue); /* individua operandi e operatori nell'espressione aritmetica postfissa in input, restituendone il tipo e predisponendo espr alla lettura del successivo token. prec: espr!= NULL && *espr!= NULL && tokenvalue!= NULL && *tokenvalue ==0. postc: restituisce add,subtract,multiply,divide se legge l' operatore +,-,*, / rispettivamente,integer,ill se legge un intero o un valore illegale inoltre il puntatore in espr è portato alla fine della porzione di espressione letta.*/

Aritmetica postfissa, implementazione: file polacca.c - le inclusioni #include <stdio.h> #include <string.h> #include <ctype.h> #include <assert.h> #include "polacca.h" #include "pila.h"

Aritmetica postfissa, implementazione: file polacca.c int valutapolacca (char* espr) {PilaP PILA; int tokenvalue, NumTop, NumSuc; tokentype t; PILA = costrpila(strlen(espr)); while (*espr!= '\0') {tokenvalue = 0; t = leggi(&espr,&tokenvalue); if (t == ill) return 0; if (t == integer) push(tokenvalue, PILA); else {NumTop = pop(pila); NumSuc = pop(pila); if (t == add) NumSuc += NumTop; if (t == subtract) NumSuc -= NumTop; if (t == multiply) NumSuc *= NumTop; if (t == divide) NumSuc /= NumTop; push(numsuc,pila);} } distrpila(pila); return NumSuc;} /*inizializza la pila*/ /*pone in t il tipo del token letto, mette in tokenvalue il suo valore e predispone la lettura del prossino token*/

Aritmetica postfissa: la funzione leggi tokentype leggi (char ** espr,int *tokenvalue) {tokentype token; char *s = *espr; while (isspace(*s)) s++; /* saltiamo eventuali spazi */ if ( isdigit(*s)) {token = integer; while (isdigit(*s)) {*tokenvalue = *tokenvalue*10 + *s -'0';s++;} } else switch(*s) {case '+' : {token = add; s++; break;} case '-' : {token = subtract; s++; break;} case '*' : {token = multiply; s++; break;} case '/' : {token = divide; s++; break;} default : {token = ill; printf("%c è un carattere illegale.\n",*s);break; } } *espr = s; return token;}

Il main #include "polacca.h" int main (void) {char * str; /*si memorizzi in str una RPN*/ if (strlen(str)) printf("il valore di str = %s è %d\n",str,valutapolacca(str)); return 0;}