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