Introduzione alla programmazione ricorsiva

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Introduzione alla programmazione ricorsiva"

Transcript

1 Introduzione alla programmazione ricorsiva chiamata ricorsiva di sottoprogrammi un sottoprogramma P chiama lo stesso P direttamente o indirettamente (e.g., P chiama Q che chiama P) sembra circolo vizioso per molti problemi soluzione per un caso generico ricavata della soluzione di altro caso, più semplice, dello stesso problema Esempi di problemi con formulazione e soluzione ricorsiva Funzione fattoriale f(n) = n! = n * (n-1) * (n-2) * 3 * 2 * 1 può essere definito RICORSIVAMENTE come segue: Se n=0 allora f(n) = 1 (base della ricorsione) Se n>0 allora f(n) = n * f(n-1) (passo ricorsivo) numeri di Fibonacci (modello di crescita di animali in parecchie generazioni) F = f 0,, f n, f 0 = 0 (caso base) f 1 = 1 (caso base) Per n > 1, f n = f n 1 + f n 2 (caso risorsivo) da cui per esempio f 0 = 0 f 1 = 1 f 2 = f 1 + f 0 = = 0 f 3 = f 2 + f 1 = = 2 f 4 = f 3 + f 2 = = 3 quinto fascicolo - 1 -

2 massimo comune divisore, MCD(m, n) di due numeri m ed n in base all algoritmo di Euclide se m = n, MCD(m, n) = m (caso base) se m > n, MCD(m, n) = MCD(m-n, n) (caso risorsivo) se m < n MCD(m, n) = MCD(m, n-m) (caso risorsivo) ciò perchè se m > n divisori comuni a m e n coincidono con divisori comuni a m n e n ragionamento può essere ripetuto ripetendo prima o poi si arriva a una coppia di numeri uguali

3 programmazione di funzioni ricorsive funzione non ricorsiva per il calcolo del fattoriale int fatt (int n) int i, ris; ris = 1; for (i = 1; i <=n; i= i+1) ris = ris * i; return ris; basandosi su definizione ricorsiva n! = n (n 1)!, con 0! = 1 per convenzione int FattRic (int n) if (n == 0) return 1; else return n * FattRic(n 1); simulazione del calcolo di FattRic(3) 1. 3 = 0? No. calcola fattoriale di 2 e moltiplica per = 0? No. calcola fattoriale di 1 e moltiplica per = 0? No. calcola fattoriale di 0 e moltiplica per = 0? Sì. fattoriale di 0 è fattoriale di 1 è 1 per fattoriale di 0, cioè 1 1 = fattoriale di 2 è 2 per fattoriale di 1, cioè 2 1 = fattoriale di 3 è 3 per fattoriale di 2, cioè 3 2 =

4 Calcolo numero di Fibonacci di indice n int fibonacci (int n) if (n == 0) return 0; else if (n == 1) return 1; else return fibonacci(n 1) + fibonacci(n 2); Calcolo MCD con algoritmo Euclide Versione iterativa int EuclideIter (int m, n) while( m!= n ) if ( m > n ) m = m n; else n = n m; return m; varsione ricorsiva int EuclideRic (int m, n) if ( m == n ) return m; else if ( m > n ) return EuclideRic(m-n, n); else return EuclideRic(m, n - m);

5 esecuzione dei sottoprogrammi ricorsivi NB: possono essere in corso diverse attivazioni del sottoprogramma ricorsivo a ogni sua esecuzione si associa un area dati distinta contiene copie distinte di parametri e variabili locali Esecuzione di FattRic(3) rischio di catene infinite di chiamate condizione NECESSARIA (non sufficiente) per evitarlo le chiamate ricorsive siano condizionate ( una chiamata può NON generarne un altra) le chiamate ricorsive abbiano argomenti RIDOTTI (contro) esempi catena infinita, argomento decrescente int FattRic(int n) return n * FattRic(n 1); catena infinita di chiamate identiche int FattRic(int n) FattRic(n); - 5 -

6 Attenzione ai parametri passati per indirizzo nelle chiamate ricorsive Esempio void incrementa(int *n, int m) /* incrementa il primo parametro del valore del secondo */ if (m!= 0) *n = *n + 1; incrementa(n, m 1); /* NB: n, non &n, passa per valore indirizzo ricevuto per valore */ int x, y; x = 2, y = 3. incrementa(&x, y); /* NB la chiamata iniziale ha forma diversa dalla chiamata ricorsiva */ - 6 -

7 Esempio: riconoscimento delle stringhe palindrome stringa palindroma uguale se letta nei due versi anna, radar, asorrosa, abbbcbbba programma RicPalindr riconosce stringhe palindrome, anche vuote usa procedura ricorsiva, Palindrome basata su constatazione stringa palindrome è vuota, o un solo carattere, o palindrome racchiusa tra due caratteri, primo e ultimo, uguali RicPalindr legge stringa (termina con \0) calcola la lunghezza con strlen da <string.h> se stringa vuota o di un carattere palindroma se caratteri agli estremi diversi NON palindroma altrimenti applica funzione Palindrome a stringa privata di estremi elegante uso puntatori a inizio e fine stringa ( indirizzi prima e ultima componente esaminata dell array) spostati avanti e indietro da una chiamata ricorsiva alla successiva - 7 -

8 /* Programma RicPalindr*/ #include <stdio.h> #include <string.h> #define LunghMaxStringa 100 typedef enum false, true boolean; main() char Stringa1[LunghMaxStringa]; boolean OK; unsigned LunghStringa; boolean Palindrome(char *PC, char *UC); scanf("%s", Stringa1); /* NB assume caratteri componenti stringa non siano spazi */ LunghStringa = strlen(stringa1); /* attenzione strlung sul libro è scorretta */ if (LunghStringa == 0) printf("la stringa è palindroma"); else OK = Palindrome(&Stringa1[0], &Stringa1[LunghStringa 1] ); if (OK == true) pritnf("la stringa è palindroma ); else printf("la stringa non è palindroma"); boolean Palindrome(char, *PC, char *UC) if (PC >= UC) /* stringa vuota o di un solo carattere */ return true; else if (*PC!= *UC) /* primo e ultimo carattere diversi */ return false; else /* chiamata ricorsiva escludendo primo e ultimo carattere */ return Palindrome(PC+1, UC 1); - 8 -

9 Strutture dati dinamiche allocazione statica di memoria dimensioni fisiche dati note prima di esecuzione programma memoria per esecuzione calcolata dal compilatore prima di esecuzione risponde a esigenza di minimizzare tempo esecuzione anticipando elaborazioni (compilazione) eccezione: programmazione ricorsiva ma ambiente dei sottoprogrammi ha dimensioni note e allocato sistematicamente (pila) rimane problema dei dati in quantità sconosciuta o variabile durante esecuzione array inadeguati: pericolo di spazio insufficiente overflow oppure spreco di memoria inserzioni/cancellazioni in array (soprattutto ordinati) sono onerose variabili dinamiche (ad allocazione dinamica) allocate (e deallocate) durante l esecuzione del programma in numero variabile sono anonime: non esiste corrispondenza fissa con identificatori per accedere a variabili dinamiche usati PUNTATORI puntatori variabili che memorizzano indirizzi di variabili (dinamiche) allocazione e rilascio dinamico di memoria mediante funzioni della standard library (<stdlib.h>) malloc per allocazione free per rilascio - 9 -

10 seguente codice TipoDato *P; P = malloc(sizeof(tipodato)); crea in memoria variabile di tipo TipoDato restituisce l indirizzo della variabile creata (primo byte) assegna l indirizzo restituito a P P perde eventuale valore precedente, punta alla variabile dinamica Simmetricamente, istruzione free(p); rilascia spazio di memoria puntato da P in quantità pari alla dimensione di TipoDato, il tipo puntato da P memoria diventa nuovamente disponibile NB (ovviamente) free deve ricevere solo puntatore a variabile dinamica in testa al file del codice dev essere messo #include <stdlib.h> stdlib.h contiene prototipi delle funzioni di allocazione dinamica dichiarazione della costante NULL (puntatore nullo) durante esecuzione memoria usata da programma partizionata in due pila (stack) per variabili statiche mucchio (heap) per variabili dinamiche int int *Punt1; **Punt2;

11 Rischi della gestione dinamica della memoria effetti collaterali (già visti) produzione di spazzatura (garbage) memoria allocata dinamicamente risulta inaccessibile ( sprecata) perché nessun puntatore punta a essa Esempio banale (esempi realistici più involuti) TipoDato *P, *Q; P = malloc(sizeof(tipodato));. Q = malloc(sizeof(tipodato)); P = Q; /* la variabile puntata da P diventa garbage */ problema simmetrico: riferimenti fluttuanti (dangling references) puntatore punta a zona di memoria deallocata ( a variabile dinamica inesistente) P = Q; free(q); /* ora *P causa un errore */ dangling references più gravi della produzione di garbage: porta a veri e propri errori alcuni linguaggi (e.g., Java) non hanno operazione free hanno garbage collector (parte di macchina astratta che trova e riutilizza memoria scollegata) deteriora l efficienza di esecuzione dei programmi puntatori e variabili dinamiche portano a programmazione di basso livello e pericolosa usare solo quando strettamente necessario, cioè per passaggio parametri per indirizzo costruzione strutture dati complesse (liste, alberi, grafi, )

12 Liste esigenza: memorizzare insiemi di elementi con cardinalità non nota a priori molto variabile lista composta da elementi allocati dinamicamente si accede agli elementi tramite puntatori numero elementi cambia durante esecuzione puntatori agli elementi devono essere variabili dinamiche soluzione: ogni elemento contiene un puntatore a prossimo elemento della lista puntatore nell ultimo elemento vale NULL NULL assume significato di fine lista o lista vuota inizio della lista, chiamata testa della lista una variabile del tipo puntatore a elemento della lista dichiarazione dei tipi per costruzione in tre passi struct EL TipoElemento Info; struct EL *Prox; ; typedef struct EL ElemLista; typedef ElemLista *ListaDiElem; 1. dichiarazione tipo struttura in forma diversa da quella usuale struct EL è una struttura autoreferenziante (con definizione ricorsiva) struct EL è il nome del tipo in corso di definizione utilizzato nella definizione stessa NB: la struttura non contiene una struttura, ma un puntatore a struttura 2. typedef rinomina il tipo struct EL come ElemLista 3. tipo ListaDiElem definito come puntatore a ElemLista

13 poi usuale dichiarazione di variabili ListaDiElem Lista1, Lista2, Lista3; possibili dichiarazioni abbreviate senza evidenziare tipo della lista (puntatore a elemento) ElemLista *Lista1; ulteriore abbreviazione se si omettono entrambe le typedef non si esplicita né tipo della lista né tipo degli elementi struct EL *Lista1 realizziamo operazioni su liste mediante sottoprogrammi lista vuota puntatore con valore NULL Inizializzazione a lista vuota procedura che riceve per indirizzo la variabile testa della lista la testa della lista è un puntatore il parametro formale è un doppio puntatore #include <stdlib.h> void Inizializza (ListaDiElem *Lista) *Lista = NULL; dichiarazione della variabile testa della lista ListaDiElem Lista1; chiamata di Inizializza: passato indirizzo di Lista1 Inizializza(&Lista1); effetto dell istruzione *Lista = NULL;

14 NB testata di funzione equivalente void Inizializza(ElemLista **Lista) per semplificare a volte lista dichiarata variabile globale #include <stdlib.h> ElemLista *Lista1; void Inizializza(void) Lista1 = NULL; sconsigliato: procedura non è più parametrica lista è accessibile senza restrizioni #include <stdlib.h> Controllo di lista vuota boolean ListaVuota(ListaDiElem Lista) /* true sse la lista parametro è vuota */ if (Lista == NULL) return true; else return false; chiamata boolean vuota; vuota = ListaVuota(Lista1);

15 Controllo dell esistenza di un elemento in una lista boolean Ricerca (ListaDiElem Lista, TipoElemento ElemCercato) ElemLista *Cursore; if (Lista!= NULL) Cursore = Lista; /* La lista non è vuota */ while (Cursore!= NULL) if (Cursore >Info == ElemCercato) return true; Cursore = Cursore >Prox; /* Cursore punta a elemento successivo */ return false; NB: lista non viene modificata può essere passata per valore parametro formale può essere modificato (usato come cursore ) boolean Ricerca (ListaDiElem Lista, TipoElemento ElemCercato) while (Lista!= NULL) if (Lista > Info == ElemCercato) return true; Lista = Lista > Prox; return false; versione ricorsiva boolean Ricerca (ListaDiElem Lista, TipoElemento ElemCercato) if (Lista == NULL) return false; else if (Lista >Info == ElemCercato) return true; else return Ricerca(Lista >Prox, ElemCercato); Esercizi: Estrazione della testa o della coda da una lista codificare le seguenti /* applicata a liste non vuote (altrimenti segnala errore); restituisce campo Info del primo elemento della lista */ TipoElemento TestaLista(ListaDiElem Lista) /* restituisce (puntatore al) la lista uguale a Lista priva del primo elemento (NB gli elementi sono gli stessi). non modifica il parametro. Assume parametro lista non vuota */ ListaDiElem CodaLista(ListaDiElem Lista)

16 Inserimento di un nuovo elemento in una lista inserimento in prima posizione #include <stdlib.h> void InsercisciInTesta(ListaDiElem *Lista, TipoElemento Elem) ElemLista *Punt; Punt = malloc(sizeof(elemlista)); Punt >Info = Elem; Punt >Prox = *Lista; *Lista = Punt;

17 inserimento in ultima posizione void InserisciInCoda(ListaDiElem *Lista, TipoElemento Elem); ElemLista *Punt; if (ListaVuota(*Lista)) Punt = malloc(sizeof(elemlista)); Punt >Prox = NULL; Punt >Info = Elem; *Lista = Punt; else InserisciIncoda(&((*Lista) >Prox), Elem); NB: nella chiamata ricorsiva passato indirizzo del puntatore che sta nel primo elemento della lista parametro attuale *Lista (*Lista) >Prox &((*Lista) >Prox) indirizzo primo elemento della lista componente puntatore del primo elemento della lista indirizzo di questo puntatore area dati chiamante Lista1.. Lista area dati chiamato

18 inserimento in lista ordinata ( definita relazione d ordine < per TipoElemento) nuovo elemento inserito mantenendo lista ordinata posizione, tra quelli già presenti subito dopo il massimo tra i minori subito prima del minimo tra i maggiori ipotesi relazione d ordine denotata con > : corretto per tipi semplici, per tipi strutturati servirebbe funzione ad hoc non si verifica se elemento già presente nella lista #include <stdlib.h> void InserisciInOrdine(ListaDiElem *Lista, TipoElemento Elem) ElemLista *Punt, *PuntCorrente, *PuntPrecedente; PuntPrecedente = NULL; PuntCorrente = *Lista; while (PuntCorrente!= NULL && Elem > PuntCorrente >Info) PuntPrecedente = PuntCorrente; PuntCorrente = PuntCorrente->Prox; Punt = malloc(sizeof(elemlista)); Punt >Info = Elem; Punt >Prox = PuntCorrente; if (PuntPrecedente!= NULL ) /* Inserimento internamente alla lista */ PuntPrecedente >Prox = Punt; else /* Inserimento in testa alla lista */ *Lista = Punt; PuntPrecedente indica l elemento che dovrà precedere immediatamente il nuovo elemento PuntCorrente indica l elemento che dovrà seguire immediatamente il nuovo elemento se inserzione avviene in testa PuntPrecedente == NULL se inserzione avviene in coda PuntCorrente == NULL se inserzione avviene in testa e in coda (la lista era vuota) PuntPrecedente == NULL && PuntCorrente == NULL

19 visualizzazione inserimento internamente alla lista (né in testa né in coda) esercizio: disegnare tutti i casi possibili di inserzione domanda: cosa succede se l elemento da inserire è già presente? Cancellazione di un elemento da una lista ipotesi: la lista non contiene elementi ripetuti #include <stdlib.h> void Cancella(ListaDiElem *Lista, TipoElemento Elem) /* Cancella dalla lista passata "per indirizzo" l'elemento Elem, se esiste, assumendo che nella lista non vi siano ripetizioni */ ElemLista *PuntTemp; if (ListaVuota (*Lista) == false) if ((*Lista) >Info == Elem) PuntTemp = *Lista; *Lista = CodaLista(*Lista); free(punttemp); else Cancella(&((*Lista) >Prox), Elem); domanda: cosa succede se elemento da cancellare non è presente?

20 vantaggio di definire sottoprogrammi per operazioni su liste struttura lista vista come nuovo tipo, con operazioni predefinite implementate da sottoprogrammi verso tipo di dato astratto uso delle liste risulta molto semplice (non la programmazione loro operazioni) esempio, leggere n interi e metterli in una lista nell ordine di lettura ListaDiElem Lista1; int i, n, x; Inizializza(&Lista1); for (i = 1; i <= n; i++) scanf( %d, &x); InserisciInCoda(&Lista1, x); confronto tra liste collegate a puntatori e array array semplici nella definizione e costruzione efficienti nell accesso (accesso diretto) NON flessibili: dimensione fissa inefficiente uso della memoria (pericolo di overflow o spreco) liste collegate a puntatori complesse nella definizione e costruzione inefficienti nell accesso (accesso sequenziale) flessibili: dimensione variabile dinamicamente (durante l esecuzione) uso efficiente della memoria (solo sovraccarico marginale per puntatori)

21 struttura caratteristica SEMPLICITÀ FLESSIBILITÀ EFFICIENZA ACCESSO EFFICIENZA USO MEMORIA array liste tecniche per rimediare a punti deboli delle liste per la semplicità trattare strutture collegate come tipi di dati astratti inaccessibili direttamente le parti interne tutte operazioni codificate mediante sottoprogrammi per l efficienza di accesso definire strutture più complesse, usando più puntatori liste bidirezionali alberi bilanciati grafi, argomento di corsi più avanzati

22 alternativa di codifica: stile funzionale notazione si semplifica un po, ci sono in giro meno * e & inizializzazione ListaDiElem Inizializza (void) return NULL; chiamata ListaDiElem Lista1; TipoElemento ElementoDaInserire, ElementoDaCancellare; Lista1 = Inizializza (); inserimento in prima posizione ListaDiElem InserisciInTesta(ListaDiElem Lista, TipoElemento Elem) ElemLista *Punt; Punt = malloc(sizeof(elemlista)); Punt >Info = Elem; Punt >Prox = Lista; return Punt; chiamata Lista1 = InserisciInTesta(Lista1, ElementoDaInserire); inserimento in ultima posizione ListaDiElem InserisciInCoda(ListaDiElem Lista, TipoElemento Elem); ElemLista *Punt; if (ListaVuota(Lista)) Punt = malloc(sizeof(elemlista)); Punt >Prox = NULL; Punt >Info = Elem; return Punt; else Lista -> Prox = InserisciIncoda(Lista > Prox, Elem); return Lista; chiamata Lista1 = InserisciInCoda (Lista1, ElementoDaInserire);

23 inserimento in lista ordinata ListaDiElem InserisciInOrdine(ListaDiElem Lista, TipoElemento Elem) ElemLista *Punt, *PuntCorrente, *PuntPrecedente; PuntPrecedente = NULL; PuntCorrente = Lista; while ( PuntCorrente!= NULL && Elem > PuntCorrente >Info ) PuntPrecedente = PuntCorrente; PuntCorrente = PuntCorrente->Prox; Punt = malloc(sizeof(elemlista)); Punt >Info = Elem; Punt >Prox = PuntCorrente; if (PuntPrecedente!= NULL ) /* Inserimento internamente alla lista */ PuntPrecedente >Prox = Punt; return Lista; else /* Inserimento in testa alla lista */ return Punt; chiamata Lista1 = InserisciInOrdine (Lista1, ElementoDaInserire); cancellazione di un elemento ListaDiElem Cancella(ListaDiElem Lista, TipoElemento Elem) ListaDiElem PuntTemp; if (ListaVuota (Lista) == false) if (Lista > Info == Elem) PuntTemp = CodaLista(Lista); free(lista); return PuntTemp; else Lista -> Prox = Cancella(Lista > Prox, Elem); return Lista; else return Lista; chiamata Lista1 = Cancella (Lista1, ElementoDaCancellare);

Strutture Dinamiche. Fondamenti di Informatica

Strutture Dinamiche. Fondamenti di Informatica Strutture Dinamiche Fondamenti di Informatica 1 Indice Allocazione e de-allocazione di memoria Liste e loro gestione Companies, srl 2 Allocazione e cancellazione di memoria malloc (sizeof (TipoDato));

Dettagli

Strutture Dinamiche. Strutture Dinamiche

Strutture Dinamiche. Strutture Dinamiche Corso di Informatica A Vito Perrone 1 Indice Allocazione e de-allocazione di memoria Liste e loro gestione 2 Allocazione e cancellazione di memoria malloc (sizeof (TipoDato)); Crea in memoria una variabile

Dettagli

Strutture dati dinamiche

Strutture dati dinamiche Strutture dati dinamiche Gestione della memoria La gestione statica della memoria è molto efficiente ma non è priva di inconvenienti È rigida rispetto a informazioni la cui dimensione non è nota a priori

Dettagli

Introduzione alla Ricorsione

Introduzione alla Ricorsione Introduzione alla Corso di Informatica A Vito Perrone Indice La formulazione in termini ricorsivi di problemi e algoritmi La ricorsione come strumento di programmazione L esecuzione dei sottoprogrammi

Dettagli

Politecnico di Milano. Strutture dati dinamiche

Politecnico di Milano. Strutture dati dinamiche Politecnico di Milano Strutture dati dinamiche Strutture dati statiche e dinamiche In C le dimensioni di ogni dato sono note prima dell esecuzione Sarebbe utile avere contenitori la cui dimensione varia

Dettagli

La programmazione nel linguaggio C. Liste

La programmazione nel linguaggio C. Liste Liste È molto comune dover rappresentare sequenze di elementi tutti dello stesso tipo e fare operazioni su di esse. Esempi: sequenza di interi (23 46 5 28 3) sequenza di caratteri ( x r f ) sequenza di

Dettagli

Ricorsione. Lucidi a cura di Gianpaolo Cugola, Carlo Ghezzi, Gian Pietro Picco Dipartimento di Elettronica e Informazione

Ricorsione. Lucidi a cura di Gianpaolo Cugola, Carlo Ghezzi, Gian Pietro Picco Dipartimento di Elettronica e Informazione Ricorsione Lucidi a cura di Gianpaolo Cugola, Carlo Ghezzi, Gian Pietro Picco Dipartimento di Elettronica e Informazione Definizioni ricorsive Sono comuni in matematica Esempio: il fattoriale di un naturale

Dettagli

Diversi modi di rappresentare sequenze di elementi

Diversi modi di rappresentare sequenze di elementi Liste È molto comune dover rappresentare sequenze di elementi tutti dello stesso tipo e fare operazioni su di esse. Esempi: sequenza di interi (23 46 5 2 3) sequenza di caratteri ( x r f ) sequenza di

Dettagli

Liste collegate. Liste

Liste collegate. Liste Liste È molto comune dover rappresentare sequenze di elementi tutti dello stesso tipo e fare operazioni su di esse. Esempi: sequenza di interi (23 46 5 28 3) sequenza di caratteri ( x r f ) sequenza di

Dettagli

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Dettagli

Informatica 1, Sez. di Cremona

Informatica 1, Sez. di Cremona Informatica 1, Sez. di Cremona Prova in itinere del 27 Gennaio 2010 Si risolvano i seguenti esercizi. La prova prevede un punteggio massimo di 17/14-esimi, cui andranno sommati i punti ottenuti nel primo

Dettagli

FUNZIONI. attribuire un nome ad un insieme di istruzioni parametrizzare l esecuzione del codice

FUNZIONI. attribuire un nome ad un insieme di istruzioni parametrizzare l esecuzione del codice Funzioni FUNZIONI Spesso può essere utile avere la possibilità di costruire nuove istruzioni che risolvono parti specifiche di un problema Una funzione permette di attribuire un nome ad un insieme di istruzioni

Dettagli

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Esercizio 1: funzione con valore di ritorno di tipo puntatore Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 7 Esercitazione: 14 dicembre 2005 Esercizi su ricorsione, manipolazione stringhe, strutture dinamiche Problema: Esercizio

Dettagli

Strutture dati dinamiche

Strutture dati dinamiche Strutture dati dinamiche - Liste concatenate - Pile -> LIFO (last in first out) - Code -> FIFO (first in first out) - Alberi binari: gestione dati in algoritmi complessi Liste Concatenate Formata da elementi

Dettagli

Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free

Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free Variabili dinamiche Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free 1 Tipi di variabili in C In C è possibile classificare le variabili in

Dettagli

Allocazione dinamica della memoria

Allocazione dinamica della memoria Allocazione dinamica della memoria Allocazione statica: limiti Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente la loro esistenza deve essere prevista e dichiarata a priori

Dettagli

Liste concatenate e allocazione dinamica

Liste concatenate e allocazione dinamica Liste concatenate e allocazione dinamica Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2018/2019 Argomenti del Corso Ogni lezione consta di una spiegazione assistita da slide, e seguita

Dettagli

Laboratorio di Programmazione

Laboratorio di Programmazione Laboratorio di Programmazione (Laurea triennale in matematica) Lezione 21 Strutture dinamiche Gli array ci permettono di memorizzare un insieme di dati dello stesso tipo Deve essere noto staticamente il

Dettagli

INFORMATICA A. Titolo presentazione sottotitolo. Laboratorio n 6 Dott. Michele Zanella Ing. Gian Enrico Conti

INFORMATICA A. Titolo presentazione sottotitolo. Laboratorio n 6 Dott. Michele Zanella Ing. Gian Enrico Conti INFORMATICA A Titolo presentazione sottotitolo A.A. 2018-19 Milano, XX mese 20XX Laboratorio n 6 Dott. Michele Zanella Ing. Gian Enrico Conti Ricorsione La ricorsione è un approccio per la risoluzione

Dettagli

Allocazione dinamica memoria

Allocazione dinamica memoria Allocazione dinamica memoria Marco Casazza 11/12/2017 1 Esercizio 1 1 /* 2 Creare una lista bidirezionale di interi, ovvero una lista 3 che permette lo scorrimento in entrambe le direzioni ( dal primo

Dettagli

Esercitazioni di Fondamenti di Informatica - Lez. 7 20/11/2018

Esercitazioni di Fondamenti di Informatica - Lez. 7 20/11/2018 Esercitazioni di Fondamenti di Informatica - Lez. 7 0/11/018 Esercizi sull allocazione dinamica della memoria in C 1. Cosa stampa il seguente programma? 1 #d e f i n e MAXLENGTH 0 4 typedef struct { char

Dettagli

Programmazione ricorsiva

Programmazione ricorsiva Programmazione ricorsiva Fondamenti di Informatica Ricorsione q Che cos è la ricorsione? Un sottoprogramma P richiama se stesso (ricorsione diretta) Un sottoprogramma P richiama un altro sottoprogramma

Dettagli

Allocazione Dinamica della memoria

Allocazione Dinamica della memoria Allocazione dinamica Allocazione Dinamica della memoria I Il C mette a disposizione delle primitive per la gestione dinamica della memoria, grazie all utilizzo di alcune funzioni messe a disposizione dalla

Dettagli

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

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007 Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007 Dott.Davide Di Ruscio Dipartimento di Informatica Università degli Studi di L Aquila Lezione del 08/03/07 Nota Questi lucidi sono tratti

Dettagli

e e n-1 Esercizio 1.2 (Punti 8; punti 10 se risolto facendo uso della ricorsione)

e e n-1 Esercizio 1.2 (Punti 8; punti 10 se risolto facendo uso della ricorsione) Informatica 1 Seconda prova 31 Gennaio 2006 Esercizio 1 (Punti Una lista bidirezionale è una lista in cui ogni elemento è collegato, mediante puntatori, all elemento seguente e a quello precedente; alla

Dettagli

Fondamenti di informatica, Sez. Ing. Informatica, Ing. Gestionale, Ing. Ambientale II prova in itinere, 29 Gennaio 2009

Fondamenti di informatica, Sez. Ing. Informatica, Ing. Gestionale, Ing. Ambientale II prova in itinere, 29 Gennaio 2009 Fondamenti di informatica, Sez. Ing. Informatica, Ing. Gestionale, Ing. Ambientale II prova in itinere, 29 Gennaio 2009 Esercizio 1 (punti 3) Sia data la funzione ricorsiva seguente: void elabora (unsigned

Dettagli

Allocazione dinamica della memoria

Allocazione dinamica della memoria Allocazione dinamica della memoria Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati

Dettagli

Strutture Dati Dinamiche

Strutture Dati Dinamiche Strutture Dati Dinamiche Motivazioni Le variabili considerate fino a questo punto devono essere dichiarate staticamente, ossia la loro esistenza, il loro nome e la loro dimensione devono essere previsti

Dettagli

Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018

Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018 Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018 Esercizi sull allocazione dinamica della memoria in C Il codice di questi esercizi é contenuto nella cartella parte1 1. Implementare una lista

Dettagli

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo. Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo. int a = 5; a 5 α=&a Esistono in C particolari variabili dette puntatori che possono

Dettagli

Titolo presentazione INFORMATICA. sottotitolo A.A Milano, XX mese 20XX Laboratorio n 6 Ing. Gian Enrico Conti Dott.

Titolo presentazione INFORMATICA. sottotitolo A.A Milano, XX mese 20XX Laboratorio n 6 Ing. Gian Enrico Conti Dott. Titolo presentazione INFORMATICA A sottotitolo A.A. 2017-18 Milano, XX mese 20XX Laboratorio n 6 Ing. Gian Enrico Conti Dott. Michele Zanella Info Logistiche (cont d) Calendario laboratori Data Orario

Dettagli

L'Allocazione Dinamica della Memoria nel linguaggio C

L'Allocazione Dinamica della Memoria nel linguaggio C L'Allocazione Dinamica della Memoria nel linguaggio C Prof. Rio Chierego riochierego@libero.it http://www.riochierego.it/informatica.htm Sommario Questo documento tratta l'allocazione dinamica della memoria

Dettagli

La programmazione nel linguaggio C

La programmazione nel linguaggio C Cancellazione : versione ricorsiva Sfruttiamo la visione ricorsiva della struttura dati per realizzare la cancellazione in modo ricorsivo 1. la cancellazione della vuota non richiede alcuna azione 2. la

Dettagli

Laboratorio di Informatica I

Laboratorio di Informatica I Struttura della lezione Lezione 6: Array e puntatori Vittorio Scarano Laboratorio di Informatica I Corso di Laurea in Informatica Università degli Studi di Salerno Una funzione per i numeri di Fibonacci

Dettagli

Memoria Dinamica. Credits Prof. Campi

Memoria Dinamica. Credits Prof. Campi Memoria Dinamica Credits Prof. Campi 1 Durata delle variabili (tempo di vita) Va dalla creazione (allocazione della memoria) alla distruzione (rilascio della memoria allocata) Due classi di variabili Statiche:

Dettagli

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste 4 Le liste collegate 4.0 Le liste collegate c Diego Calvanese Fondamenti di Informatica Corso di Laurea in Ingegneria Elettronica A.A. 2001/2002 4.0 0 4 Le liste collegate Rappresentazione di liste 4.1

Dettagli

Corso di Fondamenti di Informatica. La ricorsione

Corso di Fondamenti di Informatica. La ricorsione Corso di Fondamenti di Informatica La ricorsione La ricorsione Si dice che un oggetto (una struttura dati, una funzione matematica, un concetto ) è ricorsivo se è possibile darne una definizione in termini

Dettagli

Lezione 6: Array e puntatori

Lezione 6: Array e puntatori Lezione 6: Array e puntatori Vittorio Scarano Laboratorio di Informatica I Corso di Laurea in Informatica Università degli Studi di Salerno Struttura della lezione Una funzione per i numeri di Fibonacci

Dettagli

Esercitazione 11. Liste semplici

Esercitazione 11. Liste semplici Esercitazione 11 Liste semplici Liste semplici (o lineari) Una lista semplice (o lineare) è una successione di elementi omogenei che occupano in memoria una posizione qualsiasi. Ciascun elemento contiene

Dettagli

Il principio di induzione. La Ricorsione. Il fattoriale: iterativo. Il fattoriale: ricorsivo. P (0) P (n) P (n + 1) per ogni n

Il principio di induzione. La Ricorsione. Il fattoriale: iterativo. Il fattoriale: ricorsivo. P (0) P (n) P (n + 1) per ogni n Università Roma La Sapienza Corsi di Laurea Informatica/Tecnologie Informatiche La Ricorsione Prof. Stefano Guerrini guerrini@di.uniroma1.it Programmazione II (can. P-Z) A.A. 2005-06 Il principio di induzione

Dettagli

Previously on TDP. LISTA rappresentata mediante "struct e puntatori" Cosa e aux? Di che tipo e e cosa contiene?

Previously on TDP. LISTA rappresentata mediante struct e puntatori Cosa e aux? Di che tipo e e cosa contiene? Previously on TDP lis ^ ^ 7 21 ** ** 14 *** memoria 9 NULL LISTA rappresentata mediante "struct e puntatori" *** lis->info == cosa? lis->next == ^^; /*cosa e ^^?*/ che cosa e' (*lis)? Cosa e aux? Di che

Dettagli

Gestione dinamica della memoria

Gestione dinamica della memoria Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 2016-2017 Gestione dinamica della memoria Pietro Di Lena - pietro.dilena@unibo.it A pessimistic programmer sees the array as half empty.

Dettagli

Previously on TDP. LISTA rappresentata mediante "struct e puntatori" TipoLista lis. Dichiarare DISEGNARE e. DISEGNARE aux.

Previously on TDP. LISTA rappresentata mediante struct e puntatori TipoLista lis. Dichiarare DISEGNARE e. DISEGNARE aux. Previously on TDP lis 7 21 ** ** 14 *** *** memoria 9 LISTA rappresentata mediante "struct e puntatori" TipoLista lis lis->info == cosa? lis->next == ; /*cosa e?*/ che cosa e' (*lis)? Dichiarare DISEGNARE

Dettagli

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente ! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente!!la loro esistenza deve essere prevista e dichiarata a priori! Questo può rappresentare un problema soprattutto per variabili

Dettagli

Strutture dati dinamiche in C (II)

Strutture dati dinamiche in C (II) Strutture dati dinamiche in C (II) Laboratorio di Linguaggi di Programmazione a.a. 2001/2002 dott.ssa Francesca A. Lisi lisi@di.uniba.it Sommario Le liste concatenate (ancora ma in modo più formale) L

Dettagli

LA RICORSIONE LA RICORSIONE

LA RICORSIONE LA RICORSIONE LA RICORSIONE Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento a se stessa La ricorsione consiste nella possibilità di definire una funzione in termini

Dettagli

Liste concatenate e allocazione dinamica

Liste concatenate e allocazione dinamica Liste concatenate e allocazione dinamica Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2017/2018 Calendario delle lezioni Ogni lezione consta di una spiegazione assistita da slide,

Dettagli

Strutture dati. Le liste

Strutture dati. Le liste Strutture dati Le liste Introduzione Una lista è una successione finita di valori di un tipo (insieme di valori e ordine). Come tipo di dato è qualificata dalle operazioni che ci si possono svolgere: inserimento

Dettagli

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1 Operazioni sulle liste Definiamo una serie di procedure e funzioni per operare sulle liste. Usiamo liste di interi per semplicità, ma tutte le operazioni sono realizzabili in modo del tutto analogo su

Dettagli

Il linguaggio C Strutture

Il linguaggio C Strutture Il linguaggio C Strutture Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/ Linguaggio C -- Strutture 2 Ringraziamenti Questi

Dettagli

Gestione della memoria

Gestione della memoria Gestione della memoria Stefano Ferrari Università degli Studi di Milano stefano.ferrari@unimi.it Programmazione anno accademico 2017 2018 Allocazione di memoria A una variabile puntatore si può assegnare

Dettagli

Fondamenti di Informatica T. Linguaggio C: i puntatori

Fondamenti di Informatica T. Linguaggio C: i puntatori Linguaggio C: i puntatori Il puntatore E` un tipo di dato, che consente di rappresentare gli indirizzi delle variabili allocate in memoria. Dominio: Il dominio di una variabile di tipo puntatore è un insieme

Dettagli

Operativamente, risolvere un problema con un approccio ricorsivo comporta

Operativamente, risolvere un problema con un approccio ricorsivo comporta ! Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento a se stessa!! La ricorsione consiste nella possibilità di definire una funzione in termini di se

Dettagli

Il linguaggio C Strutture

Il linguaggio C Strutture Il linguaggio C Strutture Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/ Copyright Mirko Viroli Copyright 2017, 2018 Moreno

Dettagli

Esempio: il fattoriale di un numero fact(n) = n! n!: Z! N n! vale 1 se n " 0 n! vale n*(n-1)! se n > 0. Codifica:

Esempio: il fattoriale di un numero fact(n) = n! n!: Z! N n! vale 1 se n  0 n! vale n*(n-1)! se n > 0. Codifica: ! Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento a se stessa!! La ricorsione consiste nella possibilità di definire una funzione in termini di se

Dettagli

Tipi user-defined. Dichiarazione di tipo

Tipi user-defined. Dichiarazione di tipo Tipi user-defined Tipi user-defined Il C mette a disposizione un insieme di tipi di dato predefiniti (tipi built-in) e dei meccanismi per definire nuovi tipi (tipi user-defined) Vediamo le regole generali

Dettagli

Passaggio dei parametri

Passaggio dei parametri Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei parametri così passati non si riflettono sull environment

Dettagli

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc() Allocazione Statica Finora abbiamo visto che le variabili sono sempre definite staticamente. Questo è un limite perché la loro esistenza deve essere prevista e dichiarata a priori. In particolare per variabili

Dettagli

Programmazione Procedurale in Linguaggio C++

Programmazione Procedurale in Linguaggio C++ Programmazione Procedurale in Linguaggio C++ Sottoprogrammi Parte 8 Dettagli e Approfondimenti versione 2.3 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima

Dettagli

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

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I Lezione 4 Elementi lessicali e espressioni logiche Matricole 2-3 Elementi lessicali il linguaggio C ha un suo vocabolario di base i cui elementi sono detti token esistono 6 tipi di token: parole chiave

Dettagli

Lezione 23 - ADT LISTA

Lezione 23 - ADT LISTA Lezione 23 - ADT LISTA Rappresentazione concreta del Tipo di Dati Astratto LISTA. - Cenni sulla rappresentazione mediante array (puah!) - Rappresentazione concreta mediante struct e puntatori. - concetto

Dettagli

Fondamenti di Informatica T. Linguaggio C: Stack e Ricorsione

Fondamenti di Informatica T. Linguaggio C: Stack e Ricorsione Linguaggio C: Stack e Ricorsione FUNZIONI: IL MODELLO A RUN-TIME Ogni volta che viene invocata una funzione: si crea di una nuova attivazione (istanza) del servitore viene allocata la memoria per i parametri

Dettagli

Rappresentazione di sequenze...

Rappresentazione di sequenze... Liste Rappresentazione di sequenze... Ritorniamo al nostro problema di rappresentare le sequenze, se vi ricordate avevano sottolineato un paio di problemi della rappresentazione di sequenze usando array

Dettagli

Liste concatenate. Violetta Lonati

Liste concatenate. Violetta Lonati Liste concatenate Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 2 novembre 2017 Violetta Lonati Liste

Dettagli

Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente. per variabili di tipo array, in cui dover

Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente. per variabili di tipo array, in cui dover ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente la loro esistenza deve essere prevista e dichiarata a priori Questo può rappresentare un problema

Dettagli

cons: L E L (...), e (e,...) Operatori tradizionali sulle liste car: (e,...) cdr: What s LISTE? null: () TRUE (...) FALSE Una lista e' una

cons: L E L (...), e (e,...) Operatori tradizionali sulle liste car: (e,...) cdr: What s LISTE? null: () TRUE (...) FALSE Una lista e' una What s LISTE? Una lista e' una ( es. λ = {4, 9, 1 E = dominio degli elementi di lista (persone, voli, interi, lettere...) L = {λ / λ e' una lista di elementi in E Bool = {TRUE, FALSE cons: L E L (...),

Dettagli

Strutture. Una dichiarazione struct definisce un nuovo tipo. - Può essere seguita da una lista di variabili.

Strutture. Una dichiarazione struct definisce un nuovo tipo. - Può essere seguita da una lista di variabili. Strutture Una stuttura permette di aggregare variabili di tipo differente (a differenza degli array che rappresentano sequenze di variabili dello stesso tipo). Una dichiarazione di struttura ha la forma:

Dettagli

Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei paramet

Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei paramet Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei parametri così passati non si riflettono sull environment esterno Per riferimento

Dettagli

Informatica B Prof. Di Nitto e Morzenti Appello del 17 febbraio 2005 Cognome e Nome... Numero Matricola... (in stampatello)

Informatica B Prof. Di Nitto e Morzenti Appello del 17 febbraio 2005 Cognome e Nome... Numero Matricola... (in stampatello) Informatica B Prof. Di Nitto e Morzenti Appello del 17 febbraio 2005 Cognome e Nome... Numero Matricola... (in stampatello) Risolvere i seguenti esercizi, scrivendo le risposte ed eventuali tracce di soluzione

Dettagli

Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010.

Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010. Programmazione II Lezione 7 Daniele Sgandurra daniele.sgandurra@iit.cnr.it 9/11/2010 1/24 Programmazione II Lezione 7 9/11/2010 Sommario 1 Gestione della Memoria 2/24 Programmazione II Lezione 7 9/11/2010

Dettagli

(*lista == NULL (*lista)->info >= elem) accede al campo next di *lista solo se *lista non e' NULL. */ #include <stdio.h> #include <stdlib.

(*lista == NULL (*lista)->info >= elem) accede al campo next di *lista solo se *lista non e' NULL. */ #include <stdio.h> #include <stdlib. /* ATTENZIONE: non accedere mai ai campi di un elemento della lista prima di essersi accertati che tale elemento sia diverso da NULL; Si osservi che la condizione booleana (*lista == NULL (*lista)->info

Dettagli

Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 8 Esercitazione: 11 gennaio 2006 Esercizi su strutture dinamiche

Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 8 Esercitazione: 11 gennaio 2006 Esercizi su strutture dinamiche Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 8 Esercitazione: 11 gennaio 2006 Esercizi su strutture dinamiche Esercizio 1 Liste: calcolo del numero di elementi ripetuti

Dettagli

Implementazione di Liste puntate

Implementazione di Liste puntate Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ 1 Implementazione di Liste puntate 2 1 Indice Liste puntate semplici: Gli elementi sono logicamente

Dettagli

Esercizio 1 Liste: calcolo del numero di elementi ripetuti in una lista

Esercizio 1 Liste: calcolo del numero di elementi ripetuti in una lista Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 11 Esercitazione: 27 gennaio 2005 Esercizi su liste, ricorsione, file. Scaletta Esercizio 1 Liste: calcolo del numero di

Dettagli

Introduzione. Liste. Strutture ricorsive (2) Strutture ricorsive (1) DD p KP p

Introduzione. Liste. Strutture ricorsive (2) Strutture ricorsive (1) DD p KP p Introduzione Liste DD p. 449-474 KP p.397-424 Abbiamo fin ora studiato strutture dati con dimensione fissa: vettori e matrici strutture Introduciamo ora le strutture dati dinamiche (liste concatenate):

Dettagli

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. Unità Didattica 4 Linguaggio C Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. 1 Vettori Struttura astratta: Insieme di elementi dello stesso tipo, ciascuno individuato da un indice;

Dettagli

IMPLEMENTAZIONE CONCATENATE DELLE LISTE

IMPLEMENTAZIONE CONCATENATE DELLE LISTE IMPLEMENTAZIONE CONCATENATE DELLE LISTE Liste collegate Come già visto, la realizzazione sequenziale prevede che la sequenzialità degli elementi della lista venga rappresentata dalla adiacenza delle locazioni

Dettagli

Il linguaggio C. Notate che...

Il linguaggio C. Notate che... Il linguaggio C Notate che... 1 Il C è un linguaggio a blocchi int main (void) { blocco } 2 Il C è un linguaggio a blocchi (2) Non è possibile mischiare dichiarazioni e comandi! int main (void) { } Dichiarazione

Dettagli

Programmazione I - Laboratorio

Programmazione I - Laboratorio Programmazione I - Laboratorio Esercitazione 6 - Liste Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti di.unipi.it 2. Dipartimento

Dettagli

Passaggio dei parametri. Passaggio dei parametri

Passaggio dei parametri. Passaggio dei parametri Per valore Il valore viene copiato dal mondo esterno all environment della funzione o procedura Cambiamenti dei parametri così passati non si riflettono sul mondo esterno rimangono circoscritti all environment

Dettagli

Introduzione al linguaggio C Puntatori

Introduzione al linguaggio C Puntatori Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 19 ottobre 2017

Dettagli

Introduzione al linguaggio C Funzioni

Introduzione al linguaggio C Funzioni Introduzione al linguaggio C Funzioni Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati

Dettagli

La gestione della memoria dinamica Heap

La gestione della memoria dinamica Heap Laboratorio di Algoritmi e Strutture Dati La gestione della memoria dinamica Heap Prof. Luigi Lamberti 2005 Cenni sui Processi Un Programma è un insieme di Istruzioni memorizzato in un file con le costanti

Dettagli

LA RICORSIONE IN C. CdL Ingegneria Informatica n.o. Anno Accademico 2006/07 Fondamenti di Informatica I corso A Giacomo Piscitelli pag.

LA RICORSIONE IN C. CdL Ingegneria Informatica n.o. Anno Accademico 2006/07 Fondamenti di Informatica I corso A Giacomo Piscitelli pag. I lucidi sono una rielaborazione e integrazione di quelli messi a disposizione dei docenti nel sito relativo al testo: Informatica: arte e mestiere 2/ed Stefano Ceri, Dino Mandrioli, Licia Sbattella Copyright

Dettagli

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java Programmazione Orientata agli Oggetti in Linguaggio Java Classi e Oggetti: Metafora Parte a versione 2.2 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)

Dettagli

Struct, enum, Puntatori e Array dinamici

Struct, enum, Puntatori e Array dinamici Struct, enum, Puntatori e Array dinamici Tratti dal corso del Dr. Francesco Fabozzi Corso di Informatica Tipi di dato in C Abbiamo esaminato diversi tipi di dato che il C mette a disposizione dell utente

Dettagli

Nella propria home directory creare una sottodirectory chiamata es08, in cui metteremo tutti i file C di oggi.

Nella propria home directory creare una sottodirectory chiamata es08, in cui metteremo tutti i file C di oggi. Laboratorio 8 Nella propria home directory creare una sottodirectory chiamata es08, in cui metteremo tutti i file C di oggi. Note Quando dovete usare o ritornare dei valori booleani, usate la seguente

Dettagli

Laboratorio di Algoritmi e Strutture Dati

Laboratorio di Algoritmi e Strutture Dati Laboratorio di Algoritmi e Strutture Dati Prof. Aniello Murano Implementazioni di Liste Puntate Semplici Corso di Laurea Codice insegnamento Email docente Anno accademico Informatica 13917 murano@na.infn.it

Dettagli

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori Puntatori Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori 1 Il puntatore Un tipo puntatore è un tipo scalare per

Dettagli

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori Puntatori Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori 1 Il puntatore Un tipo puntatore è un tipo scalare per

Dettagli

Introduzione al C Lez. 4

Introduzione al C Lez. 4 Introduzione al C Lez. 4 Allocazione Dinamica della memoria http://www.di.unipi.it/~rossano/algo1/lez4.pdf Allocazione dinamica memoria In C la memoria può essere anche gestita in modo dinamico, attraverso

Dettagli

Programmazione II canale AD -- Esonero del 21/04/2006

Programmazione II canale AD -- Esonero del 21/04/2006 Esercizio 1 (Sbarramento ) Si scriva una funzione ricorsiva che riceve in input una lista concatenata di interi L e restituisce una nuova lista concatenata di interi L1 in cui l elemento j-simo ( j 1)

Dettagli

ALGORITMI E STRUTTURE DATI

ALGORITMI E STRUTTURE DATI ALGORITMI E STRUTTURE DATI Esercitazioni AndreA Orlandini http://www.dia.uniroma3.it/~orlandin/asd/ e-mail: orlandin@dia.uniroma3.it Orario di ricevimento: Martedì 14.00-16.00 Puntatori e Liste StudentiDIA

Dettagli

La Ricorsione. Carla Binucci e Walter Didimo

La Ricorsione. Carla Binucci e Walter Didimo La Ricorsione Carla Binucci e Walter Didimo Definizione induttiva di funzioni Una funzione definita in modo induttivo è una funzione definita in termini di sé stessa ad esempio la funzione f(n) = n! (fattoriale

Dettagli

Linguaggio C: PUNTATORI

Linguaggio C: PUNTATORI Linguaggio C: PUNTATORI I puntatori sono una delle più importanti caratteristiche del linguaggio C. Permettono di lavorare a basso livello, mantenendo flessibilità e praticità. Il C utilizza molto i puntatori

Dettagli