2017-04-09 3 views
1

좋은 하루for 루프를 동일한 출력에서 ​​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

만약 내가 다른 줄 아래에 getline을 사용하면 오류가 있다고 말합니다 – Geo

+0

어떻게 내가 올바르게 선언하겠습니까? – Geo

답변

0

당신은 문자의 연속 스트림으로 프로그램의 표준 입력을 볼 수 있습니다 다음과 같이

내 코드입니다. 줄 끝의 끝 (end-of-line) 문자 (EOL 또는 \n C에서 ++)이 될 것이라고

Alice\n 
2\n 
3\n 
Bob\n 
3\n 
2\n 
Charlie\n 
1\n 
1\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

@ 지오 : 그냥'문자열 더미; getline (cin, dummy); 그리고 완료되었습니다. 그 값이 할당 된 후에 사용되지 않기 때문에 변수 더미를 호출합니다. – rodrigo

+0

고맙습니다. 이제 제 코드가 올바르게 작동합니다. 나에게 설명 할 시간을내어 주셔서 감사합니다! – Geo

0

내가 볼 수있는 두 가지 해결책이 있습니다. cin.ignore(); getData 함수의 끝에있는 행은 문제를 해결해야합니다. 또는 getline으로 getline 변경 (cin >> std :: ws, theEmployee);

cin은 기본적으로 모든 공백 (공백, 탭, 줄 바꿈 등)을 건너 뜁니다. 따라서 다중 cin 줄 프로그램에서 이전 cin 명령에서 사용자가 'enter'키를 누르면 해당 줄 바꿈이 무시되고 cin 원하는 데이터를 올바르게 추출합니다.

getData의 첫 번째 루프 이후에 표준 입력 버퍼 (thePayRate 정보를 입력하는 사용자)의 줄 바꿈 '\ n'이 남습니다. 그러나 getline 명령은 입력 버퍼에 남아있는이 개행 문자를 건너 뛰지 않습니다. 사실 그것은 개행 문자 (getline)를 볼 때 즉시 종료되어 빈 문자열을 반환합니다. getline 명령이이 공백을 무시하도록하려면 getline (cin >> std :: ws, ...)을 사용하십시오. 또는 cin.ignore()를 사용하여 표준 입력 버퍼에 남아있는이 개행 문자를 처리 할 수 ​​있습니다.

관련 문제