Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoRinaldo Franco Modificato 10 anni fa
1
Esempi di riuso del codice nei linguaggi di alto livello Lab Programmazione - turno 1 2005/2006
2
AA 2005/06 Lab Programmazione L. Capra 2 Conversione da base X a base 10 Input : stringa di digit Es (base 16) 12B Output: valore intero corrispondente (base 10) : 299 299 = 1 · 16 2 + 2 · 16 1 + 11 · 16 0 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è)
3
AA 2005/06 Lab Programmazione L. Capra 3 Conversione da base X a base 10 Generalizziamo lalgoritmo 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
4
AA 2005/06 Lab Programmazione L. Capra 4 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)
5
AA 2005/06 Lab Programmazione L. Capra 5 Conversione da base X a base 10 Idea: rappresentare linsieme 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.indexOf(simboli, A) 10
6
AA 2005/06 Lab Programmazione L. Capra 6 Punto di partenza: conversione da base 2 a base 10 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 IF c == '1 THEN res = res + eleva(2, nb - i -1) ENDIF i = i + 1 ENDIF WHILE i < nb return res ENDIF ENDFUN
7
AA 2005/06 Lab Programmazione L. Capra 7 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 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
8
AA 2005/06 Lab Programmazione L. Capra 8 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 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 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
9
AA 2005/06 Lab Programmazione L. Capra 9 Conversione da base 10 in base X Input : numero intero Es: 299 Output: stringa di digit corrispondente Es. (base 16) :12B Algoritmo: 299 16 18 16 1 16 12B B (11) 2 1 resti
10
AA 2005/06 Lab Programmazione L. Capra 10 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 ENDFUN
11
AA 2005/06 Lab Programmazione L. Capra 11 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
12
AA 2005/06 Lab Programmazione L. Capra 12 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 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
13
AA 2005/06 Lab Programmazione L. Capra 13 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
14
AA 2005/06 Lab Programmazione L. Capra 14 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
15
AA 2005/06 Lab Programmazione L. Capra 15 Ancora più compatto… FUN convertFrombXTobY PAR num_bX: STRING, bX INT, bY INT STRING return convertFrom10toX (convertFromXto10 (num_bX, bX ), bY) ENDFUN
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.