c++函数while循环
c++ functions while loop
当我输入雇员人数的十进制数时,它会无限次输出"请输入至少为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();
但是小数不应该被截断吗?我如何解决这个问题,使小数被擦除。
如果你想输入一个实数,然后使用它的"截断"值,你需要输入到double
或float
,然后转换为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个字符或直到下一个换行符
相关文章:
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- while循环中while循环的时间复杂度是多少
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 擦除while循环中迭代的元素
- 为什么我不能在 while 循环中创建线程?
- 退出简单while循环时出现问题
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 嵌套While循环不起作用(C++问题)
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 使用 GMP 的 while 循环出现问题
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 为什么在 while 循环中返回表达式不起作用
- 如何使用 do while 循环确定最高值和最低值
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- OpenCV QT,显示视频的帧(不使用while循环)
- 输入循环 while 函数
- c++中的循环(while)
- 为什么这段代码没有循环(while)