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. - #include <stdio.h> #include <limits.h> #include <float.h> #include <stdlib.h> #include <string.h> void sumar(float, float); void restar(float, float); void dividir(float, float); void multiplicar(float, float); void porcentaje(float, float); void binario(float, float); void decimal(float, float); void hexadecimal(float, float); int main(void){ void ( * calc[] ) (float, float) = { sumar, restar, dividir, multiplicar, porcentaje, binario, decimal, hexadecimal }; float opUno, opDos; int operador, ch, ok, opc; while( opc != 1 ){ opUno = 0.00; do{ printf( "\n Introduzca un numero..........:" ); ok = scanf("%f",&opUno ) == 1 && opUno > 0.00 && opUno <= FLT_MAX ; while ((ch = getchar()) != EOF && ch != '\n'); }while(!ok); do{ printf( "\n 1 - Sumar\n 2 - Restar\n 3 - Dividir\n 4 - Multiplicar\n 5 - Porcentaje" ); printf( "\n 6 - Binario\n 7 - Decimal\n 8 - Hexadecimal\n\n Introduzca opcion..............:" ); ok = scanf("%d",&operador ) == 1 && operador >= 1 && operador <= 7; while ((ch = getchar()) != EOF && ch != '\n'); }while(!ok); if( operador >= 6 ){ (* calc[ operador-1 ]) (opUno, opDos); } else{ if( operador == 5){ printf( "\n Introduzca el porcentual.......:" ); } else{ printf( "\n Introduzca segundo operando....:" ); } do{ ok = scanf("%f",&opDos ) == 1 && opDos > 0.00 && opDos <= FLT_MAX ; while ((ch = getchar()) != EOF && ch != '\n'); }while(!ok); (* calc[ operador-1 ]) (opUno, opDos); } do{ printf( "\n\n 1 - para finalizar \n 2 - Otra operacion\n\n Introduzca opcion....:" ); ok = scanf("%d",&opc ) == 1 && opc >= 1 && opc <= 2; while ((ch = getchar()) != EOF && ch != '\n'); }while(!ok); } return 0; } void sumar( float opUno, float opDos ){ printf( "\n resultado ==> %5.3f\n", opUno + opDos ); } void restar( float opUno, float opDos ){ printf( "\n resultado ==> %5.3f\n", opUno - opDos ); } void dividir( float opUno, float opDos ){ printf( "\n resultado ==> %5.3f\n", opUno / opDos ); } void multiplicar( float opUno, float opDos ){ printf( "\n resultado ==> %5.3f\n", opUno * opDos ); } void porcentaje(float opUno, float opDos){ float porc, restado, sumado; porc = (opUno * opDos)/100; restado = opUno - porc; sumado = opUno + porc; printf( "\n Porcentual = %5.3f Restado = %5.3f Sumado = %5.3f", porc , restado , sumado ); } void binario( float opUno, float opDos ){ int entero, i, bits=sizeof(int)*8; entero=(int)opUno; printf("\n El numero %d en binario es: ", entero ); for(i=0;i<bits;++i) if (((entero >>(bits -i -1))&1)==1) printf("1"); else printf("0"); } void decimal( float opUno, float opDos ){ char cadena[33]; int elementos, decimal = 0, operando = 1, i; elementos = sprintf(cadena ,"%1.0f",opUno ); for( i = 0; i < elementos; i++){ if( cadena[i] > '1' ){ printf( "\n El numero ingresado es incorrecto para esta operacion" ); return; } } for( --elementos; elementos >= 0; elementos-- ){ if( cadena[elementos] == '1' ){ decimal += operando; } operando *= 2; } printf( "\n Decimal %d", decimal ); } void hexadecimal( float opUno, float opDos ){ int entero; entero=(int)opUno; printf("\n El numero %d en hexadecimal es: %X\n", entero , entero ); }
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.
|