0

Tengo una duda, a la hora de realizar la conversión de un numero dado por el usuario y después de haber pasado el ciclo, no me muestra todos los valores el array y no se en que parte este el error, estoy evaluando div_t para las funciones de quot y rem. Al pedir un dato pido el 29 y sale de resultado 10000000000. Muchas gracias por su ayuda y atención.

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include <iostream>
#include <cstdlib>
int n= 10;
int T[10];  // Arreglo de tamaño de 10 posiciones
int i = 0, cociente, numero;     // Variable para aumentar de posición en el arreglo, gaurdar cociente y variable para guardar numero de usuario
int main(){
    div_t res;                   //res sera del tipo especial div_t
    printf("Introduce el numero a convertir de decimal a binario ");
    scanf("%i", &numero);        // Usuario introduce un valor
    do{                          //inicia funcion
        res = div(numero,2);     //res guardara le division del numero sobre 2
        cociente = res.quot;     //cociente guardara el valor de residuo
        T[i]=res.rem;            //Almacenara el valor de residuo en el vector
        i++;                     //Aumentara el valor del vecto en 1
    }while(cociente !=0 && i<=T[i]);      //mientras cociente sea 0 y i < T, volver a hacer el ciclo.
    for(int i=10;i>0;i--){               //Imprimir los valores del array de manera inversa
        printf("%i", T[i]);
    }
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82

1 Answers1

1

Problema

Sólo das una vuelta al bucle de conversión:

do{
    res = div(numero,2);
    cociente = res.quot;
    T[i]=res.rem;
    i++;
}while(cociente !=0 && i<=T[i]);

Cuando compruebas que cociente no es 0 el resultado es true, pero en la primera comprobación verificas que i sea menor o igual a T[i] en esa primera vuelta i ya vale 1 (acabas de hacer i++) y T[i] posiblemente vale 0, dado que 1 no es menor o igual a 0 el bucle finaliza.

Dije que T[i] es posiblemente 0 porque no has inicializado T:

int T[10];  // Arreglo de tamaño de 10 posiciones

Entonces su contenido será aleatorio, si quieres que todas las posiciones sean 0 deberías hacer:

int T[10]{};  // Arreglo de tamaño de 10 posiciones
//       ~~ <--- Inicializa T a lista vacío: todo valores 0.

Por otro lado, la comprobación i<=T[i] es absurda. La formación1 T sólo va a almacenar valores cero o uno (pues es un número binario) mientras que i variará de 0 en adelante, cuando i valga más de 1 tu bucle finalizará irremediablemente sin haber acabado su tarea.

Solución

La condición del bucle debe ser que numero no sea más divisible, no que el cociente no sea 0 y que T[i] sea menor o igual a i. Así pues divide numero entre 2 en cada vuelta y cuando sea 0 habrás acabado.

Otras cosas a tener en cuenta.

  • Tu código parece más que . De hecho puedes etiquetarlo como C++ sólo por haber incluido cabeceras de este lenguaje, las cabeceras <stdio.h>, <stdlib.h> y <math.h> son de C, las versiones de C++ son <cstdio>, <cstdlib> y <cmath> y son esas las que deberías usar (lee este hilo para más información al respecto), así que has incluido dos veces la misma librería pero en versión C (<stdlib.h>) y C++ (<cstdlib>) además de haber incluido dos librerías de interacción con la consola de C (<stdio.h>) y C++ (<iostream>).
  • Tanto C como C++ disponen de un operador que permite obtener el resto de una división, es el operador %. La función div está pensada para ofrecer el resto de divisiones en coma flotante, ya que el operador de resto sólo funciona con enteros. Dado que estás trabajando con enteros usa ese operador.
  • printf y scanf son funciones de C incluidas desde la cabecera <stdio.h>, dado que has etiquetado la pregunta como C++ deberías estar usando std::cin y std::cout.
  • Un do-while no es una función.
  • En C++ se aconseja que las variables tengan el ámbito más pequeño posible, tus variables n, T, i, cociente y numero tienen ámbito global, deberían ser de ámbito local a main.
  • La función main debe devolver un entero.
  • C++ indexa desde 0, así que la formación1 T tiene índices de 0 a 9, por lo que tu bucle de impresión debería empezar en 9 y continuar mientras i sea mayor o igual a 0.
  • Usa pre incremento/decremento siempre que te sea posible (lee este artículo para más información al respecto).

Teniendo cuenta todo lo anterior, tu programa podría quedar así:

// Solo necesitas la cabecera iostream
#include <iostream>

int main(){
    /* Las variables son de ambito local
    el residuo lo guardas en T, asi que
    no necesitas una variable para controlarlo. */
    int i{}, numero{}, T[10]{};

    // Usa cout, no uses printf
    std::cout << "Introduce el numero a convertir de decimal a binario\n";
    // Usa cin, no uses scanf
    std::cin >> numero;

    do {                          // Inicia el bucle de conversion
        T[i] = numero % 2;        // Almacena el valor de residuo en el vector
        numero /= 2;              // Divide el numero para el siguiente ciclo
        ++i;                      // Avanza la variable de control (con pre-incremento)
    } while(numero);              // Verifica si ha finalizado el proceso

    // Imprimir la formación de manera inversa,
    // empezando en 9, acabando en 0, usando pre-decremento.
    for (int i = 9; i > 0; --i) {
        // Usa cout, no uses printf
        std::cout << T[i];
    }

    // Es necesario devolver un entero.
    return 0;
}

1También conocida como arreglo, o como array en inglés.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Muchas gracias por tu ayuda Paula, bueno ya agregue la inicializacion como me indicas pero sigue arrojandome el mismo resultado, segun se el indice del array debe inicializarse en 0 y en la evaluacion del while debe ver si el cociente es diferente de 0 o el array no esta lleno, segun entiendo yo. – Raul Velasquez Jan 26 '18 at 20:28
  • Es que tu algoritmo está mal, tendrás que repensarlo; yo sólo te he indicado por qué el resultado es `10000000000`... que es porque sólo das una vuelta a tu bucle. – PaperBirdMaster Jan 26 '18 at 20:30
  • Lo seguiré analizando, gracias – Raul Velasquez Jan 26 '18 at 20:35