这个程序在第一次迭代时工作得很好,但是在之后的任何迭代中,跳过第二个cin并显示消息。此外,在第二次迭代中,如果名称是两个部分,如名字和姓氏,则只显示第一个名称。
任何帮助?
double calcGrossPay (double payRate, double hours);
double nPay (double& fedTx, double& localTx, double& stateTx, double& ssTx, double& netPay, double fPay);
void displayAll (double fPay, double netPay, string name);
double fedTx = 14, stateTx = 6, localTx = 3.5, ssTx = 4.75;
int main()
{
while (!cin.eof())
{
string name;
cout <<"Please enter your working name: ";
cin >> name;
if (cin.eof())
return 0;
double payRate, hours;
cout <<"Enter your pay rate and hours worked, respectively."<< endl;
cin >> payRate >> hours;
if (cin.eof())
return 0;
double fPay = calcGrossPay (payRate, hours);
double netPay = 0;
netPay = nPay (fedTx, localTx, stateTx, ssTx, netPay, fPay);
displayAll (fPay, netPay, name);
system("pause");
}
}
double calcGrossPay (double payRate, double hours)
{
double extraT, fPay;
if (hours > 40)
{
extraT = (hours - 40) * (1.5 * payRate);
fPay = extraT + (40 * payRate);
}
else
fPay = payRate * hours;
return fPay;
}
double nPay (double& fedTx, double& localTx, double& stateTx, double& ssTx, double& netPay, double fPay)
{
double totalTx = fedTx + localTx + stateTx + ssTx;
netPay = fPay * (1 - (totalTx / 100));
return netPay;
}
void displayAll (double fPay, double netPay, string name)
{
cout <<"Below is "<< name << "'s salary information" << endl;
cout << fixed << showpoint << setprecision(2) <<"\nYour calculated gross pay is $"
<< fPay << ", and your net pay is $" << netPay << endl;
}
答案 0 :(得分:2)
cin >>
运算符只读取第一个空格字符的数据。
因此,如果您的数据读数为cin>> name; cin>>payRate; cin >> hours
,并且您输入John Doe 12 34
,则会将“John”视为名称,“doe”将被视为payRate。此时数据读取将失败,因为doe
无法转换为任何数值。
此外,此时cin
信息流将进入error state
,停止阅读任何其他数据。只会跳过所有阅读尝试。因此,将跳过读取cin>>hours
,并且还将跳过下一循环迭代中的所有读取。以及您在应用中使用cin
的任何其他数据。
但是你总能(并且应该!)检查是否有任何错误。您可以检查cin.good
或cin.fail
错误标志,以便检测流是否已进入错误状态。在Google或StackOverflow上搜索“cin错误处理”,您将很快找到示例。
检测到错误后,您可以按cin.clear()
重置流。这不会从流中删除任何数据 - 它只是清除错误标志,以便流再次开始读取数据。请注意,旧数据不会被删除。如果由于cin >> payrate
导致Doe
失败,您将重置cin,那么下次读取的数据将再次为doe
。
问题的最后一部分是读取字符串“name”,以便它可以包含空格。正如我所说,cin >>
只能读取第一个空格,因此在这里很难使用。
相反,切换到通过std::getline
函数读取整行文本。它的使用方式如下:
std::getline( cin, name )
它将读取整行文本作为名称,包括任何空格,制表符等。它将以\ n,\ r或\ r \ n字符结束读取,具体取决于您的操作系统。