Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 11 Noviembre 2015, 03:15 am



Título: De binario a decimal -> sprintf no da el resultado esperado (lenguaje c)
Publicado por: NOB2014 en 11 Noviembre 2015, 03:15 am
Hola a todos.
Como lo dice el enunciado, no logro ingresar más de 8 dígitos para pasar de binario a decimal, si ingreso 8 o menos dígitos el resultado es correcto, pero si por Ej. ingreso 110011001 me aparece un número mayor a 1 en el noveno dígito y de la manera que está validado regresa a la función principal,-
Cómo he buscado y buscado en la web y no ayo la manera de solucionarlo recurro una vez más a Uds.
El error está en la función decimal que se encuentra en la línea 99, dejo todo el programa por si a alguien se le ocurre alguna sugerencia para mejorarlo, me parece que error de lógica no tiene, me parece. -

Código
  1. #include <stdio.h>
  2. #include <limits.h>  
  3. #include <float.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. void sumar(float, float);
  8. void restar(float, float);
  9. void dividir(float, float);
  10. void multiplicar(float, float);
  11. void porcentaje(float, float);
  12. void binario(float, float);
  13. void decimal(float, float);
  14. void hexadecimal(float, float);
  15.  
  16. int main(void){
  17. void ( * calc[] ) (float, float) = { sumar, restar, dividir, multiplicar, porcentaje, binario, decimal, hexadecimal };
  18. float opUno, opDos;
  19. int  operador, ch, ok, opc;
  20.  
  21. while( opc != 1 ){
  22. system( "clear" );
  23. opUno = 0.00;
  24. do{
  25. printf( "\n Introduzca un numero..........:" );
  26. ok = scanf("%f",&opUno) == 1 && opUno > 0.00 && opUno <= FLT_MAX;  
  27. while ((ch = getchar()) != EOF && ch != '\n');
  28. }while(!ok);
  29.  
  30. do{
  31. printf( "\n 1 - Sumar\n 2 - Restar\n 3 - Dividir\n 4 - Multiplicar\n 5 - Porcentaje" );
  32. printf( "\n 6 - Binario\n 7 - Decimal\n 8 - Hexadecimal\n\n Introduzca opcion..............:" );
  33. ok = scanf("%d",&operador) == 1 && operador >= 1 && operador <= 7;  
  34. while ((ch = getchar()) != EOF && ch != '\n');
  35. }while(!ok);
  36.  
  37. if( operador >= 6 ){
  38. (* calc[ operador-1 ]) (opUno, opDos);
  39. }
  40. else{
  41. if( operador == 5){
  42. printf( "\n Introduzca el porcentual.......:" );
  43. }
  44. else{
  45. printf( "\n Introduzca segundo operando....:" );
  46. }
  47. do{
  48. ok = scanf("%f",&opDos) == 1 && opDos > 0.00 && opDos <= FLT_MAX;  
  49. while ((ch = getchar()) != EOF && ch != '\n');
  50. }while(!ok);
  51.  
  52. (* calc[ operador-1 ]) (opUno, opDos);
  53. }
  54.  
  55. do{
  56. printf( "\n\n 1 - para finalizar \n 2 - Otra operacion\n\n Introduzca opcion....:" );
  57. ok = scanf("%d",&opc) == 1 && opc >= 1 && opc <= 2;  
  58. while ((ch = getchar()) != EOF && ch != '\n');
  59. }while(!ok);
  60. }
  61.  
  62. return 0;
  63. }
  64.  
  65. void sumar( float opUno, float opDos ){
  66. printf( "\n resultado ==> %5.3f\n", opUno + opDos );
  67. }
  68.  
  69. void restar( float opUno, float opDos ){
  70. printf( "\n resultado ==> %5.3f\n", opUno - opDos );
  71. }
  72.  
  73. void dividir( float opUno, float opDos ){
  74. printf( "\n resultado ==> %5.3f\n", opUno / opDos );
  75. }
  76.  
  77. void multiplicar( float opUno, float opDos ){
  78. printf( "\n resultado ==> %5.3f\n", opUno * opDos );
  79. }
  80.  
  81. void porcentaje(float opUno, float opDos){
  82. float porc, restado, sumado;
  83. porc = (opUno * opDos)/100;
  84. restado = opUno - porc;
  85. sumado  = opUno + porc;
  86.  
  87. printf( "\n Porcentual = %5.3f  Restado = %5.3f  Sumado = %5.3f", porc, restado, sumado );
  88. }
  89.  
  90. void binario( float opUno, float opDos ){
  91. int entero, i, bits=sizeof(int)*8;
  92. entero=(int)opUno;
  93.  
  94. printf("\n El numero %d en binario es: ", entero);
  95. for(i=0;i<bits;++i)
  96. if (((entero>>(bits-i-1))&1)==1) printf("1"); else printf("0");
  97. }
  98.  
  99. void decimal( float opUno, float opDos ){
  100. char cadena[33];
  101. int elementos, decimal = 0, operando = 1, i;
  102.  
  103. elementos = sprintf(cadena,"%1.0f",opUno);
  104.  
  105. for( i = 0; i < elementos; i++){
  106. printf("\n %c", cadena[i]);
  107. if( cadena[i] > '1' ){
  108. printf( "\n El numero ingresado es incorrecto para esta operacion" );
  109. printf( "\n Pulse [Enter] para continuar... " ); getchar();
  110. return;
  111. }
  112. }
  113.  
  114. for( --elementos; elementos >= 0; elementos-- ){
  115. if( cadena[elementos] == '1' ){
  116. decimal += operando;
  117. }
  118. operando *= 2;
  119. }
  120.  
  121. printf( "\n Decimal %d", decimal );
  122. }
  123.  
  124. void hexadecimal( float opUno, float opDos ){
  125. int entero;
  126. entero=(int)opUno;
  127. printf("\n El numero %d en hexadecimal es: %X\n", entero, entero);
  128. }

Saludos y muchas gracias desde ya.-
Daniel


Título: Re: De binario a decimal -> sprintf no da el resultado esperado (lenguaje c)
Publicado por: ivancea96 en 11 Noviembre 2015, 08:51 am
Para cambiar de bases, no utilices float, utiliza tipos enteros.


Título: Re: De binario a decimal -> sprintf no da el resultado esperado (lenguaje c)
Publicado por: NOB2014 en 11 Noviembre 2015, 13:04 pm
Hola ivancea96 .-
Muchas gracias por ocuparte, hice la prueba de esta manera entero=(int)opUno; y me da el mismo resultado, si no tienen una sugerencia más sencilla tendré que hacer que se muestre primero la elección de las operaciones y luego utilizar float o int según sea la misma.- 

Saludos.
Daniel


Título: Re: De binario a decimal -> sprintf no da el resultado esperado (lenguaje c)
Publicado por: ivancea96 en 11 Noviembre 2015, 16:20 pm
Como digo, desconozco si es este el error, pero no trates de guardar en un float un número en una determinada base. Coma flotante no asegura la precisión en absoluto.