Programmazione (imperativa)

Documenti analoghi
Laboratorio di Algoritmi

Programmazione (imperativa)

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

Il linguaggio C. Puntatori e dintorni

Programmazione (imperativa)

Allocazione dinamica della memoria

Laboratorio di Algoritmi

Programmazione (imperativa)

C: panoramica. Violetta Lonati

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità

Funzioni, Stack e Visibilità delle Variabili in C

Funzioni. (Passaggio dei parametri per riferimento) Passaggio dei parametri

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Gestione dinamica della memoria

Ambienti di Programmazione per il Software di Base

Allocazione dinamica della memoria

Concetto di Funzione e Procedura METODI in Java

Informatica per Statistica Riassunto della lezioni del 14/11/2012 e 16/11/2012

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia

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

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

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

Il linguaggio C funzioni e puntatori

Corso di Informatica A.A

Gestione della memoria

Laboratorio di Informatica I

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Lezione 6: Array e puntatori

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

Tempo di vita e scope delle variabili

Corso di Informatica A.A

Le funzioni. Fondamenti di programmazione

Allocazione Dinamica della Memoria

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

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Introduzione al linguaggio C Puntatori

Fondamenti di Informatica T. Linguaggio C: i puntatori

Uso avanzato dei puntatori Allocazione dinamica della memoria

Il puntatore. Il puntatore

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

Il linguaggio C. Puntatori e dintorni

Perché il linguaggio C?

METODI in Java. Prof.Angela Bonifati. Metodi e Sottoprogrammi

Strutture Dati Dinamiche

Strategie di programmazione

Lezione 8: Stringhe ed array multidimensionali

Introduzione al C. Lezione 4 Allocazione dinamica della memoria. Rossano Venturini. Pagina web del corso

Puntatori e array. Violetta Lonati

Gestione della memoria

L'allocazione dinamica della memoria

L'allocazione dinamica della memoria

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Linguaggio C: PUNTATORI

La gestione della memoria dinamica Heap

Passaggio dei parametri

Allocazione dinamica della memoria

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

Precedenza e associatività. Complementi sul C - 2. Esempi. Esempi

Parametri by reference. Funzioni. Passaggio dei parametri. Parametri by reference. Soluzione. Problemi

I puntatori (richiamo)

Indirizzi e tipi puntatore a

Introduzione ai puntatori in C Definizione

Capitolo 11. Puntatori

Allocazione dinamica della memoria

Ottenere una modifica del parametro attuale

Fondamenti di Informatica

Lezione 19 e Allocazione dinamica della memoria - Direttive al preprocessore - Libreria standard - Gestione delle stringhe

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Programmazione I - Laboratorio

passaggio di vettori come parametri di funzioni/procedure. I Quando si passa un vettore come parametro ad una funzione, in

Università degli Studi di Cassino e del Lazio Meridionale Corso di Fondamenti di Informatica Allocazione dinamica di memoria

Lezione 12: Allocazione Dinamica della Memoria

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

C++ funzioni Alberto Ferrari. Alberto Ferrari Programmazione di applicazioni SW

Introduzione. Le funzioni in C. Funzioni. Cosa succede

Passare argomenti al programma

Corso sul linguaggio Java

Liste concatenate e allocazione dinamica

Ingegneria Elettronica Ingegneria delle Telecomunicazioni (J-Z) Ing. Antonio Monteleone A.A. 2001/02 3 ciclo

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

Do...While() Break Continue Concetto di Funzione e Procedura METODI in Java

LE FUNZIONI PARTE II. Manuale linguaggio C

Linguaggio C I puntatori

Introduzione al C. Unità Gestione Dinamica della Memoria

Programmazione M.A. Alberti. Comunicazione digitale AA 2009/ Classi in Java 1. Le classi in Java. Oggetti. Classi. Classi. Visibilità dei dati

Introduzione al linguaggio C Puntatori

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

Breve Ripasso del linguaggio C

Funzioni. Unità 5. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Lezione 8. Sottoprogrammi

PUNTATORI. Introduzione. puntatore. L operatore

Transcript:

Programmazione (imperativa) Corso di Laurea in Informatica Roberto Cordone DI - Università degli Studi di Milano Lezioni: Lunedì 12.00-13.00 e 14.00-16.00 Mercoledì 14.00-17.00 Laboratorio: Giovedì 12.00-13.00 e 14.00-17.00 Ricevimento: su appuntamento Tel.: 02 503 16235 E-mail: roberto.cordone@unimi.it Web page: http://homes.di.unimi.it/~cordone/courses/2015-prog/2015-prog.html Funzioni Milano, A.A. 2015/16 1 / 1

Funzioni Funzioni o procedure sono brani di codice abbastanza importanti da avere un nome, dei dati e dei risultati, come i programmi L uso delle funzioni consente di dividere un programma in brani di codice più facili da capire più facili da modificare non ripetere brani di codice identici o molto simili riutilizzare brani di codice in programmi diversi 2 / 1

Esempio Stampa dei quadrati e dei cubi per i primi dieci numeri positivi #include <stdio.h> #include <stdlib.h> #include "iocrema.h"> int quadrato (int y); int cubo (int y); int main (int argc, char *argv[]) int x; for (x = 1; x <= 10; x++) StampaIntero(quadrato(x)); StampaStringa("\n"); int quadrato (int y) return y * y; int cubo (int y) int q; q = quadrato(y); return q * y; for (x = 1; x <= 10; x++) StampaIntero(cubo(x)); return EXIT SUCCESS; 3 / 1

Prototipo, definizione e chiamate Il prototipo (dichiarazione) specifica il tipo del risultato della funzione (void se non dà risultati) il nome della funzione i dati richiesti dalla funzione La definizione della funzione riprende il prototipo e specifica le variabili locali e le operazioni eseguite dalla funzione Chiamata di una funzione (invocazione) è ciascun uso della funzione in espressioni del main o di altre funzioni e specifica i dati sui quali effettivamente la funzione opera nel caso specifico 4 / 1

Prototipo tipo funzione(tipo1 nome1,tipo2 nome2,...); Il prototipo specifica il tipo del risultato della funzione (void se non dà risultati) il nome della funzione il tipo e il nome di ciascun dato I parametri formali sono i nomi dei dati indicati nel prototipo I parametri attuali saranno i valori dei dati indicati nelle chiamate Il prototipo mette il nome della funzione nella tabella dei simboli (essendo un istruzione, termina con ;) 5 / 1

Definizione tipo funzione(tipo1 nome1,tipo2 nome2,...) parte dichiarativa parte esecutiva [return espressione;] l intestazione riprende il prototipo senza il ; (non è un istruzione) il corpo fra parentesi graffe specifica variabili locali e istruzioni e termina con l istruzione return seguita da un espressione: risultato della funzione è il valore dell espressione Una procedura non restituisce risultati: è di tipo void e non occorre che termini con return 6 / 1

Chiamata Ogni chiamata di una funzione (invocazione) è il suo uso in espressioni del main o di altre funzioni oggetto = funzione(parametri attuali); procedura(parametri attuali); Parametri attuali sono le espressioni i cui valori forniscono i dati Si chiamano anche argomenti Per ogni funzione si possono avere molte chiamate su dati diversi da parte della stessa funzione da parte di diverse funzioni 7 / 1

Struttura modulare Le chiamate a funzione sono organizzate ad albero La funzione chiamante e le chiamate in essa contenute si comportano come capufficio e impiegati il capufficio indica quali impiegati devono lavorare e in che ordine e fornisce a ciascuno i dati su cui operare gli impiegati forniscono al capufficio i risultati del loro lavoro ogni impiegato può avere sottoposti, con i quali organizza il lavoro allo stesso modo (da cui la struttura ad albero) il capufficio conosce solo dati e risultati; non sa quali operazioni compiono e che mezzi usano gli impiegati La radice dell albero è il main 8 / 1

Albero delle chiamate 9 / 1

Gestione dello stack Il processore riserva alle funzioni un area di memoria detta stack che viene gestita come una pila alla chiamata, alloca in cima alla pila lo spazio necessario a parametri formali (dati) variabili locali (risultati parziali) risultato della funzione al termine della funzione, dealloca lo spazio e rende il risultato A causa della deallocazione, parametri e variabili locali esistono solo fra la chiamata e il termine della funzione Le strutture dinamiche stanno in un altra area di memoria detta heap: vengono deallocate solo da free o al termine dell intero programma 10 / 1

Gestione dello stack: esempio Alla chiamata della funzione, il processore: 1 valuta i parametri attuali 2 alloca in cima allo stack lo spazio necessario 3 assegna i valori dei parametri attuali ai parametri formali Esempio: il main esegue l istruzione cubo(x); 11 / 1

Gestione dello stack: esempio Alla chiamata della funzione, il processore: 1 valuta i parametri attuali 2 alloca in cima allo stack lo spazio necessario 3 assegna i valori dei parametri attuali ai parametri formali Esempio: il main esegue l istruzione cubo(x); 1 il parametro attuale è x e vale 2 2 si alloca sullo stack spazio per y, q e il risultato di cubo 3 si assegna il valore 2 a y 12 / 1

Gestione dello stack: esempio Alla chiamata della funzione, il processore: 1 valuta i parametri attuali 2 alloca in cima allo stack lo spazio necessario 3 assegna i valori dei parametri attuali ai parametri formali Esempio: la funzione cubo esegue l istruzione quadrato(y); 13 / 1

Gestione dello stack: esempio Alla chiamata della funzione, il processore: 1 valuta i parametri attuali 2 alloca in cima allo stack lo spazio necessario 3 assegna i valori dei parametri attuali ai parametri formali Esempio: la funzione cubo esegue l istruzione quadrato(y); 1 il parametro attuale è y e vale 2 2 si alloca sullo stack spazio per y e il risultato di quadrato 3 si assegna il valore 2 a y 14 / 1

Gestione dello stack: esempio Al termine della funzione, il processore: 1 valuta l espressione che segue l istruzione return come risultato 2 dealloca dalla cima allo stack lo spazio dell ultima chiamata 3 restituisce il risultato alla funzione chiamante Esempio: la funzione quadrato esegue l istruzione return y * y; 15 / 1

Gestione dello stack: esempio Al termine della funzione, il processore: 1 valuta l espressione che segue l istruzione return come risultato 2 dealloca dalla cima allo stack lo spazio dell ultima chiamata 3 restituisce il risultato alla funzione chiamante Esempio: la funzione quadrato esegue l istruzione return y * y; 1 il risultato y * y vale 4 2 si dealloca lo spazio per y e per il risultato (salvando questo a parte) 3 si restituisce 4 alla funzione cubo, che lo assegna a q 16 / 1

Gestione dello stack: esempio Al termine della funzione, il processore: 1 valuta l espressione che segue l istruzione return come risultato 2 dealloca dalla cima allo stack lo spazio dell ultima chiamata 3 restituisce il risultato alla funzione chiamante Esempio: la funzione cubo esegue l istruzione return q * y; 17 / 1

Gestione dello stack: esempio Al termine della funzione, il processore: 1 valuta l espressione che segue l istruzione return come risultato 2 dealloca dalla cima allo stack lo spazio dell ultima chiamata 3 restituisce il risultato alla funzione chiamante Esempio: la funzione cubo esegue l istruzione return q * y; 1 il risultato q * y vale 8 2 si dealloca lo spazio per y, q e per il risultato (salvando questo a parte) 3 si restituisce 8 al main, che lo passa alla funzione StampaIntero 18 / 1

Conversioni di tipo (1) Il passaggio dei dati e il recupero del risultato obbediscono alle regole implicite per le conversioni di tipo int main (int argc, char *argv[]) int i; double d = 3.5; i = quadrato(d)); /* i vale 9, cioe 3*3 */ return EXIT SUCCESS; int quadrato (int y) return y * y; 19 / 1

Conversioni di tipo (2) int main (int argc, char *argv[]) int i; double d = 3.5; i = quadrato(d)); /* i vale 12, cioe (int) 3.5*3.5 */ return EXIT SUCCESS; int quadrato (double y) return y * y; int main (int argc, char *argv[]) double i; double d = 3.5; i = quadrato(d)); /* i vale 12.25, cioe 3.5*3.5 */ return EXIT SUCCESS; double quadrato (double y) return y * y; 20 / 1

Scope Come si è visto nell esempio, ogni funzione ha un suo spazio riservato sullo stack e può agire solo su parametri e variabili locali non accede alle variabili delle funzioni chiamate non accede alle variabili della funzione chiamante Si possono introdurre variabili globali dichiarate fuori dal main e visibili in ogni funzione del file Le variabili globali sono inutili e sconsigliabili nascondono il fatto che una funzione le usa e le modifica (bachi) rendono complicato chiamare la funzione da funzioni in altri file 21 / 1

Passaggio dei parametri Ad ogni chiamata i parametri attuali vengono valutati e sostituiscono i parametri formali nella funzione chiamata In generale vi sono due modi di passare i parametri per valore: la funzione accede a copie dei dati e le eventuali modifiche interne vanno perse per indirizzo: la funzione accede ai dati originali e le eventuali modifiche interne si conservano 22 / 1

Passaggio per valore Il passaggio dei parametri per valore non ha effetti collaterali Si possono usare i parametri formali come variabili locali, modificandoli per produrre il risultato senza sporcare i parametri attuali int main (int argc, char *argv[]) int x, q; x = 10; q = quadrato(x); /* x vale ancora 10 */ return EXIT SUCCESS; int quadrato (int y) y = y * y; /* ora y vale 100 */ return y; 23 / 1

Passaggio per indirizzo Il passaggio di parametri per indirizzo consente effetti collaterali Quindi consente alla funzione di accedere ai dati originali e modificarli Ma in C il passaggio per indirizzo non esiste! void scambia (int a, int b); int main (int argc, char argv[]) int a, b; a = 1; b = 2; scambia(a,b); /* ora a vale ancora 1 e b vale ancora 2 */ return EXIT SUCCESS; void scambia (int a, int b) int temp; temp = a; a = b; b = temp; /* ora temp vale 1, a vale 2 e b vale 1 */ 24 / 1

Passaggio per indirizzo in C Per simulare il passaggio per indirizzo in C si usa un trucco: si passa per valore l indirizzo del parametro void scambia (int *pa, int *pb); int main (int argc, char argv[]) int a, b; a = 1; b = 2; scambia(&a,&b); /* ora a vale 2 e b vale 1 */ return EXIT SUCCESS; void scambia (int *pa, int *pb) int temp; temp = *pa; *pa = *pb; *pb = temp; /* ora temp vale 1, a vale 2 e b vale 1 */ 25 / 1

Risultati multipli (1) Un altro limite del passaggio per valore è che si può restituire come risultato un solo valore il risultato non può essere un vettore statico (dato che non si può usare un vettore statico in un assegnamento) Ma se occorre restituire più valori o un vettore di valori? risultati multipli: si restituisce una struct oppure si passano dei finti dati che vengono modificati sfruttando gli effetti collaterali del passaggio per indirizzo vettore: si restituisce un vettore dinamico (puntatore) con area di memoria allocata nella funzione (e da deallocare fuori) oppure si sfrutta l equivalenza con i puntatori come indicato in seguito 26 / 1

Risultati multipli (2) Decomposizione di un numero double nella parte intera e frazionaria void decompone (double d, long *pl, double *pf); int main (int argc, char argv[]) double d, f; long l; d = 3.5; decompone(d,&l,&f); /* ora l vale 3L e f vale 0.5 */ return EXIT SUCCESS; void decompone (double d, long *pl, double *pf) *pl = (long) d; *pf = d - *pl; 27 / 1

Passaggio dei vettori Alla chiamata, i vettori vengono convertiti in puntatori e passati Non si deve specificarne la lunghezza, anche se sono statici Non int funzione(int V[LUNGHEZZA]); ma int funzione(int *V); Se occorre conoscerla, la lunghezza si passa come parametro gli elementi di un vettore sono passati per indirizzo, il vettore per valore: corrispondentemente, le modifiche agli elementi si conservano, quelle al vettore no dato che il puntatore non cambia 28 / 1

Risultati vettoriali Vi sono due modi per far scrivere una funzione che restituisce un vettore 1 la funzione alloca un vettore dinamico e restituisce il puntatore alla funzione chiamante 2 la funzione chiamante passa per indirizzo un puntatore alla funzione, la funzione alloca un vettore dinamico e modifica il puntatore assegnandogli il vettore dinamico int main (int argc, char argv[]) int *V; int n; n = 10; V = creavettore(n); /* ora V e un vettore dinamico */ free(v); return EXIT SUCCESS; int *creavettore (int n) int *V; V = (int *) calloc(n+1,sizeof(int)); return V; int main (int argc, char argv[]) int *V; int n; n = 10; creavettore(&v,n); /* ora V e un vettore dinamico */ free(v); return EXIT SUCCESS; void creavettore (int **pv, int n); *pv = (int *) calloc(n+1,sizeof(int)); 29 / 1

Passaggio delle strutture Le strutture si passano per valore copiando campo per campo, ma se contengono campi puntatore, ci si limita a copiare gli indirizzi: gli oggetti puntati risultano passati per indirizzo Si usa passare per indirizzo le strutture di grandi dimensioni, anche quando non si vuole modificarle, per rendere più efficiente il passaggio Si copia un semplice indirizzo anziché molte celle di dati 30 / 1