PDA

Visualizza la versione completa : [C++] Convertitore esadecimale


XWolverineX
06-11-2005, 20:12
Ho provato a fare un convertitore esadecimale


#include <iostream>

using namespace std;

int main()
{
int Numero = 0;
char Convertito[100];
cout <<"Inserisci il numero da convertire\n";
cin >> Numero;
for (int i = 0;(Numero / 16) == 0;i++)
{
switch (Numero % 16)
{
case 15:
Convertito[i] = 'F';
break;
case 14:
Convertito[i] = 'E';
break;
case 13:
Convertito[i] = 'D';
break;
case 12:
Convertito[i] = 'C';
break;
case 11:
Convertito[i] = 'B';
break;
case 10:
Convertito[i] = 'A';
break;
default:
Convertito[i] = Numero % 16;
break;
Numero = Numero / 16;
}
}

for (int a = strlen(Convertito); a = 0; a--)
{
cout<<Convertito[a];
}
cout<<endl;
system("PAUSE");
return 0;
}



Ma quando lo avvio e inserisco il numero questo non mi stampa un bel niente...
Posso capire che alcuni caratteri sono vuoti poichè strlen(Converito) mi restituisce 100 e quindi li printa vuoti...ma gli altri dove sono?
Usando il debug di Visual C++ 6.0 e premendo F11, noto che il primo ciclo for lo salta completamente!!
Sapete aiutarmi, magari anche ad ottimizzarlo?

oregon
06-11-2005, 20:46
int Numero = 0, i = 0;
char Convertito[100];
char c;

cout <<"Inserisci il numero da convertire\n";
cin >> Numero;

do
{
c = (Numero % 16) + '0';
Convertito[i++] = ((c>'9') ? c+7 : c);
Numero /= 16;
} while(Numero);

Convertito[i] = 0;

strrev(Convertito);

cout << Convertito << endl;

system("PAUSE");
return 0;

XWolverineX
06-11-2005, 20:52
Veramente io non volevo il codice completo da incollare nel compilatore.
Volevo cercare di capire l'errore, magari spiegi quello che ha i fatto nel codice...
In particolare...
while(Numero)
Che condizione vuol dire? Finchè numero == a qualcosa?

Samuele_70
06-11-2005, 23:24
Originariamente inviato da XWolverineX
while(Numero)
Che condizione vuol dire? Finchè numero == a qualcosa?

Si esatto, in pratica finchè Numero non è == 0 il ciclo
while() continua.

Considera che :

Se Numero > 0 Il controllo da true (il ciclo continua)
Se Numero < 0 Il controllo da true (il ciclo continua)
Se Numero = 0 Il controllo da false (il ciclo si interrompe)

oregon
06-11-2005, 23:27
Prova a spiegare tu cosa dovrebbe fare questa linea

for (int i = 0;(Numero / 16) == 0;i++)

e cosa c'e' di sbagliato in questa

for (int a = strlen(Convertito); a = 0; a--)

cosi' arrivi anche a capire cosa sbagli ...

XWolverineX
07-11-2005, 23:14
Ho riflettuto un po sul codice e ho prodotto quest'altro


#include <iostream>

using namespace std;

int main()
{
int Numero = 0;
int i = 0;
char Convertito[100];
cout <<"Inserisci il numero da convertire\n";
cin >> Numero;
for (i = 0;(Numero / 16) != 0;i++)

{
switch (Numero % 16)
{
case 15:
Convertito[i] = 'F';
Numero = Numero / 16;
break;
case 14:
Convertito[i] = 'E';
Numero = Numero / 16;
break;
case 13:
Convertito[i] = 'D';
Numero = Numero / 16;
break;
case 12:
Convertito[i] = 'C';
Numero = Numero / 16;
break;
case 11:
Convertito[i] = 'B';
Numero = Numero / 16;
break;
case 10:
Convertito[i] = 'A';
Numero = Numero / 16;
break;
default:
Convertito[i] = Numero % 16;
Numero = Numero / 16;
break;
i++;
Convertito[i] = 'F';
}
}

for (int a = strlen(Convertito); a != 0; a--)
{
cout<<Convertito[a];
}
cout<<endl;
system("PAUSE");
return 0;
}

Però non va lo stesso, mi da dei caratteri stranissimi, perchè 'F' mi restituisce il codice Ascii, ma se faccio "F" mi da errore...come potrei fare??

oregon
08-11-2005, 01:17
Quando ti ho suggerito di controllare la prima for, non intendevo dire che invece di == dovevi usare != ma che la for non ha molto senso ... devi spiegare e spiegarti perche' hai scritto quella for e cosa volevi fare con quella for, che invece non fa ...

XWolverineX
08-11-2005, 15:57
Originariamente inviato da oregon
Prova a spiegare tu cosa dovrebbe fare questa linea

for (int i = 0;(Numero / 16) == 0;i++)

e cosa c'e' di sbagliato in questa

for (int a = strlen(Convertito); a = 0; a--)

cosi' arrivi anche a capire cosa sbagli ...

Bhe nella prima faccio continuare il ciclio finchè il numero diviso 16 non è uguale a 0

nella seconda faccio printare al contrario tutti i caratteri del char finchè a, che è uguale alla lunghezza del char (100) non è uguale a 0...

Samuele_70
08-11-2005, 19:36
Originariamente inviato da XWolverineX
Bhe nella prima faccio continuare il ciclio finchè il numero diviso 16 non è uguale a 0

nella seconda faccio printare al contrario tutti i caratteri del char finchè a, che è uguale alla lunghezza del char (100) non è uguale a 0...

Metti questo cout per vedere cosa fa il primo ciclo for:
cout<<"i="<<i<<" Numero"<<Numero<<endl;

Qual'è la differenza tra assegnazione e confronto ?

oregon
08-11-2005, 20:03
Originariamente inviato da XWolverineX
Bhe nella prima faccio continuare il ciclio finchè il numero diviso 16 non è uguale a 0

nella seconda faccio printare al contrario tutti i caratteri del char finchè a, che è uguale alla lunghezza del char (100) non è uguale a 0...

"finche' il numero ..."

No ... la for non funziona cosi'. Se la condizione e' falsa, la for termina. Prendi il numero 171 ...

All'inizio 171/16 non e' zero e la for non viene eseguita ...

E' il ciclo for che *non è adatto* alla soluzione del problema ... ecco perche' non l'ho usato ...

Nella seconda, come ti e' stato detto,

== e' per il confronto

= per l'assegnazione

e, in ogni caso, e' piu' comodo usare la funzione di libreria

strrev

Loading