Sostieni AppuntiFacili con una piccola donazione su PayPal

Dona con PayPal
AppuntiFacili
Torna Indietro Segnala errore

Funzioni

✍️ Dennis Turco 🏷️ Informatica 📘 C
Ultima modifica:
#c#programmazione#funzioni

1. Descrizione

Le funzioni in C sono blocchi di codice riutilizzabili che permettono di:

  • evitare ripetizioni di codice
  • migliorare la leggibilità
  • suddividere un problema in sottoproblemi

Possiamo immaginare una funzione come un “mini-programma” interno al programma principale.

2. Sintassi

La sintassi di una funzione in in generale è:

tipo_ritorno nome_funzione (elenco_parametri) {
   istruzioni;
   return valore_restituito;
}

Dove:

  • tipo_ritorno è il valore di ritorno specificato come abbiamo detto prima.
  • nome_funzione è il nome dato alla funzione, si raccomanda di seguire le stesse regole sintattiche per le variabili.
  • [elenco_parametri] può anche essere una lista vuota, oppure si elencano gli argomenti passati alla funzione detti anche parametri.
  • return è il valore restituito.

3. Valore di ritorno

  • Ogni funzione presenta un valore di ritorno che puo’ essere di qualsiasi tipo predefinito o definito dell’utente.
  • Se nella dichiarazione viene omesso il tipo di ritorno, esso viene considerato automaticamente un intero.
  • Nel caso di funzione che compie un azione, ovvio non deve ritornare nessun valore, si usa il tipo predefinito void come valore di ritorno.
  • Una funzione puo’ avere o meno una lista di argomenti.

4. Tipi di funzioni

4.1 Funzioni con valore di ritorno

#include <stdio.h>

int somma(int a, int b) {
    return a + b;
}

int main() {
    int r = somma(3, 5);
    printf("%d\n", r);
    return 0;
}

4.2 Funzioni void (senza ritorno)

#include <stdio.h>

void saluta() {
    printf("Ciao!\n");
}

int main() {
    saluta();
    return 0;
}

5. Parametri per Valore vs per Riferimento

5.1 funzioni con parametri per valore

Parametri per valore: i parametri passati per valore vanno specificati all’interno delle parentesi tonde dopo il nome della funzione specificando per ogni parametro il nome preceduto dalla sua tipologia; quando sono presenti più parametri vanno separati da virgola. Quando si passa un parametro in questo modo all’inizio dell’esecuzione della funzione il valore memorizzato all’interno della variabile passata come parametro viene copiato in una nuova variabile della funzione. I parametri passati per valore possono essere anche opzionali, ovvero si possono creare funzioni che possono ricevere un numero diverso di parametri; questo si fa assegnando ad alcuni parametri dei valori di default.

La funzione riceve una copia del valore.

void incrementa(int x) {
    x++;
}

La variabile originale NON cambia.

5.2 Funzioni con parametri per riferimento (tramite puntatori)

Parametri per riferimento: in C non esistono i riferimenti come in C++; per ottenere lo stesso effetto si utilizza il passaggio di puntatori. Una funzione riceve quindi l’indirizzo di memoria della variabile e, dereferenziando il puntatore (*), può modificare direttamente il valore della variabile del programma chiamante.

In C si usa l’indirizzo di memoria.

void incrementa(int *x) {
    (*x)++;
}

5.2.1 Esempio completo

#include <stdio.h>

void funzione(int valore, int *riferimento) {
    valore++;          // incremento solo la copia
    (*riferimento)++;  // incremento il contenuto della variabile puntata
}

int main() {
    int x = 0;
    int y = 0;

    funzione(x, &y);

    printf("%d\n", x); // -> 0, perche' x è passato per valore
    printf("%d\n", y); // -> 1, perche' y è passato per "riferimento" (tramite puntatore)
    return 0;
}

6. Passaggio di array alle funzioni

In C, quando passi un array a una funzione:

  • NON viene copiato
  • viene passato come indirizzo del primo elemento

6.1 Sintassi

void funzione(int array[], int size)

oppure:

void funzione(int *array, int size)

6.2 Esempio: stampa array

#include <stdio.h>

void stampaArray(int array[], int size) {
    for(int i = 0; i < size; i++) {
        printf("%d ", array[i]);
    }
}

int main() {

    int numeri[5] = {1, 2, 3, 4, 5};

    stampaArray(numeri, 5);

    return 0;
}

6.3 Esempio: modifica array

#include <stdio.h>

void raddoppia(int array[], int size) {
    for(int i = 0; i < size; i++) {
        array[i] = array[i] * 2;
    }
}

int main() {

    int numeri[3] = {1, 2, 3};

    raddoppia(numeri, 3);

    return 0;
}

Qui l’array originale viene modificato.

7. Quiz a risposta multipla

Cosa sono le funzioni in C?

Cosa succede quando passi un array a una funzione?

Cosa fa il passaggio per valore?

Cosa permette il puntatore in una funzione?

Qual è la sintassi corretta per un array in funzione?

8. Esercizi

Esercizi con le funzioni in C/C++

8.1 Somma array

Scrivere una funzione che calcola la somma di un array.

💡 Mostra soluzione
#include <stdio.h>

int somma(int array[], int size) {

    int s = 0;

    for(int i = 0; i < size; i++) {
        s += array[i];
    }

    return s;
}

int main() {

    int numeri[4] = {1, 2, 3, 4};

    printf("Somma = %d", somma(numeri, 4));

    return 0;
}

8.2 Massimo array

Scrivere una funzione che trova il valore massimo.

💡 Mostra soluzione
#include <stdio.h>

int massimo(int array[], int size) {

    int max = array[0];

    for(int i = 1; i <details size; i++) {
        if(array[i] > max) {
            max = array[i];
        }
    }

    return max;
}

8.3 Inverti array

Invertire un array tramite funzione.

💡 Mostra soluzione
#include <stdio.h>

void inverti(int array[], int size) {

    int temp;

    for(int i = 0; i < size / 2; i++) {
        temp = array[i];
        array[i] = array[size - 1 - i];
        array[size - 1 - i] = temp;
    }
}
Prenota una lezione