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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Solucionado] Problema en codigo C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Solucionado] Problema en codigo C++  (Leído 3,518 veces)
Mario Olivera

Desconectado Desconectado

Mensajes: 108


Ser loco es pensar diferente.


Ver Perfil
[Solucionado] Problema en codigo C++
« en: 23 Julio 2014, 04:52 am »

Hola gente estoy haciendo un ejercicio de un libro que tengo, y nose por qué el programa no me da resultados.....

Dejo el ejercicio así saben de que se trata y por si alguien le gustaría hacerlo (no estoy pidiendo que me hagan el ejercicio)

El ejercicio dice lo siguiente:
Citar
Escriba un programa que reciba como entrada un entero que contenga solo 0s y 1s (es decir, un entero "Binario"), y que imprima su equivalente decimal. Use los operadores módulo y división para elegir los dígitos del número "binario" una a la vez, de derecha a izquierda. En forma parecida al sistema numérico decimal, donde el dígito más a la derecha tiene un valor posicional de 1 y el siguiente dígito a la izquierda tiene un valor posicional de 10, después 100, después 1000, etcétera, en el sistema numérico binario, el dígito más a la derecha tiene un valor posicional 1, el siguiente dígito a la izquierda tiene un valor posicional de 2, luego 4, luego 8, etcétera. Así, el número decimal 234 se puede interpretar como 2*100 + 3*10 + 4*1. El equivalente decimal del número binario 1101 es 1*1 + 0*2 + 1*4 + 1*8.

Ok, el código que hice que no me imprime nada solo la pregunta del main es:

Main.cpp

Código
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4.  
  5. #include "Binario.h"
  6.  
  7. int main()
  8. {
  9. int numero;
  10. cout <<"Ingrese el numero binario para mostrar su equivalente decimal: ";
  11. cin >> numero;
  12. Binario Binario1(numero);
  13. cin.get();
  14. cin.get();
  15. return 0;
  16. }


Binario.h


Código
  1. class Binario
  2. {
  3. public:
  4. Binario(int);
  5. void confirmarNumero(int);
  6.  
  7. };


Binario.cpp
Código
  1. #include <iostream>
  2. using std::cout;
  3.  
  4. #include "Binario.h"
  5.  
  6.  
  7. Binario::Binario(int numero)
  8. {
  9. confirmarNumero(numero);
  10. }
  11.  
  12. void Binario::confirmarNumero(int numero)
  13. {
  14. int numeroDivisor = 10;
  15. int escala = 1;
  16. int numeroSacado;
  17.  
  18. while ((numero / numeroDivisor) == 0)
  19. {
  20.  
  21.  
  22.  
  23. numeroSacado= numero % numeroDivisor;
  24.  
  25. if (escala == 1)
  26. {
  27. cout <<numeroSacado <<"*1 " ;
  28. }
  29. else
  30. {
  31. cout <<numeroSacado <<"*" <<escala <<" ";
  32. }
  33.  
  34. numeroDivisor= numeroDivisor*10;
  35. }
  36. }
  37.  

PD: tengo que desarollar el tema de la variable escala pero eso no influye en el resultado del programa ejecutado


« Última modificación: 25 Julio 2014, 22:07 pm por 718208 » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema en codigo C++
« Respuesta #1 en: 23 Julio 2014, 08:25 am »

El número que recibes se encuentra en binario y tu has de convertirlo a su representación en base 10.

Para convertir un número de una base a otra tienes que ir procesando el número cifra a cifra. Por tanto, almacenar el número en binario no parece una buena idea (además un número en binario ocupa más que el equivalente en decimal: 100 = 8, por lo que almacenar el binario, en un entero como si fuese un decimal te va a limitar el rango de datos).

Lo suyo es que almacenes el número en una cadena de texto (clase string)... entonces recorres dicha cadena de principio a fin y para cada carácter de la cadena haces lo siguiente:

* Multiplicas el resultado parcial por 2
* Sumas la equivalencia decimal del caracter actual: ( '0' = 0, '1' = 1 )

Al finalizar el proceso tendrás la equivalencia decimal del número binario que has introducido.

PD.: El siguiente código

Código
  1. while ((numero / numeroDivisor) == 0)

Solo va a ser verdadero cuando numero < numeroDivisor, es decir, que salvo que metas un "binario" menor que 10 -> 2 en base decimal, el resultado del while va a ser falso... ese es el motivo por el que no te imprime nada.


En línea

Mario Olivera

Desconectado Desconectado

Mensajes: 108


Ser loco es pensar diferente.


Ver Perfil
Re: Problema en codigo C++
« Respuesta #2 en: 25 Julio 2014, 02:23 am »

El número que recibes se encuentra en binario y tu has de convertirlo a su representación en base 10.

Para convertir un número de una base a otra tienes que ir procesando el número cifra a cifra. Por tanto, almacenar el número en binario no parece una buena idea (además un número en binario ocupa más que el equivalente en decimal: 100 = 8, por lo que almacenar el binario, en un entero como si fuese un decimal te va a limitar el rango de datos).

Lo suyo es que almacenes el número en una cadena de texto (clase string)... entonces recorres dicha cadena de principio a fin y para cada carácter de la cadena haces lo siguiente:

* Multiplicas el resultado parcial por 2
* Sumas la equivalencia decimal del caracter actual: ( '0' = 0, '1' = 1 )

Al finalizar el proceso tendrás la equivalencia decimal del número binario que has introducido.

PD.: El siguiente código

Código
  1. while ((numero / numeroDivisor) == 0)

Solo va a ser verdadero cuando numero < numeroDivisor, es decir, que salvo que metas un "binario" menor que 10 -> 2 en base decimal, el resultado del while va a ser falso... ese es el motivo por el que no te imprime nada.

Hola eferion, cambie el código de la función por este:

Código
  1. void Binario::confirmarNumero(int numero)
  2. {
  3. int numeroDivisor= 10;
  4. int escala = 1;
  5. int numeroSacado;
  6.  
  7. cout <<"El equivalente decimal  del numero binario 1101 es: ";
  8.  
  9. while ((numero / numero) != 0)
  10. {
  11. numeroSacado= numero % numeroDivisor;
  12. numero= numero / numeroDivisor;
  13. if (escala != 1)
  14. {
  15. cout <<numeroSacado <<"*" <<escala << " ";
  16. escala*= 2;
  17. }
  18. if (escala == 1)
  19. {
  20. cout <<numeroSacado <<"*" <<escala << " ";
  21. ++escala;
  22. }
  23.  
  24. }
  25. }

Pero no logo entender cual es el error ahora  :-\

PD: con respecto a lo que me dijiste sobre string no entendí muy bien a qué te refieres

« Última modificación: 25 Julio 2014, 02:27 am por 718208 » En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Problema en codigo C++
« Respuesta #3 en: 25 Julio 2014, 03:41 am »

No comprendo la lógica de tu código pero para convertir un número binario a su equivalente en base 10, el cual se encuentra almacenado en un entero seria:

Código
  1. void Binario::confirmarNumero(int numero)
  2. {
  3.    int numeroSacado, escala = 1;
  4.    int decimal = 0;
  5.  
  6.    while (numero > 0)
  7.    {
  8.        numeroSacado = numero % 10;
  9.  
  10.        decimal += escala * numeroSacado;
  11.        escala *= 2;
  12.  
  13.        numero = numero / 10;
  14.    }
  15.    cout << "El equivalente decimal es: " << decimal << endl;
  16. }

Saludos
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema en codigo C++
« Respuesta #4 en: 25 Julio 2014, 09:04 am »

Blaster, perfectamente podrías ahorrarte la variable "escala". Además, teniendo en cuenta que "numero" es una especie de "engendro" por almacenar un número en base 2 como si estuviese en base 10, el código incluso se podría optimizar un poquito más:

Código
  1. void Binario::confirmarNumero(int numero)
  2. {
  3.    int decimal = 0;
  4.  
  5.    while (numero > 0)
  6.    {
  7.        int numeroSacado = numero & 0x01;
  8.  
  9.        decimal = decimal * 2 + numeroSacado;
  10.  
  11.        numero /= 10;
  12.    }
  13.    cout << "El equivalente decimal es: " << decimal << endl;
  14. }

Pero no logo entender cual es el error ahora  :-\

Código
  1. while ((numero / numero) != 0)

¿Qué intentabas ahí exactamente?

A ver, esta parte concreta, lo que se dice funcionar... funciona, pero no es la mejor manera de hacerlo.Si tu idea es que el bucle se repita hasta que "numero sea 0" ¿por qué no usas los operadores de comparación ('==', '!=', '>', '<', '>=', '<=')??

Hay varias alternativas para expresar lo mismo y de forma mucho más clara. Que al final es de lo que se trata, hacer código legible. Te presento tres alternativas ordenadas de la más clara a la menos clara desde mi punto de vista:

* Opción 1: Comprobar si el número es distinto de 0
Código
  1. while ( numero != 0 )

* Opción 2: Comprobar si el número es mayor de 0
Código
  1. while( numero > 0 )

* Opción 3: Comprobar si el número es igual o mayor que 1
Código
  1. while( numero >= 1 )

El problema en sí, que hace qeu no te funcione, es que no estás utilizando en ningún momento la variable "escala"... le asignas valores, eso sí... pero no haces uso de esos valores en ningún momento.

Y luego te faltaría sacar por pantalla el número final.

PD: con respecto a lo que me dijiste sobre string no entendí muy bien a qué te refieres

101 (10 = 1100101 (2 <-- Queda claro que representar un número en base 2 ocupa más memoria que representarlo en base 10.

El número más alto que puedes almacenar en un int es el 2147483647 (2^31 - 1). Si usas este mismo int para almacenar un número en representación binaria, entonces no podrás almacenar números mayores que el 1111111111, que en decimal quedaría representado por el número 1023. Queda claro que el código de tu programa limita muchísimo el rango de números con el que es capaz de trabajar.

La idea que propongo es almacenar el número en una cadena de caracteres y recorrer esos caracteres para ir calculando el número final. Algo del tipo:

Código
  1. std::string cadena;
  2. std::cout << "Introduce un número en binario" << std::endl;
  3. std::cin >> cadena;
  4.  
  5. int numero = 0;
  6. for ( unsigned int i = 0; i < cadena.length( ); i++ )
  7. {
  8.  numero *= 2;
  9.  if ( cadena[ i ] == '1' )
  10.    numero++;
  11. }
  12.  
  13. std::cout << "El equivalente en decimal es: " << numero << std::endl;

Creo que el código resultante es bastante sencillo y fácil de entender.
En línea

Mario Olivera

Desconectado Desconectado

Mensajes: 108


Ser loco es pensar diferente.


Ver Perfil
Re: Problema en codigo C++
« Respuesta #5 en: 25 Julio 2014, 22:05 pm »

Ahí lo he logrado hacer!  ;D

Muchas gracias eferion y Blaster por sus ayudas !  ;-)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[BATCH] problema con código (solucionado) « 1 2 »
Scripting
corax 13 7,445 Último mensaje 10 Noviembre 2009, 15:00 pm
por SuperDraco
[Solucionado] Problema con codigo de RecursosVisualBasic
Programación Visual Basic
Elemental Code 4 3,264 Último mensaje 6 Febrero 2011, 23:06 pm
por Elemental Code
Codigo de Barras VB6[Solucionado]
Programación Visual Basic
[ANTRAX] 2 8,826 Último mensaje 18 Abril 2011, 01:12 am
por [ANTRAX]
[Solucionado] Problema en codigo C++, no se ejecuta el else « 1 2 »
Programación C/C++
Mario Olivera 15 5,847 Último mensaje 30 Julio 2014, 15:03 pm
por leosansan
[Solucionado] Problema con simple código en C++
Programación C/C++
Mario Olivera 1 1,811 Último mensaje 14 Agosto 2014, 21:57 pm
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines