未初始化数组中的最小值和最大值

Min and Max in Uninitialized Array

本文关键字:最小值 最大值 初始化 数组      更新时间:2023-10-16

任务是将 12 个月的降雨量存储到一个数组中。然后根据收集的数据计算总和、平均值、最小值和最大值。我发现总和和平均值很好。我不知道我的最大值和最小值在哪里出错了。

#include <iostream>
using namespace std; 
int main()
{
    //inititalizing variables 
    double rain[13];
    double sum = 0;
    double max = rain[0];
    double min = rain[0];
    int count = 0;
    //string highMonth, lowMonth;
    //inputing rain values for each month 
    for (int i = 1; i < 13; i++)
    {
        cout << "Enter the rainfall (in inches) for month #" << i << ":";
        cin >> rain[13];
        sum = sum + rain[13];
    }
    //finding the max  
    for ( count = 1; count < 13; count++)
    {
        if (rain[count] > max)
        {
            max = rain[count];
        }
    }
    //finding the min 
    for (count = 1; count < 13; count++)
    {
        if (rain[count] < min)
        {
            min = rain[count]; 
        }
    }
    //printing results 
    cout << " The total rainfall for the year is" << sum<<endl; 
    cout << "The average rainfall is: " << sum / 12<<endl; 
    cout << "The month with the highest rainfall was " << max <<  endl;
    cout << "The month with the lowest rainfall was " << min << endl;
    return 0; 
}

我建议在 C++11 中使用std::array和基于范围的 for 循环。 这不太容易出错。

#include <array>
#include <iostream>
int main()
{
    //storage variable
    std::array<double,12> rain;
    //inputing rain values for each month
    double sum = 0;
    unsigned i = 0;
    for (auto &p : rain)
    {
        std::cout << "Enter the rainfall (in inches) for month #" << ++i << ": ";
        std::cin >> p;
        sum += p;
    }
    //finding the max
    double max = rain[0];
    for (auto &p : rain)
    {
        if (p > max)
        {
            max = p;
        }
    }
    //finding the min
    double min = rain[0];
    for (auto &p : rain)
    {
        if (p < min)
        {
            min = p;
        }
    }
    //printing results 
    std::cout << "The total rainfall for the year is " << sum << "n";
    std::cout << "The average rainfall is: " << sum / 12 << "n"; 
    std::cout << "The month with the highest rainfall was " << max <<  "n";
    std::cout << "The month with the lowest rainfall was " << min << "n";
}

或者更好的是,只需使用 STL。

#include <algorithm>
#include <array>
#include <iostream>
int main()
{
    //storage variable
    std::array<double,12> rain;
    //inputing rain values for each month
    unsigned i = 0;
    for (auto &p : rain)
    {
        std::cout << "Enter the rainfall (in inches) for month #" << ++i << ": ";
        std::cin >> p;
    }
    //finding the min, max, average
    auto max = *std::max_element(std::begin(rain), std::end(rain));
    auto min = *std::min_element(std::begin(rain), std::end(rain));
    auto sum = std::accumulate(std::begin(rain), std::end(rain), double{0.0});
    //printing results 
    std::cout << "The total rainfall for the year is " << sum << "n";
    std::cout << "The average rainfall is: " << sum / 12 << "n"; 
    std::cout << "The month with the highest rainfall was " << max <<  "n";
    std::cout << "The month with the lowest rainfall was " << min << "n";
}

首先,您应该检查循环是否cin >> rain[i]而不是rain[13]。并且min/max应使用现有值进行初始化。

您的数组未初始化,因此您指向无用的值。

您可以执行以下操作:

double max = 0;
double min = std::numeric_limits<double>::max();
// ...
double rain[13]; // uninitialized here
double sum = 0;
double max = rain[0]; // garbage
double min = rain[0]; // garbage
// ...

初始化maxmin时,rain[0]指向垃圾。您应该在将有意义的数据读入 rain 后声明和初始化maxmin

这样做:

double max = rain[0];
double min = rain[0];

在未初始化的数组中,与将一些垃圾值放在变量 maxmin,您必须初始化为其他值,数组 rain 也是如此。

下一个问题是这样的:

for (int i = 1; i < 13; i++)
    {
        cout << "Enter the rainfall (in inches) for month #" << i << ":";
        cin >> rain[13];
        sum = sum + rain[13];
    }

您正在尝试在数组中的索引 13 处写入,这绝对超出了您的范围。

cin >> rain[i];

从 0 到 13 的"i"是正确的事情

另一方面,用于查找最大值和最小值的循环不完整(您循环了 12 次,忽略了索引 0 处的元素(

for ( count = 1; count < 13; count++)

如果你的数组有 13 个元素,你必须这样做

for ( count = 0; count < 13; count++)