Curso de Programación en C/Prog66
Ir a la navegación
Ir a la búsqueda
Prog66
1 #include <stdio.h>
2
3 void a_binario( unsigned long n );
4
5 int main( void )
6 {
7 unsigned long numero;
8 printf( "Que intero quieres convertir en binario (q para terminar)? " );
9 while( scanf( "%lu", &numero ) == 1 )
10 {
11 printf("Equivalente Binario: ");
12 a_binario( numero );
13 putchar( '\n' );
14 putchar( '\n' );
15 printf( "Que intero quieres convertir en binario (q para terminar)? " );
16 }
17 printf( "Listo.\n" );
18
19 return 0;
20 }
21
22 void a_binario( unsigned long n )
23 {
24 int r;
25
26 r = n % 2;
27 if ( n >= 2 )
28 a_binario( n / 2 );
29 putchar( '0' + r );
30
31 return;
32 }
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