El codigo de mi programa que pasa numeros binarios a base 10

Iniciado por elkiy, 26 Mayo 2013, 03:25 AM

0 Miembros y 2 Visitantes están viendo este tema.

elkiy

Hola amigos, bueno el titulo lo dice todo, hice un programa que puede leer un numero binario de hasta 10 caracteres y  los pasa a base 10. bueno espero que alguno le sirva, o simplemente le guste mi codigo y como he trabajo, siempre separando la interfaz de la implementacion.

Bueno las partes:

MAIN.CPP

Código (cpp) [Seleccionar]
#include "funciones.h"

int main()
{
funciones Objetollamador;
Objetollamador.PedirNumero();
return 0;
}



FUNCIONES.CPP

Código (cpp) [Seleccionar]
#include <iostream>
using std::cout;
using std::endl;
using std::cin;

#include "funciones.h"

void funciones::PedirNumero()
{
int Numero;
int NumeroCaracteres;
cout << "Solo se pueden escribir numeros que contengan 0 y 1 (que sea un numero binario)"
    " y el programa acepta un numero con 10 caracteres o menos, de lo contrario\n"
" el resultado no sera el deseado.\n";
cout << "Escriba su numero:\t";
cin >> Numero;
cout << "Escriba la cantidad de caracteres que tiene su numero:\t";
cin >>  NumeroCaracteres;
cout << "Obteniendo valores...\n";

funciones::ExaminarNumero(Numero,NumeroCaracteres);

}

int funciones::ExaminarNumero(int Numero, int NumeroCaracteres)
{

int NumeroCaracteres1 = NumeroCaracteres;
int Numero1 = Numero;

if (Numero1 <= 9999999999)
{
if (Numero1 > 999999999) // si tiene 10 caracteres
{
int variable;
int division1;
int division2;
int division3;
int division4;
int division5;
int division6;
int division7;
int division8;
int division9;
int division10;

division10 = Numero1 / 1000000000;
variable = Numero1 %   1000000000;
division9 = variable / 100000000;
variable = variable %  100000000;
division8 = variable / 10000000;
variable = variable %  10000000;
division7 = variable / 1000000;
variable = variable %  1000000;
division6= variable /  100000;
variable = variable %  100000;
division5 = variable / 10000;
variable = variable %  10000;
division4 = variable / 1000;
variable = variable %  1000;
division3= variable /  100;
variable = variable %  100;
division2= variable /  10;
variable = variable %  10;
division1 = variable / 1;
variable = variable %  1;

//Pasando a base 10.
division10= division10 * 512;
division9= division9 * 256;
division8= division8 * 128;
division7= division7 * 64;
division6= division6 * 32;
division5= division5 * 16;
division4= division4 * 8;
division3= division3 * 4;
division2= division2 * 2;
division1= division1 * 1;

variable = (division1 + division2 + division3 + division4 + division5 + division6
+ division7 + division8 + division9 + division10);

cout << "NUMERO CONVERTIDO EN: " << variable << endl;
cin.get();
cin.get();


}
if ((Numero1 < 1000000000) & (Numero1 > 99999999)) // si tiene 9 caracteres
{
int variable;
int division1;
int division2;
int division3;
int division4;
int division5;
int division6;
int division7;
int division8;
int division9;
int division10;

division10 = Numero1 / 1000000000;
variable = Numero1 %   1000000000;
division9 = variable / 100000000;
variable = variable %  100000000;
division8 = variable / 10000000;
variable = variable %  10000000;
division7 = variable / 1000000;
variable = variable %  1000000;
division6= variable /  100000;
variable = variable %  100000;
division5 = variable / 10000;
variable = variable %  10000;
division4 = variable / 1000;
variable = variable %  1000;
division3= variable /  100;
variable = variable %  100;
division2= variable /  10;
variable = variable %  10;
division1 = variable / 1;
variable = variable %  1;

//Pasando a base 10.
division9= division9 * 256;
division8= division8 * 128;
division7= division7 * 64;
division6= division6 * 32;
division5= division5 * 16;
division4= division4 * 8;
division3= division3 * 4;
division2= division2 * 2;
division1= division1 * 1;

variable = (division1 + division2 + division3 + division4 + division5 + division6
+ division7 + division8 + division9);

cout << "NUMERO CONVERTIDO EN: " << variable << endl;
cin.get();
cin.get();
}
if ((Numero1 < 100000000 & Numero1 > 9999999) ) // si tiene 8 caracteres
{
int variable;
int division1;
int division2;
int division3;
int division4;
int division5;
int division6;
int division7;
int division8;
int division9;
int division10;

division10 = Numero1 / 1000000000;
variable = Numero1 %   1000000000;
division9 = variable / 100000000;
variable = variable %  100000000;
division8 = variable / 10000000;
variable = variable %  10000000;
division7 = variable / 1000000;
variable = variable %  1000000;
division6= variable /  100000;
variable = variable %  100000;
division5 = variable / 10000;
variable = variable %  10000;
division4 = variable / 1000;
variable = variable %  1000;
division3= variable /  100;
variable = variable %  100;
division2= variable /  10;
variable = variable %  10;
division1 = variable / 1;
variable = variable %  1;

//Pasando a base 10.
division8= division8 * 128;
division7= division7 * 64;
division6= division6 * 32;
division5= division5 * 16;
division4= division4 * 8;
division3= division3 * 4;
division2= division2 * 2;
division1= division1 * 1;

variable = (division1 + division2 + division3 + division4 + division5 + division6
+ division7 + division8);

cout << "NUMERO CONVERTIDO EN: " << variable << endl;
cin.get();
cin.get();
}
if ((Numero1 < 10000000  & Numero1 > 999999) ) // si tiene 7 caracteres
{
int variable;
int division1;
int division2;
int division3;
int division4;
int division5;
int division6;
int division7;
int division8;
int division9;
int division10;

division10 = Numero1 / 1000000000;
variable = Numero1 %   1000000000;
division9 = variable / 100000000;
variable = variable %  100000000;
division8 = variable / 10000000;
variable = variable %  10000000;
division7 = variable / 1000000;
variable = variable %  1000000;
division6= variable /  100000;
variable = variable %  100000;
division5 = variable / 10000;
variable = variable %  10000;
division4 = variable / 1000;
variable = variable %  1000;
division3= variable /  100;
variable = variable %  100;
division2= variable /  10;
variable = variable %  10;
division1 = variable / 1;
variable = variable %  1;

//Pasando a base 10.
division7= division7 * 64;
division6= division6 * 32;
division5= division5 * 16;
division4= division4 * 8 ;
division3= division3 * 4;
division2= division2 * 2;
division1= division1 * 1;

variable = (division1 + division2 + division3 + division4 + division5 + division6
+ division7);

cout << "NUMERO CONVERTIDO EN: " << variable << endl;
cin.get();
cin.get();
}
if ((Numero1 < 10000000  & Numero1 > 99999 )) // si tiene 6 caracteres
{
int variable;
int division1;
int division2;
int division3;
int division4;
int division5;
int division6;
int division7;
int division8;
int division9;
int division10;

division10 = Numero1 / 1000000000;
variable = Numero1 %   1000000000;
division9 = variable / 100000000;
variable = variable %  100000000;
division8 = variable / 10000000;
variable = variable %  10000000;
division7 = variable / 1000000;
variable = variable %  1000000;
division6= variable /  100000;
variable = variable %  100000;
division5 = variable / 10000;
variable = variable %  10000;
division4 = variable / 1000;
variable = variable %  1000;
division3= variable /  100;
variable = variable %  100;
division2= variable /  10;
variable = variable %  10;
division1 = variable / 1;
variable = variable %  1;

//Pasando a base 10.
division6= division6 * 32;
division5= division5 * 16;
division4= division4 * 8;
division3= division3 * 4;
division2= division2 * 2;
division1= division1 * 1;

variable = (division1 + division2 + division3 + division4 + division5 + division6);

cout << "NUMERO CONVERTIDO EN: " << variable << endl;
cin.get();
cin.get();
}
if ((Numero1 < 100000 & Numero1 > 9999)) // si tiene 5 caracteres
{
int variable;
int division1;
int division2;
int division3;
int division4;
int division5;
int division6;
int division7;
int division8;
int division9;
int division10;

division10 = Numero1 / 1000000000;
variable = Numero1 %   1000000000;
division9 = variable / 100000000;
variable = variable %  100000000;
division8 = variable / 10000000;
variable = variable %  10000000;
division7 = variable / 1000000;
variable = variable %  1000000;
division6= variable /  100000;
variable = variable %  100000;
division5 = variable / 10000;
variable = variable %  10000;
division4 = variable / 1000;
variable = variable %  1000;
division3= variable /  100;
variable = variable %  100;
division2= variable /  10;
variable = variable %  10;
division1 = variable / 1;
variable = variable %  1;

//Pasando a base 10.
division5= division5 * 16;
division4= division4 * 8;
division3= division3 * 4;
division2= division2 * 2;
division1= division1 * 1;

variable = (division1 + division2 + division3 + division4 + division5);

cout << "NUMERO CONVERTIDO EN: " << variable << endl;
cin.get();
cin.get();
}
if ((Numero1 < 10000 & Numero1 > 999)) // si tiene 4 caracteres
{
int variable;
int division1;
int division2;
int division3;
int division4;
int division5;
int division6;
int division7;
int division8;
int division9;
int division10;

division10 = Numero1 / 1000000000;
variable = Numero1 %   1000000000;
division9 = variable / 100000000;
variable = variable %  100000000;
division8 = variable / 10000000;
variable = variable %  10000000;
division7 = variable / 1000000;
variable = variable %  1000000;
division6= variable /  100000;
variable = variable %  100000;
division5 = variable / 10000;
variable = variable %  10000;
division4 = variable / 1000;
variable = variable %  1000;
division3= variable /  100;
variable = variable %  100;
division2= variable /  10;
variable = variable %  10;
division1 = variable / 1;
variable = variable %  1;

//Pasando a base 10.
division4= division4 * 8;
division3= division3 * 4;
division2= division2 * 2;
division1= division1 * 1;

variable = (division1 + division2 + division3 + division4);

cout << "NUMERO CONVERTIDO EN: " << variable << endl;
cin.get();
cin.get();
}
if ((Numero1 < 1000) & (Numero1 > 99)) // si tiene 3 caracteres
{
int variable;
int division1;
int division2;
int division3;
int division4;
int division5;
int division6;
int division7;
int division8;
int division9;
int division10;

division10 = Numero1 / 1000000000;
variable = Numero1 %   1000000000;
division9 = variable / 100000000;
variable = variable %  100000000;
division8 = variable / 10000000;
variable = variable %  10000000;
division7 = variable / 1000000;
variable = variable %  1000000;
division6= variable /  100000;
variable = variable %  100000;
division5 = variable / 10000;
variable = variable %  10000;
division4 = variable / 1000;
variable = variable %  1000;
division3= variable /  100;
variable = variable %  100;
division2= variable /  10;
variable = variable %  10;
division1 = variable / 1;
variable = variable %  1;

//Pasando a base 10.
division3= division3 * 4;
division2= division2 * 2;
division1= division1 * 1;

variable = (division1 + division2 + division3);

cout << "NUMERO CONVERTIDO EN: " << variable << endl;
cin.get();
cin.get();
}
if ((Numero1 < 100 & Numero1 > 9) ) // si tiene 2 caracteres
{
int variable;
int division1;
int division2;
int division3;
int division4;
int division5;
int division6;
int division7;
int division8;
int division9;
int division10;

division10 = Numero1 / 1000000000;
variable = Numero1 %   1000000000;
division9 = variable / 100000000;
variable = variable %  100000000;
division8 = variable / 10000000;
variable = variable %  10000000;
division7 = variable / 1000000;
variable = variable %  1000000;
division6= variable /  100000;
variable = variable %  100000;
division5 = variable / 10000;
variable = variable %  10000;
division4 = variable / 1000;
variable = variable %  1000;
division3= variable /  100;
variable = variable %  100;
division2= variable /  10;
variable = variable %  10;
division1 = variable / 1;
variable = variable %  1;

//Pasando a base 10.
division2= division2 * 2;
division1= division1* 1;

variable = (division1 + division2);

cout << "NUMERO CONVERTIDO EN: " << variable << endl;
cin.get();
cin.get();
}
if (Numero1 < 10 ) // si tiene 1 caracter
{
int variable;
int division1;
int division2;
int division3;
int division4;
int division5;
int division6;
int division7;
int division8;
int division9;
int division10;

division10 = Numero1 / 1000000000;
variable = Numero1 %   1000000000;
division9 = variable / 100000000;
variable = variable %  100000000;
division8 = variable / 10000000;
variable = variable %  10000000;
division7 = variable / 1000000;
variable = variable %  1000000;
division6= variable /  100000;
variable = variable %  100000;
division5 = variable / 10000;
variable = variable %  10000;
division4 = variable / 1000;
variable = variable %  1000;
division3= variable /  100;
variable = variable %  100;
division2= variable /  10;
variable = variable %  10;
division1 = variable / 1;
variable = variable %  1;

//Pasando a base 10.
division1= division1 * 1 ;

variable = (division1);

cout << "NUMERO CONVERTIDO EN: " << variable << endl;
cin.get();
cin.get();
}

}
else
{
cout << "El numero ingresado excede el maximo de caracteres permitidos.\n";
}

return 0;
}



FUNCIONES.H

Código (cpp) [Seleccionar]
class funciones
{
public:
void PedirNumero();
int ExaminarNumero(int,int);
};



flony

no soy un especialista pero se me hace que se puede hacer mas corto el code...aplicando un for y una serie para la multiplicación
si un problema no tiene solucion entonces no es un problema...es algo inevitable

satu

Buenas!!

Acabo de hacer esta versión que acepta cualquier longitud y es mucho más corto. He probado algunos valores pero puede que tenga errores.

main.cpp
Código (cpp) [Seleccionar]

#include "Binario.h"


int main() {
    string numero;
    double resultado = 0;
    cout << "Introduce el número: ";
    cin >> numero;
    Binario b(numero);
    resultado = b.convert();
    if(resultado != -1) {
        cout << "El decimal de " << numero << " es " << resultado << endl << endl;
    } else {
        cout << "No has introducido un valor válido" << endl << endl;
    }
    cin.sync();
    cout << "Pulsa Enter para salir...." << endl;
    cin.get();
    return 0;
}



Binario.cpp
Código (cpp) [Seleccionar]

#include "Binario.h"


Binario::Binario(string num) {
    binario = num;
}

bool Binario::isValid() {
    for(unsigned i = 0; i < binario.size(); i++) {
        if(binario[i] != '0' && binario[i] != '1') {
            return false;
        }
    }
    return true;
}

string Binario::reverseString() {
    string cad = string(binario.rbegin(), binario.rend());
    return cad;
}

double Binario::convert() {
    double result = 0;
    if(isValid()) {
        string reversed = reverseString();
        for(unsigned i = 0; i < reversed.size(); i++) {
            if(reversed[i] == '1') {
                result += pow(2, i);
            }
        }
        return result;
    }
    return (-1);
}



Binario.h
Código (cpp) [Seleccionar]

#include <iostream>
#include <string>

using namespace std;

class Binario {

string binario;

    public:
        Binario(string num);
        bool isValid();
        string reverseString();
        double convert();
};



Por supuesto se aceptan críticas  :P

Saludos
Breakbeat como forma de vida

rir3760

En C y C++ se puede utilizar la función strtol para obtener el numero representado por una cadena. En C++ seria mas o menos así:
Código (cpp) [Seleccionar]

cout << "Numero: ";
string palabra;
cin >> palabra;
cout << palabra << " ==> " << strtol(palabra.c_str(), 0, 2) << endl;

El tercer argumento de la función es la base (2 a 36) de la representación en cadena. Mas información sobre la mentada función en sitios como "C Plus Plus".

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

elkiy

bueno con respecto a lo de for, es un ejercicio de un libro, donde me decia que no use for, con respecto a usar string despues no se puede dividir

S2

leosansan

#5
Cita de: Don Olivera en 26 Mayo 2013, 03:25 AM
Hola amigos, bueno el titulo lo dice todo, hice un programa que puede leer un numero binario de hasta 10 caracteres y  los pasa a base 10.

Suponiendo que no vamos a hacer uso de funciones ya implementadas en C/C++ que lo harían de forma automática, no sé dónde me he perdido, pero pedazo de código para hacer eso me parece, cuanto menos, excesivo. No he pillado el por qué de hacer un proyecto con tres ficheros que te cambas. Creo que sinceramente me he perdido algo en la explicación o en el objetivo.

Porque si lo que vamos a hacer es un código que pase a decimal números en binario de no más de diez caracteres, a mí con lo que sigue me sobra, y aún así sé que es muy mejorable (por ejemplo, se podría calcular sin usar strlen la longitud de la cadena, pero estoy un poco vago hoy):


Código (cpp) [Seleccionar]

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
   int i,n=0,longi,potencias_dos[]={1024,512,256,128,64,32,16,8,4,2,1};
   char Numero[10]={0};
   cout << "Escriba en numero en binario: ";
   cin >> Numero;
   longi=strlen (Numero);
   for (i=0;i<Numero[i]!='\0';i++)
       n+=(Numero[i]-'0')*potencias_dos[11-longi+i];
   cout << endl<<n;
   return 0;
}


Sí, ya sé que debí usar fgets, lo usaré en el próximo código.

Y respecto a  lo comentado por satu:


Cita de: satu en 26 Mayo 2013, 14:23 PM
Buenas!!

Acabo de hacer esta versión que acepta cualquier longitud y es mucho más corto.

lamento recordarle que no es así, pues estas limitado al número de dígitos capaz de calcular/manejar en C/C++, que anda por las quince cifras si mal no recuerdo, toda vez  que estas haciendo uso de la función ""pow" en una parte del código. Y las primeras potencias de 2 son:

Citar
0                                                                                1
 1                                                                                2
 2                                                                                4
 3                                                                                8
 4                                                                               16
 5                                                                               32
 6                                                                               64
 7                                                                              128
 8                                                                              256
 9                                                                              512
10                                                                            1,024
11                                                                            2,048
12                                                                            4,096
13                                                                            8,192
14                                                                           16,384
15                                                                           32,768
16                                                                           65,536
17                                                                          131,072
18                                                                          262,144
19                                                                          524,288
20                                                                        1,048,576
21                                                                        2,097,152
22                                                                        4,194,304
23                                                                        8,388,608
24                                                                       16,777,216
25                                                                       33,554,432
26                                                                       67,108,864
27                                                                      134,217,728
28                                                                      268,435,456
29                                                                      536,870,912
30                                                                    1,073,741,824
31                                                                    2,147,483,648
32                                                                    4,294,967,296
33                                                                    8,589,934,592
34                                                                   17,179,869,184
35                                                                   34,359,738,368
36                                                                   68,719,476,736
37                                                                  137,438,953,472
38                                                                  274,877,906,944
39                                                                  549,755,813,888
40                                                                1,099,511,627,776
41                                                                2,199,023,255,552
42                                                                4,398,046,511,104
43                                                                8,796,093,022,208
44                                                               17,592,186,044,416
45                                                               35,184,372,088,832
46                                                               70,368,744,177,664
47                                                              140,737,488,355,328
48                                                              281,474,976,710,656
49                                                              562,949,953,421,312
50                                                            1,125,899,906,842,624
51                                                            2,251,799,813,685,248
52                                                            4,503,599,627,370,496
53                                                            9,007,199,254,740,992
54                                                           18,014,398,509,481,984
55                                                           36,028,797,018,963,968
56                                                           72,057,594,037,927,936
57                                                          144,115,188,075,855,872
58                                                          288,230,376,151,711,744
59                                                          576,460,752,303,423,488
60                                                        1,152,921,504,606,846,976
61                                                        2,305,843,009,213,693,952
62                                                        4,611,686,018,427,387,904
63                                                        9,223,372,036,854,775,808

64                                                       18,446,744,073,709,551,616
65                                                       36,893,488,147,419,103,232
66                                                       73,786,976,294,838,206,464
67                                                      147,573,952,589,676,412,928
68                                                      295,147,905,179,352,825,856
69                                                      590,295,810,358,705,651,712
70                                                    1,180,591,620,717,411,303,424
71                                                    2,361,183,241,434,822,606,848
72                                                    4,722,366,482,869,645,213,696
73                                                    9,444,732,965,739,290,427,392
74                                                   18,889,465,931,478,580,854,784
75                                                   37,778,931,862,957,161,709,568
76                                                   75,557,863,725,914,323,419,136
77                                                  151,115,727,451,828,646,838,272
78                                                  302,231,454,903,657,293,676,544
79                                                  604,462,909,807,314,587,353,088
80                                                1,208,925,819,614,629,174,706,176
81                                                2,417,851,639,229,258,349,412,352
82                                                4,835,703,278,458,516,698,824,704
83                                                9,671,406,556,917,033,397,649,408
84                                               19,342,813,113,834,066,795,298,816
85                                               38,685,626,227,668,133,590,597,632
86                                               77,371,252,455,336,267,181,195,264
87                                              154,742,504,910,672,534,362,390,528
88                                              309,485,009,821,345,068,724,781,056
89                                              618,970,019,642,690,137,449,562,112
90                                            1,237,940,039,285,380,274,899,124,224
91                                            2,475,880,078,570,760,549,798,248,448
92                                            4,951,760,157,141,521,099,596,496,896
93                                            9,903,520,314,283,042,199,192,993,792
94                                           19,807,040,628,566,084,398,385,987,584
95                                           39,614,081,257,132,168,796,771,975,168
96                                           79,228,162,514,264,337,593,543,950,336
97                                          158,456,325,028,528,675,187,087,900,672
98                                          316,912,650,057,057,350,374,175,801,344
99                                          633,825,300,114,114,700,748,351,602,688
¡Cuidado, que te caes!

He marcado en rojo hasta dónde creo se podría calcular sin usar librerías externas,  si hacemos uso de la propia librería de números más grandes del C/C++, la inttypes

Y un código como el que plantea satu, pero recordando que el número de dígitos del número binario a introducir está limitado por lo antes expuesto, sería:


Código (cpp) [Seleccionar]

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cinttypes>
#include <cmath>
using namespace std;

int  main()
{
   uint64_t n=0;
   register int i,j,longi;
   char numero[71={0};
   cout <<  "Entre numero entero en base 2:\t";
   fgets (numero, 20, stdin);
   longi=strlen (numero);
   for (j=0;j<longi-1;j++)
       n+=(numero[j]-'0')*pow(2,longi-2-j);
   cout <<"En decimal es "<< n;
   return 0;
}


Hecho a toda pastilla y, por tanto a mejorar todavía.

Y vuelvo al comienzo, no sé dónde me perdí para que salieran esos códigos tan, como decirlo, tan complejos a simple vista.

Saluditos!. .... ..

CCross

#6
leosansan me gusto el metodo que usas para pasar de binario a decimal pero no
comprendo en que consiste esta operación.

Código (cpp) [Seleccionar]
(numero[j]-'0')

Que hace esto exactamente ya que si multiplicas un número por cero el resultado es
cero por que no directamente pero luego me di cuenta que al quitarle eso obtengo
resultados incoherentes.

Saludos :rolleyes:


leosansan

#7
Cita de: CCross en 26 Mayo 2013, 18:56 PM
leosansan me gusto el metodo que usas para pasar de binario a decimal pero no
comprendo en que consiste esta operación.

Código (cpp) [Seleccionar]
(numero[j]-'0')

Que hace esto exactamente ya que si multiplicas un número por cero el resultado es
cero
por que no directamente pero luego me di cuenta que al quitarle eso obtengo
resultados incoherentes.


La explicación es que numero[j] está declarado como char y para pasarlo a entero le tengo que restar su valor en ascii, que sería restarle 48 o su equivalente que es '0'. Ese es  todo el misterio que encierra esa operación, convertir un caracter ascii a int. Si lo que hubiese necesitado hubiera sido convertir el array numero, declarado como char, a int hubiese podido utilizar una función como atoi u otra de la clase string, que habría sido otra forma de haber declarado a la variable numero en lugar de char, y posiblemente más cómoda. En realidad salió el código que salió porque no me dí cuenta y lo hice en C, pero al ir a postearlo me fijé que estaba en C++ e hice una conversión "rápida", de ahí mi comentario de que es muy mejorable.

Espero haberme explicado meridianamente bien, si no es que fui torpe  ;)

Saluditos!. ... .

CCross

#8
Que despistado soy como no me pude dar cuenta era obvio gracias por la aclaración
mejor no pudo ser se agradece.

Saludos  ;D

rir3760

Cita de: leosansan en 26 Mayo 2013, 17:21 PMpor ejemplo, se podría calcular sin usar strlen la longitud de la cadena, pero estoy un poco vago hoy
No es necesario multiplicar cada dígito por la potencia de 2 correspondiente, en su lugar antes de procesar cada dígito se multiplica el acumulado por la base:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

int main()
{
   char binario[11];
   cout << "Escriba un numero en binario: ";
   cin >> binario;
   
   int num = 0;
   for (int i = 0; binario[i] != '\0'; i++)
      num = num * 2 + binario[i] - '0';
   cout << binario << " == " << num << endl;
   
   return 0;
}


Cita de: leosansan en 26 Mayo 2013, 17:21 PMlamento recordarle que no es así, pues estas limitado al número de dígitos capaz de calcular/manejar en C/C++, que anda por las quince cifras si mal no recuerdo, toda vez  que estas haciendo uso de la función ""pow" en una parte del código.
Ya que no es necesario el uso de la función pow para pasar de binario a decimal la limitante es el numero de bits del acumulador, si se utiliza una variable de tipo int se tienen como mínimo 16, 32 en el caso del tipo long.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language