未初始化阵列中的最小值和最大值

未初始化阵列中的最小值和最大值

问题描述:

任务是取12个月的雨量并将它们存储到数组中。然后根据收集的数据计算总和,平均值,最小值和最大值。我发现总数和平均数很好。我不知道我的最大和最小值出错了。当maxmin初始化未初始化阵列中的最小值和最大值

#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; 
} 
+1

你应该初始化最大值和最小值要下雨[0]输入你的值后,否则可以有任何数量的在它 –

+0

你出了阵列的界限。您正在将每个读取的值*写入数组的末尾。我也不知道你来自哪个星球,但这里一年有十二个月,而不是十三个月。 –

+1

我想你应该在'rain [i]'中改变'rain [13]'来存储在正确的位置。此外,您还希望将来使用'std :: vector'来简化您的生活。 –

我建议使用std::array和基于范围,适用于C++ 11的循环:

你可以这样做。这种方式不太容易出错。

#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"; 
} 
+0

非常感谢!我想我的教授告诉我如何做到这一点并不是最好的方法。不是一个惊喜....再次感谢你!!!!! – Cantum2

+0

你的教授正在教你如何将代码算法作为教学练习。这将有助于你理解他们,就他们如何编码以及他们的复杂性(Big-Oh)而言。 – Adrian

// ... 
double rain[13]; // uninitialized here 
double sum = 0; 
double max = rain[0]; // garbage 
double min = rain[0]; // garbage 
// ... 

rain[0]点垃圾。将有意义的数据读入rain之后,您应该声明并初始化maxmin

+0

我在找到max for循环之前初始化了max,就是你所说的。我也在min循环之前初始化min。 – Cantum2

这样做:

double max = rain[0]; 
double min = rain[0]; 
在未初始化数组

是一样的把一些垃圾值在 变量最大分钟,你必须初始化为其它值,同样的阵列

下一个问题是这样的:

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独家

另一方面,你的循环寻找最大值和最小值是不完整的(你正在循环12次忽略索引0处的元素)

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

如果你的阵列有13种元素,你必须做

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

我的数组只能有12个值。所以我会说(count = 0; count Cantum2

+0

@ Cantum2:是的,这是正确的。 –

+0

@ Cantum2 - ** for循环的所有**应该从0运行到12. –

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

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

double max = 0; 
double min = std::numeric_limits<double>::max(); 
+0

我现在能够找到最大值,但现在每次最小值都是0。我不承认为什么?!?!?!为(计数= 0;计数 Cantum2

+0

这个答案也没有任何意义。从输入读取数组,然后*然后*设置'double max = rain [0]; double min = rain [0];'。 –