C++ 计算平均值C++;

C++ 计算平均值C++;,c++,C++,我被要求在我的平均数中显示两位小数。现在,它四舍五入到最接近的数字,并在计算出的十分之一和百分之一百的数量中有不同的数字时显示零。也许我忽略了一些非常简单的事情。我认为将类型声明为double可以让它显示正确的计算 double CalculateAverageScore(int score[],int numPlayers, double averageScore) { double total = 0; for (int i = 0; i < numPlayers; i

我被要求在我的平均数中显示两位小数。现在,它四舍五入到最接近的数字,并在计算出的十分之一和百分之一百的数量中有不同的数字时显示零。也许我忽略了一些非常简单的事情。我认为将类型声明为double可以让它显示正确的计算

double CalculateAverageScore(int score[],int numPlayers, double averageScore)
{
    double total = 0;
    for (int i = 0; i < numPlayers; i++)
    {
        total += score[i];
    }
    averageScore = total / numPlayers;
    cout << fixed << showpoint << setprecision(2);
    cout << "\nAverage Score: " << averageScore << endl;
    return averageScore;
}
double CalculateAverageScore(整数分[],整数分,双平均分)
{
双倍合计=0;
for(int i=0;i
averageScore = static_cast< double>( total) / numPlayers;
                  ^^^
               explicit cast
正如您之前将
averageScore
作为参数,但未使用其初始值:

double CalculateAverageScore(int score[],int numPlayers, double averageScore)
{
    double total = 0.0;
    //...
    averageScore = total / numPlayers;
                 ^
           forget initial value, so it was useless
           == no need to pass averageScore as argument
    //....
} 

根据您的示例,您的解决方案应该按原样工作

double total = 0;
// ...
averageScore = total / numPlayers; // Result of division is of type double.
这里您将
double
除以
int
,结果应该是
double
。因此不需要强制转换

不过,还有一些其他问题:

  • 您已将参数
    score
    声明为
    int*
    ,该参数允许客户端传递空值(您不检查该值)
  • 您已经将参数
    numPlayers
    声明为
    int
    ,这是一种错误的做法,而不是声明为
    std::size\t
  • averageScore
    已声明为参数,但从未使用该参数。请将其声明为局部变量
  • 您缺少常量正确性,即当您不打算修改时,将参数作为
    const
    传递
考虑使用模板参数传递
score
作为对
int[N]
的引用。这样就不必将数组长度作为第二个参数传递。例如:

template <const std::size_t N>
double average(const int (&score)[N]) {
    return static_cast<double>(std::accumulate(std::begin(score), std::end(score), 0)) / N;
}
模板
双倍平均值(常数整数和分数)[N]){
返回static_cast(标准::累计(标准::开始(分数),标准::结束(分数),0))/N;
}
并用作:

int score[5] = { 2, 2, 3, 4, 5};
std::cout << std::fixed << std::showpoint << std::setprecision(2);
std::cout << average(score) << std::endl; // Outputs 3.20
int-score[5]={2,2,3,4,5};

STD::正如我明确提出的,我建议使用代码> double(总数)< /C> >在C++程序中使用C++ >代码STATICEXCAST 比较好,而且,经验不足的程序员可能会认为(double)
cast应用于商而不是股息。是的,很酷。我发现averageScore=static\u cast(总计)/numPLayers,但你的方法更简单。我会记住它。@user100748 C样式转换的最大缺点是,它们可以用于执行几乎任何你可能想要或不想要的类型转换或类型转换(例如删除
const
或将整数转换为指针)。最好明确说明预期的强制转换,以便编译器在您执行意外操作时向您发出警告。感谢您的评论Felix,这很有意义。我对这一点不熟悉,所以最好现在就养成好习惯。为什么
double averageScore
是一个参数而没有区域设置变量?删除参数
double averageScore
因为您返回值,并且不更改参数。因为我必须在另一个函数中使用它,该函数显示低于平均值的球员的姓名和分数。它在函数中声明,所以我不需要将其设置为局部变量。如果我错了,请告诉我,我是新手。1.这是我的想法。我知道uble检查了这本书,有一点是有道理的,那就是cast修复了它。这个例子说,没有cast,1/2是0,因为即使是双精度的,也没有十进制。cast使1.0/2等于.5.2。@Zach707将
double
int
传递给二进制运算符进行除法,将提升
int
double
并执行浮点除法。因此
1.0/2
变成
1.0/2.0
,结果是
0.5
@Zach707我在GCC 4.8.2上编译了你的函数,它将以两位小数输出平均值。2.我不知道std是什么::size\t,仍在学习,只允许3.我试图从原型和标题中删除它,但程序变得疯狂。我确实在下一个函数中使用了它,该函数显示了玩家和低于平均水平的分数。非常感谢任何建议…………我的输出现在与本课的示例完全一样,但我仍然很满意我想学习简单的好的实践,以提高自己。我使用Visual C++作为学校的要求。
template <const std::size_t N>
double average(const int (&score)[N]) {
    return static_cast<double>(std::accumulate(std::begin(score), std::end(score), 0)) / N;
}
int score[5] = { 2, 2, 3, 4, 5};
std::cout << std::fixed << std::showpoint << std::setprecision(2);
std::cout << average(score) << std::endl; // Outputs 3.20