0

従業員数に小数を入力すると、「少なくとも 1 の値を入力してください」が無限に出力されます。しかし、小数点以下を切り捨てるべきではありませんか? 小数が消去されるようにこれを修正するにはどうすればよいですか。これは、daysMissed の入力でも発生します。

#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;

}
4

2 に答える 2

2

操作が失敗するたびcinに、次を使用する必要があります。

cin.clear();

失敗フラグをリセットします。
そして、次を使用します。

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 文字のみをスキップしますが、長い無効な文字列 (小さな 10 進数: 0.23 など) を取得することが予想される場合は、次のように変更する必要がありますignore

cin.ignore(10000, '\n') 

これは、最大 10000 文字または次の改行までスキップします。

于 2013-03-26T01:49:54.340 に答える
2
int employeeNum;
cin >> employeeNum;

intこのコードはfromを解析しようとしstd::cinます。まず、後で実際にストリームの状態をチェックしていません。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();

しかし、小数点以下を切り捨てるべきではありませんか? 小数が消去されるようにこれを修正するにはどうすればよいですか。

実数を入力してその「切り捨てられた」値を使用する場合は、 に入力するdoubleか、 in コードfloatに変換する必要があります。int範囲チェックが必要ないと仮定すると...

double x;
if (std::cin >> x)
{
    int x_int = x;
    ...use x_int...
}
于 2013-03-26T02:08:54.347 に答える