2017-07-07 2 views
1
#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; 
} 

Ce programme doit retourner le nombre d'arbres qui est le plus grand dans ce arraybut, je ne sais pas pourquoi quand je présente comme exemple cinq numéros (121,34,56,67,545) et le compilateur a été Renvoie 545, puis tombe en panne. Merci d'avance pour la réponse.Les trois plus grands nombres dans tableau

+0

'arr [s]' n'est pas standard C++. Ne peux-tu pas utiliser un 'std :: vector ' à la place? Aussi, comment gérez-vous le cas où les 3 premiers numéros contiennent des doublons? – Bathsheba

+1

Comme l'a dit @Bathsheba, utilisez 'std :: vector'. Puis cherchez 'std :: nth_element'. –

+0

quand je commence le compilateur je présente comme exemple cinq nombres (121,34,56,67,545) et le compilateur était le retour 545 et ensuite décomposer –

Répondre

1

Le problème est que, avant itérer la boucle, vous devez d'abord définir la maxValue être le premier élément du tableau. Le imax est mis à jour chaque fois qu'il y a au moins un élément supérieur à l'actuel maxValue. Cependant, si le premier élément est en quelque sorte le maxValue que vous recherchez, alors le imax ne sera jamais défini, ce qui ne serait pas initialisé, causant une erreur de segmentation à la fin.

Dans votre code, après avoir trouvé l'élément le plus grand 545, le deuxième plus grand élément n'a jamais été trouvé, puisque 121 est le premier élément du tableau. Par conséquent, après l'impression de 545, imax[1] n'est pas initialisé et le programme se bloque.

0

Vous utilisez des valeurs de tableau dans les lignes non initialisées

cout<<"First biggest number:"<<arr[imax[0]]<<"\n"; 
cout<<"Second biggest number:"<<arr[imax[1]]<<"\n"; 
cout<<"Third biggest number:"<<arr[imax[2]]; 

S'il y a moins de 3 différents numéros en entrée, certains éléments du tableau imax ne seront pas initialisés. De même, si le tableau d'entrée est vide, imax ne sera pas initialisé du tout.

Par conséquent dans l'expression arr[imax[1]] vous lisez l'élément de arr avec index, qui n'a pas été initialisé et peut être un très grand nombre. Il peut être fixé si vous déclarez iarr comme

int imax[t] = {}; 

Cela zéro initialiser tous les éléments du tableau et éviter de s'écraser.

Votre programme ne vérifie pas non plus le nombre d'éléments dans la matrice d'entrée, donc s'il y a moins de trois nombres d'entrée, arr[2] imprime également la valeur non initialisée.

Voici la solution appropriée en utilisant les algorithmes STL et std :: vector. Il fonctionne avec n'importe quel nombre de t - vous pouvez facilement le changer pour imprimer les 10 plus grands nombres. Il est également efficace sur le plan de la mémoire - il n'a pas besoin de stocker tout le tableau d'entrée pour pouvoir traiter de grandes entrées avec lui.

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

Merci pour la réponse. –