[Solucionado] Problema en codigo C++

Iniciado por Mario Olivera, 23 Julio 2014, 04:52 AM

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

Mario Olivera

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:
CitarEscriba 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 (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;

#include "Binario.h"

int main()
{
int numero;
cout <<"Ingrese el numero binario para mostrar su equivalente decimal: ";
cin >> numero;
Binario Binario1(numero);
cin.get();
cin.get();
return 0;
}



Binario.h


Código (cpp) [Seleccionar]
class Binario
{
public:
Binario(int);
void confirmarNumero(int);

};



Binario.cpp
Código (cpp) [Seleccionar]
#include <iostream>
using std::cout;

#include "Binario.h"


Binario::Binario(int numero)
{
confirmarNumero(numero);
}

void Binario::confirmarNumero(int numero)
{
int numeroDivisor = 10;
int escala = 1;
int numeroSacado;

while ((numero / numeroDivisor) == 0)
{



numeroSacado= numero % numeroDivisor;

if (escala == 1)
{
cout <<numeroSacado <<"*1 " ;
}
else
{
cout <<numeroSacado <<"*" <<escala <<" ";
}

numeroDivisor= numeroDivisor*10;
}
}


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

eferion

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 (cpp) [Seleccionar]
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.

Mario Olivera

#2
Cita de: eferion 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 (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
void Binario::confirmarNumero(int numero)
{
int numeroDivisor= 10;
int escala = 1;
int numeroSacado;

cout <<"El equivalente decimal  del numero binario 1101 es: ";

while ((numero / numero) != 0)
{
numeroSacado= numero % numeroDivisor;
numero= numero / numeroDivisor;
if (escala != 1)
{
cout <<numeroSacado <<"*" <<escala << " ";
escala*= 2;
}
if (escala == 1)
{
cout <<numeroSacado <<"*" <<escala << " ";
++escala;
}

}
}


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


Blaster

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 (cpp) [Seleccionar]
void Binario::confirmarNumero(int numero)
{
    int numeroSacado, escala = 1;
    int decimal = 0;

    while (numero > 0)
    {
        numeroSacado = numero % 10;

        decimal += escala * numeroSacado;
        escala *= 2;

        numero = numero / 10;
    }
    cout << "El equivalente decimal es: " << decimal << endl;
}


Saludos

eferion

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 (cpp) [Seleccionar]
void Binario::confirmarNumero(int numero)
{
    int decimal = 0;

    while (numero > 0)
    {
        int numeroSacado = numero & 0x01;

        decimal = decimal * 2 + numeroSacado;

        numero /= 10;
    }
    cout << "El equivalente decimal es: " << decimal << endl;
}


Cita de: 718208 en 25 Julio 2014, 02:23 AM
Pero no logo entender cual es el error ahora  :-\

Código (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
while ( numero != 0 )

* Opción 2: Comprobar si el número es mayor de 0
Código (cpp) [Seleccionar]
while( numero > 0 )

* Opción 3: Comprobar si el número es igual o mayor que 1
Código (cpp) [Seleccionar]
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.

Cita de: 718208 en 25 Julio 2014, 02:23 AM
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 (cpp) [Seleccionar]

std::string cadena;
std::cout << "Introduce un número en binario" << std::endl;
std::cin >> cadena;

int numero = 0;
for ( unsigned int i = 0; i < cadena.length( ); i++ )
{
  numero *= 2;
  if ( cadena[ i ] == '1' )
    numero++;
}

std::cout << "El equivalente en decimal es: " << numero << std::endl;


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

Mario Olivera

Ahí lo he logrado hacer!  ;D

Muchas gracias eferion y Blaster por sus ayudas !  ;-)