C++ c++;函数while循环
当我输入员工数量的小数时,它会无限次地输出“请输入至少1的值”。但是小数点不应该被截断吗?如何修复此问题,以便删除小数点。daysMissed的输入也会发生这种情况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() {
#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++通用实践。