Curso de Programación en C/Prog66
De WikiCabal
Prog66
#include <stdio.h>
void a_binario( unsigned long n );
int main( void )
{
unsigned long numero;
printf( "Que intero quieres convertir en binario (q para terminar)? " );
while( scanf( "%lu", &numero ) == 1 )
{
printf("Equivalente Binario: ");
a_binario( numero );
putchar( '\n' );
putchar( '\n' );
printf( "Que intero quieres convertir en binario (q para terminar)? " );
}
printf( "Listo.\n" );
return 0;
}
void a_binario( unsigned long n )
{
int r;
r = n % 2;
if ( n >= 2 )
a_binario( n / 2 );
putchar( '0' + r );
return;
}
Resultado
[rrc@Pridd CClase]$ gcc -Wall -O2 -o Prog66 Prog66.c [rrc@Pridd CClase]$ ./Prog66 Que intero quieres convertir en binario (q para terminar)? 1 Equivalente Binario: 1 Que intero quieres convertir en binario (q para terminar)? 2 Equivalente Binario: 10 Que intero quieres convertir en binario (q para terminar)? 3 Equivalente Binario: 11 Que intero quieres convertir en binario (q para terminar)? 4 Equivalente Binario: 100 Que intero quieres convertir en binario (q para terminar)? 5 Equivalente Binario: 101 Que intero quieres convertir en binario (q para terminar)? 55 Equivalente Binario: 110111 Que intero quieres convertir en binario (q para terminar)? 44444555 Equivalente Binario: 10101001100010101110001011 Que intero quieres convertir en binario (q para terminar)? q Listo.
Explicación
Ejemplo para el número 4: El truco está en seguir el flujo de control hasta volver a main(). Notece que la variable r de uno a otro bloque, aunque se llama igual no es la misma. Se crea en cada bloque, posee su propia dirección de memoria y no es sobreescrita por la calculada en otro bloque.
n = 4: <-------- Viene de main()
a_binario (4) --------> n = 4 {
int r; r = 4 % 2; --------> r = 0 if (4 >= 2) <-- Verdadero
a_binario (4/2) --------> n = 2 { int r; r = 2 % 2; --------> r = 0 if (2 >= 2) <-- Verdadero
a_binario (2/2) --------> n = 1 { int r; r = 1 % 2; --------> r = 1 if (1 >= 2) <-- Falso putchar('0' + 1)--------> Imprime 1 return; }
putchar('0' + 0)--------> Imprime 0 return; }
putchar('0' + 0)--------> Imprime 0 return;
} <-------- Vuelve el control a main()
Impresión final: 100