一个特殊的才艺比赛由五名评委组成,每名评委将每位表演者的得分定在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;
}
}
由于某种原因,该程序接受非数字输入,如何使它停止执行此操作?
答案 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);
}