2013-02-15 69 views
0

函數require()中的循環需要3個條件,a> b或「a」或「b」不是數字。即使我不滿足條件並放入2個整數,它只是再次循環。布爾條件在do-while循環中無法正常工作

另外,當我把一個字符,然後它只是無休止地循環「輸入最小數字輸入最大數量」忽略了cins。有人知道爲什麼我是初學者所以這可能是真的很明顯

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

using namespace std; 

int random(int minN, int maxN) //generates random number within specified range 
{ 
    srand (time(NULL)); 
    int x = (maxN - minN); 
    int y = minN + (rand() % (x+1)); 
    return y; 
} 

int require()  //makes sure a < b and both are digits 
{ 
    int a,b; 
    do { 
    cout << "Enter minimum number" << endl; 
    cin >> a; 
    cout << "Enter maximum number. Note: Has to be greater or equal to minimum." << endl; 
    cin >> b; 
    } while (a > b || !isdigit(a) || !isdigit(b)); 

    return random(a,b); 
} 

int main() 
{ 
    cout << require() << endl; 
} 
+0

對不起,我的措辭 – Foxic 2013-02-15 06:21:34

+1

'isdigit'是測試人物。如果您將整數作爲參數傳遞,它會將它們解釋爲特定編碼下的字符(取決於區域設置)。 – jogojapan 2013-02-15 06:22:31

+0

另外,當我滿足條件時,你又指什麼意思,再次循環_。這就是do-while循環的工作原理:只要條件滿足,它就會循環。當條件不再滿足時停止。 – jogojapan 2013-02-15 06:24:16

回答

1

你不應該使用isdigit,因爲這涉及到一個特定的字符是數字。取而代之的是循環應該是這樣的:

int require()  //makes sure a < b and both are digits 
{ 
    validNumbers = true; 
    do 
    { 
     cout << "Enter minimum number" << endl; 
     cin.clear(); 
     cin >> a; 
    } while (cin.fail()); 

    do 
    { 
     cout << "Enter maximum number. Note: Has to be greater or equal to minimum." 
      << endl; 
     cin.clear(); 
     cin >> b; 
    } while (cin.fail() || a > b); 

    return random(a,b); 
} 

PS:你只需要在程序開始調用一次srand (time(NULL));

+0

這正是我所尋找的,非常感謝 – Foxic 2013-02-15 06:38:39

1

您正在閱讀的數字作爲,以及,數字不是字符作爲isdigit功能的期望。如果您使用的是C++ 11兼容標準庫,則如果輸入不是有效的整數,則ab的值實際上爲零,這意味着例如!isdigit(a)將是true。如果您使用的是非C++ 11庫,則ab的值將是隨機的,並且很可能會導致!isdigit(a)爲真,以及完整的32位整數中的有效數字ASCII值的數量範圍很小。


如果你看了一則關於輸入操作的參考,像this one你會看到,如果提取失敗,則流failbit將被設置。這可以測試「內聯」是這樣的:

if (!(std::cin >> a)) 
{ 
    std::cout << "Not a valid number, try again: "; 
    continue; 
} 

或者也可以使用流fail功能進行測試。

+0

我明白了,我能做些什麼呢?我不太懂,但會像atoi一樣工作? – Foxic 2013-02-15 06:27:09

+0

@Foxic請參閱我的更新回答 – 2013-02-15 06:31:29

+0

謝謝,我以爲我不知道這一點是愚蠢的,但我只是沒有學到足夠的語法 – Foxic 2013-02-15 06:35:34