• Non ci sono risultati.

Università degli Studi di Udine

N/A
N/A
Protected

Academic year: 2021

Condividi "Università degli Studi di Udine"

Copied!
20
0
0

Testo completo

(1)

FONDAMENTI DI INFORMATICA

Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI

Facoltà di Ingegneria

Università degli Studi di Udine

Linguaggio C

Le funzioni

(2)

Questo insieme di 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 di 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 al 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 di 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 di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. Gli autori non assumono alcuna responsabilità per il contenuto di 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

(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

(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

= −

 

 

(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

(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

(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

(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) {

...

}

(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 () {}

(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

(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);

(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

(13)

• 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 );

(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

(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).

(16)

Esempio

Pascal

function sort ...

...

function compare ...

...

begin {* sort *}

...

if compare ...

...

C

void sort ...

{

...

if (compare ... ) ...

}

int compare ...

{

...

}

(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!

(18)

Ricorsione

• Una funzione può richiamare se stessa, oppure un’altra che a sua volta la

chiama.

int f (int k) {

...

n = f (m);

...

}

(19)

Ricorsione

• Esempio: fattoriale

 

= =

altrimenti n

n

n n se

)!

1 (

0

! 1

(20)

Ricorsione

• Esempio: fattoriale

int fattoriale (int n) {

if (n <= 0) {

return 1;

}

else {

return n * fattoriale (n-1);

}

}

Riferimenti

Documenti correlati

Questi esempi non esauriscono la classe delle funzioni integrabili: esistono anche funzioni integrabili discontinue in un insieme infinito di punti..

Supponiamo di essere arrivati a un certo passo della costruzione e di saper costruire tutti i punti del piano che hanno coordinate appartenenti a un certo campo di numeri F..

2 E che, a sua volta, costituisce il cuore pulsante di una concezione (che Brigaglia chiama) pragmatica del potere, che si ritroverebbe, appunto, solo nelle opere anni ’80:

L’uomo e lo scrittore, allora, sono diventati un pretesto per allargare lo sfondo e cercare di rendere più comprensibile un paese passato attraverso le grandi

Per fortuna l’informatore decide di aiutare ancora l’ispettore fornendogli indizi proprio attraverso il computer. Il numero

Finalmente arrivano informazioni sul complice della Signora Violet, l’abilissima ladra arrestata da Numerik.. Gli indizi sono contenuti in una busta chiusa: l’ispettore Numerik la

■ Quindi il vero argomento della prima funzione non é la seconda funzione, ma un normale valore, che può avere qualsiasi origine (variabile, espressione ecc...), e in particolare

Dunque tutti i concetti definiti per uno spazio vettoriale qualsiasi si possono dare anche per questo spazio vettoriale, cos`ı si potr` a parlare di combinazioni lineari di funzioni,