2011-11-25 28 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

我將閱讀該鏈接,並就如何解決此問題獲得另一個角度。看起來,作爲一個字符串輸入是最好的方法。 –