Test Foro de elhacker.net SMF 2.1

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

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