da tony » 02/11/2003, 18:50
Ciao mica81
Nessuno ti risponde: forse il c++ non è molto popolare da queste parti.
Ebbene, nemmeno io lo conosco, però ti incollo comunque qui sotto una routine in basic, completa di "test bed", che fa quello che chiedi.
Se il tuo problema è semplicemente l'algoritmo di conversione, ti potrà esser utile, altrimenti, ... peccato!
Sono qui per eventuali spiegazioni.
Tony
<pre id=code><font face=courier size=2 id=code>
---- inizio collage -------
' prova conversione: da stringa ascii contenente cifre binarie (es. "101") a Long Int
' linguaggio: PowerBasicConsoleCompiler
OPTION EXPLICIT ' impongo l'esplicita dichiaraz. delle variabili
' prototipi:
DECLARE FUNCTION NonBinario(DatoAscii AS STRING) AS INTEGER
DECLARE FUNCTION Ascii2Long(DatoAscii AS STRING) AS LONG
FUNCTION PBMAIN() AS LONG ' in questo basic il Main si chiama PbMain
DIM DatoAscii AS STRING, Risultato AS LONG, Risp AS STRING
WHILE 1>0 ' loop infinito
print: PRINT "batti un valore binario (es. 100101),"
LINE INPUT "oppure 'Q' per uscire " DatoAscii
IF DatoAscii ="Q" OR DatoAscii ="q" THEN
EXIT FUNCTION ' se ha battuto "q", fine funz. e fine programma
END IF
IF NonBinario(DatoAscii) THEN ' valido l'input
BEEP: PRINT "caratteri illegali! riprova " : ITERATE LOOP ' se K.O. torno al WHILE
END IF
Risultato = Ascii2Long(DatoAscii) ' converto il numero
PRINT DatoAscii; " ="; Risultato ' e lo stampo
WEND
END FUNCTION '-------------------------------------------------------------
FUNCTION Ascii2Long(campo AS STRING) AS LONG ' converte un ASCII "1001" in 9 Long
DIM i AS INTEGER, tot AS LONG, espon AS LONG ' variabili locali
tot = 0: espon=1 ' preparo l'esp=2^0 (andrò da destra a sin.)
FOR i = LEN(campo) TO 1 STEP -1 ' in Basic il primo car. ha indice 1, non 0!
IF MID$(campo, i, 1) = "1" THEN ' se l'i-esimo car., da solo, è = 1
tot = tot + espon ' sommo l'esonente al risultato
END IF
espon = espon * 2 ' comunque sia andata, raddoppio l'esponente
NEXT i ' prossimo car.
FUNCTION = tot ' fine della scansione: esco rendendo tot"
END FUNCTION '-------------------------------------------------------------
FUNCTION NonBinario(campo AS STRING) AS INTEGER ' test se ci sono car. non ("0" o "1")
DIM i AS INTEGER, c AS STRING ' variabili locali
FOR i = 1 TO LEN(campo) ' in Basic il primo car. ha indice 1, non 0!
c = MID$(campo, i, 1) ' estraggo l'i-esimo car., da solo
IF c <> "0" AND c <> "1" THEN ' se è diverso da 0 e da 1
FUNCTION = -1: EXIT FUNCTION ' esco rendendo un "true"
END IF
NEXT i ' altrimenti prossimo car.
FUNCTION = 0 ' fine scansione O.K.: esco rendendo un "false"
END FUNCTION '-------------------------------------------------------------
---- fine collage -------
</font id=code></pre id=code>
Tony
*** AGGIUNTA A POSTERIORI ***
ri-edizione del collage con [ code ] e [ / code ] senza modifiche al testo.
*Edited by - tony on 06/03/2004 01:10:33