• Viernes 29 de Marzo de 2024, 09:04

Autor Tema:  Conversion De Hexadecimal A Decimal  (Leído 8714 veces)

elpollo12

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Conversion De Hexadecimal A Decimal
« en: Lunes 19 de Mayo de 2008, 01:28 »
0
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:

Código: Text
  1.  #include <iostream.h>
  2. #include <string.h>
  3. #include <conio.h>
  4. #include <math.h>
  5. main() {
  6. char cad[1]={' '};
  7. int c=0,n=0,tam,i,num[1];
  8. clrscr();
  9. cout<<"Ingrese el numero: ";
  10. cin>>cad;
  11. tam=strlen(cad);
  12. for(i=tam-1; i>=0; i--) {
  13. if(cad[i]<10 && cad[i]>0)
  14. n=n+cad[i]*pow(16,c);
  15. else if(cad[i]=='a')  num[i]=10;
  16. else if(cad[i]=='b') num[i]=11;
  17. else if(cad[i]=='c') num[i]=12;
  18. else if(cad[i]=='d') num[i]=13;
  19. else if(cad[i]=='e') num[i]=14;
  20. else if(cad[i]=='f') num[i]=15;
  21. n=n+num[i]*pow(16,c);
  22. c++; }
  23. cout<<"El resultado es: "<<n<<endl;
  24. getch();
  25. return 0;
  26. }
  27.  

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.
cout<<" by elpollo 12 "<<endl;



Iganguli

  • Miembro activo
  • **
  • Mensajes: 51
  • Nacionalidad: mx
    • Ver Perfil
Re: Conversion De Hexadecimal A Decimal
« Respuesta #1 en: Lunes 19 de Mayo de 2008, 04:40 »
0
revisa esta linea
Código: Text
  1. char cad[1]={' '};
  2.  
declaras cad de tamaño 1 por ende cuando ingresas datos no lo reconoce bien , lo podrias solucionar declarando cad de mayor tamaño recuerda reservar 1 mas para el '\0' que es el de terminacion de cadena

elpollo12

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: Conversion De Hexadecimal A Decimal
« Respuesta #2 en: Lunes 19 de Mayo de 2008, 04:55 »
0
Cita de: "Iganguli"
revisa esta linea
Código: Text
  1. char cad[1]={' '};
  2.  
declaras cad de tamaño 1 por ende cuando ingresas datos no lo reconoce bien , lo podrias solucionar declarando cad de mayor tamaño recuerda reservar 1 mas para el '\0' que es el de terminacion de cadena
Gracias Iganguli por tu resp. Ya modifique la linea tal como me lo indicastes pero sigue igual  :(  

Es como que no me estuviese reconociendo los valores numericos, solo las letras. Pero d verdad no logro detectar el error.
Por cierto, algunos valores me dan bastante cerca.. por ejemplo si ingreso a1 el resultado que me arroja es 162 .. pero el correcto es 161.
cout<<" by elpollo 12 "<<endl;



carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Conversion De Hexadecimal A Decimal
« Respuesta #3 en: Lunes 19 de Mayo de 2008, 11:02 »
0
Hola,
Lo primero,
también tendrás que redefinir num[1] para que tenga el mismo tamaño que cad[].

Segundo,
cad[] es de tipo char, por tanto los valores dentro van codificados en ascii, no vas a encontrar un 0 o un 1, sino el valor correspondiente en ascii...
if (cad=='0')
...

Aunque para hacerlo así, usa mejor un switch:
Código: Text
  1. switch(cad[i])
  2. {
  3. case '0':
  4.     ...
  5.    break;
  6. case '1':
  7.    ...
  8.    break;
  9. ...
  10. case 'a':
  11.    ...
  12.    break;
  13. ...
  14. case 'f':
  15.    ...
  16.    break;
  17.  
  18.  
Tercero,
¿no sería más fácil usar un scanf con %x?, en C se trabaja en hexadecimal igual que en decimal, recibe el número como un hexadecimal y printealo como un decimal....
Si no puedes hacer esto revisa los dos primeros puntos.

Un saludo,
 :lightsabre:
No hay tonto más molesto que el ingenioso.

elpollo12

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: Conversion De Hexadecimal A Decimal
« Respuesta #4 en: Lunes 19 de Mayo de 2008, 13:44 »
0
Cita de: "carmamezo"
Tercero,
¿no sería más fácil usar un scanf con %x?, en C se trabaja en hexadecimal igual que en decimal, recibe el número como un hexadecimal y printealo como un decimal....
Si no puedes hacer esto revisa los dos primeros puntos.

Un saludo,
 :lightsabre:
Gracias por tu Respuesta carmamezo, bueno el punto de printear el numero que se recibe como un decimal.. explique alla arriba que el profesor no lo permite.. tiene que ser desarrollando el cálculo..... y con respecto a la otra solución, dejame intentarlo a ver... y enseguida coloco como me fue. Gracias.
cout<<" by elpollo 12 "<<endl;



elpollo12

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: Conversion De Hexadecimal A Decimal
« Respuesta #5 en: Lunes 19 de Mayo de 2008, 14:00 »
0
Muchas Gracias carmamezo tu respuesta me solucionó el problema... ahora si dan correctos los calculos. Utilizé el switch.......

Aquí dejo el código por si alguien lo necesita  :D

Código: Text
  1. #include &#60;iostream.h&#62;
  2. #include &#60;string.h&#62;
  3. #include &#60;conio.h&#62;
  4. #include &#60;math.h&#62;
  5. main() {
  6. char cad[2];
  7. int c=0,n=0,tam,i,num[2];
  8. clrscr();
  9. cout&#60;&#60;&#34;Ingrese el numero: &#34;;
  10. cin&#62;&#62;cad;
  11. tam=strlen(cad);
  12. for(i=tam-1; i&#62;=0; i--) {
  13. switch(cad[i])
  14. {
  15. case '1': num[i]=1; break;
  16. case '2': num[i]=2; break;
  17. case '3': num[i]=3; break;
  18. case '4': num[i]=4; break;
  19. case '5': num[i]=5; break;
  20. case '6': num[i]=6; break;
  21. case '7': num[i]=7; break;
  22. case '8': num[i]=8; break;
  23. case '9': num[i]=9; break;
  24. case 'a': num[i]=10;break;
  25. case 'b': num[i]=11;break;
  26. case 'c': num[i]=12;break;
  27. case 'd': num[i]=13;break;
  28. case 'e': num[i]=14;break;
  29. case 'f': num[i]=15;break; }
  30. n=n+num[i]*pow(16,c);
  31. c++; }
  32. cout&#60;&#60;&#34;El resultado es: &#34;&#60;&#60;n&#60;&#60;endl;
  33. getch();
  34. return 0;
  35. }
  36.  
cout<<" by elpollo 12 "<<endl;



carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Conversion De Hexadecimal A Decimal
« Respuesta #6 en: Lunes 19 de Mayo de 2008, 15:47 »
0
Hola,
de nada, pero veo aún un par de cositas que podrías mejorar...

1- No tienes en cuenta el 0, ¿que pasa si te introducen un 20h?

2- Sólo funciona con valores hexadecimales de dos cifras, el mismo código valdría si en vez de usar un array de dos posiciones usas uno de X posiciones... Podrías representar número más altos.

Un saludo,
 :lightsabre:
No hay tonto más molesto que el ingenioso.

elpollo12

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: Conversion De Hexadecimal A Decimal
« Respuesta #7 en: Lunes 19 de Mayo de 2008, 18:10 »
0
Ok carmamezo se me habia pasado ese detalle... gracias por recordarlo... ya lo modifico!!!!!  :D

Ahora fijate este detalle: Mi programa original, debe realizar 12 conversiones .... ya solucione el problema con los hexadecimales, pero ahora cuando implemento la funcion para cambiar de octal a decimal (que deberia ser la misma, pero con base 8) me arroja resultados locos... muy grandes.  :(

Fijate lo que llevo de código:

Código: Text
  1. #include &#60;iostream.h&#62;
  2. #include &#60;conio.h&#62;
  3. #include &#60;string.h&#62;
  4. #include &#60;math.h&#62;
  5.  
  6. convertirbin(){
  7. char cad[8]={' '};
  8. int c=0,n=0,tam,i,num;
  9. cout&#60;&#60;&#34;Ingrese el numero en binario: &#34;;
  10. cin&#62;&#62;cad;
  11. tam=strlen(cad);
  12. for(i=tam-1;i&#62;=0;i--) {
  13. if(cad[i]=='0')
  14. num=0;
  15. else
  16. num=1;
  17. n=n+num*pow(2,c);
  18. c++; }
  19. return n;
  20. }
  21. convertiroctaldec(){
  22. char cad[3];
  23. int c=0,n=0,tam,i,num[3];
  24. cout&#60;&#60;&#34;Ingrese el numero en octal: &#34;;
  25. cin&#62;&#62;cad;
  26. tam=strlen(cad);
  27. for(i=tam-1;i&#62;=0;i--) {
  28. switch(cad[i])
  29. {
  30. case '1': num[i]=1; break;
  31. case '2': num[i]=2; break;
  32. case '3': num[i]=3; break;
  33. case '4': num[i]=4; break;
  34. case '5': num[i]=5; break;
  35. case '6': num[i]=6; break;
  36. case '7': num[i]=7; break;}
  37. n=n+num[i]*pow(8,c);
  38. c++; }
  39. return n;
  40. }
  41. conversion() {
  42. char cad[3];
  43. int c=0,n=0,tam,i,num[3];
  44. cout&#60;&#60;&#34;Ingrese el numero: &#34;;
  45. cin&#62;&#62;cad;
  46. tam=strlen(cad);
  47. for(i=tam-1; i&#62;=0; i--) {
  48. switch(cad[i])
  49. {
  50. case '0': num[i]=0; break;
  51. case '1': num[i]=1; break;
  52. case '2': num[i]=2; break;
  53. case '3': num[i]=3; break;
  54. case '4': num[i]=4; break;
  55. case '5': num[i]=5; break;
  56. case '6': num[i]=6; break;
  57. case '7': num[i]=7; break;
  58. case '8': num[i]=8; break;
  59. case '9': num[i]=9; break;
  60. case 'a': num[i]=10;break;
  61. case 'b': num[i]=11;break;
  62. case 'c': num[i]=12;break;
  63. case 'd': num[i]=13;break;
  64. case 'e': num[i]=14;break;
  65. case 'f': num[i]=15;break; }
  66. n=n+num[i]*pow(16,c);
  67. c++; }
  68. return n; }
  69. void convertir(int n, int base){
  70. int y[8],z[8];
  71. cout&#60;&#60;&#34;El resultado es: &#34;&#60;&#60;endl;
  72. for(int i=0;i&#60;8;i++)
  73. {
  74. z[i]=n/base;
  75. y[i]=n%base;
  76. n=z[i];
  77. }
  78. for(int j=7;j&#62;=0;j--) {
  79. cout&#60;&#60;y[j]; }
  80. }//fin de la funcion
  81. void convertiroct(int n, int base){
  82. int y[3],z[3];
  83. cout&#60;&#60;&#34;El resultado es: &#34;&#60;&#60;endl;
  84. for(int i=0;i&#60;3;i++)
  85. {
  86. z[i]=n/base;
  87. y[i]=n%base;
  88. n=z[i];
  89. }
  90. for(int j=2;j&#62;=0;j--) {
  91. cout&#60;&#60;y[j]; }
  92. }//fin de la funcion
  93. void convertirhex(int n) {
  94. int hex[32],x=0;
  95. if(n&#60;=0)
  96. {
  97. cout&#60;&#60;&#34;Error!!&#34;&#60;&#60;endl;
  98. }
  99. while(n&#62;0)
  100. {
  101. hex[x]=n%16;
  102. n/=16;
  103. x++;
  104. }
  105. x--;
  106. cout&#60;&#60;&#34;El numero en hexadecimal es: &#34;;
  107. for(x;x&#62;=0;x--)
  108. {
  109. if (hex[x]&#60;10)
  110. cout&#60;&#60;hex[x];
  111. else if (hex[x]==10)cout&#60;&#60;&#34;A&#34;;
  112. else if(hex[x]==11)cout&#60;&#60;&#34;B&#34;;
  113. else if(hex[x]==12)cout&#60;&#60;&#34;C&#34;;
  114. else if(hex[x]==13)cout&#60;&#60;&#34;D&#34;;
  115. else if(hex[x]==14)cout&#60;&#60;&#34;E&#34;;
  116. else if(hex[x]==15)cout&#60;&#60;&#34;F&#34;;
  117. }
  118. }
  119. main(){
  120. int n,opcion;
  121. clrscr();
  122. cout&#60;&#60;&#34;Menu:&#34;&#60;&#60;endl;;
  123. cout&#60;&#60;&#34;1.-Decimal --&#62; Binario&#34;&#60;&#60;endl;
  124. cout&#60;&#60;&#34;2.-Decimal --&#62; Octal&#34;&#60;&#60;endl;
  125. cout&#60;&#60;&#34;3.-Decimal --&#62; Hexadecimal&#34;&#60;&#60;endl;
  126. cout&#60;&#60;&#34;4.-Binario --&#62; Decimal&#34;&#60;&#60;endl;
  127. cout&#60;&#60;&#34;5.-Binario --&#62; Octal&#34;&#60;&#60;endl;
  128. cout&#60;&#60;&#34;6.-Binario --&#62; Hexadecimal&#34;&#60;&#60;endl;
  129. cout&#60;&#60;&#34;7.-Hexadecimal --&#62; Decimal&#34;&#60;&#60;endl;
  130. cout&#60;&#60;&#34;8.-Hexadecimal --&#62; Octal&#34;&#60;&#60;endl;
  131. cout&#60;&#60;&#34;9.-Hexadecimal --&#62; Binario&#34;&#60;&#60;endl;
  132. cout&#60;&#60;&#34;10.-Octal --&#62; Decimal&#34;&#60;&#60;endl;
  133. cout&#60;&#60;&#34;11.-Octal --&#62; Hexadecimal&#34;&#60;&#60;endl;
  134. cout&#60;&#60;&#34;12.-Octal --&#62; Binario&#34;&#60;&#60;endl;
  135. cout&#60;&#60;&#34;13.-Salir&#34;&#60;&#60;endl;
  136. cout&#60;&#60;&#34;Ingresa la opcion que desees: &#34;;
  137. cin&#62;&#62;opcion;
  138. switch(opcion){
  139. case 1:
  140. cout&#60;&#60;&#34;Ingrese el numero: &#34;;
  141. cin&#62;&#62;n;
  142. convertir(n,2);
  143. break;
  144. case 2:
  145. cout&#60;&#60;&#34;Ingrese el numero: &#34;;
  146. cin&#62;&#62;n;
  147. convertiroct(n,8);
  148. break;
  149. case 3:
  150. cout&#60;&#60;&#34;Ingrese el numero: &#34;;
  151. cin&#62;&#62;n;
  152. convertirhex(n);
  153. break;
  154. case 4:
  155. cout&#60;&#60;&#34;El resultado es: &#34;&#60;&#60;convertirbin()&#60;&#60;endl;
  156. break;
  157. case 5:
  158. convertiroct(convertirbin(),8);
  159. getch();
  160. break;
  161. case 6:
  162. convertirhex(convertirbin());
  163. break;
  164. case 7:
  165. cout&#60;&#60;&#34;El resultado es: &#34;&#60;&#60;conversion()&#60;&#60;endl;
  166. break;
  167. case 8:
  168. convertiroct(conversion(),8);
  169. break;
  170. case 9:
  171. convertir(conversion(),2);
  172. break;
  173. case 10:
  174. cout&#60;&#60;&#34;El Resultado es: &#34;&#60;&#60;convertiroctaldec()&#60;&#60;endl;
  175. break;
  176. case 11:
  177. convertirhex(convertiroctaldec()); break;
  178. case 12:
  179. convertir(convertiroctaldec(),2); break;
  180. case 13:
  181. return 0;
  182. }
  183. getch();
  184. return main();
  185. }
  186.  

y específicamente la funcion que me da problemas es ésta:

Código: Text
  1. convertiroctaldec(){
  2. char cad[3];
  3. int c=0,n=0,tam,i,num[3];
  4. cout&#60;&#60;&#34;Ingrese el numero en octal: &#34;;
  5. cin&#62;&#62;cad;
  6. tam=strlen(cad);
  7. for(i=tam-1;i&#62;=0;i--) {
  8. switch(cad[i])
  9. {
  10. case '1': num[i]=1; break;
  11. case '2': num[i]=2; break;
  12. case '3': num[i]=3; break;
  13. case '4': num[i]=4; break;
  14. case '5': num[i]=5; break;
  15. case '6': num[i]=6; break;
  16. case '7': num[i]=7; break;}
  17. n=n+num[i]*pow(8,c);
  18. c++; }
  19. return n;
  20. }
  21.  

De verdad no me explico por que no me da.. si debería ser practicamente lo mismo  :blink:
cout<<" by elpollo 12 "<<endl;