2013-03-26 55 views
0

当我为员工数输入一个小数时,它输出“请输入一个atleast 1的值”无限次数。但不应该将小数点截断?我如何解决这个问题,所以小数点被删除。这发生在daysMissed的输入中。循环中的C++函数

#include <iomanip> 
#include <iostream> 

using namespace std; 

int getNumEmployees(); 
int getDaysMissed(int); 
double getAverageDays(int,int); 

int main() 
{ 
int numEmployees; 
int daysMissed; 
double average; 

    //Get the number of employees 
numEmployees = getNumEmployees(); 

//Get the number of days missed 
daysMissed = getDaysMissed(numEmployees); 

//Get the average days missed 
average = getAverageDays(numEmployees, daysMissed); 

cout << "The average number of days missed is: " << average << endl; 

system("pause"); 
return 0; 
} 

int getNumEmployees() 
{ 
    int employeeNum; 

    cout << "Enter the number of company employees: "; 
    cin >> employeeNum; 

    while(employeeNum < 1) 
     { 
      cout << "Please enter a value of atleast 1 " << endl; 
      cin >> employeeNum; 
     } 

    return employeeNum; 
} 


int getDaysMissed(int employeeNum) 
{ 
int totalDays = 0; 
int employee; 

for(int count = 1; count <= employeeNum; count++) 
{ 
    cout << "Enter the number of days employee " << count << " missed: "; 
    cin >> employee; 
    while(employee < 0) 
     { 
     cout << "Enter a positive number for days missed " <<  endl; 
      cin >> employee; 
     } 

    totalDays += employee; 
} 
return totalDays; 
} 

double getAverageDays(int employeeNum, int totalDays) 
{ 
double averageDays; 

averageDays = totalDays/employeeNum; 

return averageDays; 

} 

回答

2

每一未成功cin操作后,您需要使用:

cin.clear(); 

复位故障标志。
然后用:

cin.ignore(); 

忽略,只是导致了错误,所以你不要试图再次解析它的字符串。

你应该做这样的事情:

int employeeNum = 0; 
cout << "Enter the number of company employees: "; 

while (!(cin >> employeeNum) || employeeNum < 1) 
{ 
    if(cin.fail()) 
    { 
     cout << endl << "Please enter a valid value: "; 
     cin.clear(); // reset the "failure" flag 
    } 
    else if(employeeNum < 1) 
    { 
     cout << "Please enter a value of at least 1: "; 
    } 
    // ignore the bad charactors 
    // needed here incase '0.XX was entered 
    cin.ignore(10000, '\n'); 
} 

如果你输入的值是一个小数,则小数将被截断,而不是四舍五入。

ignore默认是只跳过1个字符,但如果你希望得到一个长期无效的字符串(如小十进制:0.23),你应该改变ignore到:

cin.ignore(10000, '\n') 

哪将跳过最多10000个字符或直到下一个换行符。

+0

您可能还想摆脱冒犯的字符或行。 – chris 2013-03-26 01:55:33

+0

@chris相当真实!忘了忽略。 – Serdalis 2013-03-26 01:59:20

+0

它回答这个问题:“但不应该小数点被截断?” – 4pie0 2013-03-26 02:06:44

2
int employeeNum; 
cin >> employeeNum; 

此代码尝试解析从std::cin一个int。首先,事后并未真正检查数据流状态 - 您认为employeeNum < 1可以充分传达故障,但这通常不是最佳方法:输入数据流中可能存在EOF或错误条件。对于前者程序可能需要终止,后者则可能要忽略输入行的休息和试之前清除错误条件:

#include <limits> 

if (std::cin >> employeeNum) 
    break; // no need to retry input... 
else if (std::cin.eof()) 
    throw std::runtime_error("EOF on input"); 
else 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n').clear(); 

但不应该小数被截断?我如何解决这个问题,所以小数点被删除。

如果你想输入则实数使用其“截断”值,则需要输入到doublefloat然后将其转换成int代码。假设您不需要范围检查...

double x; 
if (std::cin >> x) 
{ 
    int x_int = x; 
    ...use x_int... 
}