Pagina 1 di 1

programma in c++

MessaggioInviato: 30/10/2003, 21:30
da mica81
salve a tutti!
devo scrivere un programma in c++ che trasformi un numero binario in un numero decimale.
dovrei rispettare il seguente output:
inserire il numero binario: 10100
il numero decimale è: 20
non importa che ci mettiate funzioni.va bene anche se eseguito con gli operatori if/else for, switch ecc...
sono giorni che mi scervello non riesco a raggiungere una soluzione...
grazie a tutti!

MessaggioInviato: 02/11/2003, 19:50
da tony
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

MessaggioInviato: 07/11/2003, 01:27
da dazuco
ciao

dovresti scorrere il vettore contenente il numero binario da destra verso sinistra (dovresti usare la funzione strlen per calcolare la lunghezza del vett.)
ad ogni iterazione controlli il carattere se 0 o 1 e
se 1 ==> calcoli la potenza i-esima di 2(il nmero dell'iterazione quindi ad esempio se è la prima sarà 0) e la sommi in una var di appo che aggiornerai ad ogni iterazione && il carattere == 1.
se 0 ==> non fai nulla
alla fine avrai il decimale
ciao

MessaggioInviato: 10/11/2003, 13:03
da FraNCE
il C++ non lo uso.. ma il C dovrebbe essere simile.. ciao!

#include <stdio.h>

int main ()
{
int i=0,bin=0,x;
char c[20];

printf("Inserisci il numero binario: ");
scanf("%s",c);
while (c[i]!=0)
{
x=c[i]-'0';
bin+=x;
bin*=2;
i++;
}
bin/=2;
printf("Il corrispondente decimale e' %d",bin);
}

MessaggioInviato: 10/11/2003, 17:09
da tony
bella, FraNCE!
così mostri che si può procedere da sinistra a destra.
Tony

MessaggioInviato: 10/11/2003, 20:11
da mica81
oooh grazie a tutti ma in particolare france.
effettivamente tra il c++ e il c ci sono differenze di sintattica ma li ho risolti facilmente in quanto basta sostituire le parole chiave...
funziona!
grazie!

MessaggioInviato: 11/11/2003, 16:18
da FraNCE
figurati! se hai problemi col C sono ben lieto di darti una mano!

MessaggioInviato: 11/11/2003, 22:43
da mica81
grazie, ma i miei "problemi" riguardano il c++!
grazie comunque ^_^