#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然后崩溃。 提前谢谢您的回答。
答案 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;
}
}