14: Definizione di una funzione

Ben tornati miei cari lettori, oggi cercheremo di introdurre un argomento complicato per certi versi, che però vi aiuterà  molto a migliorare le prestazioni del vostro programma e a facilitarne la progettazione. Di cosa stiamo parlando? Delle Funzioni.
La maggior parti dei programmi sono abbastanza corposi, fatti di centinaia di righe di codice, creati per risolvere problemi del mondo reale, e tenere a mente tutta la struttura del programma risulta un’impresa assai ardua . L’esperienza ha dimostrato che il modo migliore per sviluppare e amministrare un programma corposo è di costruirlo partendo da piccoli pezzi o moduli. Questi pezzi o moduli  in C  sono chiamati funzioni.  I programmi scritti in C sono scritti solitamente combinando le nuove funzioni scritte dal programmatore con quelle già “preconfezionate” disponibili nella libreria standard del C, quest’ultime saranno argomento del nostro prossimo articolo. Se vi state chiedendo: quindi abbiamo già usato delle funzioni “preconfezionate” senza saperlo? Ebbene la risposta è sì. La libreria standard del C fornisce una serie di funzioni per eseguire calcoli matematici più o meno complessi, per manipolare le stringhe o per l’input/output. Le funzioni printf e scanf che abbiamo utilizzato finora sono tutte funzioni della libreria standard.
Per definire dei compiti specifici, possiamo creare una nuova funzione che può essere usata in più punti del programma. Le istruzioni che definiscono effettivamente la funzione, saranno scritte solo una volta e saranno nascoste alle altre funzioni.

Le funzioni vengono invocate da una chiamata di funzione che specifica il nome della funzione e fornisce le informazioni (gli argomenti) di cui la funzione ha bisogno, per completare le funzioni per cui è stata progettata. Per rendervi più chiaro il concetto vediamo un analogia, prendiamo ad esempio una struttura gerarchica di una azienda. Un capo (la funzione chiamante) chiede a un operaio (funzione chiamata) di eseguire un compito e di tornare indietro a riferire quando il lavoro sarà stato eseguito. Se siete ancora dubbiosi aspettate di vedere qualche esempio e vi sarà tutto più chiaro.

 

Definizione di una funzione

Esistono funzioni già preconfezionate nella libreria standard (e le vedremo successivamente), oggi però  ci occuperemo  di creare una funzione personalizzata che svolga le nostre richieste. Partiremo con qualcosa di semplice. Creeremo una funzione che restituirà il quadrato del numero che è presente nell’argomento della funzione invocata.

#include<stdio.h>
int quadrato (int y) ;  //prototipo della funzione

//ricordatevi che l'esecuzione di ogni programma inizia dalla funzione main
int main (void) 
{
int x;  //contatore

/*itera 10 volte, calcola e visualizza il quadrato di x */
for(x=0;x<=10;x++) 
{
printf("%10d", quadrato(x) );  //chiamata di funzione

}
printf("\n");
return 0; }

//definizione della funzione che restituisce il quadrato del parametro
int quadrato (int y)  //y è la copia dell'argomento passato alla funzione
{
return y * y ; //restituisce il quadrato di y come intero
}  // fine della funzione quadrato

La funzione quadrato sarà invocata nel corpo del main all’interno dell’istruzione printf (si poteva invocarla anche fuori da printf)

printf("%d", quadrato(x) );

La funzione quadrato riceverà una copia del valore di x nel parametro y. In seguito quadrato calcolerà y * y. Il risultato sarà restituito alla funzione printf all’interno del main nel punto di invocazione di quadrato e printf visualizzerà il risultato. Questo processo sarà ripetuto 10 volte utilizzando il comando di iterazione for.

La parola chiave prima del nome della funzione indica che quadrato restituirà un risultato intero.

int quadrato (int y) ;  //prototipo della funzione

Questo è il prototipo della funzione e si inserisce prima del main; il prototipo indica al compilatore il tipo del dato restituito dalla funzione, il numero dei parametri che si aspetta di ricevere, il tipo dei parametri e l’ordine in cui questi sono attesi. Il compilatore userà i prototipi per convalidare le chiamate di funzione. L’int all’interno delle parentesi indica che la funzione quadrato si aspetta di ricevere un valore intero dal chiamante.

Formalmente il formato di una definizione di funzione è
tipo-del-valore-di-ritorno nome-della-funzione (lista di parametri separati dalla virgola)

{
dichiarazioni
istruzioni
valore di ritorno
}

Se mettiamo come tipo-del-valore-di-ritorno void allora la funzione non restituirà niente. Se usate più parametri dichiarate il tipo per ogni parametro ( int x, int y  e non int x,y ).
Esistono tre modi per restituire il controllo da una funzione chiamata al punto in cui quest’ultima è stata invocata. Nel caso in cui non restituisca alcun valore, il controllo verrà ripreso quando sarà raggiunta la parentesi graffa destra che chiude la funzione, oppure eseguendo la seguente istruzione return;
Nel caso restituisca un risultato, l’istruzione
return espressione;
restituirà al chiamante il valore dell’espressione.

Concludiamo questa prima parte sulle funzioni lasciandovi un altro esempio. La nostra funzione calcolerà il maggiore dei 3 numeri inseriti dall’utente.

#include<stdio.h>
int maggiore (int x, int y, int z); //prototipo della funzione
int main (void) 
 {
int num1;
int num2;
int num3;
printf("Inserire tre interi:  ");
scanf("%d%d%d", &num1, &num2, &num3);

//chiamata di funzione maggiore

printf("Il numero maggiore tra quelli inseriti e': %d ", maggiore(num1, num2, num3) );
return 0;  }

//definizione della funzione maggiore
int maggiore (int x, int y, int z)
  {
int max = x;  //assumiamo x come il maggiore tra i numeri

if (y>max) { max = y;   } //se y è maggiore di max, assegna y a max

if(z>max)  { max = z;   }  //se z è maggiore di max, assegna z a max

return max;
  }

Per oggi è tutto. Se avete domande non esitate a contattarci.
Alla prossima!!

Please follow and like us: