c++ - 程序接受非数字输入,我如何让它停止这样做?

标签 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;
    }
}

由于某种原因,该程序接受非数字输入,我如何让它停止这样做?

最佳答案

您的问题是您重置了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

关于c++ - 程序接受非数字输入,我如何让它停止这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55427557/

相关文章:

c++ - 显式复制构造函数行为和实际用途

c++ - Clang 和 Intel 无法编译此 CRTP 代码

c++ - 什么是 boost::optional 效率?

c++ - 没有 cruft 的 C++ "in"运算符?

c++ - 为什么当远远超过 CPU 缓存大小时内存访问时间会增加

c++ - C++中的64位枚举?

c++ - 有没有办法获取我的 C++ 应用程序的进程 ID?

c++ - 将 3D 模型导入 OpenGL/C++ 项目的推荐文件格式和图形库?

c++ - 在Qt cpp中按像素获取QString的子串

c++ - 结构数组的模糊引用