Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Astrazione Funzionale
mnappi@unisa.it
biplab.unisa.it
biplab unisa it
089-963334
Divide et impera
– Divide
Di id et impera
i
• Sviluppo facile del programma
– Funzione
– Procedura
• Funzione
– Astrazione della nozione di operatore su un TD primitivo o
definito dall’utente. Può essere attivata durante la
valutazione di una qualsiasi espressione
• Procedura
– Astrazione della nozione di istruzione su un TD primitivo
o definito dall’utente. Una procedura è di fatto
un’istruzione complessa è può essere attivata ovunque può
essere usata un’istruzione
un istruzione
• F i
Funzione e Procedura
P d sono analoghe
l h dal
d l punto
t di vista
i t sintattico
i t tti e per ciò
iò che
h concerne le
l regole
l che
h governano la
l loro
l
valutazione
• Di hi
Dichiarazione
i della
d ll funzione
f i (o
( procedura)
d )
– Il nome
– I parametri formali
– Il corpo, costituito da dichiarazioni locali e da una sequenza
di istruzioni
– Un tipo per il risultato
Ti
Tipo del
d l risultato
i l N
Nome d
della
ll Funzione
F i
Parametri formali
1. int esempio(int i)
2
2. {
3. int k;
4
4. k i+5
k=i+5;
5. return(k%dim);
6. } Corpo della funzione
– All’
All’atto
tt della
d ll dichiarazione
di hi i il binding
bi di associa
i all TD tutte
t tt le
l
informazioni necessarie per il suo utilizzo
– Il ciclo di vita di queste informazioni legate alle variabile
nella dichiarazione è equivalente al tempo di attivazione del
programma (funzione o procedura) in cui compare la
dichiarazione
1.
1 iint esempio(int
i (i i) • Il ciclo d vita di k
l di
2. { inizierà ogni volta che
3. int k; esempio sarà invocato e
terminerà nel momento
4. k=i+5; in cui la funzione
5. return(k%dim); restituisce il valore (step
6. } 5).
)
• I valori che k assume
durante le varie
chiamate sono
indipendenti tra di loro
11/24/2014 Michele Nappi 11
Binding (
(cont.)
t)
• Tutte le occorrenze del nome di un binding sono dette essere nell’ambito del binding
• Il binding di un nome x è visibile in punto del programma se un’occorrenza di x in quel punto ricadrebbe nell’ambito del
binding medesimo
• Nome globale
11. iint esempio(int
i (i i)
– Visibile a tutte le
funzioni (o procedure) 2. {
• Nome locale 3. int k;
– Visibile solo nella 4. k=i+5;
funzione in cui è stato 5. return(k%dim);
dichiarato
6. }
• dim→globale
• i,k→locale
ik l l
• I pparametri attuali
for (x = 1; x <= 10; x++)
printf(“%d “, exp(2, x));
• 2 e x sono parametri attuali
• Un parametro attuale è il valore effettivamente passato alla funzione. Questo valore viene assegnato al
corrispondente
p parametro
p formale all’atto della chiamata della ffunzione
– Nome
Nome-funzione
funzione : qualsiasi identificatore valido
– Tipo-del-valore-restituito: tipo del risultato
• void – la funzione non restituisce nulla
– Lista-parametri : lista separata da virgole, dichiara il tipo e il numero dei parametri
• void
id – la
l funzione
f i non riceve
i nulla
ll
#include <stdio.h>
#include <math.h>
/*prototipi*/
int scegli_opzione(void);
scegli opzione(void);
int leggi_intero(void);
int fattoriale (int);
int stampa_fattoriale(int, int);
/*inizio main*/
int main(void)
{
int opzione,
p , fact,, intero,, temp=1;
p ;
do
{
opzione=scegli_opzione();
switch(opzione){
case 0:
0 temp=0;
t 0 break;
b k
case 1: intero=leggi_intero(); fact=fattoriale(intero); stampa_fattoriale(fact, intero); break;
}
}while(temp);
return 0;
}/*fine main*/
11/24/2014 Michele Nappi 18
Esempio: IL Fattoriale (cont.)
int scegli_opzione(void) #include <stdio.h>
{ /*prototipi*/
/* t ti i*/
int flag; int scegli_opzione(void);
char risposta; int leggi_intero(void);
int fattoriale (int);
do int stampa_fattoriale(int, int);
{ /*inizio main*/
printf("Questo programma calcola il fattoriale di un int main(void)
numero\n"); {
int opzione, fact, intero, temp=1;
printf("Che opzione scegli? (F)Fattoriale or (U)Uscita\n"); do
scanf("%s", &risposta); {
switch (risposta){ opzione=scegli_opzione();
switch(opzione)
case 'F':flag=1; break; {
case 'U':flag=0;
U :flag=0; break; case 0:
0 temp=0;
t 0 break;
b k
default: printf("Hai Sbagliato! Riprova\n"); flag=-1; case 1: intero=leggi_intero();
fact=fattoriale(intero);
break; stampa_fattoriale(fact, intero); break;
} }
}while(temp);
}while(flag==-1); return 0;
return (flag); }/*fine main*/
}
• Visibilità ed allocazione:
• Decomposizione top-down
• Vantaggi
4 = 2+2
6 = 3+3
8 = 3+5
10 = 5+5
12 = 5+7
14 = 7+7
16 = 3+13
........
11/24/2014 Michele Nappi 25
LIVELLO 1 (funzione main)
a) stampare una intestazione
b) per tutti i valori K pari dell’intervallo
specificato stampare una linea del tipo:
K=i+j
con i e j numeri primi (se possibile)
c) se è stato coperto l’intero intervallo
stampare
t “G ldb h ha
“Goldbach h ragione”
i ”
altrimenti stampare “Goldbach si sbaglia”
LIVELLO 2 (stampa
(stampa_linea)
linea)
LIVELLO 2 (stampa_linea)