Funzioni
- #c
- #programmazione
- #funzioni
In questa lezione
- 1. Descrizione
- 2. Sintassi
- 3. Valore di ritorno
- 4. Tipi di funzioni
- 4.1 Funzioni con valore di ritorno
- 4.2 Funzioni void (senza ritorno)
- 5. Parametri per Valore vs per Riferimento
- 5.1 funzioni con parametri per valore
- 5.2 Funzioni con parametri per riferimento (tramite puntatori)
- 6. Passaggio di array alle funzioni
- 6.1 Sintassi
- 6.2 Esempio: stampa array
- 6.3 Esempio: modifica array
- 7. Quiz a risposta multipla
- 8. Esercizi
- 8.1 Somma array
- 8.2 Massimo array
- 8.3 Inverti array
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
voidcome 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
Mettiti alla prova
0/5 risposte
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;
}
}