Le funzioni in C Introduzione Spesso alcuni gruppi

  • Slides: 19
Download presentation
Le funzioni in C++

Le funzioni in C++

Introduzione Spesso alcuni gruppi di operazioni vengono ripetute in diverse parti all’interno del medesimo

Introduzione Spesso alcuni gruppi di operazioni vengono ripetute in diverse parti all’interno del medesimo programma Si pensi ad esempio a un programma di algebra È plausibile pensare che ci sia la necessità di stampare a video le soluzioni di un’equazione di 2° grado Il codice relativo è sempre lo stesso È quindi utile definire una sola volta questo gruppo di istruzioni e dare un nome ad esso Ogni volta che si vuole mostrare a video le soluzione di un’equazione di 2° grado sarà sufficiente indicare il nome assegnato

Le funzioni Una funzione è: un insieme di istruzioni dotato di nome descritta (definita)

Le funzioni Una funzione è: un insieme di istruzioni dotato di nome descritta (definita) una sola volta attivabile (richiamabile o invocabile) all’interno del programma o di un’altra funzione Alcune funzioni sono già definite si pensi alla scanf e alla printf dietro a questi nomi vi sono una serie di istruzioni in grado di, rispettivamente, intercettare la pressione dei tasti e di visualizzare un carattere sullo schermo chi richiama queste funzioni non si preoccupa di come sono fatte, basta sapere solo cosa fanno (visione black box)

Funzioni: utilizzo(1) Astrazione e leggibilità: enucleano parti di codice, nascondendo dettagli algoritmici e di

Funzioni: utilizzo(1) Astrazione e leggibilità: enucleano parti di codice, nascondendo dettagli algoritmici e di codifica il nome di programma si presenta come “un’operazione elementare” Strutturazione e scomposizione funzionale del programma: consentono una stesura del programma che riflette un’analisi funzionale del problema Collaudo: verifica di correttezza della soluzione facilitata dal poter verificare la correttezza prima dei singoli sottoprogrammi e poi dell’intero programma visto come insieme di chiamate che si scambiano informazioni

Funzioni: utilizzo(2) Compattezza ed efficienza del codice: Modificabilità: si evita di ripetere sequenze di

Funzioni: utilizzo(2) Compattezza ed efficienza del codice: Modificabilità: si evita di ripetere sequenze di istruzioni in più parti del programma una sola modifica vale per tutte le attivazioni del sottoprogramma Riuso: sottoprogrammi non troppo specifici possono essere raccolti in librerie utilizzabili da programmi diversi

Calcolare la somma dei fattoriali dei primi 100 numeri naturali: 0!+1!+2! … + 99!+100!

Calcolare la somma dei fattoriali dei primi 100 numeri naturali: 0!+1!+2! … + 99!+100! #include <iostream> Using namespace std; int fattoriale(int); main(){ int numero; // numero di cui voglio calcolare il fattoriale int fatt; // memorizzo il fattoriale di numero int somma; somma = 0; for(numero=0; numero<=100; numero++) { fatt = fattoriale(numero); somma = somma + fatt; } Cout<< «la somma dei fattoriali è » <<somma; }

Dichiarazione del prototipo Il prototipo definisce: il nome della funzione il tipo dei parametri

Dichiarazione del prototipo Il prototipo definisce: il nome della funzione il tipo dei parametri in ingresso e in uscita Chi utilizzerà la funzione dovrà rispettare la sintassi definita nel prototipo Prototipo funzione tipo_restituito nome_funzione (elenco dei parametri); Funzione che non ritorna valori (void è una parola chiave del C che indica assenza di tipo) void nome_funzione (lista tipi dei parametri);

Definizione della funzione La definizione di una funzione va messa dopo il main. Ha

Definizione della funzione La definizione di una funzione va messa dopo il main. Ha la stessa struttura del main (in realtà anche il main è una funzione): Una parte dichiarativa Una parte esecutiva tipo nome (tipo par_for 1, tipo par_for 2. . . ) { parte dichiarativa locale parte esecutiva } tipo nome (tipo par_for 1, tipo par_for 2. . . ) è la testata della funzione par_for 1, par_for 2 sono i nomi dei parametri formali della funzione, il cui tipo deve corrispondere in m

Definizione della funzione(2) int fattoriale(int n){ int risultato=1; int i; for (i = 1;

Definizione della funzione(2) int fattoriale(int n){ int risultato=1; int i; for (i = 1; i <= n; i++) risultato = risultato * i; return risultato; } Parametri Formali: Rappresentano un riferimento simbolico (identificatori) a oggetti utilizzati all’interno della funzione Sono utilizzati dalla funzione come se fossero variabili dichiarate localmente Il valore iniziale di parametri formali viene definito all’atto della chiamata della funzione tramite i parametri attuali (passaggio di parametri)

Invocazione o chiamata Nel corpo del main o di un’altra funzione indica il punto

Invocazione o chiamata Nel corpo del main o di un’altra funzione indica il punto in cui va eseguita la parte del codice presente nella definizione di funzione Invocazione di funzione come operando in una espressione <espressione> = <… nome funzione(par_att 1 …)…>; par_att 1, … sono i parametri attuali che devono corrispondere per ordine e per tipo ai parametri formali I parametri attuali possono essere variabili, costanti o espressioni definite nell’ambiente chiamante, i cui valori all’atto della chiamata vengono copiati nei parametri formali

Istruzione return È l’ultima istruzione di una funzione e indica: il punto in cui

Istruzione return È l’ultima istruzione di una funzione e indica: il punto in cui il controllo torna al chiamante il valore restituito In una funzione deve esserci almeno un’istruzione di return possono esserci più istruzioni di return ma in alternativa la funzione può restituire un solo valore

Chiamata di una funzione All’atto della chiamata, il controllo dell’esecuzione passa dal chiamante al

Chiamata di una funzione All’atto della chiamata, il controllo dell’esecuzione passa dal chiamante al chiamato codice chiamante Inizio programma Il codice del chiamato viene eseguito Al termine dell’esecuzione il controllo ritorna al chiamante, all’istruzione successiva a quella della Istruzione 1 Istruzione 2 Chiama funzione Istruzione 3 Passaggio del controllo Ritorno del controllo Istruzione 1 Istruzione 2 Istruzione 3 Istruzione 4 return

Scambio di informazioni Il chiamato deve poter ricevere dal chiamante i valori attuali sui

Scambio di informazioni Il chiamato deve poter ricevere dal chiamante i valori attuali sui quali eseguire le operazioni definite nella funzione Il chiamato deve poter fornire al chiamante i risultati dell’elaborazione Lo scambio di informazioni tra chiamante e chiamato può avvenire: valore restituito da una funzione (dal chiamato al chiamante) per fornire un valore al chiamante passaggio dei parametri (dal chiamante al chiamato) per fornire i valori in ingresso al chiamato per fornire i risultati di operazioni al chiamante variabili globali (in entrambe le direzioni) fortemente sconsigliato

Passaggio dei parametri Il passaggio dei parametri consiste nell’associare, all’atto delle chiamata di un

Passaggio dei parametri Il passaggio dei parametri consiste nell’associare, all’atto delle chiamata di un sottoprogramma, ai parametri formali i parametri attuali Se il prototipo di una funzione è float circonferenza (float raggio); Invocare questa funzione significa eseguire l’istruzione c = circonferenza(5. 0); In questo modo la variabile raggio (il parametro formale) assumerà per quella particolare invocazione il valore 5 (il parametro attuale). Lo scambio di informazioni con passaggio dei parametri tra chiamante e chiamato può avvenire in due modi: Passaggio per valore Passaggio per indirizzo

Passaggio per VALORE All’atto della chiamata il valore del parametro attuale viene copiato nelle

Passaggio per VALORE All’atto della chiamata il valore del parametro attuale viene copiato nelle celle di memoria del corrispondente parametro formale. Il parametro formale e il parametro attuale si riferiscono a due diverse celle di memoria La funzione in esecuzione lavora nel suo ambiente e quindi sui parametri formali I parametri attuali non vengono modificati

Esempio: passaggio per valore float circonferenza(float raggio) { float circ; circ = raggio *

Esempio: passaggio per valore float circonferenza(float raggio) { float circ; circ = raggio * 3. 14; raggio = 7; /*istruzione senza senso, voglio solo vedere cosa succede modificando il valore di un paramentro formale*/ return circ; Ambiente della funzione circonferenza raggio Quando invoca la funzione in raggio viene copiato il valore di r circ Quando la funzione termina il valore di circ in circonferenza viene copiato in c nel main } /* nel main */ float c, r=5; r c c=circonferenza(r); /*Attenzione! r vale sempre 5 */ Ambiente della funzione main

Passaggio per riferimento All’atto della chiamata viene passato l’indirizzo del parametro attuale. Il parametro

Passaggio per riferimento All’atto della chiamata viene passato l’indirizzo del parametro attuale. Il parametro formale e il parametro attuale si riferiscono alla stessa cella di memoria. L’indirizzo viene passato mettendo & nella definizione dei parametri. In questo caso qualunque cambiamento dei parametri formali all’interno della funzione determina un cambiamento dei parametri attuali I parametri attuali possono venire modificati.

Esempio: passaggio per indirizzo Ordinamento crescente di tre numeri #include <iostream> using namespace std;

Esempio: passaggio per indirizzo Ordinamento crescente di tre numeri #include <iostream> using namespace std; //Ordina scambia i valori di x e y void ordina(int &x, int &y)) { int temp; if(x>y){ temp=x; x=y; y=temp; } }

Esempio: passaggio per indirizzo(2) Ambiente della funzione ordina int main() { int a, b,

Esempio: passaggio per indirizzo(2) Ambiente della funzione ordina int main() { int a, b, c; cout<<"Trenumeri: "; cin>>a>>b>>c; Indirizzo di a ordina(a, b); ordina(a, c); ordina(b, c); cout<<"Numeri ordinati: "<<endl; system("PAUSE"); return EXIT_SUCCESS; } x y Indirizzo di b a b Ambiente della funzione main