Sei sulla pagina 1di 35

FUNZIONI E

PROCEDUREE
Teresa Mallardo

CARATTERISTICHE
Nome

DELLE VARIABILI

(1/2)

es. x, pippo, ecc.

Tipo

es. int, char, float, ecc.

Dimensione Indirizzo

la loro posizione in memoria

Valore

il contenuto della cella di memoria


2

CARATTERISTICHE

DELLE VARIABILI

(1/2)

Dimensione di una cella 1 byte (8 bit)


0x40000000 0x40000001

int i = 5;

0x40000002 0x40000003 0x40000004 0x40000005 0x40000006 0x40000007

Nome: Tipo: Dimensione: Indirizzo: Valore:

i int 16 bit 0x40000003 5

Perch si usano i sottoprogrammi?

SOTTOPROGRAMMI

Un sottoprogramma permette di dare un nome a una parte di programma, rendendola parametrica


Funzioni e procedure

ESEMPIO DI PROGRAMMA SENZA


SOTTOPROGRAMMI
#include <stdio.h>

#define dim 10
main(){ int V[dim], i,j, max, tmp; /* lettura dei dati */ for (i=0; i<dim; i++) { printf("valore n. %d: ",i); scanf("%d", &V[i]); } /* ordinamento */ for(i=dim-1; i>1; i--) { max=i; for( j=0; j<i; j++) if (V[j]>V[max]) max=j; if (max!=i) /* scambio */ { tmp=V[i]; V[i]=V[max]; V[max]=tmp; } } /* stampa */ for (i=0; i<dim; i++) printf("\n%d", V[i]); }

Limiti di questa soluzione


difficile leggibilit funziona solo con vettori di 10 elementi non riutilizzabile

Soluzione

si pu assegnare un nome ad ogni parte del programma, racchiudendone le istruzioni che la definiscono all'interno di un componente software riutilizzabile

il sottoprogramma

ESEMPIO DI PROGRAMMA CON


SOTTOPROGRAMMI
#include <stdio.h> #define dim 10 int V[dim]; // var. globale int main() { /* lettura dei dati */ leggi(); /* ordinamento */ ordina(); /* stampa */ stampa(); }

leggi, ordina e stampa

sono nomi di sottoprogrammi, ognuno dei quali rappresenta una parte del programma (nella prima versione)

Vantaggi di questa soluzione


Leggibilit Sintesi Riusabilit

RIUSABILIT
Mediante i sottoprogrammi possibile eseguire pi volte lo stesso insieme di operazioni senza doverlo riscrivere Esempio: ordinamento di due vettori

#include <stdio.h> #define dim 10 #define dim2 25 main() { int V1[dim], V2[dim2]; leggi(V1, dim); leggi(V2, dim2); ordina(V1, dim); ordina(V2, dim2); stampa(V1,dim); stampa(V2, dim2); }

SOTTOPROGRAMMI: FUNZIONI E
PROCEDURE

Un sottoprogramma una nuova istruzione, o un nuovo operatore definito dal programmatore per sintetizzare una sequenza di istruzioni In particolare:

procedura: un sottoprogramma che rappresenta unistruzione non primitiva funzione: un sottoprogramma che rappresenta un operatore non primitivo

Tutti i linguaggi di alto livello offrono la possibilit di definire funzioni e/o procedure

Il linguaggio C realizza solo il concetto di funzione


9

FUNZIONI

Una funzione cattura lidea matematica di funzione


molti possibili ingressi (che non vengono modificati) una sola uscita (il risultato) riceve dati di ingresso attraverso i parametri esegue una espressione, la cui valutazione fornisce un risultato denota un valore in corrispondenza al suo nome

Una funzione

10

Come fa la funzione a restituire il risultato?

11

RISULTATO DI UNA FUNZIONE: RETURN

Listruzione return <espressione> provoca la terminazione dellattivazione della funzione e la restituzione del controllo al chiamante unitamente al valore dellespressione che la segue Eventuali istruzioni successive alla return non saranno mai eseguite Esempio: int max() { int x, y, max; scanf(%d, &x); scanf(%d, &y); if (x > y) max = x; else max = y; return max; printf(ciao!); /* mai eseguita! */ }

12

E le procedure?

13

PROCEDURE IN C

possibile costruire delle particolari funzioni che non restituiscono alcun valore:
void proc () { ... }

la definizione di una funzione proc che non restituisce alcun valore NB: void un identificatore di tipo per classificare dati il cui dominio linsieme vuoto

14

OSSERVAZIONI SUL VALORE DI RITORNO


VOID
La chiamata di proc non produce alcun risultato Dallinterno del corpo della funzione proc non verr restituito alcun risultato Il corpo potr contenere o meno listruzione return

15

ESEMPIO

Calcolare e visualizzare il perimetro di un triangolo rettangolo, dati in input i suoi cateti


INIZIO RICHIEDI A

INIZIO

LEGGI A

INS_DATI
RICHIEDI B LEGGI B

CALCOLA_PERIM
P = A + B + IPOT
VISUALIZZA P FINE

STAMPA

16
FINE

ESEMPIO
INS_DATI CALCOLA_PERIM STAMPA

INIZIO

INIZIO

INIZIO

RICHIEDI A
VISUALIZZA P LEGGI A P = A + B + IPOT RICHIEDI B FINE LEGGI B FINE

FINE

17

E i parametri cosa sono?

18

PARAMETRI

La comunicazione tra funzioni avviene mediante i parametri


di ingresso (o di input) di uscita (o di output)

Parametri formali
sono specificati nellinterfaccia della funzione indicano cosa la funzione si aspetta quando viene chiamata

Parametri effettivi (o attuali)


sono trasmessi allatto della chiamata della funzione devono corrispondere ai parametri formali in numero, posizione e tipo

19

PASSAGGIO DEI PARAMETRI

possibile passare dei parametri a una funzione in due modi diversi


per valore c = somma (a, b); per indirizzo leggi (&a);

20

PASSAGGIO PER VALORE


int somma(int a, int b) { int c; c = a+b; return c; } void main() { int a, b, c; a = 3; b = 2; c = somma(a,b); printf (%d + %d = %d\n,a,b,c); } a b
0x40000000

0x40000002
0x40000004 0x40000006 0x40000008 0x4000000A 0x4000000C 0x4000000E

21

PASSAGGIO PER VALORE


int somma(int a, int b) { int c; c = a+b; return c; } void main() { int a, b, c; a = 3; b = 2; c = somma(a,b); printf (%d + %d = %d\n,a,b,c); } a b

3
2

0x40000000

0x40000002
0x40000004 0x40000006 0x40000008 0x4000000A 0x4000000C 0x4000000E

22

PASSAGGIO PER VALORE


int somma(int a, int b) { int c; c = a+b; return c; } a b

3
2

0x40000000

0x40000002
0x40000004

c
somma_a somma_b 3 2

0x40000006 0x40000008 0x4000000A 0x4000000C 0x4000000E

void main() { int a, b, c; a = 3; b = 2; c = somma(a,b); printf (%d + %d = %d\n,a,b,c); }

23

PASSAGGIO PER VALORE


int somma(int a, int b) { int c; c = a+b; return c; } void main() { a b

3
2

0x40000000

0x40000002
0x40000004

c
somma_a somma_b 3 2

0x40000006 0x40000008 0x4000000A 0x4000000C 0x4000000E

somma_c int a, b, c; a = 3; b = 2; c = somma(a,b); printf (%d + %d = %d\n,a,b,c); }

24

PASSAGGIO PER VALORE


int somma(int a, int b) { int c; c = a+b; return c; } a b

3
2

0x40000000

0x40000002
0x40000004

c
somma_a somma_b 3 2 5

0x40000006 0x40000008 0x4000000A 0x4000000C 0x4000000E

void main() { somma_c int a, b, c; a = 3; b = 2; c = somma(a,b); printf (%d + %d = %d\n,a,b,c); }

25

PASSAGGIO PER VALORE


int somma(int a, int b) { int c; c = a+b; return c; } void main() { int a, b, c; a b

3
2 5 3 2 5

0x40000000

0x40000002
0x40000004 0x40000006 0x40000008 0x4000000A 0x4000000C 0x4000000E

c
somma_a somma_b somma_c

a = 3; b = 2; c = somma(a,b); printf (%d + %d = %d\n,a,b,c); }

26

PASSAGGIO PER INDIRIZZO


int somma(int *a, int *b) { int c; c = *a+*b; return c; } void main() { int a, b, c; a = 3; b = 2; c = somma(&a,&b); printf (%d + %d = %d\n,a,b,c); } a b
0x40000000

0x40000002
0x40000004 0x40000006 0x40000008 0x4000000A 0x4000000C 0x4000000E

27

PASSAGGIO PER INDIRIZZO


int somma(int *a, int *b) { int c; c = *a+*b; return c; a b

3
2

0x40000000

0x40000002
0x40000004 0x40000006 0x40000008 0x4000000A 0x4000000C 0x4000000E

}
void main() { int a, b, c; a = 3; b = 2; c = somma(&a,&b); printf (%d + %d = %d\n,a,b,c); }

28

PASSAGGIO PER INDIRIZZO


int somma(int *a, int *b) { a int c; b c = *a+*b; c return c; } somma_a void main() { int a, b, c; somma_b

3
2

0x40000000

0x40000002
0x40000004

0x40000000

0x40000006 0x40000008 0x4000000A 0x4000000C 0x4000000E

0x40000002

a = 3; b = 2; c = somma(&a,&b); printf (%d + %d = %d\n,a,b,c);


}

29

PASSAGGIO PER INDIRIZZO


int somma(int *a, int *b) { a int c; b c = *a+*b; c return c; } somma_a void main() { int a, b, c; somma_b

3
2

0x40000000

0x40000002
0x40000004

0x40000000

0x40000006 0x40000008 0x4000000A 0x4000000C 0x4000000E

0x40000002

somma_c a = 3; b = 2; c = somma(&a,&b); printf (%d + %d = %d\n,a,b,c);

30

PASSAGGIO PER INDIRIZZO


int somma(int *a, int *b) { a int c; b c = *a+*b; c return c; } somma_a void main() { int a, b, c; somma_b

3
2

0x40000000

0x40000002
0x40000004

0x40000000

0x40000006 0x40000008 0x4000000A 0x4000000C 0x4000000E

0x40000002

somma_c a = 3; b = 2; c = somma(&a,&b); printf (%d + %d = %d\n,a,b,c);

31

PASSAGGIO PER INDIRIZZO


int somma(int *a, int *b) { a int c; b c = *a+*b; c return c; } somma_a void main() { int a, b, c; somma_b

3
2 5
0x40000000

0x40000000

0x40000002
0x40000004 0x40000006 0x40000008 0x4000000A 0x4000000C 0x4000000E

0x40000002

somma_c a = 3; b = 2; c = somma(&a,&b); printf (%d + %d = %d\n,a,b,c);

32

PROTOTIPI DI FUNZIONE (1/2)

Indicano al compilatore
il tipo di dato restituito dalla funzione il numero dei parametri che si aspetta di ricevere il tipo dei parametri lordine in cui i parametri sono attesi

Il compilatore utilizza i prototipi per convalidare le chiamate di funzione

33

PROTOTIPI DI FUNZIONE (2/2)


int somma(int a, int b); /*prototipo della funzione*/ void main() { int a, b, c; a = 3; b = 2; c = somma(a,b); printf (%d + %d = %d\n,a,b,c); } int somma(int a, int b) { int c; c = a+b; return c; }
34

RIFERIMENTI
H.M. Deitel, P.J. Deitel. C: Corso completo di programmazione, 2 ed., 2004, Apogeo A. Kelley, I. Pohl. C: Didattica e Programmazione, Pearson Education Italia, 2004 A. Bellini, A. Guidi. Linguaggio C: Guida alla programmazione, 2 ed., McGraw Hill, 2003 Alcuni esempi trovati sul web

35