2016-11-02 4 views
0

enter image description hereСамый большой и второй по величине число в массиве C++

Я написал код в C++ для поиска большой и второй по величине элемент в массиве. Код работает нормально, но проблема в местоположении второго по величине номера не обновляется. Хотя значение второго по величине числа верно, но его местоположение неверно.

#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

в случае 'DATA [я]> largestNumber' вы должны добавить' LOC2 = LOC1; '' Перед LOC1 = i': каждый раз, когда вы назначаете 'secondLargestNumber', вы должны назначить' loc2'. – Franck

+0

Обратите внимание, что вам не нужно сохранять значения, достаточно позиций. Это значительно упростит код – Slava

ответ

2

Могу я предложить более простое решение?

#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

ваш код может быть UB, никто не говорит, что значения уникальны. Он может иметь другой результат как код OP. Хотя неясно, правильный ли код OP. – Slava

+0

@ Простое замещение Слайны http://en.cppreference.com/w/cpp/container/multiset – mkmostafa

0

если вы только сохранить позиции, а не значение, ваш код может быть значительно упрощен:

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

использование «LOC2 = LOC1» заявление на первом, если блок я думаю, что он будет работать, проверить этот код ,

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; 
    } 
} 
Смежные вопросы