Esercizi su pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale.

Slides:



Advertisements
Presentazioni simili
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Advertisements

MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Dipartimento di Matematica
Algoritmi e Programmazione
Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A CDL in Ingegneria Gestionale (B)- A.A Programmazione Ricorsiva.
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
Alberi binari di ricerca
Esercizi su alberi binari
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
Esercizi su alberi binari di ricerca
Esercizi di esonero (a.a. 2007/2008) Compito C, terzo esercizio Data una sequenza di caratteri s1 ed una stringa s2 diciamo che s1 è contenuta in s2 se.
Esercizi su strutture dinamiche Fondamenti di Programmazione Canale AD a.a. 2009/2010.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di Programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli Corso.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 2 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
Corso di Laurea in Biotecnologie Informatica (Programmazione)
Corso di Informatica (Programmazione)
1 Corso di Informatica (Programmazione) Lezione 10 (12 novembre 2008) Programmazione in Java: espressioni booleane e controllo del flusso (selezione)
Corso di Laurea in Biotecnologie Informatica (Programmazione)
Albero: insieme di punti chiamati NODI e linee chiamate EDGES
Corso di Informatica A.A Corso di Informatica Laurea Triennale - Comunicazione&Dams Dott.ssa Adriana Pietramala Laurea.
Corso di Informatica A.A Corso di Informatica Laurea Triennale - Comunicazione&Dams Dott.ssa Adriana Pietramala Laurea.
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
Fondamenti di Informatica I a.a Il linguaggio C Il controllo di flusso La selezione condizionale Listruzione switch I cicli Le istruzioni break,
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
1 Implementazione di Linguaggi 2 Implementazione di Linguaggi 2 Federico Bernardi Type checking 2° parte Type checking 2° parte - Equivalenza di type expressions.
Esercizi su code Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori.
Esercizi su alberi binari
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
Esempi di riuso del codice nei linguaggi di alto livello Lab Programmazione - turno /2006.
Politecnico di Milano Esercizi Stringhe Ricerca binaria.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
La Programmazione Ricorsiva
Sorting: MERGESORT Vogliamo ordinare lista (a 1,…,a n ). 1.Dividi lista in 2 sottoliste aventi (quasi) la stessa dimensione: (a 1,a 3,a 5,…) e (a 2,a 4,…),
Programmazione in Java Claudia Raibulet
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
CODIFICA Da flow-chart a C++.
Corso di informatica Athena – Periti Informatici
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e stringhe Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
Esercizi Liste.
Esercizi su File e Liste
Grafi Rappresentazione mediante liste di adiacenza:
Tail recursion: esempio
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Esercizi su alberi binari di ricerca
Alberi binari Definizione della struttura dati: struct tree { };
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni – BCOR Ingegneria Elettronica – BELR Introduzione al C Esercitazione 5 D. Bloisi, A.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
s STRINGHE DI CARATTERI a p e \0
Struttura di una lista legata Una lista legata è una variabile strutturata in cui ogni elemento mantiene l’indirizzo (mediante un puntatore) dell’elemento.
1 Corso di Informatica (Programmazione) Lezione 8 (7 novembre 2008) Programmazione in Java: operatori aritmetici, operatori di assegnamento e cast.
AlgoLab - Pile e Code Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
PROVA INTERCORSO MOD.B a.a RICORSIONE ESERCIZI A1.1-A1.6.
Algoritmi e basi del C Struttura di un programma
Operatori di incremento e decremento
Lezione X Laboratorio di Programmazione. Struttura di un programma Definizione classe e specifica (parziale) classe.hclasse.cpp main.cpp Specifica metodi.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Copyright © Istituto Italiano Edizioni Atlas
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 14 Marzo 204.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algoritmi e basi del C Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Strutture dati di tipo astratto 19 Strutture dati,
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Transcript della presentazione:

Esercizi su pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale non deve essere modificata. Scrivere una funzione che crea una copia della pila passata in ingresso Scrivere una funzione per verificare che le parentesi tonde e quadre all’interno di una stringa siano correttamente annidate. Scrivere una funzione per calcolare il valore di un’espressione aritmetica espressa come stringa in forma postfissa contenente i simboli 0, 1, …, 9, +, * e le parentesi ( ). Scrivere una funzione che inverta l’ordine dei valori di una pila. La funzione deve modificare la pila in ingresso e non crearne una nuova. Una parola o una frase palindroma può essere letta indifferentemente da sinistra a destra o da destra a sinistra. Scrivere una funzione che controlli se una data stringa è palindroma utilizzando una pila. Scrivere una funzione che stampi il contenuto di una pila senza distruggerla e usando solo operazioni pop e push. NOTA: scrivere sempre pre e post condizione di ogni funzione

Definizione di pila struct nodo_pila { tipo_elemento el; struct nodo_pila *next; }; struct pila struct nodo_pila *top; dove tipo_elemento codifica il tipo di ogni elemento della pila.

Esercizio 3 Scrivere una funzione per verificare che le parentesi tonde e quadre all’interno di una stringa siano correttamente annidate. Pre condizioni: la funzione prende in ingresso una stringa s che contiene eventuali parentesi tonde e quadre Post condizioni: restituisce 1 se le parentesi contenute in s sono bilanciate, 0 altrimenti Nota: se le parentesi sono solo tonde, basta verificare che il contatore non diventi mai negativo. Variante: stampare anche il contenuto di ogni coppia di parentesi riconosciuta.

Svolgimento int bilanciamento(char *s) { struct pila *p = crea_pila(); char c, par; while(c = *s++) switch(c) case ‘(‘; case ‘[‘: push(p, c); break; case ‘)’: case ‘]’: if (pila_vuota(p) || !match(pop(p), c)) return 0; } /* verifica che non ci siano parentesi rimaste aperte */ return pila_vuota(p); int match(char p1, char p2) { return (p1 == ‘(‘ && p2 == ‘)’) || (p1 == ‘[‘ && p2 == ‘]’); }

Esercizio 4 Scrivere una funzione per calcolare il valore di un’espressione aritmetica espressa come stringa in forma postfissa contenente i simboli 0, 1, …, 9, +, *. Pre condizioni: la funzione prende in ingresso una stringa contenente un’espressione aritmetica in forma postfissa Post condizioni: la funzione restituisce il valore dell’espressione o emette un errore se l’espressione non è ben formata Variante: prevedere anche gli operatori -, /, % (modulo)

Svolgimento (2) int valuta_postfissa(char *e) { struct pila *p = crea_pila(); char c; while(c = *e++) /* operando */ if ((c != ‘+’)&&(c != ‘*’)) { push(p, c-’0’); } /* operatore */ else int op1, op2; op2 = pop(p); op1 = pop(p); switch(c) case ‘+’: push(p, op1+op2); break; case ‘*’: push(p, op1*op2); break; } return pop(p); Per esercizio: ampliare la precondizione, ammettendo in ingresso stringhe che non siano in forma postfissa ed emettendo errore in tal caso.

Esercizio 6 Una parola o una frase palindroma può essere letta indifferentemente da sinistra a destra o da destra a sinistra. Scrivere una funzione che controlli se una data stringa è palindroma utilizzando una pila. Pre condizioni: la funzione prende in ingresso una stringa Post condizioni: restituisce 1 se la stringa è palindroma, 0 altrimenti Nota: è possibile ottimizzare confrontando i valori sulla pila con la seconda metà della stringa

Svolgimento (non ottimizzato) int palindroma(char *s) { char *s2 = s; struct pila *p = crea_pila(); char c; while(c = *s++) push(p, c); while(!is_empty(p)) if (pop(p) != *s2++) return 0; return 1; }

Svolgimento (ottimizzato) int palindroma2(char *s) { struct pila *p = crea_pila(); char c; int slen = strlen(s); int len = slen/2; while(len--) push(p, *s++); /* se s è una stringa dispari, salta il carattere centrale */ if (slen % 2) s++; while(!is_empty(p)) if (pop(p) != *s++) return 0; return 1; }

Esercizio 8 (bonus!!) Pre condizioni: Post condizioni: Realizzare una funzione che, dato un array bidimensionale (labirinto), una cella di partenza p e una cella di arrivo a, restituisca 1 se è possibile raggiungere a da p passando solo per celle del labirinto di valore 0 (le celle di valore == 1 rappresentano i muri del labirinto). Utilizzare una pila. Pre condizioni: la funzione prende in ingresso un array bidimensionale a valori 0 e 1 e due puntatori a una struttura cella che rappresenta una coordinata all’interno del labirinto. Post condizioni: restituisce 0 se esiste un cammino di celle di valore 0 da p ad a; restituisce 1 altrimenti. Variante: scrivere una funzione che restituisca (se esiste) un possibile cammino che porta da p ad a

Ragioniamoci typedef struct { int x; int y; } cella; Esempio di matrice labirinto: int labirinto[MAX_Y][MAX_X] = { 0, 0, 0, 1, 0, }, { 0, 1, 1, 1, 0, }, { 0, 0, 0, 1, 1, }, { 0, 1, 0, 0, 0, }, { 0, 0, 1, 1, 0, }, }; Prototipo della funzione: int labirinto(int **lab, cella p, cella a); In rosso un percorso che porta da (0, 0) a (4, 4) (su questi input la funzione deve restituire 1)