viernes, 22 de julio de 2011

Convertir de Binario a Decimal en C

Este programa convierte numeros binarios a decimales. Es, creo, completo y fácil de usar y de entender. Es de alguna manera el complemento a el programa anterior que convierte un decimal a binario.

 /*Este programa convierte de binario 
   a decimal */

 #include <stdio.h>
 #define Tamano 35

 // La variable Tamano se fija en 35
 // porque los enteros de cuatro bytes
 // ocupan 32 bits y la ultima entrada
 // de una cadena en un arreglo es \n
 /*Prototipo de funcion Recibe*/
 /* Esta funcion recibe la cadena
    pero no verifica que sea valida */

 void Recibe( int a[]);

 /*Prototipo de funcion Imprime*/
 /* Si la cadena es valida se calcula
 e imprime su equivalente decimal, si no
 se manda un mensaje al usuario y se termina
 el programa */

 void Imprime( int b[]);

 /*///////////////////////////////
 // MAIN
 ////////////////////////////////*/ 

 int main()
 {       // Abre main 
 int arreglo[Tamano];
 // En este arreglo se recibiran los valores
 // de la cadena binaria 
 int evaluar;
 // La variable evaluar lleva el control
 // de la legalidad de la cadena, es decir
 // se introducen los unicos digitos validos 0, 1
 // o se introducen valores invalidos como
 // 9

 // Un  mensaje que avisa al usuario que
 // hace el programa
 printf("\nEste programa recibe un numero "
         "binario y lo convierte a decimal.\n");

 // Se invoca a la funcion Recibe y se le envia
 // la direccion de la primera posicion de arreglo
 Recibe(arreglo);
 // Se calcula e imprime el valor decimal, de 
 // nuevo por referencia 
 Imprime(arreglo);
 return 0;

 }       // Cierra main

 /*////////////////////////////////////
 // FUNCION RECIBE
 ////////////////////////////////////*/

 void Recibe( int a[])
 {  // Abre Recibe 
 /* En el arreglo a se guardaran las 
   entradas de la cadena*/
 int i = 0;
 /* La variable i sirve como contador
    en varios ciclos */
 for( i = 0; i < Tamano; i++ )
 a[i] = ' ';
 // Las entradas se inicializan a ' ' 
 printf("\nIntroduzca un numero binario: \n");

 /*El siguiente while recibe la cadena y la
   asigna al arreglo en una sola linea.
   Observe que al final hay un ;  */

 i = 0;
 // Se pone i = 0
 while ( (a[i++] = getchar()) != '\n' && Tamano > i );
 printf("\n");
 }  // Cierra Recibe 

 /*/////////////////////////////////////
 // FUNCION IMPRIME
 /////////////////////////////////////*/

 void Imprime( int b[] )

 {  // Abre Imprime

 int i;
 int potencia = 1;
 // La variable potencia lleva el valor de la
 // potencia de 2 por la cual se va a multiplicar
 // el digito almacenado dependiendo de su posicion

 int decimal = 0;
 // El equivalente decimal de la cadena binaria 
 // se inicia a 0
 int inicio;
 // La variable inicio se encarga de registrar
 // en donde empieza el primer digito de la cadena.
 // Esta cadena debe leerse de izquierda a derecha.

 // Este ciclo for busca de atras para 
 // adelante el primer digito distinto
 // de ' ' en el arreglo. A partir de
 // ahi se empieza a evaluar el numero
 // binario 

 for ( i = Tamano - 1; i >= 0; i-- )
 {  // Abre for
 if ( ' ' != b[i] )
 {  // abre if  
 inicio = i;
 break; // sale de for
 }   // Cierra if
 }  // Cierra for

 // Este ciclo for evalua cada una de las
 // entradas del arreglo que fueron introducidas 
 // por el usuario, las multiplica por la potencia 
 // de 2 correspondiente a su posicion y los
 // productos los va sumando. La suma total sera
 // el valor decimal del numero. 

 int valido = 1;
 // Si el binario recibido no es valido, no 
 // se puede calcular su valor decimal. Esta 
 // variable controla eso. En principio se establece
 // en 1 o cierto, ya que se asume que el usuario 
 // introdujo un numero valido

  for ( i = inicio; i >= 0; i-- )
 {  // Abre for
 switch( b[i] )
 {  // Abre switch
 case '0':
 decimal += 0*potencia;
 potencia *= 2;
 break;
 case '1':
 decimal += 1*potencia;
 potencia *= 2;
 break;
 default:
 if ( '\n' != b[i])
 {  // Abre if
 printf("\nERROR. LA CADENA NO ES VALIDA!\n");
 valido = 0;  // El binario recibido no 
              // es valido
 printf("\nEste caracter no es valido: ");
 putchar(b[i]);
 printf("\n");
 } // Cierra if
 break;
 }   // Cierra switch
 }  // Cierra for  

 if ( 1 == valido )
 printf("\nEl valor decimal es: %d\n", decimal);
 else
 printf("\nEl numero introducido no es valido.\n");

 }  // Cierra Imprime

7 comentarios:

  1. Gracias buen aporte ademas que tambien se puede hacer de esta manera :
    #include
    #include
    using namespace std;
    int main()
    {
    int B,R,Y,labcod1,labcod2,labcod3,labcod4,labcod5,labcod6,labcod7,labcod8;
    cin>>B;
    labcod1 = ((B/1)%10);
    labcod2 = ((B/10)%10);
    labcod3 = ((B/100)%10);
    labcod4 = ((B/1000)%10);
    labcod5 = ((B/10000)%10);
    labcod6 = ((B/100000)%10);
    labcod7 = ((B/1000000)%10);
    labcod8 = ((B/10000000)%10);

    R=(labcod1+labcod2+labcod3+labcod4+labcod5+labcod6+labcod7+labcod8)%2;
    labcod1=labcod1*1;
    labcod2=labcod2*2;
    labcod3=labcod3*4;
    labcod4=labcod4*8;
    labcod5=labcod5*16;
    labcod6=labcod6*32;
    labcod7=labcod7*64;
    labcod8=labcod8*128;
    Y=labcod1+labcod2+labcod3+labcod4+labcod5+labcod6+labcod7+labcod8;
    R=Y-R;
    cout<<R<<endl;
    return 0;
    }

    ResponderEliminar
    Respuestas
    1. Muchas gracias a ti por compartir el código.

      Eliminar
  2. Hola, yo empecé hace poco a estudiar del libro "como programar en c/c++ y java" cuarta edición de Deitel y en el ejercicio 3.36 la consigna es realizar un programa para pasar de binario a decimal. Les comparto como lo hice yo, parece que anda bien.
    /*Pasar de sistema binario a decimal*/
    #include
    #include

    int main()
    {
    int x,e=1,d=0,n=0,c=0,f=0,g=1;

    printf("Ingrese un numero binario: ");
    scanf("%d",&x);
    while(x/e>=1) { d++; e*=10; }
    e/=10;

    while(c1){ g*=2; f++; }
    else g=0;
    n+=g;
    f=0;
    g=1;
    e/=10;
    c++;
    }

    printf("\nEl numero en el sistema decimal es: %d\n",n);
    return 0;
    }

    Cualquier sugerencia es bienvenida, tengan en cuenta que el ejercicio es del capitulo tres del libro y solo vi hasta el momento if, if else, while y las operaciones básicas (todavía no vi pero seguramente habrá un comando para calcular la potencia, por eso tuve que poner while(d-c-f>1){ g*=2; f++; }
    Me gustaría que alguien lo pruebe y comente porque la mayoría de los ejercicios del libro no están resueltos y es difícil saber si uno va por buen camino ya que estoy estudiando solo. Gracias.

    ResponderEliminar
    Respuestas
    1. corte y pegue pero no salieron bien las dos lineas
      #include <stdio.h
      #include <stdlib.h
      no puse los signos de mayor o igual poque sino se me borran stdio.h y stdlib.h

      Eliminar
  3. recien me doy cuenta que falta una parte del codigo porque al publicar desaparece una parte que estaba entre signo menor y mayor, tratare de subirlo bien mas adelante.

    ResponderEliminar
  4. ahora si, este es el codigo, solo tienen que reemplazar la letra ñ por el simbolo de mayor > porque sino cuando publico desaparece todo lo que esta entre los simbolos menor y mayor.

    /*Pasar de sistema binario a decimal*/
    #include <stdio.hñ
    #include <stdlib.hñ

    int main()
    {
    int c1=0,c2=0,k=0,a=1,b,x=1,d=0;

    printf("Ingrese un numero binario: ");
    scanf("%d",&b);
    while(b/añ=1) { k++; a*=10; }
    a/=10;

    while(c1<k){
    if((b/a%10)==1)
    while(k-c1-c2ñ1){ x*=2; c2++; }
    else x=0;
    d+=x;
    x=1;
    a/=10;
    c2=0;
    c1++;
    }

    printf("\nEl numero en el sistema decimal es: %d\n",d);
    return 0;
    }

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...