2011-11-03 81 views
1

我試圖讓代碼檢查用戶輸入是否在10和100之間(並且包括)。如何爲此代碼創建檢查?

因爲它只用於單個輸入,所以我遇到了麻煩,因爲它是一個數組。 ..

int main() 
{ 
    int numlist[20]; 

    for(int i = 0; i < 20; i++) 
    { 
     cout << "Enter # " << i + 1 << " : "; 

     // here is where I am going wrong... 

     if ((numlist[i] <= 100) && (numlist[i] >= 10)) 
     { 
      cin >> numlist[i]; 
     } 
    } 
} 

回答

6

你不應該把輸入語句cin >> numlist[i]測試if ((numlist[i] <= 100) && (numlist[i] >= 10))過嗎?

2

它看起來像你想要做這樣的事情:

int temp = 0; 

for (int i = 0; i < 20; i++) 
{ 
    cin >> temp; 
    if ((temp <= 100) && (temp >= 10)) 
    numlist[i] = temp; 
} 
2

只給一個稍微不同的方式,你可以做到這一點,你可以考慮vector而不是數組,並讀取與數據istream_iterator一個標準的算法一起:

std::vector<int> numlist; 

std::remove_copy_if(std::istream_iterator<int>(std::cin), 
        std::istream_iterator<int>(), 
        std::back_inserter(numlist), 
        [](int i)->bool { return i<10 || i > 100; }); 

編輯:我想因爲我使用C++ 11的λ,我也用C++ 11 copy_if,這一點更是直接表達了意圖:

std::copy_if(std::istream_iterator<int>(std::cin), 
      std::istream_iterator<int>(), 
      std::back_inserter(numlist), 
      [](int i)->bool { return i>=10 && i<=100; }); 

至於「聰明」去,這不是意圖在所有 - 而不是,有什麼需要的是原始意圖的簡單,直接的表現:從標準輸入複製(過濾)數據的容器。要習慣將文件視爲容器(特別是像std::cin,通常是交互式的),但最終文件是一個序列,而istream_iterator/ostream_iterator只是讓你像其他序列一樣對待它們,這確實需要一點時間。

+0

這是...很聰明。 –

+0

聰明......但我只是想,如果你想要一個過濾器,C++不是最好的語言來表達這... –

0

正如其他人所指出的,你不能檢查你甚至沒有讀過的值(來自用戶)。 要約束輸入,只要不滿足約束條件,就必須在do while while循環內檢查cin之後的輸入。

do 
{ 
    //you might cout here 
    cin >> numlist[i]; 
} 
while ((numlist[i] > 100) || (numlist[i] < 10)); 
+0

你可能也想'++我'的地方,但除此之外,我認爲這是最接近到OP要求的內容。 –

+0

++我必須在這個循環之外,我只給了一個代碼來接受相同的輸入,只要它不符合約束。 –