Funzioni in C

Scopriamo cos’è una funzione e come utilizzarla per ottimizzare il nostro codice.

Calcolo del fattoriale

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

Cos’è una funzione?

Una funzione è un blocco di codice che viene eseguito ogni volta che viene richiamato. Può avere dei parametri e un valore di ritorno.

esempio funzione

In C la sintassi per definire una funzione è la seguente:

sintassi funzione C

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.

Come utilizzare una funzione?

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.

dichiarazione funzione C

Ecco qui degli esempi pratici.

Visibilità di una variabile in C

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.