Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che...

33
 Lezione 9 Funzioni in C++ Mauro Piccolo [email protected]

Transcript of Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che...

Page 1: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Lezione 9Funzioni in C++

Mauro [email protected]

Page 2: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Aggiungere nuove funzioni

● Abbiamo visto che main e' una funzione● E' possibile aggiungere altre funzioni usando

void NOME(LISTA DI PARAMETRI){DEFINIZIONE

}● main ad esempio e' una funzione speciale, che 

non richiede parametri

Page 3: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Esempio

ProduceProducono

Page 4: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si 

trovasse in fondo al file

Quando si legge un programma, esso non va letto dall'alto verso il basso, ma seguendo il flusso di 

esecuzione!!!

Page 5: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Funzioni con argomenti

● Si consideri la seguente funzione

La funzione prende in input un carattere c e lo stampa due volte

● Essa puo' essere invocata nel seguente main

Page 6: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Visibilita'

● I parametri e le variabili esistono solo all'interno delle loro proprie funzioni

● Esempio

Page 7: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Funzioni con piu' argomenti

● Esempio

● Attenzione agli errori!!!● (int hour, minute) non e' un formato legale per i parametri● Il seguente pezzo di codice e' sbagliato

● Il modo giusto e' il seguente

Page 8: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Le funzioni possono anche restituire valori!In realta' la keyword void messa all'inizio delle 

funzioni che abbiamo scritto, sta a significare che la funzione restituisce un valore di tipo void, 

ovvero non restituisce nulla.

Page 9: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Funzioni con valori di ritorno

● Nella dichiarazione della funzione, deve essere presente il tipo di dato ritornato

● Per restituire il valore si utilizza l'istruzione return

Page 10: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Morale

● Una funzione e' un pezzo di programma con un nome. Essa viene eseguita tramite l'invocazione del suo nome.

Invoca f()

f(         )

Elaborai

valori

Chiamante Chiamata

valori

risultato

Page 11: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Cosa succede nella memoria?

● Programmi strutturati in blocchi● Main(){...{...{...}...}...}

● Vediamo un esempio

Page 12: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

main()w               0

if()

h               1  

f()x               0

return

y             20z             20  

20

test            true

20

Page 13: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Altro esempio

● Scrivere una funzione che calcola il piu' grande divisore di un numero dato

Page 14: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Altro esempio (continua)

● Scrivere una funzione che calcola il numero primo piu' grande minore uguale di un numero dato

● Ho utilizzato la funzione divisore scritta nello slide precedente

Page 15: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Le funzioni possono anche invocare loro stesse!!!

Page 16: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Ricorsione

● Una funzione che richiama se stessa

● Cosa accade se chiamiamo la funzione nel modo seguente

Page 17: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Lo stack

Page 18: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Un altro esempio

● Vi ricordate le funzioni seguenti?

● Se volessi stampare un numero arbitrario di linee?

Page 19: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Attenti a non divertirvi troppo, le insidie sono dietro l'angolo

Page 20: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Il fattoriale

● Voglio scrivere in C++ una funzione che calcola il fattoriale di un numero● Il fattoriale (n!) e' cosi' definito

– 0! = 1– n! = n(n­1)(n­2) = n (n­1)! 

Page 21: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Soluzione iterativa

Page 22: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Soluzione ricorsiva

Page 23: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Vediamo lo stack delle chiamate per factorial(3)

Page 24: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Possiamo fare praticamente tutto con assegnazioni condizionali e ricorsione. Tuttavia, alcuni fenomeni potrebbero indurci a utilizzare 

istruzioni alternative alla ricorsione.

Page 25: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Page 26: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Page 27: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Passaggio dei parametri per valore

Page 28: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Cosa succede in memoria?

● R­valore di x uguale a R­valore di primo, R­valore di y uguale all'R­valore di secondo ma gli L­valori sono diversi!!

Page 29: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Passaggio parametri per puntatore

Page 30: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Cosa succede in memoria?

Page 31: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Passaggio parametri per riferimento

Page 32: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Cosa succede in memoria

● primo e secondo sono alias di x ed y

Page 33: Lezione 9 Funzioni in C++piccolo/teach/AA1516/Lezioni/Lezione9.pdf · 2015-10-15 · Osservate che l'esecuzione parte sempre dalla prima istruzione del main() anche se esso si trovasse

   

Passaggio parametri per riferimento

● Il passaggio dei parametri per riferimento mette in comune una variabile tra chiamante e chiamato● Puo' servire in entrambe le direzioni o solo in una!

● Ha senso passare puntatori per riferimento?