2017-08-10 81 views
-1

我是C++和編程的超級新手,我需要一些幫助。我不明白爲什麼當電腦猜到我的號碼時它會無限循環。目前我已經在最後放置了一個休息功能。任何意見,將不勝感激。無限循環與do函數

// Computer guesses number 

#include <iostream> 
#include <ctime> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    srand(static_cast<unsigned int>(time(0))); // Generates random number 

    int myNumber; // My number. 
    int computersNumber = 0; 
    int tries = 0; 
    int highest = 100; // Highest number the computer has put. 
    int lowest = 1; // Lowest number the computer has put. 

    cout << "\tHello, in this game the computer will try to find your number.\n\n"; 
    cout << "Please insert your number (1 - 100): "; 
    cin >> myNumber; // My number, that the computer is going to guess. 

    while (myNumber <= 0 || myNumber >= 101) // Checks if user has inputed a legal number. 
    { 
     cout << "You entered an illegal number. Please type a new one.\n"; 
     cin >> myNumber; // If user made an illegal choice it asks to input a new one. 
    } 

    do 
    { 
     int computersNumber = rand() % (highest - lowest) + lowest; 
     ++tries; // adds +1 every time computer guesses wrong number. 

     if (myNumber > computersNumber) 
     { 
      cout << "The computer guessed: " << computersNumber << "\n"; 
      lowest = computersNumber + 1; 
     } 
     else if (myNumber < computersNumber) 
     { 
      cout << "The computer guessed: " << computersNumber << "\n"; 
      highest = computersNumber - 1; 
     } 
     else 
     { 
      cout << "Computer guessed your number in " << tries << " tries.\n"; 
      break; // infinite loop if this wasn't here. 
     } 

    } while (myNumber != computersNumber); 

    return 0; 
} 
+2

當你用調試器遍歷該循環時會發生什麼? – MrEricSir

+0

Off topic:'//生成隨機數字'種子隨機數發生器,實際上。 – user4581301

+0

不知道這個賦值是否很重要,但是如果用戶輸入的值不能轉換爲整數,你也會得到一個無限循環。例如:請插入您的電話號碼(1 - 100):FOO! 'cin'將被置於錯誤狀態,並拒絕進一步讀取輸入,直到錯誤被清除,並且由於它永遠不會被清除,所以要求輸入的循環永遠不會接收新的輸入並永遠旋轉。 – user4581301

回答

3

您已經在循環中聲明瞭另一個名爲computersNumber的變量。 while語句中使用的computersNumber是您在主函數中聲明的另一個變量。

您可以通過在循環中使用相同的變量解決這個問題:

改變這一行

int computersNumber = rand() % (highest - lowest) + lowest; 

並刪除int關鍵字。

computersNumber = rand() % (highest - lowest) + lowest; 

你可以閱讀下面的鏈接詳細瞭解變量的作用域:
https://www.tutorialspoint.com/cplusplus/cpp_variable_scope.htm

+0

非常感謝! – Steb

3

您的問題是您在do-while循環內重新聲明computersNumber。這創建了變量的一個新的本地實例,即執行do-while使用的所有變量,但while()語句本身中的條件仍然引用在main()方法中聲明的computersNumber變量,該變量未被更改,因爲int computersNumber = rand() % (highest - lowest) + lowest;告訴C++在do-while循環中創建一個新變量,而不是修改main中的原始變量。

要修復它,改變這一行:

int computersNumber = rand() % (highest - lowest) + lowest; 

要這樣:

computersNumber = rand() % (highest - lowest) + lowest; 
+0

非常感謝! – Steb

3

您在聲明do循環中一個新的變量: int computersNumber = rand() % (highest - lowest) + lowest;

這個定義裏面循環範圍並且在do { }塊之外不可見。

while (myNumber != computersNumber);你條件被檢查對從環路,這始終是0。

int computersNumber = 0;定義的解決將是重新使用循環內的現有變量,而不是創建一個新的,所以取出int從以下行:

int computersNumber = rand() % (highest - lowest) + lowest;

,而使用

computersNumber = rand() % (highest - lowest) + lowest;

+0

非常感謝! – Steb

0

您在兩個點聲明computersNumber。所以你有一個設置爲零,int computersNumber = 0;和在另一個點你分配一個隨機數到int computersNumber = rand() % (highest - lowest) + lowest;

一個被設置爲零的就是你正在檢查的那個,因爲被設置爲一個隨機數的那個只有它所設置的每個迭代的範圍。這意味着循環外部computersNumber始終爲零,並且在循環內使用隨機值創建新的computersNumber。所以只要myNumber未設爲零,就會有無限循環。

爲了解決這個問題剛剛從int computersNumber = rand() % (highest - lowest) + lowest;刪除int,使其computersNumber = rand() % (highest - lowest) + lowest;和每次循環中,您將設置computersNumber爲隨機值,如果該隨機值匹配myNumber會破環。