2015-07-26 3 views
1

Я пытаюсь выяснить код, который может определять наибольшее число, наименьшее число, второе по величине число и второе наименьшее число для набора введенных чисел. Вот мой код. У меня возникают проблемы в основном из-за инициализации переменных. Буду признателен за любую помощь!C++ looping, самое большое/наименьшее введенное число

Мой код:

#include <iostream> 
#include <cstdlib> 
#include <string> 
using namespace std; 


int main(){ 
    string buffer; 
    unsigned n; 
    double min = 1, max = 0; 
    double min2 = 1, max2 = 5; 
    cout << "How many integers will you enter? "; 
    cin >> n || die("Input failure "); 
    cout << "OK type the " << n << " integers, non #'s to quit: "; 
    for (unsigned count = 0; count < n; count++){ 
     double num; 
     cin >> num; 
     if (min > num){ 
      min = num; 
     } 
     else if (max < num){ 
      max = num; 
     } 
     else if (num >= max2 && num <= max){ 
      max2 = num; 
     } 
     else if (num >= min2 && num <= min){ 
       min2 = num; 
     } 

    } cout << "The largest number is: " << max << endl; 
    cout << "The smallest number is: " << min << endl; 
    cout << "The second smallest number is: " << min2 << endl; 
    cout << "The second largest number is: " << max2 << endl; 

    cin >> buffer; 
} 

ответ

0

Я хотел бы предложить несколько иной подход.

C++ имеет ряд структур данных, таких как std::set, std::map и std::vector, которые применимы для разных сценариев. Например, если вы знаете, что ваши значения уникальны, вы можете поместить их все в std::set, который сохраняет значения, упорядоченные в порядке размера. Тогда, взяв первые два и последние два, вы получите самые высокие и самые низкие значения. Если ваши значения не уникальны, вы можете поместить их все в std::vector, сортировать вектор, а затем делать то же самое: взять первые два и два последних элемента.

Вот пример того, что я имею в виду, используя std::set. Я еще не тестировал это, но вам нужно начать, если вы решите применить этот подход.

#import <set> 

int main() { 

    std::set<double> mySet; 

    mySet.insert(0.0); 
    mySet.insert(100.0); 
    mySet.insert(10.0); 
    mySet.insert(90.0); 
    mySet.insert(20.0); 
    mySet.insert(80.0); 

    double min = *(mySet.begin()); 
    double min2 = *(mySet.begin()+1); 
    double max = *(mySet.end()-1); 
    double max2 = *(mySet.end()-2); 

    return 0; 
} 

Надеюсь, что это поможет!

+0

Здравствуйте! Я на самом деле очень новичок в C++, как бы применить std :: set или std :: vector? Я заменю использование пространства имен std; для использования пространства имен std :: set? – Beezy

+0

Также можно достичь конечного результата со значениями, которые не уникальны, как я сделал это выше, не используя набор или вектор? – Beezy

+0

Привет @Breezy, и добро пожаловать в SO! Вам не нужно менять строку 'using namespace std' - это означает, что вы можете изменить' set 'в моем примере на' std :: set '. 'std' - это пространство имен, и такие вещи, как' set', 'cout' и' cin', являются объектами внутри этого пространства имен. Лично я не ставил строку 'using namespace std' и префикс моих стандартных объектов библиотеки с помощью' std', поэтому я помню, откуда они пришли. :-) –

0

У меня возникают проблемы в основном из-за инициализации переменных.

Если вы хотите инициализировать переменные пределы двойной (например мин и min2 может быть инициализирован до максимального предела двойной, и наоборот для макс и max2) взгляните на это, minimum double value in C/C++.

0

Просто прочитайте все значения в std:vector<double>, затем отсортируйте этот вектор.

Первые два значения будут двумя наименьшими значениями. Последние два будут двумя самыми большими.

Вам нужно будет решить, как обращаться с дублирующимися входами. Например, если одно и то же значение вводится более одного раза.

Смежные вопросы