Post on 06-Mar-2020
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(n1)(n2) = n (n1)!
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?
● Rvalore di x uguale a Rvalore di primo, Rvalore di y uguale all'Rvalore di secondo ma gli Lvalori 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?