数组中的三个最大数字

时间:2017-07-07 12:27:41

标签: c++

#include<iostream>
using namespace std;
int main()
{
    int s;
    cin>>s;
    int t=3;
    int maxValue,imax[t],maxIndex,arr[s];
    for(int i=0; i<s; i++){
        cin>>arr[i];
    }
    maxValue=arr[0];
    for(int i=0;i<s;i++){
        if(arr[i]>maxValue){
             maxValue=arr[i];
             imax[0] = i;
        }
    }
    maxValue=arr[0];
    for(int i=0;i<s;i++){
        if (i == imax[0]) { continue; }
        if(arr[i]>maxValue){
            maxValue=arr[i];
            imax[1] = i;
        }
    }
    maxValue=arr[0];
    for(int i=0;i<s;i++){
        if (i == imax[0]) { continue; }
        if (i == imax[1]) { continue; }
        if(arr[i]>maxValue){
            maxValue=arr[i];
            imax[2] = i;
        }
    }
    cout<<"First biggest number:"<<arr[imax[0]]<<"\n";
    cout<<"Second biggest number:"<<arr[imax[1]]<<"\n";
    cout<<"Third biggest number:"<<arr[imax[2]];
    return 0;
}

这个程序必须返回这个数组中最大的树数但是,我不知道为什么当我作为例子介绍五个数字(121,34,56,67,545)并且编译器返回545然后崩溃。 提前谢谢您的回答。

2 个答案:

答案 0 :(得分:1)

问题是在迭代循环之前,首先将maxValue设置为数组中的第一个元素。只有当至少有一个元素大于当前imax时,maxValue才会更新。但是,如果第一个元素在某种程度上是您要查找的maxValue,则imax永远不会被设置,这将是未初始化的,从而导致最后的分段错误。

在您的代码中,在找到最大元素545之后,从未找到第二大元素,因为121是数组中的第一个元素。因此,在打印出545之后,imax[1]未初始化并且程序崩溃。

答案 1 :(得分:0)

您在行

中使用未初始化的数组值
cout<<"First biggest number:"<<arr[imax[0]]<<"\n";
cout<<"Second biggest number:"<<arr[imax[1]]<<"\n";
cout<<"Third biggest number:"<<arr[imax[2]];

如果输入中有少于3个不同的数字,则不会初始化某些imax数组元素。此外,如果输入数组为空,则根本不会初始化imax。

因此,在表达式arr[imax[1]]中,您读取带有索引的arr元素,该元素未初始化,可能是一些非常大的数字。如果您将iarr声明为

,则可以修复此问题
int imax[t] = {};

这将零初始化数组的所有元素并防止崩溃。

您的程序也不会检查输入数组中的元素数量,因此如果输入数字少于三个,则arr[2]也会打印未初始化的值。

这是使用STL算法和std :: vector的正确解决方案。它适用于任意数量的t - 您可以轻松更改它以打印最大的10个数字。它还具有内存效率 - 它不需要存储整个输入数组,因此您可以使用它处理大量输入。

#include <algorithm>
#include <iostream>
#include <vector>

int main() {
  int s;
  std::cin >> s;

  unsigned t = 3;
  std::vector<int> max_numbers;
  max_numbers.reserve(t + 1);

  for (int i = 0; i < s; ++i) {
    int number;
    if (std::cin >> number) { //Check basic input errors
      max_numbers.push_back(number); // Add number to top-3 list

      // Sort elements in descending order
      std::sort(max_numbers.begin(), max_numbers.end(), std::greater<int>());

      // Remove duplicates
      max_numbers.erase(std::unique(max_numbers.begin(), max_numbers.end()),
                        max_numbers.end());

      // Remove excess elements
      if (max_numbers.size() > t) {
        max_numbers.resize(t);
      }
    }
  }

  std::cout << "Biggest " << t << " numbers are" << std::endl;
  for (int i : max_numbers) {
    std::cout << i << std::endl;
  }
}