Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Le funzioni
Il passaggio dei parametri
Le dichiarazioni e le chiamate
I prototipi di funzione
I puntatori a funzione
La ricorsione
Ancora sull’ordinamento C
L an
La funzione main() gu
ag
e
Nome funzione ( )
,
Tipo restituito
Argomento
Espressione
Fondamenti di Informatica I a.a. 2008-09 10
I valori restituiti 2
Esempio:
Esempio valori restituiti da return,
return implicitamente convertiti
dal compilatore, per una funzione che dovrebbe restituire un
float
float f()
{
float f2;
int a;
char c;
Argomento
Nell’allusione
extern int f();
il simbolo f è un puntatore a funzione,
funzione che permette di accedere alla
locazione riferita dal puntatore; dato che f è un puntatore costante,
non è possibile assegnargli un valore
Per dichiarare un puntatore variabile a funzione, è necessario far
precedere il nome del puntatore da un asterisco
Esempio:
Esempio
int (*pf)(); /* dichiara un puntatore ad una funzione di tipo int */
Le parentesi che delimitano *pf sono necessarie per consentire un
raggruppamento corretto: se non venissero specificate si otterrebbe
la dichiarazione di una funzione che restituisce un puntatore ad int
pf f1;
answer (*pf)(a); /* richiama la funzione f1
con argomento a */
………
2sum(1) 1
1) Fattoriale
2) I numeri di Fibonacci
Si consideri la sequenza di numeri interi
0,1,1,2,3,5,8,13,21…
nota come successione di Fibonacci
La legge di generazione della successione è espressa mediante
la relazione di ricorrenza
F0 0F11
Fn Fn1 Fn2
Nota:
Nota La legge di Fibonacci (Leonardo Pisano, detto il Fibonacci,
Pisa 1170) descrive la crescita del numero di coppie di conigli a
partire da una singola coppia, supponendo che ogni coppia
procrei, ogni mese, una nuova coppia di conigli, che sia in grado
di riprodursi a partire dal mese successivo
int fibonacci(n)
int n;
{
if (n < 0)
return 0; /* passo base: n 0 */
else if (n 1)
return 1; /* passo base: n 1 */
else
return (fibonacci(n1) + fibonacci(n2)); /* passo di induzione */
}
Fondamenti di Informatica I a.a. 2008-09 36
Esempi di funzioni ricorsive 4
3) Algoritmo di Euclide per il calcolo del M.C.D.
int mcd (int m, int n); Prototipo della
funzione mcd()
main (void)
{
int numero1, numero2;
printf(“Inserisci i due numeri ”);
scanf(“%d %d”, &numero1, &numero2);
printf(“Il MCD tra %d e %d è %d\n”, numero1, numero2, mcd(numero1, numero2));
}
int mcd(m, n)
{
if (m 0)
return n; /* caso m 0 */
else if ((n 0) || (m n))
return m; /* caso n 0 o m n */
else if (m > n)
return mcd (n, m%n); /* caso m>n */
else
return mcd (m, n%m); /* caso m<n */ 37
Fondamenti di Informatica I a.a. 2008-09
}
Esempi di funzioni ricorsive 5
4) Quicksort Come si seleziona
l’elemento perno?
5) Mergesort
34 93 64 25 18 29 76 81
34 93 25 64 18 29 76 81
25 34 64 93 18 29 76 81
18 25 29 34 64 76 81 93