2013-03-26 2 views
0

직원 수를 소수점 이하로 입력하면 "최소한 1의 값을 입력하십시오"라는 결과가 무한 수 반복됩니다. 그러나 십진수는 잘리지 않아야합니까? 어떻게하면 10 진수가 지워지므로이 문제를 해결할 수 있습니다. 이것은 daysMissed의 입력에 대해서도 발생합니다.C++ 함수 while 루프

cin.clear(); 

가 실패 플래그를 재설정 :

#include <iomanip> 
#include <iostream> 

using namespace std; 

int getNumEmployees(); 
int getDaysMissed(int); 
double getAverageDays(int,int); 

int main() 
{ 
int numEmployees; 
int daysMissed; 
double average; 

    //Get the number of employees 
numEmployees = getNumEmployees(); 

//Get the number of days missed 
daysMissed = getDaysMissed(numEmployees); 

//Get the average days missed 
average = getAverageDays(numEmployees, daysMissed); 

cout << "The average number of days missed is: " << average << endl; 

system("pause"); 
return 0; 
} 

int getNumEmployees() 
{ 
    int employeeNum; 

    cout << "Enter the number of company employees: "; 
    cin >> employeeNum; 

    while(employeeNum < 1) 
     { 
      cout << "Please enter a value of atleast 1 " << endl; 
      cin >> employeeNum; 
     } 

    return employeeNum; 
} 


int getDaysMissed(int employeeNum) 
{ 
int totalDays = 0; 
int employee; 

for(int count = 1; count <= employeeNum; count++) 
{ 
    cout << "Enter the number of days employee " << count << " missed: "; 
    cin >> employee; 
    while(employee < 0) 
     { 
     cout << "Enter a positive number for days missed " <<  endl; 
      cin >> employee; 
     } 

    totalDays += employee; 
} 
return totalDays; 
} 

double getAverageDays(int employeeNum, int totalDays) 
{ 
double averageDays; 

averageDays = totalDays/employeeNum; 

return averageDays; 

} 

답변

2

각 않은 성공 cin 작업 후에는 사용할 필요가있다. 다음
및 사용 :

cin.ignore(); 

그냥 다시 구문 분석을 시도하지 않도록 오류를 발생시킨 문자열을 무시. 사용자가 입력 한 값이 그 진수는,하지 절단 반올림됩니다 소수 인 경우

int employeeNum = 0; 
cout << "Enter the number of company employees: "; 

while (!(cin >> employeeNum) || employeeNum < 1) 
{ 
    if(cin.fail()) 
    { 
     cout << endl << "Please enter a valid value: "; 
     cin.clear(); // reset the "failure" flag 
    } 
    else if(employeeNum < 1) 
    { 
     cout << "Please enter a value of at least 1: "; 
    } 
    // ignore the bad charactors 
    // needed here incase '0.XX was entered 
    cin.ignore(10000, '\n'); 
} 

:

당신은 같은 일을해야합니다.

ignore의 기본은 1 개 문자 이상 건너 뛸 것입니다,하지만 당신은 (작은 소수 같은 : 0.23) 긴 유효하지 않은 문자열을 얻을 것으로 예상하는 경우, 당신은 ignore에 변경해야합니다 :

cin.ignore(10000, '\n') 

을 어느 최대 10000 자 또는 다음 줄 바꿈까지 건너 뜁니다.

+0

문제가되는 문자 나 줄도 제거 할 수 있습니다. – chris

+0

@chris 꽤 사실! 무시 잊어 버렸습니다. – Serdalis

+0

그것은 "그러나 십진수는 잘리지 않아야합니까?"라는 질문에 답합니다. – 4pie0

2
int employeeNum; 
cin >> employeeNum; 

이 코드는 std::cin에서 int의 해석을 시도합니다. 먼저 스트림 상태를 실제로 확인하지 않고 있습니다. employeeNum < 1이 오류를 충분히 통신한다고 가정하지만 일반적으로 최선의 방법은 아닙니다. 입력 스트림에 EOF 또는 오류 조건이있을 수 있습니다. 이전 프로그램이 종료해야 할 수도 있습니다를 들어, 후자 당신은 아마 그 입력 라인의 나머지 부분을 무시하고 재 시도하기 전에 오류 상태를 지우려면 :

#include <limits> 

if (std::cin >> employeeNum) 
    break; // no need to retry input... 
else if (std::cin.eof()) 
    throw std::runtime_error("EOF on input"); 
else 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n').clear(); 

그러나 야해 소수가 잘립니다? 어떻게하면 10 진수가 지워지므로이 문제를 해결할 수 있습니다.

당신이 실수는 다음의 "잘린"값을 사용하여 입력하려면 다음 코드에 int로 변환 double 또는 float에 입력해야합니다. 범위 검사가 필요 없다고 가정하면 ...

double x; 
if (std::cin >> x) 
{ 
    int x_int = x; 
    ...use x_int... 
}