Procedure e funzioni nei
linguaggi di alto livello
Lab Programmazione - turno 1
2005/2006
Procedura
• Costrutto sintattico presente in quasi tutti i LdP di alto livello che
consente di raggruppare un blocco di istruzioni (che
implementano un algoritmo) in maniera che possano essere
richiamate in qualunque punto di un programma attraverso un
nome
• Oltre al nome, una procedura è caratterizzata dall’avere zero o
più variabili di input (contenenti i dati su cui opera la procedura)
detti parametri
• I parametri usati nella definizione di una procedura sono detti
formali (essi rappresentano dei dati generici)
• I parametri formali vengono associati a valori effettivi (detti
parametri attuali) al momento di una chiamata alla procedura
AA
2005/06
2
Lab Programmazione
L. Capra
Parametri
• I parametri formali di una procedura, come ogni altra variabile di
un programma, devono essere dichiarati di un certo tipo
• Il numero ed il tipo dei parametri formali varia da procedura a
procedura
• Quando si richiama una procedura occorre che vi sia una
corrispondenza in numero, tipo e ordine di apparizione tra i
parametri attuali e quelli formali (associazione di tipo
posizionale)
• Es. se la procedura A è stata definita con due parametri formali, di
cui il primo di tipo intero ed il secondo di tipo stringa, allora
A(2,”due”) è un esempio di chiamata corretta, mentre A(“due”,2)
è un esempio di chiamata scorretta
AA
2005/06
3
Lab Programmazione
L. Capra
Parametri (2)
• I parametri attuali usati nella chiamata ad una procedura,
possono essere a loro volta delle variabili, o più in generale
delle espressioni (compatibili per tipo rispetto ai corrispondenti
parametri formali)
• Es.
A( x + y * 3 , ”sommaprodotto”)
• L’espressione usata come parametro attuale viene prima
valutata, quindi il valore risultante viene assegnato al parametro
formale corrispondente
• Le variabili usate come parametri attuali possono essere
modificate o meno dall’esecuzione della procedura (nel primo
caso si parla di side-effect, o parametri di I/O)
• Tale aspetto è molto importante, e dipende dalle modalità di
passaggio dei parametri, che possono essere diverse a
seconda dei linguaggi
AA
2005/06
4
Lab Programmazione
L. Capra
Funzioni
• Una funzione è una procedura che restituisce un
valore di tipo fissato come risultato di un calcolo
• Tale valore è reso disponibile alla istruzione
contenente la chiamata alla funzione (ambiente
chiamante)
• Quindi una (chiamata a funzione) può comparire
all’interno di qualsiasi espressione
• Es. supponendo che A ritorni un intero:
x = w - A(x*x,”dueallax”) + 3
AA
2005/06
5
Lab Programmazione
L. Capra
Una funzione che calcola xy
FUN eleva PAR x: INT ,y: INT  INT
VAR r: INT ENDVAR
IF y < 0 or (x == 0 and y ==0)
THEN
ABORT 1
ELSE
r=1
WHILE y > 0 DO
r=r*x
y = y – 1;
REPEAT
return r
ENDIF
ENDFUN
AA
2005/06
6
Lab Programmazione
L. Capra
Descrizione
FUN eleva PAR x: INT ,y: INT  INT
VAR r: INT ENDVAR
Parametri formali
tipo rientro
IF y < 0 or (x == 0 and y ==0)
THEN
ABORT 1
ELSE
r=1
WHILE y > 0 DO
r=r*x
y = y – 1;
REPEAT
return r
ENDIF
ENDFUN
AA
2005/06
7
Lab Programmazione
L. Capra
Descrizione
FUN eleva PAR x: INT ,y: INT  INT
VAR r: INT ENDVAR
Var. locali
AA
2005/06
Parametri formali
tipo rientro
IF y < 0 or (x == 0 and y ==0)
THEN
ABORT 1
ELSE
r=1
WHILE y > 0 DO
r=r*x
y = y – 1;
REPEAT
return r
ENDIF
ENDFUN
8
Lab Programmazione
L. Capra
Descrizione
FUN eleva PAR x: INT ,y: INT  INT
VAR r: INT ENDVAR
Var. locali
AA
2005/06
Parametri formali
tipo rientro
IF y < 0 or (x == 0 and y ==0)
THEN
ABORT 1
ELSE
r=1
WHILE y > 0 DO
r=r*x
y = y – 1;
REPEAT
return r
ENDIF
ENDFUN
9
istruzione rientro anomalo
istruzione rientro
Lab Programmazione
L. Capra
Esercizio: conversione da base 2
• Input : stringa di bit
• Es
“1001101”
• Output: valore intero corrispondente (base 10) : 77
77 = 1 · 26 + 1 · 23 + 1 · 22 +1 · 20
• Assunzione: esistono due funzioni predefinite stringlength e
getchar per calcolare la lunghezza di una stringa data, e
conoscere il carattere in una posizione data
• Suggerimento: usare la funzione eleva
AA
2005/06
10
Lab Programmazione
L. Capra
funzione di conversione
FUN convertFrom2to10 PAR bits: STRING  INT
VAR res, i, nb: INT; c CHAR ENDVAR
nb = stringlength (bits)
IF nb == 0 THEN
return -1 %codice di errore%
ELSE
AA
return res
ENDIF
ENDFUN
2005/06
11
Lab Programmazione
L. Capra
funzione di conversione
FUN convertFrom2to10 PAR bits: STRING  INT
VAR res, i, nb: INT; c CHAR ENDVAR
nb = stringlength (bits)
IF nb == 0 THEN
return -1 %codice di errore%
ELSE
res = 0
i=0
DO
i=i+1
AA
WHILE i < nb
return res
ENDIF
ENDFUN
2005/06
12
Lab Programmazione
L. Capra
funzione di conversione
FUN convertFrom2to10 PAR bits: STRING  INT
VAR res, i, nb: INT; c CHAR ENDVAR
nb = stringlength (bits)
IF nb == 0 THEN
return -1 %codice di errore%
ELSE
res = 0
i=0
DO
c= getchar(bits,i)
IF c =/= '1' and c =/= '0‘ THEN
return –2 %codice di errore%
ELSE
i=i+1
AA
ENDIF
WHILE i < nb
return res
ENDIF
ENDFUN
2005/06
13
Lab Programmazione
L. Capra
funzione di conversione
FUN convertFrom2to10 PAR bits: STRING  INT
AA
VAR res, i, nb: INT; c CHAR ENDVAR
nb = stringlength (bits)
IF nb == 0 THEN
return –1 %codice di errore%
ELSE
res = 0
i=0
DO
c= getchar(bits,i)
IF c =/= '1' and c =/= '0‘ THEN
return –2 %codice di errore%
ELSE
IF c == '1‘ THEN
res = res + eleva(2 , nb - i -1)
ENDIF
i=i+1
ENDIF
WHILE i < nb
return res
ENDIF
14
ENDFUN
2005/06
Lab Programmazione
L. Capra
Esercizio: conversione da base 10
in base 2
• Input : numero intero
• Es:
20
• Output: stringa binaria corrispondente
• Es. :
• Algoritmo:
“10100“
20
10
5
2
1
2
2
2
2
2
0
resti
0
1
0
1
10100
• Assunzione: l’operatore + può essere anche usato per
concatenare stringhe
AA
2005/06
15
Lab Programmazione
L. Capra
Conversione inversa
FUN convertFrom10to2 PAR num: INT  STRING
VAR c CHAR; res: STRING ENDVAR
res = “”
%stringa vuota%
IF num < 0 THEN
return res
%codice di errore%
ELSE
IF num == 0 THEN
return ‘“0”
ELSE
return res
ENDIF
ENDIF
ENDFUN
AA
2005/06
16
Lab Programmazione
L. Capra
Conversione inversa
FUN convertFrom10to2 PAR num: INT  STRING
VAR c CHAR; res: STRING ENDVAR
res = “”
%stringa vuota%
IF num < 0 THEN
return res
%codice di errore%
ELSE
IF num == 0 THEN
return ‘“0”
ELSE
DO
num = num / 2
WHILE num =/= 0
return res
ENDIF
ENDIF
ENDFUN
AA
2005/06
%divisione intera%
17
Lab Programmazione
L. Capra
Conversione inversa
FUN convertFrom10to2 PAR num: INT  STRING
VAR c CHAR; res: STRING ENDVAR
res = “”
%stringa vuota%
IF num < 0 THEN
return res
%codice di errore%
ELSE
IF num == 0 THEN
return ‘“0”
ELSE
DO
IF (num mod 2) == 0 THEN
c = ‘0’
%resto zero%
ELSE
c = ‘1’
ENDIF
res = c + res
%appende c a sinistra di res%
num = num / 2
%divisione intera%
WHILE num =/= 0
return res
ENDIF
ENDIF
ENDFUN
AA
2005/06
18
Lab Programmazione
L. Capra
Scarica

return