程序接受非数字输入,如何停止它?

时间:2019-03-30 02:18:20

标签: c++

一个特殊的才艺比赛由五名评委组成,每名评委将每位表演者的得分定在0到10之间(0到10被认为是有效的!)。分数不得超过8.3。表演者的最终分数是通过将收到的最高和最低分数相减,然后取剩余的三个分数的平均值来确定。

编写一个程序,使用这些规则来计算和显示参赛者的分数。它应包含以下功能:

void getJudgeData()。此功能应向用户询问法官的分数,将其存储在参考参数变量中并进行验证。 main会为五位法官分别调用一次此功能。对void getJudgeData( )进行以下更改。

该函数应接受2个参数,而不是如上所述的1个参数

第一个参数应该是一个字符串,其中包含值“ Judge 1”,“ Judge 2” ..等。

第二个参数应符合上面显示的规格。

getJudgeData函数应确保:

分数是数字

得分是> = 0

分数是<= 10

double getHighest()。该函数获得5分,并返回传递给它的5个参数中的最高分。

double getLowest()。该函数获得5分,并返回传递给它的5个参数中的最低者。

这是我的代码

#include <iostream>
#include <iomanip>
#include <limits>

using namespace std;

//Function prototypes
void getJudgeData(string jname, double &score); 
double getAverage(double score1, double score2, double score3, double score4, double score5);
double  findLowest(double score1, double score2, double score3, double score4, double score);
double  findHighest(double score1, double score2, double score3, double score4, double score5);

int main()
{
    //Variables
    double score1, score2, score3, score4, score5, average, lowest, highest;

    //Get input from five judges
    std::cout << "Enter the scores for the five judges." << endl;
    getJudgeData("Judge 1", score1);
    getJudgeData("Judge 2", score2);
    getJudgeData("Judge 3", score3);
    getJudgeData("Judge 4", score4);
    getJudgeData("Judge 5", score5);

    average = getAverage(score1, score2, score3, score4, score5);
    lowest = findLowest(score1, score2, score3, score4, score5);
    highest = findHighest(score1, score2, score3, score4, score5);


    system("pause");
    return 0;
}

/* getJudgeData
** Function should ask the user for a judge's score, store it in a reference parameter variable, and validate it.
This function should be called by main once for each of the five judges.
*/
void getJudgeData(string jname, double &score)
{
    do
    {
        cout << "Data entry for Judge. Score must be in the range 0 - 10: ";
        cin >> score;
        if (!cin)
        {
            cout << "Invalid. Input must be numeric. Please re-enter score." << std::endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
        else
        {
            if (score < 0 || score > 10)
            {
                cout << "Invalid. Score must be between 0 and 10. Please re-enter score." << std::endl;
            }
        }
    } while (!cin || score < 0 || score > 10);

}

/* calcScore 
Function should calculate and return the average of the three scores
that remain after dropping the highest and lowest scores.
*/
double getAverage(double score1, double score2, double score3, double score4, double score5)
{
    double lowest,
        highest,
        average;

    //Find lowest
    lowest = findLowest(score1, score2, score3, score4, score5);

    //Find highest
    highest = findHighest(score1, score2, score3, score4, score5);

    //Calculate average
    average = (score1 + score2 + score3 + score4 + score5 - highest - lowest) / 3;

    //std::cout << std::setprecision(3) << "Average: " << scoreAverage << std::endl;
    cout << setprecision(3) << "Average: " << average << endl;
    cout << setprecision(3) << "Lowest: " << lowest << endl;
    cout << setprecision(3) << "Highest: " << highest << endl;

    return average;
}


//findLowest
double findLowest(double score1, double score2, double score3, double score4, double score5)
{
    //Compare and return low score
    if (score1 < score2 && score1 < score3 && score1 < score4 && score1 < score5)
    {
        return score1;
    }
    else if (score2 < score1 && score2 < score3 && score2 < score4 && score2 < score5)
    {
        return score2;
    }
    else if (score3 < score2 && score3 < score1 && score3 < score4 && score3 < score5)
    {
        return score3;
    }
    else if (score4 < score2 && score4 < score3 && score4 < score1 && score4 < score5)
    {
        return score4;
    }
    else
    {
        return score5;
    }
}

//findHighest
double findHighest(double score1, double score2, double score3, double score4, double score5)
{
    //Compare and return low score
    if (score1 > score2 && score1 > score3 && score1 > score4 && score1 > score5)
    {
        return score1;
    }
    else if (score2 > score1 && score2 > score3 && score2 > score4 && score2 > score5)
    {
        return score2;
    }
    else if (score3 > score2 && score3 > score1 && score3 > score4 && score3 > score5)
    {
        return score3;
    }
    else if (score4 > score2 && score4 > score3 && score4 > score1 && score4 > score5)
    {
        return score4;
    }
    else
    {
        return score5;
    }
}

由于某种原因,该程序接受非数字输入,如何使它停止执行此操作?

1 个答案:

答案 0 :(得分:1)

您的问题是您重置了std::cin的错误标志,然后再次检查错误。您可能会更改为以下内容:

void getJudgeData(string jname, double &score)
{
    do
    {
        cout << "Data entry for Judge. Score must be in the range 0 - 10: ";
        cin >> score;
        if (!cin)
        {
            score = -1; // Invalid value to force the loop
            cout << "Invalid. Input must be numeric. Please re-enter score." << std::endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
        else if (score < 0 || score > 10)
        {
            cout << "Invalid. Score must be between 0 and 10. Please re-enter score.\n";
        }
    } while (score < 0 || score > 10);
}

Demo