Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;函数while循环_C++_Function_While Loop - Fatal编程技术网

C++ c++;函数while循环

C++ c++;函数while循环,c++,function,while-loop,C++,Function,While Loop,当我输入员工数量的小数时,它会无限次地输出“请输入至少1的值”。但是小数点不应该被截断吗?如何修复此问题,以便删除小数点。daysMissed的输入也会发生这种情况 #include <iomanip> #include <iostream> using namespace std; int getNumEmployees(); int getDaysMissed(int); double getAverageDays(int,int); int main() {

当我输入员工数量的小数时,它会无限次地输出“请输入至少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;

}
#包括
#包括
使用名称空间std;
int getNumEmployees();
int getDaysMissed(int);
double getAverageDays(int,int);
int main()
{
国际雇员;
int daysMissed;
双倍平均;
//获取员工人数
numEmployees=getNumEmployees();
//获取错过的天数
daysMissed=getDaysMissed(numememployees);
//得到平均错过天数
average=getAverageDays(numEmployees,daysMissed);

cout每次手术不成功后,您需要使用:

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');
}

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

在每次不成功的
cin
操作后,您需要使用:

cin.clear();
int employeeNum;
cin >> employeeNum;
重置故障标志。
然后使用:

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');
}
最多可跳过10000个字符,或直到下一个换行符

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();
此代码试图从
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();

您可能还想删除令人不快的字符或行。@克里斯说得很对!忘记了忽略。它是否回答了问题:“但是小数点不应该被截断吗?”“SeldalCin在流有效时被认为是正确的,即使用户输入了0,所以您的代码不能保证至少1的值。):@ Serdalis:当输入不是来自管道或重定向时,对于WiRoZE的非常有限的情况可能是正确的,但不是好的C++通用实践。好吧。@chris说得很对!忘记了忽略。它回答了问题:“但是小数点不应该被截断吗?”当流有效时,@ SerdaliCin被认为是正确的,即使用户输入了0,所以你的代码不能保证至少1的值。))@ Serdalis:当输入不是来自管道或重定向时,对于非常有限的WRIOZE情况可能是正确的,但不是好的C++通用实践。