Conversion de Hexadecimal a Decimal
Buenas!! Tengo el siguiente problema... y es que en la univ me asignaron la realización de la conversion en c++ de Hexadecimal a Decimal .... bien lo pudiese hacer utilizando hex y dec de iostream, pero como es para fines educativos, el profesor nos ha dicho que no lo quiere bajo ese método. Pues bien he desarrollado el siguiente código:
#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <math.h>
main() {
char cad[1]={' '};
int c=0,n=0,tam,i,num[1];
clrscr();
cout<<"Ingrese el numero: ";
cin>>cad;
tam=strlen(cad);
for(i=tam-1; i>=0; i--) {
if(cad[i]<10 && cad[i]>0)
n=n+cad[i]*pow(16,c);
else if(cad[i]=='a') num[i]=10;
else if(cad[i]=='b') num[i]=11;
else if(cad[i]=='c') num[i]=12;
else if(cad[i]=='d') num[i]=13;
else if(cad[i]=='e') num[i]=14;
else if(cad[i]=='f') num[i]=15;
n=n+num[i]*pow(16,c);
c++; }
cout<<"El resultado es: "<<n<<endl;
getch();
return 0;
}
El problema es que me funciona bien cuando se ingresan 2 letras, por ejemplo FF = 255 ... pero cuando ingreso 2 numeros, por ejemplo 29 o un numero y una letra, como A1 no me arroja el resultado correcto. A ver si me pueden hechar una mano para detectar el problema. Muchas Gracias.
#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <math.h>
main() {
char cad[1]={' '};
int c=0,n=0,tam,i,num[1];
clrscr();
cout<<"Ingrese el numero: ";
cin>>cad;
tam=strlen(cad);
for(i=tam-1; i>=0; i--) {
if(cad[i]<10 && cad[i]>0)
n=n+cad[i]*pow(16,c);
else if(cad[i]=='a') num[i]=10;
else if(cad[i]=='b') num[i]=11;
else if(cad[i]=='c') num[i]=12;
else if(cad[i]=='d') num[i]=13;
else if(cad[i]=='e') num[i]=14;
else if(cad[i]=='f') num[i]=15;
n=n+num[i]*pow(16,c);
c++; }
cout<<"El resultado es: "<<n<<endl;
getch();
return 0;
}
El problema es que me funciona bien cuando se ingresan 2 letras, por ejemplo FF = 255 ... pero cuando ingreso 2 numeros, por ejemplo 29 o un numero y una letra, como A1 no me arroja el resultado correcto. A ver si me pueden hechar una mano para detectar el problema. Muchas Gracias.
Recuerda que el arreglo es de caracteres. En tu sentencia if estás comparando un carácter con un entero, algo asÃ:
'1' == 1;
lo cual es incorrecto. Tu comparación deberÃa ser asÃ:
if (cad[i] >= '0' && cad[i]<='9')
n=n+ (cad[i]-48) *pow(16,c);
A continuación te explico la parte de '(cad[i]-48)'.
Al tener un carácter numérico en tu arreglo de tipo caracter podemos utilizar su código ASCII. Los códigos ASCII del 0 al 9 van del 48 al 57, respectivamente. Es por eso que si tu ingresas el valor de '1', su código ASCII será el 49, pero si le restamos 48, nos quedará 1, que es el número que queremos, no '1'. Teniendo el 1, ahora si podemos hacer la multiplicación y luego realizar la suma.
Otro error que tiene tu programa es que la sentencia 'n=n+num[i]*pow(16,c);' ser realizará SIEMPRE, asà se cumpla o no se cumplan los condicionales 'if' y 'else if' ya que dicha sentencia no tienen ninguna condición.
Aquà te dejo tu programa ya corregido, espero que te sirva.
Pero antes un último consejo, trata siempre de utilizar 'int main()' en vez de 'main()' ya que de esa forma especificas que la función retornará con un valor, que es lo que pasa cuando se ejecuta la instrucción 'return 0'. El compilador no te mandará ningún error sobre esto, pero es mejor que tus programas sean estándares y se puedan compilar en cualquier compilador, no sólo en un compilador especÃfico.
-------------------------------------------------------------------
cout<<"Ingrese el numero en hexadecimal: ";
cin>>cad;
tam=strlen(cad);
for(i=tam-1; i>=0; i--)
{
if(cad[i]<='9' && cad[i]>='0')
{
n=n+ (cad[i]-48) *pow(16,c);
}
else
{
if(cad[i]=='a') {num=10;}
if(cad[i]=='b') {num=11;}
if(cad[i]=='c') {num=12;}
if(cad[i]=='d') {num=13;}
if(cad[i]=='e') {num=14;}
if(cad[i]=='f') {num=15;}
n=n+num*pow(16,c);
}
c++;
--------------------------------------------------------------------
Saludos
'1' == 1;
lo cual es incorrecto. Tu comparación deberÃa ser asÃ:
if (cad[i] >= '0' && cad[i]<='9')
n=n+ (cad[i]-48) *pow(16,c);
A continuación te explico la parte de '(cad[i]-48)'.
Al tener un carácter numérico en tu arreglo de tipo caracter podemos utilizar su código ASCII. Los códigos ASCII del 0 al 9 van del 48 al 57, respectivamente. Es por eso que si tu ingresas el valor de '1', su código ASCII será el 49, pero si le restamos 48, nos quedará 1, que es el número que queremos, no '1'. Teniendo el 1, ahora si podemos hacer la multiplicación y luego realizar la suma.
Otro error que tiene tu programa es que la sentencia 'n=n+num[i]*pow(16,c);' ser realizará SIEMPRE, asà se cumpla o no se cumplan los condicionales 'if' y 'else if' ya que dicha sentencia no tienen ninguna condición.
Aquà te dejo tu programa ya corregido, espero que te sirva.
Pero antes un último consejo, trata siempre de utilizar 'int main()' en vez de 'main()' ya que de esa forma especificas que la función retornará con un valor, que es lo que pasa cuando se ejecuta la instrucción 'return 0'. El compilador no te mandará ningún error sobre esto, pero es mejor que tus programas sean estándares y se puedan compilar en cualquier compilador, no sólo en un compilador especÃfico.
-------------------------------------------------------------------
cout<<"Ingrese el numero en hexadecimal: ";
cin>>cad;
tam=strlen(cad);
for(i=tam-1; i>=0; i--)
{
if(cad[i]<='9' && cad[i]>='0')
{
n=n+ (cad[i]-48) *pow(16,c);
}
else
{
if(cad[i]=='a') {num=10;}
if(cad[i]=='b') {num=11;}
if(cad[i]=='c') {num=12;}
if(cad[i]=='d') {num=13;}
if(cad[i]=='e') {num=14;}
if(cad[i]=='f') {num=15;}
n=n+num*pow(16,c);
}
c++;
--------------------------------------------------------------------
Saludos
