Pequeña duda C#

Vikkktor

Buenas, estoy haciendo un ejercicio para clase en C# pero tengo un error y no sé como resolverlo, a ver si me podéis echar un cable!

Es un programa en el que introduciendo un número en decimal, te da su equivalente en binario.

He hecho esto:

[code]class Program
{
    static void Main(string[] args)
    {
        int numero;
        string resultado = "";
        string resultadoInverso;
        int resto;
        Console.Write("Introduzca un número en sistema decimal, y se le mostrará en binario :");
        numero = Convert.ToInt32(Console.ReadLine());
        do
        {
            resto = (numero % 2);
            resultado = resultado + resto;
            numero = (numero / 2);
        }
        while ((numero / 2) != 0);
        resultadoInverso = resultado;
        Console.WriteLine("El número {0} en binario es {1}", numero, resultadoInverso);
    }
}[/code]

El caso es que el programa se me queda una operación por detrás y no veo donde está el fallo.
Por ejemplo, el número 5, para conseguir su binario juntamos todos los restos que obtengamos de dividir el número entre 2, hasta que el cociente sea cero.
En este caso obtendríamos tres restos por el camino, "1", "0" y "1", 5 en binario es 101, pero el programa solamente me devuelve "10", siempre se come la última cifra y no sé por qué.

Y por último, el resultado final se obtiene dando la vuelta a la cadena, pero no sé como hacerlo, en resultadoInverso iría la cadena invertida, ¿Cómo se invierte una cadena?.

Gracias de antemano.

Un saludo.

eXtreM3

A ver, creo que lo de invertir el string no te hace falta, simplemente cambiando esta línea en el while:

resultado = resto + resultado;

ya se te pondrá en orden correcto. Si sigue sin funcionar avisa y lo miro mejor mañana sobre código.

3 respuestas
Wasd

#2 Lo he probado y no me ha funcionado.

#1 Con este código te queda el ejercicio completo (te lo he hecho en Java, pero se adapta fácilmente a C#:

spoiler

-Te faltaba una variable que guardase el número inicial de forma perpetua, ya que lo guardabas en "int numero" y luego ejercías modificaciones sobre esa variable para el while.

  • Te he cambiado el do while por un while a secas, me ha parecido más cómodo.
  • He añadido la variable
    boolean par = true;
    , que lo que hace es mantenerse en true por defecto, y si el numero introducido es impar, pasa a false, lo cual hace que se le sume "1" a la última posición de "resultado" tras salir del while.
  • He tenido que usar varios imports para hacer el programa, C# no se si los necesita, en cualquier caso para adaptar ese código a tu ejercicio tendrás que quitarlos o cambiarlos.
  • La parte que quizás menos entiendas, porque no estaba en tu código es
    resultadoInverso = new StringBuffer(resultado).reverse().toString();
    . Lo que hace es darle la vuelta al String "resultado" con una función predefinida de Java (reverse()), y como devuelve un resultado de tipo StringBuffer, se pasa a String mediante otra función predefinida, toString(). Tras todo esto, le asigna el valor obtenido a "resultadoInverso". Me imagino que en C# tendrás que alterar esta linea, pero lo importante es saber qué hace y por qué lo hace.
Soltrac
while ((numero / 2) != 0); 

por

while (numero != 0); 

Para invertir el resultado, lo que dice #2.

1 1 respuesta
T

Lo dicho por #4. Dentro del bucle ya haces la división entera por 2 una vez has cogido el resto. Al volver uan divisón en la comprobación del while te "adelantas" un bucle ya que el numero ya contiene el valor actualizado.

Para invertir el string diria que existe una función que lo realiza.

Si me equivoco y no existe siempre puedes mirar la largada del string y hacer un bucle que empiece al final del string y vaya cogiendo los char 1 a 1.

A malas puedes remplazar el string por un heap, ir apilando y después desapilar para dar el resultado.
No creo que sea necesario niunguna de estas dos últimas soluciones ya que estoy casi seguro que existe una función que inversa una palabra.

Lo de #2 no sé si funciona pero si es así es una solución más rápida y sencilla que las que he puesto.

Vikkktor

al final lo hice así:

 class Program
    {
        static void Main(string[] args)
        {
            int numero;
            int numeroIntroducido;
            string resultado = "";
            string resultadoInverso = "";
            int resto;
            Console.Write("Introduzca un número en sistema decimal, y se le mostrará en binario :");
            numero = Convert.ToInt32(Console.ReadLine());
            numeroIntroducido = numero;
            for (numero = numero; numero != 0; numero = numero / 2)
            {
                resto = (numero % 2);
                resultado = resultado + resto;
            }
            for (int i = resultado.Length - 1; i >= 0; i--)
            {
                resultadoInverso = resultadoInverso + resultado.Substring(i, 1);
            }
            Console.WriteLine("El número {0} en binario es {1}", numeroIntroducido, resultadoInverso);
        }
    }

Usuarios habituales