美好的一天

我写了一个输出员工工资单的代码。

另外,尽管进行了大量研究(我试图自己解决),但我不确定如何获取for循环以允许我在同一输出屏幕上连续输入5位不同员工的信息。当我运行程序时,它允许我输入工资单的所有信息,但在每个新工资单的开头都没有员工的姓名。

我是一个初学者,希望尽可能多地学习,以便对任何解释都将不胜感激。

我的代码如下:

#include <iostream>
#include <string>

using namespace std;

void getData (string & theEmployee , float & theHoursWorked, float &
thePayRate)
{
  cout<< "Enter the employees name and surname: "<< endl;
  getline(cin, theEmployee);

  cout << "Enter the numbers of hours the employee worked: " << endl;
  cin >> theHoursWorked;

  cout << "Enter the employees hourly pay rate?" << endl;
  cin >> thePayRate;

}

  float calculatePay(const string & theEmployee, float theHoursWorked, float

  thePayRate)
{
  float regularPay, thePay, overtimeHours;
  if (theHoursWorked > 40)
{
 regularPay = 40 * thePayRate;
 overtimeHours = theHoursWorked - 40;
 thePay = regularPay + (overtimeHours * 1.5 * thePayRate);
 return thePay
}
else
thePay = theHoursWorked * thePayRate;
return thePay;
}

void printPaySlip(const string & theEmployee, float theHoursWorked, float
thePayRate, float thePay)
{
float overtimeHours;
 cout << "Pay slip for " << theEmployee <<endl;
 cout << "Hours worked: "<< theHoursWorked << endl;
 if (theHoursWorked > 40)
 overtimeHours = theHoursWorked - 40;
 else
 overtimeHours = 0;
 cout << "Overtime hours: "<< overtimeHours << endl;
 cout << "Hourly pay rate: " << thePayRate << endl;
 cout << "Pay: " << thePay << endl;
 cout << endl;

}


 int main()
{
 string theEmployee;
 float theHoursWorked;
 float thePayRate;
 int thePay;

 for (int i = 0; i < 5; i++)
{
  getData(theEmployee, theHoursWorked, thePayRate);
  thePay = calculatePay (theEmployee, theHoursWorked, thePayRate);
  printPaySlip(theEmployee, theHoursWorked, thePayRate, thePay);
}

return 0;
}

最佳答案

您可以将程序的标准输入视为连续的字符流。

例如,我的标准输入将包含以下文本:

Alice\n
2\n
3\n
Bob\n
3\n
2\n
Charlie\n
1\n
1\n


请注意,在行尾将有一个行尾字符(在C ++中为EOL或\n)。

std::getline()的第一次调用将返回名字Alice,并将在EOL处停止,但不包括在输出中。一切都很好。

下次调用cin >> theHoursWorked会将2读入变量,一切正常。但是它不会消耗EOL,因为它不是数字的一部分。

下次调用cin >> thePayRate将跳过EOL,因为它不是数字,并且将读取3。它也不会消耗下一个EOL。

但是,接下来,对std::getline()的下一次调用将找到一个EOL字符,就像第一个字符一样,它将返回一个空字符串。

下次调用cin >> theHoursWorked将在B中找到Bob,并且将严重失败。从现在开始,您将无法获得预期的输入。

解决方案是在需要时正确跳过EOL字符和任何其他空格。有几种方法可以做到这一点。


std::getline()之后,使用伪string变量调用cin >> theHoursWorked
呼叫cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');将剩余的字符跳过到EOL(包括)。
使用cinstd::getline()读取所有数据,然后在第二个调用string中将double转换为getline(cin, line); std::istringstream(line) >> theHoursWorked;

关于c++ - 试图让for循环在同一输出上执行5次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43311144/

10-10 23:50