Esempi di riuso del codice
nei linguaggi di alto livello
Lab Programmazione - turno 1
2005/2006
Conversione da base X a base 10
• Input : stringa di “digit”
• Es (base 16)
“12B”
• Output: valore intero corrispondente (base 10) : 299
299 = 1 · 162 + 2 · 161 + 11 · 160
• Assunzione: oltre alle funzioni predefinite stringlength e
getchar (per calcolare la lunghezza di una stringa, e conoscere
il carattere in una certa posizione di una stringa), indexOf
ritorna la posizione della prima occorrenza di un dato carattere
in una stringa (-1 se non c’è)
AA
2005/06
2
Lab Programmazione
L. Capra
Conversione da base X a base 10
• Generalizziamo l’algoritmo per convertire un
qualunque numero scritto in base x (2 ≤ x ≤ 16) in
base decimale
• Insieme dei simboli
base 2:
‘0’,’1’
base 3:
‘0’,’1’,’2’
…
base 11: ‘0’,…,’9’,’A’
…
base 16: ‘0’,…,’9’,’A’,…,’F’
AA
2005/06
3
Lab Programmazione
L. Capra
Conversione da base X a base 10
• La funzione avrà un nuovo parametro formale (bX)
• Bisogna controllare che i simboli presenti nella
stringa da convertire siano consistenti rispetto alla
base
• (ad es. se la base è 8 solo i simboli ‘0’,..,’7’ potranno
comparire nella stringa)
• Bisogna trovare un modo per associare a ogni
simbolo il corrispondente valore
• (ad es. il valore di ‘A’ è 10, quello di ‘F’ è 15)
AA
2005/06
4
Lab Programmazione
L. Capra
Conversione da base X a base 10
• Idea: rappresentare l’insieme dei simboli (digit) con
una costante di tipo stringa (basi da 2 a 16)
• simboli = “0123456789ABCDEF”
• valore numerico di un digit ≡ posizione carattere
corrispondente in simboli
• usando la funzione indexOf è semplicissimo trovare il valore
numerico di un simbolo
• Es.
AA
2005/06
indexOf(simboli , ‘A’)  10
5
Lab Programmazione
L. Capra
Punto di partenza: conversione da
base 2 a base 10
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
6
ENDFUN
2005/06
Lab Programmazione
L. Capra
Conversione da base x a base 10
FUN convertFromXto10 PAR num_bX : STRING, bX : INT  INT
VAR res , i , nd , val_c: INT; c CHAR ENDVAR
nd = stringlength (num_bX)
IF nd == 0 THEN
return –1
%errore: stringa vuota%
ENDIF
IF bX < 2 or bX > 16 THEN
return –2
%errore: base non nel range%
ENDIF
res = 0
i=0
DO
c= getchar(num_bX , i)
%carattere i-esimo in num_bX%
val_c = valore corrispondente a c
IF val_c non è consistente rispetto a bX THEN
return –3
%errore: simbolo non corretto%
ENDIF
res = res + val_c * eleva(bX , nd - i -1)
i=i+1
WHILE i < nd
return res
ENDFUN
AA
2005/06
7
Lab Programmazione
L. Capra
Conversione da base x a base 10
FUN convertFromXto10 PAR num_bX : STRING, bX : INT  INT
CONST simboli = “0123456789ABCDEF”
VAR res , i , nd , val_c: INT; c CHAR ENDVAR
nd = stringlength (num_bX)
IF nd == 0 THEN
return –1
%errore: stringa vuota%
ENDIF
IF bX < 2 or bX > 16 THEN
return –2
%errore: base non nel range%
ENDIF
res = 0
i=0
DO
c= getchar(num_bX , i)
%carattere i-esimo in num_bX%
val_c = indexOf(simboli , c)
%valore corrispondente%
IF val_c < 0 or val_c > bX -1 THEN
return –3
%errore: simbolo non corretto%
ENDIF
res = res + val_c * eleva(bX , nd - i -1)
i=i+1
WHILE i < nd
return res
ENDFUN
AA
2005/06
8
Lab Programmazione
L. Capra
Conversione da base 10 in base X
• Input : numero intero
• Es:
299
• Output: stringa di digit corrispondente
• Es. (base 16) :
• Algoritmo: 299 16
18 16
1 16
“12B“
B (11)
2
resti
1
“12B”
AA
2005/06
9
Lab Programmazione
L. Capra
Punto di partenza: da base 10 a base 2
FUN convertFrom10to2 PAR num: INT  STRING
VAR c CHAR; res: STRING ENDVAR
res = “”
%stringa vuota%
IF num < 0 or 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
10
Lab Programmazione
L. Capra
Conversione da base 10 a base X
FUN convertFrom10toX PAR num: INT , bX INT  STRING
CONST simboli = “0123456789ABCDEF”
VAR c CHAR; res: STRING ENDVAR
res = “”
%stringa vuota%
IF parametri errati THEN
return “”
%parametri errati%
ENDIF
IF num == 0 THEN
return “0”
ENDIF
DO
c = simbolo corrispondente a (num mod bX)
res = c + res
%appende c a sinistra di res%
num = num / bX
%divisione intera%
WHILE num =/= 0
return res
ENDFUN
AA
2005/06
11
Lab Programmazione
L. Capra
Conversione da base 10 a base X
FUN convertFrom10toX PAR num: INT , bX INT  STRING
CONST simboli = “0123456789ABCDEF”
VAR c CHAR; res: STRING ENDVAR
res = “”
%stringa vuota%
IF num < 0 or bX < 2 or bX > 16 THEN
return “”
%parametri errati%
ENDIF
IF num == 0 THEN
return “0”
ENDIF
DO
c = getchar(simboli , num mod bX)
%car. corrispondente a resto%
res = c + res
%appende c a sinistra di res%
num = num / bX
%divisione intera%
WHILE num =/= 0
return res
ENDFUN
AA
2005/06
12
Lab Programmazione
L. Capra
Conversione da base x a base y
FUN convertFrombXTobY PAR num_bX: STRING , bX
INT, bY INT  STRING
VAR tmp: INT ENDVAR
tmp = convertFromXto10 (num_bX , bX )
IF tmp < 0 THEN
return “”
%parametri errati%
ENDIF
return convertFrom10toX (tmp , bY)
ENDIF
ENDFUN
AA
2005/06
13
Lab Programmazione
L. Capra
Conversione da base x a base y
FUN convertFrombXTobY PAR num_bX: STRING , bX
INT, bY INT  STRING
VAR tmp: INT ENDVAR
tmp = convertFromXto10 (num_bX , bX )
IF tmp < 0 THEN
return “”
%parametri errati%
ENDIF
return convertFrom10toX (tmp , bY)
ENDFUN
AA
2005/06
14
Lab Programmazione
L. Capra
Ancora più compatto…
FUN convertFrombXTobY PAR num_bX: STRING , bX
INT, bY INT  STRING
return convertFrom10toX (convertFromXto10
(num_bX , bX ), bY)
ENDFUN
AA
2005/06
15
Lab Programmazione
L. Capra
Scarica

endif