Форум программистов, компьютерный форум CyberForum.ru

Поиск 2-х наибольших чисел - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.76
Psixodelik
 Аватар для Psixodelik
39 / 38 / 2
Регистрация: 27.11.2009
Сообщений: 93
31.03.2010, 20:31     Поиск 2-х наибольших чисел #1
Всем привет))) Вопрос вот в чём: подскажите как найти 2 наибольших числа из 10...массивами пользоваться нельзя)))) Ну первое число это просто...это я сделал...вот не могу вспомнить как вывести 2-е....можете не писать сам код, а просто навести на путь истинный)))

вот пример нахождения самого наибольшего

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int _tmain(int argc, _tchar* argv[])
{
    setlocale(lc_all,"russian");
 
    int counter = 0;
    int number;
    int largest = 0;
 
    while (counter < 10)
    {
        cout << "введите объём продаж ";
        cin >> number;
        if(number > largest)
            largest = number;
        counter ++;
    }
    cout << "наибольший объём продаж = " << largest << endl;
    return 0; 
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2010, 20:31     Поиск 2-х наибольших чисел
Посмотрите здесь:

сумма 5 наибольших чисел C++
Задан массив натуральных чисел X из 20 элементов. Удалить из него 2 наибольших и наименьших элемента. C++
C++ найти произведение двух наибольших из трех введенных с клавиатуры чисел
Сумма двух наибольших чисел последовательности. C++
Найти произведение двух наибольших отрицательных чисел массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
EvilSlipp3r
32 / 32 / 3
Регистрация: 25.03.2010
Сообщений: 45
31.03.2010, 21:14     Поиск 2-х наибольших чисел #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
много раз не тестил, то вроде похоже на правду
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main() {
        int counter = 0;
        int number, temp;
        int largest = 0;
        int largest2 = 0;
        while (counter < 10)
        {
                cout << "enter element: ";
                cin >> number;
                if(number > largest)
                        largest = number;
 
                if(largest > largest2){
                    temp = largest2;
                    largest2 = largest;
                    largest = temp;
                }
 
                counter ++;
        }
        cout << "MAX = " << largest << " and " << largest2 << endl;
        return 0;
}
Psixodelik
 Аватар для Psixodelik
39 / 38 / 2
Регистрация: 27.11.2009
Сообщений: 93
31.03.2010, 21:18  [ТС]     Поиск 2-х наибольших чисел #3
Спасибо! Тема закрыта
2Bik
4 / 4 / 2
Регистрация: 14.12.2009
Сообщений: 17
31.03.2010, 21:18     Поиск 2-х наибольших чисел #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <conio.h>
using namespace std;
 
int main()
{
        int counter = 0;
        int number;
        int largest = 0;
        int pre_largest=0;
 
        while (counter < 10)
        {
                cout << "Input volume: ";
                cin >> number;
                if(number > pre_largest)
         {      
                pre_largest = number;
                       if (number > largest)
        {
             pre_largest = largest;
             largest = number;
         }
           }
           counter ++;
        }
        cout << "Largest = " << largest << endl;
        cout << "Pre_Largest = " << pre_largest << endl;
 
        getch();
       
        return 0; 
}
mousebc103
0 / 0 / 1
Регистрация: 01.08.2011
Сообщений: 15
01.08.2011, 23:16     Поиск 2-х наибольших чисел #5
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
 
main()
{     int i=0, num, naib, wtor;
      
      printf("Введите число: ");
      scanf("%d", &num);
      scanf("%*c");
      naib=num;
      wtor=num;
      ++i;
      
      while (i<10)
      {printf("Введите число: ");
      scanf("%d", &num);
      scanf("%*c");
      
      if (num>wtor)
      {
                   wtor=num;
                   if(num>naib)
                   {
                               wtor=naib;
                               naib=num;
                               }
                               }
                               
      
      ++i;
      }
      
      printf("\n Наибольшее : %d", naib);
      printf("\n Второе : %d", wtor);
      
      scanf("%*c");
      
      return 0;
      }
num - число,naib - наибольшее, wtor - второе,i счетчик.

От себя добавлю.Наибольшему и второму присваивается значение первого вводимого числа.
Строчки 6-11 - на случай отрицательных чисел.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
01.08.2011, 23:31     Поиск 2-х наибольших чисел #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
 
 
using namespace std;
 
int main()
{
    vector<int> b;
 
    b.push_back(6);
    b.push_back(2);
    b.push_back(65);
    b.push_back(1);
    b.push_back(2);
    b.push_back(39);
    b.push_back(9);
    b.push_back(4);
    b.push_back(7);
 
    sort(b.begin(), b.end());
 
    vector<int>::const_iterator it = b.end();
 
    advance(it, -1);
    cout << "Second large = " << *it;
 
    advance(it, -1);
    cout << "First large = " << *it;
 
    return 0;
}
Olga_
 Аватар для Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
01.08.2011, 23:32     Поиск 2-х наибольших чисел #7
C
1
2
3
4
5
6
7
8
9
10
11
#include<limits.h>
void Max(int *a, int n, int *max1, int *max2)
{
   int i;
   *max1 = *max2 = INT_MIN;
   for (i = 0; i < n; i++)
      if (a[i] > *max1)
         *max1 = a[i];
      else if (a[i] > *max2 && a[i] < *max1)
         *max2 = a[i];
}
Сыроежка
Заблокирован
01.08.2011, 23:54     Поиск 2-х наибольших чисел #8
Цитата Сообщение от PointsEqual Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
 
 
using namespace std;
 
int main()
{
    vector<int> b;
 
    b.push_back(6);
    b.push_back(2);
    b.push_back(65);
    b.push_back(1);
    b.push_back(2);
    b.push_back(39);
    b.push_back(9);
    b.push_back(4);
    b.push_back(7);
 
    sort(b.begin(), b.end());
 
    vector<int>::const_iterator it = b.end();
 
    advance(it, -1);
    cout << "Second large = " << *it;
 
    advance(it, -1);
    cout << "First large = " << *it;
 
    return 0;
}
У вас ошибка в коде, так как если последовательность чисел имеет всего лишь один максимальный элемент, то у вас получится неправильный ответ, так как ваши два максимальных элемента будут иметь разные значения. Более того если сформулировать задачу корректнее, то есть найти позиции двух максимальных элементов, то ваш код с этой задачей не справится, так как вы перемешали исходную последовательность. Кроме того, если вы используете средства С++, то почему бы не использовать алгоритмы?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
01.08.2011, 23:58     Поиск 2-х наибольших чисел #9
PointsEqual,
Цитата Сообщение от Psixodelik Посмотреть сообщение
массивами пользоваться нельзя
Хоть и не явно, но все же...
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
02.08.2011, 00:00     Поиск 2-х наибольших чисел #10
Цитата Сообщение от Сыроежка Посмотреть сообщение
У вас ошибка в коде, так как если последовательность чисел имеет всего лишь один максимальный элемент, то у вас получится неправильный ответ
это только пример, без учета сколько в массиве элементов, 0 или 1 или больше.

Цитата Сообщение от Сыроежка Посмотреть сообщение
Более того если сформулировать задачу корректнее,
как сформулирована так сформулирована
Сыроежка
Заблокирован
02.08.2011, 00:12     Поиск 2-х наибольших чисел #11
Во-первых, я бы хотел отметить, что предложенные в начале варианты страдают "детской болезнью", когда начальным значениям максимумов присвоены нули. Так как рассматривается последовательность целых чисел, то вполне возможно, что все члены последовательности будут отрицательными, а тогда значение 0 для максимумов очевидно будет неверным.
Во-вторых, задачу следует переформулировать более корректно, то есть найти номера членов последовательности для двух максимальных элементов.

Вообще-то, здача решается очень просто! Нужно для первого максимума использовать строгое неравенство при сравнении максимума и очередного элемента. А для второго максимума использовать не строгое неравенство. То есть для первого максимума max1 использовать конструкцию

if ( max1 < element ) max1 = element;

А для второго максимума max2 использовать конструкцию

if ( max2 <= element ) max2 = element;

Тогда будет найден первый максимум в последовательности и последний максимум в последовательности.

Если писать свой алгоритм, то для первого максимума можно использовать стандартный предикат std::less, а для второго std::less_equal.

Прототип шаблона собственного алгоритма для этих целей может выглядеть так

template <typename InputIterator>

std:air<typename std::iterator_traits<InputIterator, typename std::traits<InputIterator>
two_max( InputIterator first, InputIterator last );

Добавлено через 2 минуты
Во-первых, я бы хотел отметить, что предложенные в начале варианты страдают "детской болезнью", когда начальным значениям максимумов присвоены нули. Так как рассматривается последовательность целых чисел, то вполне возможно, что все члены последовательности будут отрицательными, а тогда значение 0 для максимумов очевидно будет неверным.
Во-вторых, задачу следует переформулировать более корректно, то есть найти номера членов последовательности для двух максимальных элементов.

Вообще-то, здача решается очень просто! Нужно для первого максимума использовать строгое неравенство при сравнении максимума и очередного элемента. А для второго максимума использовать не строгое неравенство. То есть для первого максимума max1 использовать конструкцию

if ( max1 < element ) max1 = element;

А для второго максимума max2 использовать конструкцию

if ( max2 <= element ) max2 = element;

Тогда будет найден первый максимум в последовательности и последний максимум в последовательности.

Если писать свой алгоритм, то для первого максимума можно использовать стандартный предикат std::less, а для второго std::less_equal.

Прототип шаблона собственного алгоритма для этих целей может выглядеть так

template <typename InputIterator>

C++
1
2
std::pair<typename std::iterator_traits<InputIterator>::value_type, typename std::traits<InputIterator>::value_type>
two_max( InputIterator first, InputIterator last );
mousebc103
0 / 0 / 1
Регистрация: 01.08.2011
Сообщений: 15
02.08.2011, 00:46     Поиск 2-х наибольших чисел #12
С/С++ для начинающих В данном разделе "детская болезнь" уместна
На такую простую задачу столько батек сбежалось.

Даёшь рабочий код!
Сыроежка
Заблокирован
02.08.2011, 00:55     Поиск 2-х наибольших чисел #13
Цитата Сообщение от mousebc103 Посмотреть сообщение
С/С++ для начинающих В данном разделе "детская болезнь" уместна
На такую простую задачу столько батек сбежалось.

Даёшь рабочий код!
\Ошибки нигде не уместны, когда они даются в решениях на поставленный вопрос! Иначе получится, что человек пришел на форум с некоторым вопросом об ошибке и уйдетт с форума, получив замену одной ошибки на другую.
Olga_
 Аватар для Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
02.08.2011, 07:10     Поиск 2-х наибольших чисел #14
Четко сформулируйте задачу. А уж решить ее не составит НИКАКИХ проблем для АБСОЛЮТНО любого случая поиска двух максимальных элементов.
Frenk-kobalt
0 / 0 / 0
Регистрация: 02.08.2011
Сообщений: 10
03.08.2011, 14:03     Поиск 2-х наибольших чисел #15
......
mousebc103
0 / 0 / 1
Регистрация: 01.08.2011
Сообщений: 15
03.08.2011, 14:31     Поиск 2-х наибольших чисел #16
Frenk-kobalt,
В 5 посте ищи полный код.
C
1
2
3
4
5
6
7
8
9
if (num>wtor)
      {
                   wtor=num;
                   if(num>naib)
                   {
                               wtor=naib;
                               naib=num;
                               }
                               }
Это для 2х наибольших.Для двух наименьших делается аналогично.
num - число,naib - наибольшее, wtor - второе.
-=ЮрА=-
Заблокирован
Автор FAQ
04.08.2011, 10:22     Поиск 2-х наибольших чисел #17
Цитата Сообщение от EvilSlipp3r Посмотреть сообщение
int largest = 0;
* * * * int largest2 = 0;
А если речь будет идти скажем о температурах за день в течении января где нибудь на камчатке, и мы сравниваем -50 с нулём, что будет на выходе???Наверное 0, да?В то время как температуры будут -40 в среднем, такие начальные приблежения не верны...
Olga_
 Аватар для Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
04.08.2011, 11:08     Поиск 2-х наибольших чисел #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А если речь будет идти скажем о температурах за день в течении января где нибудь на камчатке, и мы сравниваем -50 с нулём, что будет на выходе???Наверное 0, да?В то время как температуры будут -40 в среднем, такие начальные приблежения не верны...
Типичная ошибка новичков. А потом удивляются почему программа неправильно работает.

Добавлено через 39 минут
Если массивами пользоваться нельзя, то вот вариант с последовательностью. Вводим произвольное количество элементов до первого 0 (вместо 0 можно другой модификатор конца поставить). В итоге, печатаются 2 различных! максимальных элемента.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<limits.h>
 
int main()
{
   int x, max1, max2;
   scanf("%d", &x);
   max1=max2=INT_MIN;
   while (x)
   {
     if (x > max1)
     {
         max2 = max1;
         max1 = x;
     }
      else if (x > max2 && x < max1)
         max2 = x;
      scanf("%d", &x);
   }
   printf("max1 = %d, max2 = %d\n", max1, max2);
   return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
04.08.2011, 11:22     Поиск 2-х наибольших чисел #19
Цитата Сообщение от Olga_ Посмотреть сообщение
int x, max1, max2;
* *scanf("%d", &x);
* *max1=max2=INT_MIN;
- тоже не верно
Не следует приравнивать величину ничему не принадлежащему введенной последовательности, а если задача на минимум будет тогда INT_MAX?А если мне нужен сам диапазон введенных величин, нижняя и верхняя границы???
C++
1
2
3
int x, max1, max2;
scanf("%d", &x);
max1 = x; max2 = x;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2011, 12:02     Поиск 2-х наибольших чисел
Еще ссылки по теме:

Найти произведение двух наибольших четных чисел массива C++
C++ Найти сумму двух наибольших из трех заданных различных чисел
C++ Задача на поиск 2х наибольших чисел

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Olga_
 Аватар для Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
04.08.2011, 12:02     Поиск 2-х наибольших чисел #20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- тоже не верно
Не следует приравнивать величину ничему не принадлежащему введенной последовательности, а если задача на минимум будет тогда INT_MAX?А если мне нужен сам диапазон введенных величин, нижняя и верхняя границы???
C++
1
2
3
int x, max1, max2;
scanf("%d", &x);
max1 = x; max2 = x;
Понимаете в чем тут дело. Если в задаче найти два различных максимальных элемента, например из чисел 5, 5, 4, 4, 1, то при инициализации max1 = x; max2 = x; Вы второе максимальное значение (4) не сможете найти. Так тоже не пойдет.
Yandex
Объявления
04.08.2011, 12:02     Поиск 2-х наибольших чисел
Ответ Создать тему
Опции темы

Текущее время: 15:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru