2013-12-05 3 views
0

По какой-то причине во второй раз этот цикл повторяется, инструкции cout перекрываются. Другими словами, после первого cout программа не ждет ввода. Как я могу это решить?Overlapping cout

Также, в случае реальных налогов, работает ли функция nPay правильно? Кто-то сказал мне, что налоги должны быть умножены на валовые, каждый отдельно и добавлены. Однако мой метод будет работать одинаково, тем более, что они происходят одновременно.

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; 

      //cin.ignore(); 
      cout <<"Please enter your working name: "; 
      getline (cin, name); 
      !cin.eof(); 

      double payRate, hours; 

      cout <<"Enter your pay rate and hours worked, respectively."<< endl; 
      cin >> payRate >> hours; 
      !cin.eof(); 

      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; 
} 
+2

'cin.ignore();' – 0x499602D2

+0

WTH вы думаете достичь с 'cin.eof();' ?? !! ??! –

+0

['while (! Eof())' неверно.] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – chris

ответ

2

После getline, новая линия все еще находится в потоке, так что вам придется ignore это:

getline(cin, name); 
cin.ignore(); 

Кроме того, вместо while (!cin.eof()), сделать выписку перед проверкой потока:

while (getline(cin, name)) 
{ 
    cin.ignore(); 
    // ... 
} 

Вот обновленный код. Я надеюсь, что это работает для вас:

int main() 
{ 
    for (std::string name; (cout << "Please enter your working name: ") && 
          getline(cin >> std::ws, name);) 
    { 
     if (cin.eof()) 
      break; 

     double payRate, hours; 

     cout << "\nEnter your pay rate and hours worked, respectively." << endl; 

     if (!(cin >> payRate >> hours)) 
      break; 

     double fPay = calcGrossPay(payRate, hours); 

     double netPay = nPay(fedTx, localTx, stateTx, ssTx, netPay, fPay); 

     displayAll(fPay, netPay, name); 
     cin.get(); 
    } 
} 
+0

Неисправность работала thx, но я не понимаю, куда идет eof. Я думал, что это пошло после каждого cin, потому что когда пользователь вводит ctrl-z, prog выходит – matttm

+0

@matttm Вам не нужно '! Eof()'. Дайте мне пример ввода, предоставленного программе, и я покажу вам, что делать. – 0x499602D2

+0

* code * cout << "Введите свое рабочее имя:"; getline (cin, name); cin.ignore(); cin.eof(); * code * Это значит, что когда вы входите в ctrlZ, прог заканчивается. – matttm