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 c que c++. 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.