2011-11-25 71 views
1

这是一个非常简单的问题;第一次海报和很长一段时间的形象。用int填充数组,如Char; C++,cin对象

这里是我的二进制到十进制转换器我写道:

#include <iostream> 
#include <cmath> 
using namespace std; 
const int MAX = 6; 
int conv(int z[MAX], int l[6], int MAX); 

int main() 
{ 
    int zelda[MAX]; 
    const int d = 6; 
    int link[d]; 

    cout << "Enter a binary number: \n"; 
    int i = 0; 
    while (i < MAX && (cin >> zelda[i]).get()) //input loop 
    { 
     ++i; 
    } 

    cout << conv(zelda, link, MAX); 

    cin.get(); 
    return 0; 
} 

int conv(int zelda[MAX], int link[6], int MAX) 
{ 
    int sum = 0; 
    for (int t = 0; t < MAX; t++) 
    { 
     long int h, i; 
     for (int h = 5, i = 0; h >= 0; --h, ++i) 
      if (zelda[t] == 1) 
       link[h] = pow(2.0, i); 
      else 
       link[h] = 0; 
      sum += link[t]; 
    } 
    return sum; 
} 

与输入回路的处理方式,我必须按一个数字的每个输入后进入。我还没有添加任何错误更正(也有一些变量是模糊的),但是想输入一个二进制数,例如111111而不是1个输入,1个输入,1个输入等来填充数组。我愿意接受任何技术和其他建议。也许输入它作为一个字符串,并将其转换为一个int?

我会继续研究。谢谢。

+7

你的变量命名是最吸引人的。 –

+1

您的整个输入逻辑非常模糊。你为什么不简单阅读* one *字符串,预计只包含'1'和'0',并将其转换? –

+1

最佳变量命名法,EVAR :)(不得不发表评论:)) – ScarletAmaranth

回答

1

你可以读一个int和解析这样说:

int number = 0; 

cin >> number; 
int i = 0; 
while(i < MAX) 
{ 
    if(number > 0) 
    { 
     zelda[i] = number % 10; // or you can switch to zelda[MAX-(i+1)] 
     number = number/10; 
    else 
    { 
     zelda[i] = 0; 
    } 
    i++; 
} 

编辑:
注意,此转换为小端格式,这意味着如果你键入INT“100”,zelday会充满'001'。

EDIT2:
如果你想从一个字符串得到它,而不是,做到这一点,假设zeldastr大小相同:

string str ("111000"); 
int i; 
for (i=0; i < str.length(); i++) 
{ 
    zelda[i] = (str[i] - '0'); 
} 

之所以这样工作的:
在代表的数字字符列表是顺序的(在这种情况下为ASCII),即数字0表示为48,数字1表示为49,依此类推。所以当你减去'0'的表示时,你会得到实际的数字。

+0

我喜欢这种方法,但我可能需要解决endian格式。绝对有一些想法。 –

+0

切换注释版本'zelda [MAX-(i + 1)]'而不是'zelda [i]',然后切换。 – felipemaia

+0

如果要使用字符串而不是int,则添加代码。 – felipemaia

2

读取数据,see this related question(并用std::cin替换文件流)。

要转换,你可以做一些简单的:

unsigned int convert(const std::string & s) 
{ 
    // maybe check that s.size() <= CHAR_BIT * sizeof(unsigned int) 

    unsigned int result = 0; 

    for (std::string::const_reverse_iterator rit = s.rbegin(), rend = s.rend(); rit != rend; ++rit) 
    { 
    result *= 2; 

    if (*rit == '1') ++result; 

    else if (*rit != '0') { /*error!*/ return -1; } 
    } 

    return result; 
} 
+0

我将阅读该链接,并就如何解决此问题获得另一个角度。看起来,作为一个字符串输入是最好的方法。 –