Menu
Coddy logo textTech

Passare funzioni come argomenti

Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 36 di 61.

Uno degli usi più potenti dei puntatori a funzione è passarli come argomenti ad altre funzioni. Questo ti permette di inserire un comportamento personalizzato in una funzione senza modificarne il codice: una tecnica talvolta chiamata callback.

Considera una funzione che esegue un calcolo su due numeri. Invece di codificare rigidamente l'operazione, puoi accettare un puntatore a funzione che definisce quale operazione eseguire:

typedef int (*Operation)(int, int);

int compute(int a, int b, Operation op) {
    return op(a, b);
}

La funzione compute non sa se sta sommando, sottraendo o facendo qualcos'altro. Si limita a chiamare la funzione che le viene passata:

int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }

int main() {
    printf("%d\n", compute(5, 3, add));       // Output: 8
    printf("%d\n", compute(5, 3, multiply));  // Output: 15
    return 0;
}

Nota come la stessa funzione compute produce risultati diversi in base alla funzione che le passiamo. Questo schema è fondamentale per scrivere codice flessibile e riutilizzabile. Scrivi la struttura una sola volta e chi usa la tua funzione fornisce la logica specifica di cui ha bisogno.

challenge icon

Sfida

Facile

Scrivi una funzione apply_twice che accetta due interi e un codice operazione, applica l’operazione ai numeri due volte in sequenza e restituisce il risultato finale.

La tua funzione riceverà un codice operazione che determina quale operazione usare. Devi definire le funzioni operazione all’interno della tua soluzione e passarle a una funzione ausiliaria compute che accetta un puntatore a funzione.

Nota: sono necessarie solo le funzioni. I test chiamano direttamente apply_twice e ne controllano il valore restituito, quindi non leggere input né stampare nulla.

Struttura richiesta:

  • Definisci un typedef chiamato Operation per un puntatore a funzione che accetta due parametri int e restituisce un int
  • Definisci due funzioni operazione: add (restituisce a + b) e multiply (restituisce a * b)
  • Definisci una funzione compute che accetta due interi e un puntatore a funzione Operation, quindi restituisce il risultato della chiamata all’operazione
  • In apply_twice, seleziona l’operazione appropriata in base al codice, quindi usa compute due volte: prima con i numeri originali, poi con il risultato e di nuovo il secondo numero

Logica:

  1. Seleziona la funzione operazione in base a op_code (1 = add, 2 = multiply)
  2. Chiama compute(a, b, operation) per ottenere un risultato intermedio
  3. Chiama compute(intermediate, b, operation) per ottenere il risultato finale
  4. Restituisci il risultato finale

Parametri:

  • a (int): Primo numero
  • b (int): Secondo numero
  • op_code (int): Codice operazione (1 per add, 2 per multiply)

Valore restituito: Il risultato dopo aver applicato l’operazione due volte in sequenza (int)

Esempio: Con a = 5, b = 3, op_code = 1 (add):

  • Primo calcolo: 5 + 3 = 8
  • Secondo calcolo: 8 + 3 = 11
  • Restituisci: 11

Con a = 2, b = 4, op_code = 2 (multiply):

  • Primo calcolo: 2 × 4 = 8
  • Secondo calcolo: 8 × 4 = 32
  • Restituisci: 32

Provalo tu

int apply_twice(int a, int b, int op_code) {
    // Write code here
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C online