2016-12-11 9 views
-1

コンピュータに9桁の2進数を7回推測させる方法と、入力された数字が正しく出力されるようにする方法を理解しようとしています。C++コンピュータに数字を推測させる

また、2進数の0と1の数をどのように数えるのか分かっている人は、std :: count()を読み込もうとしましたが、C++の新機能として理解できませんでした。

乾杯。

void breakyourcode() 
    { 
     cout << "You have picked break your code" << endl; 
     string guess; 
     int tries = 7; 
     srand(time(NULL)); 
     int index = rand() % 512; 
     string cGuess = index2code(index); 
     cout << cGuess << endl; 

     cout << "Enter a number: "; 
     cin >> guess; 

     do { 
      cout << "\nComputer's guess: " << endl; 
      cout << cGuess; 
      ++tries; 

      if (guess == cGuess) { 
       cout << "Yeeha! I won!" << endl; 
       system("PAUSE"); 
       break; 
      } 
      cGuess = rand() % 512; 

     } while (guess != cGuess); 

     return; 
    } 

答えて

0

2進数は数字の単なる数値です。任意の古い有理数は2進数で表すことができます(コンピュータは別の方法では動作しません)。

数値をバイナリ形式で出力しますか? 5の代わりに00000101

ので、このスタブプログラムは(hereから取られた)どのようにあなたが表示されます:あなたの質問の私の解釈で

#include <bitset> 
#include <iostream> 

int main() { 
    int x = 5; 
    std::cout << std::bitset<8>(x) << std::endl; 
} 
0

私はあなたが未署名の数をしたいと仮定 - 私はこれは符号付き整数で動作する必要がありますねかかわらずまあまあ。

もう1つの前提は、数字を1と0として入力し、文字列に入れて、convertBinaryNumberStringToIntで整数unsignedに変換することです。

あなたの番号のバイナリ形式で何個あるのかを数えるために特別に作られたhowManyOnesという機能を含め、あなたができることを示唆するいくつかのコードがあります。

#include <iostream> 
#include <string> 

// For CHAR_BIT 
#include <climits> 

// For std::reverse, but you could 
// write your own string reverse function 
#include <algorithm> 

unsigned convertBinaryNumberStringToInt(const std::string& stringNumber) 
{ 
    unsigned outputNumber = 0; 

    // Using a reversed string allows us to insert ones in the 
    // number's binary form from right to left while still using 
    // a range-based for loop with not much tinkering 
    std::string reversedStrNum = stringNumber; 
    std::reverse(reversedStrNum.begin(), reversedStrNum.end()); 


    unsigned i = 1; 

    // i starts as 00000000000000000000000000000001 (binary, assuming 32 bits integer) 
    // On each iteration of the for loop, the 1 is shifted left and, 
    // if the current character is '1', the value 1 is copied into 
    // its corresponding current position in outputNumber 
    for(char c : reversedStrNum) 
    { 
     if(c == '1') 
     { 
      // The bitwise-or operation copies the 1 in i to 
      // its corresponding position in outputNumber 
      outputNumber = outputNumber | i; 

     } 
     // Shift i's 1 to the left by one position 
     i = i << 1; 
     // You could also do i *= 2, but we're specifically shifting 
     // bits, so the bitshift seems more "semantic" 
    } 

    return outputNumber; 
} 

bool isStringCorrect(std::string& userString, size_t maxSize) 
{ 
    if(userString.size() > 9) 
     return false; 

    for(char c : userString) 
     if(c != '1' && c != '0') 
      return false; 

    return true; 
} 

unsigned computerGuess(unsigned highBound) 
{ 
    return rand() % highBound; 
} 

unsigned howManyOnes(unsigned number) 
{ 
    unsigned count = 0; 
    unsigned shifter = 1; 

    // For each bit: sizeof(unsigned) is the size in bytes 
    // of an unsigned, CHAR_BIT is the bit length of a char or byte 
    // So we loop through each bit position. 
    for(unsigned i = 0; i < CHAR_BIT * sizeof(unsigned); i++) 
    { 
     // What we do is we test our number against the shifter 
     // for each bit position. If a bitwise-and between both 
     // is non-zero, it means number has 1 in that position, 
     // so we increase the "one" count. 
     if((number & shifter) != 0) 
      ++count; 

     // Either way, we left-shift the one in shifter afterwards 
     shifter = shifter << 1; 
    } 

    return count; 
} 

int main() 
{ 
    std::string userChoiceNumberString; 
    std::cout << "Enter a number: "; 
    std::cin >> userChoiceNumberString; 

    if(!isStringCorrect(userChoiceNumberString, 9)) 
    { 
     std::cout << "Entered string is incorrect" << std::endl; 
     return -1; 
    } 

    unsigned userChoiceNumber = convertBinaryNumberStringToInt(userChoiceNumberString); 

    std::cout << "Your number has " << howManyOnes(userChoiceNumber) << " ones in binary." << std::endl; 

    int attempts = 7; 
    while(attempts > 0) 
    { 
     if(computerGuess(512) == userChoiceNumber) 
     { 
      std::cout << "Yeeha! I won!" << std::endl; 
      attempts = 0; 
     } 
     else 
     { 
      std::cout << "Hmmm... guessed wrong..." << std::endl; 
      --attempts; 
     } 
    } 

    return 0; 
} 
関連する問題