c++函数while循环



当我输入雇员人数的十进制数时,它会无限次输出"请输入至少为1的值"。但是小数点不应该被截断吗?我该如何修正这个,使小数点被擦除。输入daysMissed也会发生这种情况。

#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;
}
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...
}

每次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个字符或直到下一个换行符

最新更新