Laboratorio di Programmazione M-Z

Documenti analoghi
Da infissa a Postfissa

Descrizione delle operazioni di calcolo. Espressioni costanti semplici

Foglio Elettronico Lezione 1

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

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

Esercitazioni di Reti Logiche. Algebra Booleana e Porte Logiche

Espressioni ed operatori in C

Operatori di relazione

Algebra Booleana, Funzioni Logiche e Circuiti Logici

Esercizi su strutture dati

Aritmetica postfissa

Lezione 7 Alberi binari: visite e alberi di ricerca

Fondamenti di Informatica

Sviluppo di programmi

IL LINGUAGGIO C TIPI DI DATO

Il potere espressivo di un linguaggio è caratterizzato da: PROGRAMMA = DATI + CONTROLLO

3. Indicare cosa sta a significare la figura geometrica del rombo in un diagramma a blocchi

Appunti di informatica. Lezione 10 anno accademico Mario Verdicchio

LINGUAGGI DI PROGRAMMAZIONE!

Laboratorio di Programmazione Laurea in Bioinformatica

RAPPRESENTAZIONE GLI ALGORITMI NOTAZIONE PER LA RAPPRESENTAZIONE DI UN ALGORITMO

Le variabili logiche possono essere combinate per mezzo di operatori detti connettivi logici. I principali sono:

MODULO 1. Prof. Onofrio Greco. Prof. Greco Onofrio

Algebra di Boole. Andrea Passerini Informatica. Algebra di Boole

CONVERSIONE DA DECIMALE A BINARIO

Algebra di Boole X Y Z V. Algebra di Boole

Conversione di un numero da binario a decimale

Potenziamento formativo, Infermieristica, M. Ruspa Esempi di operazioni con monomi

Formalismi per la descrizione di algoritmi

Informatica di Base - 6 c.f.u.

Espressione di chiamata di funzione

Fondamenti di Informatica T-1

Introduzione alla programmazione in C(++)

Espressioni. Espressioni. Valutazione di un espressione. Espressioni semplici

Strutture di Controllo

Esercizi Programmazione I

PROGRAMMAZIONE DISCIPLINARE LICEO SCIENTIFICO OPZIONE SCIENZE APPLICATE INFORMATICA CLASSE QUINTA

Liste con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }

Algebra di Boole Algebra di Boole

Programmazione in Python. Moreno Marzolla

Sistemi di numerazione

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

PROLOG E ANALISI SINTATTICA DEI LINGUAGGI Quando si vuole definire in modo preciso la sintassi di un linguaggio si ricorre a una grammatica G=(V n,v t

CALCOLO NUMERICO. Rappresentazione virgola mobile (Floating Point)

Introduzione alla programmazione

Esercitazioni su rappresentazione dei numeri e aritmetica. Interi unsigned in base 2

Monomi L insieme dei monomi

Corso di Matematica per la Chimica. Dott.ssa Maria Carmela De Bonis a.a

Algoritmi e Strutture Dati

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

OBIETTIVI DI APPRENDIMENTO DI MATEMATICA-SCUOLA SECONDARIA DI PRIMO GRADO

CALCOLO LETTERALE I MONOMI. Il primo tipo di oggetto che incontriamo nel calcolo letterale è il MONOMIO.

Transcript:

Laboratorio di Programmazione M-Z Docente: Dott. Francesco Strappaveccia france.strappavecci2@unibo.it Università di Bologna, Sede di Cesena

Espressioni algebriche Uno dei compiti del compilatore è quello di valutare le espressioni algebriche: Per esempio: y = x + z (w/x + z (7 + 6)). Il compilatore, oltre a valutarne il valore numerico, deve stabilire se è sintatticamente corretta o meno. Le notazioni con cui possiamo descrivere le espressioni algebriche possono essere 3: Prefissa, Infissa e Postfissa. Nella vita reale, sin dalle prime esperienze di calcolo, abbiamo sempre avuto a che fare con la notazione Infissa.

Notazione Infissa E la notazione più comunemente usata. Infissa significa che ogni operatore binario appare in mezzo ai suoi due operandi: A }{{} + }{{} B }{{} Operando1 Operatore Operando2 A }{{} + }{{} B }{{} Operando1 Operatore Operando2 Operatore2 Operando3. }{{} c }{{} Possiamo scrivere il secondo esempio in due modi diversi, usando le parentesi e quindi indicando una precedenza nella valutazione delle varie operazioni: (A + B) C oppure (A+(B*C)). Per la valutazione di espressioni infisse, sono applicate le seguenti regole: 1. Regole di Precedenza (es. il deve essere valutato prima del +). 2. Regole associative (valutando da sinistra verso destra). 3. Regole relative alle parentesi..

Espressioni Prefisse e Postfisse Nel caso delle espressioni prefisse (postfisse) l operatore binario tra due operandi è posizionato prima (dopo) gli operandi stessi: Prefissa: +A B, (A + B). Postfissa: A B+, (A + B). Il vero vantaggio di tali espressioni è che non è necessario l uso di regole di precedenza tra le operazioni, infatti è lo stesso posizionamento degli operatori e degli operandi a dirci quali espressioni devono essere valutate per prime.

Conversione da notazione infissa a prefissa Per convertire b + c 3/2 4 è necessario compiere due passi: Individuare le precedenze: Individuare le associazioni e porre l operatore delle singole operazioni binarie prima degli operandi:

Conversione da notazione infissa a postfissa Per convertire a + b/c è necessario compiere due passi: Individuare le precedenze: Individuare le associazioni e porre l operatore delle singole operazioni binarie dopo degli operandi:

Algoritmo per la conversione da notazione infissa a postfissa. Pile Utilizzando le Pile (Stack), possiamo scrivere un algoritmo per la conversione da notazione infissa a notazione postfissa(prefissa). Utilizzando la pila possiamo tenere traccia degli operatori che incontriamo e delle parentesi. I passi dell algoritmo sono pochi e relativamente semplici: Ogni volta che incontriamo un operando, lo accodiamo nell espressione postfissa che stiamo calcolando. Ogni volta che incontriamo un operatore, lo confrontiamo con quello sulla testa della pila. Se la sua priorità è maggiore lo inseriamo nella pila (push), altrimenti togliamo dalla pila (pop) tutti gli operatori di priorità minore (o uguale) e li accodiamo nell espressione di ritorno.

Algoritmo per la conversione da notazione infissa a postfissa (II). Ogni volta che incontriamo una parentesi aperta ( la inseriamo nella pila. Ogni volta che incontriamo una parentesi chiusa ), accodiamo nella espressione postfissa tutto quello che c è sulla pila fino alla prima parentesi aperta (.

Algoritmo per la conversione da notazione infissa a postfissa (III). Esempio I A + B C D/E Infix Stack Postfix A+B*C-D/E # +B*C-D/E # A B*C-D/E # + A *C-D/E # + A B C-D/E # + * A B -D/E # + * A B C D/E # - A B C * + /E # - A B C * + D E # - / A B C * + D # - / A B C * + D E # - A B C * + D E / # A B C * + D E / -

Algoritmo per la conversione da notazione infissa a postfissa (IV). Esempio II A B (C + D) + E Infix Stack Postfix A*B-(C+D)+E # *B-(C+D)+E # A B-(C+D)+E # * A -(C+D)+E # * A B (C+D)+E # - A B * C+D)+E # - ( A B * +D)+E # - ( A B * C D)+E # - ( + A B * C )+E # - ( + A B * C D +E # - A B * C D + E # + A B * C D + - # + A B * C D + - E # A B * C D + - E +

Algoritmo per la conversione da notazione infissa a postfissa (V). Pseudo-Codice stack = Create_stack (); out_list = Create_list () while (eof ( in_infix )){ ch= getch ( in_infix ); // Prendo il carattere successivo di in_infix if(ch == operand ) add_tail ( out_list, ch); // Valuto se è un operando if(ch == ( ) push ( stack, ch); // Valuto se è una ( if(ch = ) ){ // Valuto se è una ) chpop = pop ( stack ); while ( chpop!= ( ){ add_tail ( out_list, chpop ); chpop = pop ( stack ); } } if(ch == operator ) // Valuto se è un operatore { while (! is_empty ( stack ) && pred (top ( stack )) >= pred (ch)){ chpop = pop ( stack ); add_tail (out_list, chpop ); } push ( stack, ch); } } while (! is_empty ( stack )){ // Svuoto lo stack ch = pop ( stack ); add_tail ( out_list, ch); }

Esercizi 1. Scrivere un algoritmo per trasformare un espresssione infissa in una prefissa.