Curso de Programación en C/Prog66

De WikiCabal
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