Conversion de Hexadecimal a Decimal

elpollo12
19 de Mayo del 2008
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.

David Reza
19 de Mayo del 2008
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