Scopriamo cos’è una funzione e come utilizzarla per ottimizzare il nostro codice.
Proviamo a scrivere un programma che calcola il fattoriale di un numero.
#include <stdio.h>
int main(){
int numero;
//Input
printf("Inserisci un numero positivo");
scanf("%d",&numero);
//Calcolo del fattoriale
int fattoriale=1;
if(numero > 0){
int i=1;
while(i < numero){
fattoriale=fattoriale*i;
i = i + 1;
}
}
//Output
printf("Fattoriale: %d \n");
return 0;
}
Immaginiamo ora di dover calcolare il fattoriale di diverse variabili nello stesso programma. Per fare questo dovremmo scrivere le seguenti righe di codice per ogni variabile, un procedimento assolutamente ridondante.
int fattoriale = 1;
if(numero > 0){
int i = 1;
while(i < numero){
fattoriale=fattoriale * i;
i = i + 1;
}
}
printf("Fattoriale: %d \n", fattoriale);
La soluzione sarà scrivere il codice per il calcolo del fattoriale all’interno di una funzione e richiamarla quando ne abbiamo bisogno.
#include <stdio.h>
//Dichiaro la funzione fattoriale
int fattoriale(int);
int main(){
int numero1 = 2;
int numero2 = 5;
int numero3 = 7;
//Richiamo la funzione fattoriale
int fattoriale1 = fattoriale(numero1);
int fattoriale2 = fattoriale(numero2);
int fattoriale3 = fattoriale(numero3);
printf("Fattoriale 1: %d \n",fattoriale1);
printf("Fattoriale 2: %d \n",fattoriale2);
printf("Fattoriale 3: %d \n",fattoriale3);
return 0;
}
//Codice della funzione fattoriale
int fattoriale(int n){
int fatt=1;
if(n > 0){
int i=1;
while(i < n){
fatt=fatt*i;
i = i + 1;
}
}
return fatt;
}
Qui abbiamo definito la funzione fattoriale e l’abbiamo richiamata tre volte nel main. Vediamo l’output:
Fattoriale 1: 2
Fattoriale 2: 120
Fattoriale 3: 5040
Una funzione è un blocco di codice che viene eseguito ogni volta che viene richiamato. Può avere dei parametri e un valore di ritorno.
In C la sintassi per definire una funzione è la seguente:
Il tipo di ritorno di una funzione dev’essere lo stesso del valore di ritorno. Se la funzione non ritorna nessun valore allora è di tipo void.
void stampa_ciao( int ripetizioni ){
int i = 0;
//stampo "ciao" per ripetizioni volte
if(ripetizioni > 0){
while( i < ripetizioni){
printf("Ciao\n");
i = i + 1;
}
}
}
In C un programma è un insieme di funzioni. printf() e scanf() sono funzioni così come main(). main() è una funzione speciale perché è il punto di partenza del nostro programma.
Per utilizzare una funzione devo dichiarare il suo prototipo prima del main(), definire la funzione dopo il main e poi richiamare la funzione dove ne ho bisogno. La logica di questo procedimento è analoga a quella di una variabile.
Ecco qui degli esempi pratici.
Se dichiaro una variabile all’interno di un blocco di codice essa sarà utilizzabile solo al suo interno. Guardiamo il codice di esempio.
#include <stdio.h>
int funzione(int);
int main(){
int n = 1;
// n non è visibile al di fuori di main
// n è visibile all'interno dell if successivo perchè
// anch'esso si trova all'interno di main
if(n == 1){
int m = n + 5;
int a = funzione( m );
// m ed a non sono visibili al di fuori dell'if
}
// m ed a non esistono più
// se le richiamo qui il programma va in crash
return 0;
}
int funzione(int n){
//n è visibile solo all'interno di funzione
//questa n non è la stessa variabile presente nel main
return n+1;
}
Ecco come una funzione ci permette di ridurre notevolmente la dimensione del nostro codice. Nel prossimo tutorial conosceremo le strutture complesse.