1 Fondamenti di Informatica
© 2001 Pier Luca Montessoro, Davide Pierattoni
(si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 1
FONDAMENTI DI INFORMATICA
Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI
Facoltà di Ingegneria Università degli Studi di Udine
Linguaggio C Le funzioni
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 2 Questo insieme d i trasparenze ( detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi inclusi , ma non limitatamente, ogni immagine, fotografia, animazione , video, audio, musica e testo) sono d i proprietà degli autori prof . Pier Luca Montessoro e Ing. Davide Pierattoni, Università degli Studi di Udine.
Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca , scolastici ed universitari afferenti a l Ministero della Pubblica Istruzione e al Ministero dell’Università e Ricerca Scientifica e Tecnologica , per scopi istituzionali, non a fine di lucro . In tal caso non è richiesta alcuna autorizzazione .
Ogni altro utilizzo o riproduzione (ivi incluse , ma non limitatamente, le riproduzioni su supporti magnetici , su reti d i calcolatori e stampe) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori.
L’informazione contenuta in queste slide è ritenuta essere accurata alla data della pubblicazione . Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti d i impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. Gli autori non assumono alcuna responsabilità per il contenuto d i queste slide (ivi incluse, ma non limitatamente , la correttezza, completezza, applicabilità, aggiornamento dell’informazione ).
In ogni caso non può essere dichiarata conformità all’informazione contenuta in queste slide.
In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono mai essere rimossi e devono essere riportati anche in utilizzi parziali.
Nota di Copyright
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 3
Le funzioni dal punto di vista della programmazione top-down
-Permettono di rendere trasparente al resto del programma i dettagli implementativi che non è necessario condividere ê MODULARITA’
-Se ben strutturate, permettono di riutilizzare del codice già scritto per altri programmi ê RIUTILIZZABILITA’ e COLLAUDABILITA’
-Lo standard ANSI ha introdotto importanti modifiche nella sintassi per la dichiarazione delle funzioni, aspetto che consente un maggior controllo degli errori ê CHIAREZZA e LEGGIBILITA’ del codice
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 4
Esempio
• Coefficiente binomiale:
• Il fattoriale va calcolato tre volte: con le funzioni è possibile scrivere il codice un’unica volta
)!
(
!
! k n k
n k
n
= −
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 5
main
int main() {
int n, k;
printf ("n = "); scanf ("%d", &n);
printf ("k = "); scanf ("%d", &k);
if ((n < k) || (k < 0))
printf ("dati non validi\n");
else
printf ("n su k = % lf\n",
coefficiente_binomiale (n, k));
return EXIT_SUCCESS;
}
chiamata della funzione coefficiente_binomiale
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 6
coefficiente_binomiale
double coefficiente_binomiale (int n, int k) {
return fattoriale (n) /
(double) (fattoriale (k) * fattoriale (n-k));
}
lista di argomenti tipo di
ritorno
istruzione
di ritorno
2 Fondamenti di Informatica
© 2001 Pier Luca Montessoro, Davide Pierattoni
(si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 7
fattoriale
int fattoriale (int n) {
int fatt = 1;
while (n > 1) fatt *= n--;
return fatt;
}
lista di argomenti tipo di
ritorno
istruzione di ritorno
variabili locali
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 8
Il programma completo
#include <stdio.h>
#include <stdlib.h>
double coefficiente_binomiale (int n, int k);
int fattoriale (int n);
main() { ...
}
double coefficiente_binomiale (int n, int k) {
...
}
int fattoriale (int n) {
...
}
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 9
Definizione delle funzioni
• Ogni definizione di funzione ha la forma:
tipo_ritornato nome_funzione(dichiarazione_argomenti) {
dichiarazioni ed istruzioni }
• Alcune parti possono essere omesse
• Forma minima:
dummy() {}
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 10
Ritorno di valori
• Se il tipo ritornato è omesso, viene assunto int
• L'istruzione per ritornare il valore in uscita al chiamante è return:
return espressione;
• Se necessario, l'espressione viene convertita nel tipo di ritorno della funzione
• L'espressione può essere omessa, e in tal caso il tipo della funzione (che non ritorna alcun valore) dovrebbe essere void
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 11
Chiamata a una funzione
• Se la funzione ritorna un valore:
variabile = funz_1(argomenti);
In tale caso è anche possibile invocarla come argomento all’interno di un’altra funzione:
... funz_2(..., funz_1(argomenti), ...);
• Altrimenti:
nome (argomenti);
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 12
Chiamata a una funzione
• Ogni funzione definita dall’utente deve essere nota al compilatore
• Per poter utilizzare una funzione, sono necessari:
– la dichiarazione del prototipo – il codice sorgente della funzione
#include < stdio.h>
int somma (int, int );
int main() {
… }
int somma (int a, int b) {
return (a + b);
}
La dichiarazione del prototipo va scritta all’inizio del file sorgente, prima della funzione main
E’ buona consuetudine scrivere il
codice sorgente di tutte le funzioni
dopo la funzione main
3 Fondamenti di Informatica
© 2001 Pier Luca Montessoro, Davide Pierattoni
(si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 13
Prototipo di una funzione
• Il prototipo di una funzione corrisponde alla prima riga del suo codice sorgente, con l’aggiunta del ;
• Serve come riferimento per il compilatore durante l’analisi del file sorgente
• Deve contenere il nome della funzione, il tipo ritornato, il numero e il tipo dei parametri
• Se la funzione è ad esempio:
int fattoriale (int n) {
<codice sorgente della funzione>
}
il suo prototipo sarà...
int fattoriale ( int );
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 14
float my_f(float data) {
float tmp;
...
return tmp;
}
Variabili locali
Una funzione può contenere dichiarazioni di variabili locali, come qualsiasi blocco del C. Per tali variabili viene allocata memoria al momento della chiamata della funzione, e deallocata al suo termine.
alloca la memoria
copia il valore nel registro di ritorno e rilascia la memoria
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 15
Le dichiarazioni di funzioni possono essere annidate?
NO! In C, a differenza del Pascal, tutte le funzioni sono allo stesso livello, e sono accessibili a tutto il codice presente nello stesso file sorgente o in altri file (a patto che non siano state dichiarate static).
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 16
Esempio
Pascal
function sort ...
...
function compare ...
...
begin {* sort *}
...
if compare ...
...
C
void sort ...
{ ...
if (compare ... ) ...
}
int compare ...
{ ...
}
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 17
Funzioni e variabili static
• Come le variabili esterne, anche le funzioni dichiarate static sono visibili alle sole funzioni presenti nei rispettivi file sorgente
• Simili funzioni si ottengono anteponendo a una normale dichiarazione la parola chiave static :
static tipo_ritornato nome_funz(argomenti)
• Una variabile interna dichiarata static conserva il proprio valore anche fra due chiamate successive alla stessa funzione cui appartiene í non viene deallocata!
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 18
Ricorsione
• Una funzione può richiamare se stessa, oppure un’altra che a sua volta la chiama.
int f (int k) {
...
n = f (m);
...
}
4 Fondamenti di Informatica
© 2001 Pier Luca Montessoro, Davide Pierattoni
(si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 19
Ricorsione
• Esempio: fattoriale
−
= =
altrimenti n
n
n n se
)!
1 (
0
! 1
Fondamenti di Informatica - Linguaggio C - Le funzioni
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere la nota di copyright a pag.2) 20