2013-12-21 80 views
1

我正在尝试编写一个计算素数的程序,并且遇到了我正在使用的do-while-loop问题。Do-While-loop问题

代码:

#include <iostream> 
#include <conio.h> 

using namespace std; 

int main() 
{ 
    unsigned long int lower_limit; 
    unsigned long int upper_limit; 

    cout << "\n" << "Program calculates prime numbers in a given range between 2 and 4.294.967.295."; 
    cout << "\n" << "Input range in which prime numbers are to be calculated... "; 

    do 
    { 
     cout << "\n\n" << "Lower Limit:\t";  cin >> lower_limit;  
     cout << "\n" << "Upper Limit:\t";  cin >> upper_limit;  

     if(lower_limit >= upper_limit) 
     { 
      cout << "\nInvalid Input: Value of Upper Limit has to be bigger than value of Lower Limit."; 
      cout << "\nSelect new numbers."; 
     } 

     if(!(cin >> lower_limit) || !(cin >> upper_limit)) 
     { 
      cout << "\nInvalid Input: Values of Lower Limit and Upper Limit have to be integers."; 
      cout << "\nSelect new numbers."; 
     } 

    }while(lower_limit >= upper_limit || !(cin >> lower_limit) || !(cin >> upper_limit)); 

    return(0); 
} 

如果我输入值触发Lower Limit >= Upper Limit它触发的第一个错误正确,但不事后重复DO-while循环,不关闭程序(返程(0 ))要么...因此该程序不会重复执行循环,程序也不会退出循环。我真的不知道它实际上在那里做了什么。

如果我输入值触发!(cin >> lower_limit) || !(cin >> upper_limit)(“ADFD”等)的整个程序只是去心理和快速重复DO-while循环,甚至忽略了cin >> lower_limit;cin >> upper_limit;语句。

有没有人有一个想法可以帮助我?

干杯!

+0

你'CIN> > lower_limit'三次循环中,您可能会存储结果以避免重新读取值。 – Jarod42

+0

'“\ n \ n”<<“下限:\ t' - *** ??? ***为什么不是'”\ n \ n下限:\ t'? – 2013-12-21 11:00:09

回答

1

的一点是,如果你输入无效,则需要通过清除错误状态:

cin.clear(); 
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

你的循环应改为类似:

do 
{ 
    while (!(cin >> lower_limit >> upper_limit)) { 
    cout << "Invalid input, Please re-enter\n";  
    cin.clear(); 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 

    if(lower_limit >= upper_limit) 
    { 
    cout << "\nInvalid Input: Value of Upper Limit has to be bigger than value of Lower Limit."; 
    cout << "\nSelect new numbers."; 
    } 


} while(lower_limit >= upper_limit); 
+0

太棒了!至少它不再坚果了。谢谢! – krbu