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

Post on 06-Mar-2020

0 views 0 download

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

   

Lezione 9Funzioni in C++

Mauro Piccolopiccolo@di.unito.it

   

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

   

Esempio

ProduceProducono

   

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!!!

   

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

   

Visibilita'

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

● Esempio

   

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

   

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.

   

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

   

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

   

Cosa succede nella memoria?

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

● Vediamo un esempio

   

main()w               0

if()

h               1  

f()x               0

return

y             20z             20  

20

test            true

20

   

Altro esempio

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

   

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

   

Le funzioni possono anche invocare loro stesse!!!

   

Ricorsione

● Una funzione che richiama se stessa

● Cosa accade se chiamiamo la funzione nel modo seguente

   

Lo stack

   

Un altro esempio

● Vi ricordate le funzioni seguenti?

● Se volessi stampare un numero arbitrario di linee?

   

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

   

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)! 

   

Soluzione iterativa

   

Soluzione ricorsiva

   

Vediamo lo stack delle chiamate per factorial(3)

   

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

istruzioni alternative alla ricorsione.

   

   

   

Passaggio dei parametri per valore

   

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!!

   

Passaggio parametri per puntatore

   

Cosa succede in memoria?

   

Passaggio parametri per riferimento

   

Cosa succede in memoria

● primo e secondo sono alias di x ed y

   

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?