De binario a decimal -> sprintf no da el resultado esperado (lenguaje c)

Iniciado por NOB2014, 11 Noviembre 2015, 03:15 AM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

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 ){
system( "clear" );
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++){
printf("\n %c", cadena[i]);
if( cadena[i] > '1' ){
printf( "\n El numero ingresado es incorrecto para esta operacion" );
printf( "\n Pulse [Enter] para continuar... " ); getchar();
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
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

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

NOB2014

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
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

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.