【问题标题】:Finding min and max value in a random array在随机数组中查找最小值和最大值
【发布时间】:2018-08-01 23:54:24
【问题描述】:

处理需要我输入一些函数的作业(查找数组中随机数的最大值/最小值、总和和平均值),我已经设法完成了所有这些,但对于最小值我是得到 -2145379808 的值。我不确定我在哪里搞砸了,我将不胜感激。 到目前为止的代码:

#include <cstdlib>
#include <iostream>
#include <ctime>
using namespace std;


int main(int argc, char** argv) {
    {
        cout << "Enter array size " << endl;
    }
    float avg;
    float sum;
    int size;
    cin >> size;
    int array[size]; 
    int max = array [0];
    int min = array [0];
    srand((unsigned)time(NULL));
    for (int i = 1; i < size + 1; i++)
    {
        array[i] = 1+rand()%100 ;
        sum += array[i];
        cout << "number " << i << " = "<< array[i] << endl;
    }
    for (int x = 1; x < size; x++){
        if (array[x] > max){
            max = array[x]; 
        }
         if (array[x] < min){
            min = array[x]; 
        }
    }
    cout << "\nmax = " << max << endl;
    cout << "\nmin = " << min << endl;
    cout << "\nsum = "<< sum << endl;
    cout << "\navg = " << sum / size << endl;
    return 0;
}

【问题讨论】:

  • 你没有初始化你的变量。始终初始化您的变量。你落后了。索引越界是未定义的。
  • 我认为 C++ 的乐趣在于使用广受赞誉的 STL。请参阅标题为 Second Version 的部分之后的标题为 Example 的部分... en.cppreference.com/w/cpp/algorithm/minmax_element
  • cin &gt;&gt; size; int array[size]; - 这不是标准的 C++,而且永远不会(有充分的理由)。使用std::vector&lt;int&gt;
  • 可以只使用std::nth_element 并在两行可重新存储的代码中获取最小值和最大值。或者更好的是,使用std::minmax

标签: c++ arrays max min


【解决方案1】:

maxmin 设置为array 的未初始化元素永远不会有好结果。在此说明中,您还需要初始化sumavg你不用也可以去掉。

一旦知道array 是什么,就需要将maxmin 设置为array 的第一个元素。粗略地说,您可以将max 设置为std::numeric_limits&lt;int&gt;::min()min 设置为std::numeric_limits&lt;int&gt;::max()

还要注意array边界array[0]array[size - 1]。因此,您需要重新访问循环中的索引。

然后,一旦你让它工作,将它装箱,并使用std::vector&lt;int&gt;,以及像minmax_element这样的东西:http://en.cppreference.com/w/cpp/algorithm/minmax_element

【讨论】:

  • @user463035818:哈,我们共同发表吧!
  • 有时我在工作中很难解决一些问题,所以在这里解决问题总是一种乐趣;)
  • @AluanHaddad:非常正确,C++ 不是 Fortran。
【解决方案2】:

问题出在以下几行:

float avg;
float sum;
...
int max = array [0];
int min = array [0];

因为此时array [0] 的值是垃圾值
要更正您的代码,请按以下方式更改此行(还包括 climits 头文件)。此外,相应地更改循环索引:

float avg = 0;
float sum = 0;
...
int max = INT_MIN;
int min = INT_MAX;

以下是更正的代码(为优化做了一些更改)。看到它工作here

#include <cstdlib>
#include <iostream>
#include <ctime>
#include <climits>
using namespace std;


int main(int argc, char** argv) {
    {
        cout << "Enter array size " << endl;
    }
    float sum = 0;
    int size;
    cin >> size;
    int array[size]; 
    int max = INT_MIN;
    int min = INT_MAX;
    srand((unsigned)time(NULL));
    for (int i = 0; i < size; i++)
    {
        array[i] = 1+rand()%100 ;
        sum += array[i];
        cout << "number " << i << " = "<< array[i] << endl;

        if (array[i] > max){
            max = array[i]; 
        }
         if (array[i] < min){
            min = array[i]; 
        }
    }
    cout << "\nmax = " << max << endl;
    cout << "\nmin = " << min << endl;
    cout << "\nsum = "<< sum << endl;
    cout << "\navg = " << sum / size << endl;
    return 0;
}

【讨论】:

    【解决方案3】:

    为了确保您的maxmin 被正确初始化,C++ 为所有类型提供了std::numeric_limits。它们每个都有 max()min() 成员函数来返回类型的 maxmin 值。在任何想要找到最大值和最小值的代码中,首先要将最大值初始化为类型的最小值,反之亦然。这样,任何值都将大于您的 min 并小于您的 max

    您可以使用 std::numeric_limits 来执行此操作,类似于:

    int min = std::numeric_limits<int>::max()
    int max = std::numeric_limits<int>::min()
    

    如果您还有其他问题,请告诉我。

    【讨论】:

    • 如果数组已经初始化,那么将最小值和最大值设置为数组的第一个元素并遍历其余元素当然是合法的,就像设置最小值和最大值一样到他们类型的极值?
    猜你喜欢
    • 2018-05-03
    • 1970-01-01
    • 2017-08-18
    • 2021-09-15
    • 2018-07-01
    • 2019-03-31
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多