2017-04-09 8 views
1

こんにちはforループを同じ出力で5回実行しようとしています

私は従業員の給料を出力するコードを書いています。

また、私は自分自身でそれを理解しようとしましたが、たくさんの研究を行っていましたが、同じ出力画面に5人の従業員の情報を連続して入力できるようにforループを取得する方法がわかりません。プログラムを実行すると、新しい給料伝票の冒頭にある従業員の名前を除いて、給与伝票のすべての情報を入力することができます。

私はできるだけ多くのことを学びたいと思っていますので、どんな説明も大歓迎です。次のように

私のコードは次のとおりです。

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

getlineとcin >> int、またはhttp://stackoverflow.com/questions/5739937/using-getlinecin-s-after-cinまたは短い形式を参照してください。これをgetDataの最後に入れてみてください。cin.ignore std :: numeric_limits :: max()、 '\ n'); –

+0

もし私が他の2つの下のgetlineを使用すると、エラーがあると言われます – Geo

+0

どうすればそれを正しく宣言できますか? – Geo

答えて

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の呼び出しではBBobになり、失敗する可能性があります。これからは、予想される入力を得ることはできません。

解決策は、必要に応じてEOL文字やその他の空白を適切にスキップすることです。それを行うにはいくつかの方法があります。ただcin >> theHoursWorked後のダミーstring変数と

  1. コールstd::getline()
  2. cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');を呼び出して、残りの文字をEOLまでスキップします.`
  3. cinからすべてのデータを読み取ってstd::getline()を使用し、次にのstringdoubleに変換します。
+0

ありがとうございます。私はそれを取得し始めています。私はどのようにstd :: getline()関数を宣言しますか?ダミー文字列の意味を聞くことができますか? – Geo

+0

@Geo:ちょうど 'string dummy; getline(cin、dummy); 'を実行します。割り当てられた後にその値が使用されないので、変数dummyを呼び出します。 – rodrigo

+0

ありがとう、私のコードは正しく動作しています。私に説明する時間をとってくれてありがとう! – Geo

0

私には2つの解決策があります。 cin.ignore();を追加してください。 getData関数の最後の行が問題を解決するはずです。 OR getlineにgetlineを変更する(cin >> std :: ws、theEmployee);

デフォルトのスキップによるCINすべての空白(スペース、タブ、改行など)ので、複数CINラインプログラムでは、ユーザーが押した場合は、前回のCINコマンドに「を入力」、その改行は無視され、CIN必要なデータが正しく抽出されます。

getDataの最初のループの後に、改行 '\ n'が標準入力バッファに残されます(ユーザーはthePayRateの情報を入力します)。ただし、getlineコマンドは、入力バッファーに残っているこの改行文字をスキップしません。実際には、改行文字(getline)を見るとすぐに終了し、空の文字列を返します。 getlineコマンドがこの空白を無視するようにするには、getline(cin >> std :: ws、...)を使用します。代わりに、cin.ignore()を使って、標準入力バッファに残っているこの改行文字を扱うことができます。

関連する問題