elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  De binario a decimal -> sprintf no da el resultado esperado (lenguaje c)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: De binario a decimal -> sprintf no da el resultado esperado (lenguaje c)  (Leído 2,393 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
De binario a decimal -> sprintf no da el resultado esperado (lenguaje c)
« 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


En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: De binario a decimal -> sprintf no da el resultado esperado (lenguaje c)
« Respuesta #1 en: 11 Noviembre 2015, 08:51 am »

Para cambiar de bases, no utilices float, utiliza tipos enteros.


En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: De binario a decimal -> sprintf no da el resultado esperado (lenguaje c)
« Respuesta #2 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
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: De binario a decimal -> sprintf no da el resultado esperado (lenguaje c)
« Respuesta #3 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[ code=C++] Conversor binario-decimal-binario « 1 2 »
Programación C/C++
Chonk 11 23,545 Último mensaje 9 Julio 2010, 17:52 pm
por Debci
Pasar decimal a binario
.NET (C#, VB.NET, ASP)
Cuasar 7 7,612 Último mensaje 8 Febrero 2011, 04:00 am
por Cuasar
¿Posible la opereción con un resultado decimal? - Batch
Scripting
Puntoinfinito 8 4,988 Último mensaje 5 Junio 2012, 21:52 pm
por Puntoinfinito
De binario a decimal en lenguaje C.
Programación C/C++
NOB2014 3 8,327 Último mensaje 10 Septiembre 2017, 18:20 pm
por NOB2014
Convertir de decimal a binario en lenguaje C.
Programación C/C++
NOB2014 8 5,738 Último mensaje 7 Noviembre 2016, 21:53 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines