2016-11-02 4 views
0

enter image description heregrößte und zweitgrößte Zahl im Array C++

I einen Code in C++ geschrieben sind für die Suche nach größten und zweitgrößten Elements in einem Array. Code funktioniert gut, aber das Problem ist der Ort der zweitgrößten Nummer wird nicht aktualisiert. Obwohl der Wert der zweitgrößten Zahl korrekt ist, ist die Position jedoch nicht korrekt.

#include<iostream> 
using namespace std; 
void main() 
{ 
    int DATA[10]; 
    int largestNumber, secondLargestNumber, loc1, loc2; 
    cout << "Enter 10 numbers of array DATA" << endl; 
    for (int i = 0; i < 10; i++) 
    { 
     cin >> DATA[i]; 
    } 
    largestNumber = DATA[1]; 
    secondLargestNumber = DATA[2]; 
    loc1 = 1; 
    loc2 = 2; 
    if (largestNumber < secondLargestNumber) 
    { 
     largestNumber = DATA[2]; 
     secondLargestNumber = DATA[1]; 
    } 
    for (int i = 2; i < 10; i++) 
    { 
     if (DATA[i]>largestNumber) 
     { 
      secondLargestNumber = largestNumber; 
      largestNumber = DATA[i]; 
      loc1 = i; 

     } 
     else if (DATA[i]>secondLargestNumber) 
     { 
      secondLargestNumber = DATA[i]; 
      loc2 = i; 
     } 
    } 
    cout << "Largest Number with location :"<<largestNumber<<" "<<loc1 << endl; 
    cout << "Second Largest Number location  :" << secondLargestNumber<<" "<<loc2 << endl; 
    cin.get(); 
    cin.get(); 
} 
+0

im Fall 'DATA [i]> largestNumber' sollten Sie fügen' loc2 = loc1; '' vor loc1 = I': jedes Mal, wenn Sie zuweisen 'secondLargestNumber', müssen Sie' loc2' zuweisen. – Franck

+0

Beachten Sie, dass Sie keine Werte beibehalten müssen, Positionen sind ausreichend. Dies wird Code erheblich vereinfachen – Slava

Antwort

2

kann ich eine einfachere Lösung vorschlagen?

#include <functional> 
#include <set> 
#include <iostream> 

int main() { 
    std::set<int, std::greater<int>> s; 
    int input; 
    while(true) { // choose your stopping condition 
    cin >> input; 
    s.insert(input); 
    } 
    std::cout << (*s.begin()) << (*std::next(s.begin())) << std::endl; 
} 
+0

Ihr Code hat UB möglich, niemand sagt, dass Werte einzigartig sind. Es kann ein anderes Ergebnis als der OP-Code haben. Es ist jedoch nicht klar, ob der OP-Code korrekt ist. – Slava

+0

@Slava einfacher Ersatz http://en.cppreference.com/w/cpp/container/multiset – mkmostafa

0

wenn Sie Positionen halten, nicht Werte, können Sie Ihren Code wesentlich vereinfacht werden:

int largest = 0, second = -1; 

for (int i = 1; i < 10; i++) { 
    if(second == -1 || DATA[i] > DATA[second]) { 
     second = i; 
     if(DATA[second] > DATA[largest]) 
      std::swap(largest, second); 
    } 
} 
0

Verwendung „loc2 = loc1“ Anweisung auf den ersten, wenn Block Ich denke, es wird funktionieren, diesen Code überprüfen ,

for (int i = 2; i < 10; i++) 
{ 
    if (DATA[i]>largestNumber) 
    { 
     secondLargestNumber = largestNumber; 
     loc2=loc1; 
     largestNumber = DATA[i]; 
     loc1 = i; 

    } 
    else if (DATA[i]>secondLargestNumber) 
    { 
     secondLargestNumber = DATA[i]; 
     loc2 = i; 
    } 
} 
Verwandte Themen