2014-02-28 259 views
0

试图计算数组中的随机数的最大值和最小值,我不知道我在这里做错了什么。我一直在试图弄明白,而且我的智慧已经结束了。也许你们中的一个人可以帮忙?最大输出不正确

#include <iostream> 
#include <stdlib.h> 
#include <ctime> 

using namespace std; 

int main() { 
    int *sora; 
    int num; 
    int min; 
    int max; 

    cout<< "Enter the size : " ; 
    cin >> num; 
    cout<< endl; 
    sora = new int [num]; 

    max= sora[0]; 
    min= sora[0]; 

    srand((unsigned)time(0)); 

    for(int x=0;x<num; x++) { 
     sora[x]=rand()%100; 

     if(min > sora[x]) { 
      min=sora[x];   
     } 
     else if (max < sora[x]) { 
      max=sora[x]; 
     } 

     cout<< sora[x] << endl;  
    } 

    cout<< "Maximum value is: " << max << endl << "Minimum value is: " << min; 
} 
+0

我很惊讶,我不能立即找到这个问题的好副本。 – jerry

+0

我知道对不对?这似乎很简单,就像其他人会犯这个错误,但没有多少人有。 –

回答

2
if(min > sora[x]) { 
    min=sora[x]; 
} 
else if (max < sora[x]) 
{ 
    max=sora[x]; 
} 

有问题。第二个else if声明仅在第一个if满足时才被输入。但第二个if必须始终执行。请按以下方式更改上述块:

if(min > sora[x]) { 
    min = sora[x]; 
} 
if (max < sora[x]) { 
    max = sora[x]; 
} 

而且您还在使用未初始化的区域进行比较。如果您仅使用正数

max = 0; 
min = UINT_MAX; 

如果您使用负数也,然后

max = INT_MIN; 
min = INT_MAX; 

你必须包括<limits.h>这些宏。

+0

我仍然得到错误,最小值是正确的,但是最大值是吹得不成比例的。 –

+0

这是我刚才得到的结果。 最大值为:2952960 最小值为:25 真正的最大值为96 –

+0

没有ü初始化的最小值和最大值正确> –

2

您正在阅读的未初始化的内存位置:

sora = new int [num]; 

max= sora[0]; 
min= sora[0]; 

new创建阵列未初始化其内容。

这导致了所谓的未定义行为,意味着几乎任何事情都可能发生。在这种情况下,它可能很漂亮:某些任意值(最可能在0-99范围外的rand()%100)以最小值和最大值存储,通常会导致错误的结果。

相反,做

// must #include <limits> 

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

甚至只是

int max = 0; 
int min = 99; 

,因为你的范围是预定义的。

+0

谢谢,这解决了我的问题! –

+0

@AlanWatts还注意到Daniel和Sakthi Kumar指出的问题 – jerry

2

你初始化的最小值和最大值为不确定的值,当你做max= sora[0];min= sora[0];

此外,你有一个else,你不一定要一个。第一个值将是最小值。 您可以从设置max=0min=99开始,并且应该解决该特定问题。

+0

你是正确地指出了'else'问题(我没有看到通知后,未定义的行为),但如果第一次生成的值恰好是最大值的(仅为实例),那么适当地设置'min'和'max'将不会修复它。 – jerry

2
sora = new int [num]; 

max= sora[0]; 
min= sora[0]; 

该行用垃圾初始化int数组,并将max和min设置为垃圾值。

你有两个选择:

  1. 在启动初始化最高到最低值可能(INT_MIN)和初始化分钟可能的最高值(INT_MAX)。

  2. 首先创建一个随机值并在sora [0]上赋值,并将max和min初始化为该值。之后,初始化[1 ..num]