gpt4 book ai didi

c++ - 试图让 for 循环在同一输出上执行 5 次

转载 作者:太空宇宙 更新时间:2023-11-04 13:03:32 24 4
gpt4 key购买 nike

美好的一天

我编写了一个代码,可以为员工输出工资单。

此外,尽管做了很多研究(我试图自己弄清楚),但我不确定如何让我的 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

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

第一次调用 std::getline()将返回名字 Alice并将在 EOL 停止,不包括在输出中。一切顺利。

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

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

但是,下一次调用 std::getline()将找到一个 EOL 字符作为第一个字符,它将返回一个空字符串。

下一次调用 cin >> theHoursWorked会找到 B来自 Bob它会严重失败。从现在开始,您将不会获得预期的输入。

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

  1. 调用std::getline()用假人 string cin >> theHoursWorked 之后的变量.
  2. 调用cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');跳过剩余字符直至 EOL,包括`。
  3. 读取cin中的所有数据使用 std::getline()然后转换 stringdouble在第二次通话中:getline(cin, line); std::istringstream(line) >> theHoursWorked; .

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com