Autor
|
Tema: funcion de conversion de bases (Leído 5,769 veces)
|
m@o_614
Desconectado
Mensajes: 389
|
Saludos tengo una funcion llamada obtener numero, a la que le paso una cadena como argumento algo como #456 y la base(hex,octal,binaria o decimal), y me regresa un int con el numero(ya sin el #) el problema es que si le ingreso el numero #65536 me imprime que el numero es 65535 y no entiendo por qué imprime eso, ya lo habia probado para numeros de otras bases y lo hacia correctamente no se por que ahora no, solo puse la funcion que me da problemas por que el codigo es un poco largo int obtenerNumero(char *operando,int base) { int i,potencia,num_decimal = 0,lon,entero,x = 1; for(i = lon-1,potencia = 0;i >= x;i--,potencia++) { if(esLetraBase16(operando[i])) entero = hexadecimal(operando[i]); else entero = operando[i]-48; num_decimal += pow(base ,potencia )*entero ; } return num_decimal; } int hexadecimal(char caracter) { int decimal; switch(caracter) { case 'A':case 'a': decimal = 10; break; case 'B':case 'b': decimal = 11; break; case 'C':case 'c': decimal = 12; break; case 'D':case 'd': decimal = 13; break; case 'E':case 'e': decimal = 14; break; case 'F':case 'f': decimal = 15; break; default: } return decimal; }
me imprime 6 36 536 5536 65535 gracias de antemano
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
6 36 536 5536 65536 [65536]
A mi me sale el resultado correcto.
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Pues a mí me da bien: 6 36 536 5536 65536 [65536] Process returned 0 (0x0) execution ti Press any key to continue.
Pero en principio lo que he hecho es prescindir de pow y de la librería math y lo he calculado directamente:
int obtenerNumero(char *operando,int base) { int i,potencia,num_decimal = 0,lon,entero=0,x = 1; lon = strlen(operando); for(i = lon-1,potencia = 1;operando[i];i--,potencia*=10) { /*if(esLetraBase16(operando[i])) entero = hexadecimal(operando[i]); else*/ entero = operando[i]-'0'; num_decimal+= potencia*entero; printf("%d\n",num_decimal); } printf("[%d]",num_decimal); return num_decimal; } int main(){ obtenerNumero("65536",10); return 0; }
Pero me quedé con el "mosqueo" de lo que te ocurría. Casi no lo pillo, pero sí, lo he pillado.
El problema radica que el uso de pow implica que la variable sea de tipo float o double y si se usa un int pasan cosas raras, cosa que no sucede con mi método. Es decir, la solución a tu código:int obtenerNumero(char *operando,int base) { int i,potencia,lon,entero=0,x = 1; float num_decimal = 0; /*<== AQUI ::::::*/ lon = strlen(operando); for(i = lon-1,potencia = 0;operando[i];i--,potencia++) { /*if(esLetraBase16(operando[i])) entero = hexadecimal(operando[i]); else*/ entero = operando[i]-'0'; num_decimal+= pow(base,potencia)*entero; printf("%g\n",num_decimal); } printf("[%d]",num_decimal); return num_decimal; } int main(){ obtenerNumero("65536",10); return 0; }
¡¡¡¡ Saluditos! ..... !!!!
|
|
« Última modificación: 19 Marzo 2014, 12:08 pm por leosansan »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
El problema radica en el printf("%g"). No se debe usar el %g para enteros. Podemos comprobar que retorno es correcto #include <stdio.h> int obtenerNumero(char *operando,int base) { int i,potencia,lon,entero=0,x = 1; int num_decimal = 0; lon = strlen(operando); for(i = lon-1,potencia = 0;operando[i];i--,potencia++) { /*if(esLetraBase16(operando[i])) entero = hexadecimal(operando[i]); else*/ entero = operando[i]-'0'; num_decimal+= pow(base,potencia)*entero; //printf("%g\n",num_decimal); } //printf("[%d]",num_decimal); return num_decimal; } int main(){ printf("%d\n",obtenerNumero("65536",10)); return 0; }
Aunque por eficiencia, yo lo haría sin la función pow (tal y como ha hecho Leo).
|
|
« Última modificación: 19 Marzo 2014, 13:03 pm por amchacon »
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
Yo le pondría un parche al cálculo de la potencia propuesto por leosansan. int obtenerNumero(char *operando,int base) { int i,potencia,num_decimal = 0,lon,entero=0,x = 1; for(i = lon-1,potencia = 1;operando[i];i--,potencia*=base) // <--- AQUI { if(esLetraBase16(operando[i])) entero = hexadecimal(operando[i]); else entero = operando[i]-'0'; num_decimal+= potencia*entero; } return num_decimal; }
Básicamente para que funcione en bases que no sea la decimal.
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
El problema radica en el printf("%g"). No se debe usar el %g para enteros. .......................................
Creo que no, el problema radica en lo que indiqué.
Una salida con int y %d en el printf:Y si los declara como float o double e imprime con %d ya ni te cuento.Yo le pondría un parche al cálculo de la potencia propuesto por leosansan.
......................................................... Básicamente para que funcione en bases que no sea la decimal.
Bien observado amigo eferion. Pero ya lo dice la variable: "num_decimal". No creo que ese fuera el propósito de m@o_614, pero efectivamente el método es lo bastante versátil como para ser usado para distintas bases. Y repito sí tienes razón, su uso es más potente. .....y me has sacado un as que tenía en la manga para otros temas
¡¡¡¡ Saluditos! ..... !!!!
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
.....y me has sacado un as que tenía en la manga para otros temas jajajaja. Vaya por dios, siento haberte fastidiado el plan... la próxima avísame por MP para no meter la pata
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Creo que no, el problema radica en lo que indiqué.
Una salida con int y %d en el printf:
Y si los declara como float o double e imprime con %d ya ni te cuento. ¿Me has puesto la salida bien? ¿?
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
La salida a tu código en mi ordenadorr y compilador:6 36 536 5536 65535 EN FUNCION: [65535] 6 36 536 5536 65535 EN FUNCION: [65535] EN MAIN: 65535
Process returned 0 (0x0) execution time : 0.028 s Press any key to continue.
¿Me has puesto la salida bien? ¿? Te tengo en una muy alta estima, de corazón, como para jugar con esos detalles.
En realidad creo que todo acaba dependiendo del compilador. Fíjate que a eferion el código de m@o_614 le dio el resultado correcto y sin embargo a m@o_614 y a mi nos daba mal. ¿¿¿¿¿¿?????..... No encuentro otra explicación que todo acaba dependiendo del compilador y versión usado.
Un fuerte abrazo y todos mis respetos hacia ti.¡¡¡¡ Saluditos! ..... !!!!
|
|
« Última modificación: 19 Marzo 2014, 18:52 pm por leosansan »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Te tengo en una muy alta estima[/b], de corazón, como para jugar con esos detalles. Me has entendido mal Leo, no me referia que lo hicieses de mala fe ^^ Lo que quería decir esque me comentas que la salida es erronea y me la enseñas: 6 36 536 5536 65535 EN FUNCION: [65535] EN MAIN: 65535 Es exactamente la salida que pones en tu primer post. No entiendo, ¿acaso no era esa la salida correcta?
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Función que retorna el valor de retorno de otra función
Programación C/C++
|
naderST
|
7
|
5,088
|
7 Diciembre 2011, 23:45 pm
por naderST
|
|
|
Evaluar Una Funcion dentro de otra funcion Python
Scripting
|
cristiantorres
|
1
|
10,683
|
14 Abril 2012, 06:20 am
por cristiantorres
|
|
|
[javascript] llamar a funcion que se recibe por parametro de la funcion
Desarrollo Web
|
Graphixx
|
0
|
6,015
|
24 Abril 2012, 19:36 pm
por Graphixx
|
|
|
Como llamar a una funcion dentro de otra funcion. Una ayuda urgentemente porfavo
Programación C/C++
|
LobateZZZ
|
1
|
10,844
|
14 Abril 2013, 03:07 am
por rir3760
|
|
|
Conversion de bases, consulta
ASM
|
fofaso
|
4
|
4,541
|
17 Noviembre 2014, 21:14 pm
por fofaso
|
|