2016-07-24 42 views
1

我正在一個hang子手遊戲,我想弄清楚爲什麼不管用戶輸入什麼類型,它會返回「該字母已被使用\ n」;C++二進制搜索返回(找到)無論用戶類型

下面是函數定義...

bool binarySearch(char usedLetters[], int used, char letterToFind) 
{ 

    bool found = false; 
    int mid = 0, first = 0, last = used - 1; 
    while (!found && first <= last) 
    { 
     mid = (first + last)/2; 
     if (usedLetters[mid] == letterToFind) 
      found = true; 
     else if (usedLetters[mid] > letterToFind) // works on ascending sorted collections only 
      last = mid - 1;    // first half 
     else 
      first = mid + 1;   // last half 
    } 
    if (found) 
     return mid; 
    return -1; 
} 

這裏是聲明...

char gLetter; 
int wrong = 0; 
int gameStatus = 5; 
int chances = 0; 
int used = 0; 
int letterIndex; 

,這裏是主內的函數調用...

while (wrong != 6)       // Function to find out which hangman board to print to user 
{ 
    cout << "<<<<<<<<<< MAKE A GUESS >>>>>>>>>>\n"; 
    cout << "Guessed Letters: " << usedLetters << endl; 
    cout << "\nEnter a letter to guess: "; 
    cin >> gLetter; 
    gLetter = toupper(gLetter); 

    usedLetters[used++] = gLetter; 

    letterIndex = binarySearch(usedLetters, used, gLetter);  // Binary search for letters used 

    bubbleSort(usedLetters, used); 

    if (letterIndex == -1) 
    { 
     continue; 
    } 

    else 
    { 
     cout << "That letter has already been used\n"; 
    } 

只需要弄清爲什麼用戶輸入的字符在他們還沒有被使用時總是被找到。我認爲它是因爲我聲明「int used = 0」,但是當我將其更改爲26之類的其他內容時,二進制搜索不會返回任何字母。

+0

小心,usedLetters沒有分配預內存和C++在涉及到時非常愚蠢:它只是在數組的末尾寫入數據。 (或者至少,我沒有看到你是如何分配它的,但[used ++]讓我很緊張 – user1582024

+0

另外,你的binaryserach實現有一個溢出問題:'mid =(first + last)/ 2'應該是' mid = first +(last-first)/ 2' – user1582024

+1

您正在從'bool'類型函數中返回'int mid,-1'。 – Shravan40

回答

4

false是0.還有其他的是true

bool binarySearch(char usedLetters[], int used, char letterToFind) 
... 
    if (found) 
     return mid; 
    return -1; 

只會返回false,如果你發現在指數爲零的東西(mid爲0)。

又見http://ideone.com/2XU2bn

- 編輯 -

你表明你只是想知道,如果這封信是存在,所以才返回found

+0

我很困惑我會怎麼做解決這個問題,我需要改變使用的值,以便第一個仍然小於最後(第一個<=最後一個),如果是這個值是什麼? –

+1

@GregoryKinsey你想回報什麼?信件是否被找到或者它被發現在什麼位置?如果你想返回它是否被發現,只需返回找到。如果要返回該位置,請將返回類型更改爲int。 – kfsone

+0

所以用戶輸入的字母都應放在usedLetters數組中。因此,如果用戶輸入A,則應將A放入該數組中,並且此binarySearch試圖查找用戶是否已輸入A.因此,如果用戶第二次輸入A,則程序應該返回「該字母已被使用」。問題是,不管用戶輸入什麼字母,它總是返回「那封信已被使用」,而不是繼續遊戲。 –