此循环仅适用于第一次迭代

时间:2013-12-07 13:56:53

标签: c++ loops

这个程序在第一次迭代时工作得很好,但是在之后的任何迭代中,跳过第二个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;
}

1 个答案:

答案 0 :(得分:2)

cin >>运算符只读取第一个空格字符的数据。

因此,如果您的数据读数为cin>> name; cin>>payRate; cin >> hours,并且您输入John Doe 12 34,则会将“John”视为名称,“doe”将被视为payRate。此时数据读取将失败,因为doe无法转换为任何数值。

此外,此时cin信息流将进入error state停止阅读任何其他数据。只会跳过所有阅读尝试。因此,将跳过读取cin>>hours,并且还将跳过下一循环迭代中的所有读取。以及您在应用中使用cin的任何其他数据。

但是你总能(并且应该!)检查是否有任何错误。您可以检查cin.goodcin.fail错误标志,以便检测流是否已进入错误状态。在Google或StackOverflow上搜索“cin错误处理”,您将很快找到示例。

检测到错误后,您可以cin.clear() 重置流。这不会从流中删除任何数据 - 它只是清除错误标志,以便流再次开始读取数据。请注意,旧数据不会被删除。如果由于cin >> payrate导致Doe失败,您将重置cin,那么下次读取的数据将再次为doe

问题的最后一部分是读取字符串“name”,以便它可以包含空格。正如我所说,cin >>只能读取第一个空格,因此在这里很难使用。

相反,切换到通过std::getline函数读取整行文本。它的使用方式如下:

std::getline( cin, name )

它将读取整行文本作为名称,包括任何空格,制表符等。它将以\ n,\ r或\ r \ n字符结束读取,具体取决于您的操作系统。