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