* * Vediamo di prendere confidenza con le funzioni. * Riassumiamo intanto il formato: * * TipoRitorno NomeFunzione(Lista tipo+nome argomenti in entrata) * { * corpo della funzione * } * * Ad esempio: * * int somma(int a,int b) * Funzione che restituisce un valore INT * * * ed ha 2 parametri in entrata sempre INT * * { * return(a+b); * } * * Ora vediamo una funzione che non ha parametri in entrata ne' in uscita: * * void acapo(void) * { * printf("\n"); * } * * Una che ha solo un parametro in entrata: * * void stampanumero(int a) * { * printf("%d",a); * } * * Ed una che ha solo un parametro in uscita (ossia lo restituisce): * * int prendinumero(void) * { * int a; * Mi serve una variabile locale...* * scanf("%d",&a); * return(a) * } * * Naturalmente queste funzioni sono cosi' semplici che anziche' aiutare, * forse complicano il programma, ma chiariscono come funziona il passaggio * di parametri ad una funzione, e l'eventuale ritorno di valori. * La cosa da ricordarsi e' che la prima dichiarazione di tipo che facciamo, * prima del nome della funzione, si riferisce al valore restituito dalla * funzione stessa (con l'instruzione RETURN), per cui abbiamo: * * void nomefunzione -> funzione che non restituisce niente * int nomefunzione -> funzione che restituisce un valore INT * float nomefunzione -> funzione che restituisce un valore FLOAT * * In pratica definiamo il "tipo di ritorno-restituzione". * Invece le variabili che mettiamo nella lista degli argomenti, dentro le * parentesi (), sono i parametri che saranno passati ALLA funzione, in * entrata. * Quando la funzione non restituisce alcun valore, si puo' omettere il * return, che andrebbe messo senza valori: * * { * ... * return; * Si puo' omettere se non si restituisce nulla * * } * * Si possono mettere anche piu' return, all'interno di una funzione, e fare * in modo (tramite if-else o simili) che si esca a causa di un return o * di un'altro, per restituire valori diversi o uscire al momento giusto. * Altra cosa da notare e' che all'interno di una funzione si possono * anche definire delle variabili LOCALI, ossia utilizzabili solo all'interno * della funzione, come abbiamo visto in "prendinumero()". Altro esempio: * * int somma(int a,int b) * Funzione che restituisce un valore INT * * { * ed ha 2 parametri in entrata sempre INT * * int risultato; * Definisco una variabile locale * * risultato=a+b; * return(risultato); * } * * Abbiamo un po' complicato la nostra funzione di somma, usando una * variabile per il risultato, che pero' non e' indispensabile. * Vediamo quindi il listato precedente spezzettato in molte funzioni: */ #include <stdio.h> /* Includiamo la libreria standard */ /* Forniamo una dichiarazione anticipata (prototipo) delle nostre funzioni */ int somma(int,int); /* Entrata: 2 int, ritorno: 1 int */ void acapo(void); /* Entrata: niente, ritorno: niente */ void stampanumero(int); /* Entrata: 1 int, ritorno: niente */ int prendinumero(void); /* Entrata: niente, ritorno: 1 int */ /* Funzione principale e inizio del programma */ int main(void) /* Funzione principale, eseguita per prima */ { /* Inizio della funzione main() */ int pippo,pluto,papero; /* Definiamo 3 variabili intere */ acapo(); /* Chiamo acapo() */ printf("Dammi un numero: "); pippo = prendinumero(); /* Chiamo prendinumero() */ acapo(); /* Chiamo acapo() */ printf("Dammi un'altro numero: "); pluto = prendinumero(); /* Chiamo prendinumero() */ papero = somma(pippo,pluto); /* Chiamo somma() */ acapo(); /* Chiamo acapo() */ printf("La somma dei due e'"); acapo(); /* Chiamo acapo() */ stampanumero(papero); /* Chiamo stampanumero() */ return(0); /* la funzione main restituisce uno 0 intero */ } /* Fine della funzione main() */ /* Ora definiamo una funzione chiamata somma(), che in entrata richiede 2 * variabili di tipo intero, e in uscita restituisce un numero intero, somma * dei 2 in entrata. */ int somma(int a,int b) { printf("Sto calcolando la somma... com'e' difficile!!!"); return(a+b); } /* Una funzione che non ha parametri in entrata e non restituisce niente */ void acapo(void) { printf("\n"); } /* Una funzione che ha solo un parametro in entrata */ void stampanumero(int a) { printf("%d",a); } /* Una funzione che ha un parametro in uscita (ossia lo restituisce): */ int prendinumero(void) { int a; /* Mi serve una variabile locale...*/ scanf("%d",&a); return(a); } /* Usare le funzioni in un programma cosi' corto e' controproducente, ma * piu' il programma diventa grande e piu' le funzioni divengono utili. */