Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/76: Рейтинг темы: голосов - 76, средняя оценка - 4.86
 Аватар для Psixodelik
42 / 41 / 5
Регистрация: 27.11.2009
Сообщений: 100

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

31.03.2010, 20:31. Показов 14603. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет))) Вопрос вот в чём: подскажите как найти 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; 
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2010, 20:31
Ответы с готовыми решениями:

Задача на поиск 2х наибольших чисел
Попалась задачка с ныне мне не встречавшейся переменной tmp. Единственное, что я нашла в интернете, так это то, что tmp создают для...

Найти 10 наибольших чисел в массиве из 10000 чисел и записать в массив
Есть массив положительных чисел (значение каждого числа не превышает 3000). Найти 10 наибольших чисел и записать в массив arr. ...

Поиск в массиве: найти 5 наибольших элементов
Есть массив чисел, в нем найти 5 крупнейших чисел и вывести на экран. Вот мой код, но он не работает правильно, когда вместо 100 написать...

29
33 / 33 / 11
Регистрация: 25.03.2010
Сообщений: 45
31.03.2010, 21:14
Лучший ответ Сообщение было отмечено как решение

Решение

много раз не тестил, то вроде похоже на правду
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;
}
4
 Аватар для Psixodelik
42 / 41 / 5
Регистрация: 27.11.2009
Сообщений: 100
31.03.2010, 21:18  [ТС]
Спасибо! Тема закрыта
0
4 / 4 / 4
Регистрация: 14.12.2009
Сообщений: 17
31.03.2010, 21:18
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; 
}
1
0 / 0 / 1
Регистрация: 01.08.2011
Сообщений: 20
01.08.2011, 23:16
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 - на случай отрицательных чисел.
0
ниначмуроФ
 Аватар для PointsEqual
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
01.08.2011, 23:31
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;
}
0
 Аватар для Olga_
848 / 190 / 18
Регистрация: 01.08.2011
Сообщений: 505
01.08.2011, 23:32
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];
}
0
Заблокирован
01.08.2011, 23:54
Цитата Сообщение от 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;
}
У вас ошибка в коде, так как если последовательность чисел имеет всего лишь один максимальный элемент, то у вас получится неправильный ответ, так как ваши два максимальных элемента будут иметь разные значения. Более того если сформулировать задачу корректнее, то есть найти позиции двух максимальных элементов, то ваш код с этой задачей не справится, так как вы перемешали исходную последовательность. Кроме того, если вы используете средства С++, то почему бы не использовать алгоритмы?
1
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
01.08.2011, 23:58
PointsEqual,
Цитата Сообщение от Psixodelik Посмотреть сообщение
массивами пользоваться нельзя
Хоть и не явно, но все же...
1
ниначмуроФ
 Аватар для PointsEqual
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
02.08.2011, 00:00
Цитата Сообщение от Сыроежка Посмотреть сообщение
У вас ошибка в коде, так как если последовательность чисел имеет всего лишь один максимальный элемент, то у вас получится неправильный ответ
это только пример, без учета сколько в массиве элементов, 0 или 1 или больше.

Цитата Сообщение от Сыроежка Посмотреть сообщение
Более того если сформулировать задачу корректнее,
как сформулирована так сформулирована
0
Заблокирован
02.08.2011, 00:12
Во-первых, я бы хотел отметить, что предложенные в начале варианты страдают "детской болезнью", когда начальным значениям максимумов присвоены нули. Так как рассматривается последовательность целых чисел, то вполне возможно, что все члены последовательности будут отрицательными, а тогда значение 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 );
2
0 / 0 / 1
Регистрация: 01.08.2011
Сообщений: 20
02.08.2011, 00:46
С/С++ для начинающих В данном разделе "детская болезнь" уместна
На такую простую задачу столько батек сбежалось.

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

Даёшь рабочий код!
\Ошибки нигде не уместны, когда они даются в решениях на поставленный вопрос! Иначе получится, что человек пришел на форум с некоторым вопросом об ошибке и уйдетт с форума, получив замену одной ошибки на другую.
0
 Аватар для Olga_
848 / 190 / 18
Регистрация: 01.08.2011
Сообщений: 505
02.08.2011, 07:10
Четко сформулируйте задачу. А уж решить ее не составит НИКАКИХ проблем для АБСОЛЮТНО любого случая поиска двух максимальных элементов.
0
0 / 0 / 0
Регистрация: 02.08.2011
Сообщений: 10
03.08.2011, 14:03
......
0
0 / 0 / 1
Регистрация: 01.08.2011
Сообщений: 20
03.08.2011, 14:31
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 - второе.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.08.2011, 10:22
Цитата Сообщение от EvilSlipp3r Посмотреть сообщение
int largest = 0;
* * * * int largest2 = 0;
А если речь будет идти скажем о температурах за день в течении января где нибудь на камчатке, и мы сравниваем -50 с нулём, что будет на выходе???Наверное 0, да?В то время как температуры будут -40 в среднем, такие начальные приблежения не верны...
0
 Аватар для Olga_
848 / 190 / 18
Регистрация: 01.08.2011
Сообщений: 505
04.08.2011, 11:08
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А если речь будет идти скажем о температурах за день в течении января где нибудь на камчатке, и мы сравниваем -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;
}
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.08.2011, 11:22
Цитата Сообщение от 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;
0
 Аватар для Olga_
848 / 190 / 18
Регистрация: 01.08.2011
Сообщений: 505
04.08.2011, 12:02
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- тоже не верно
Не следует приравнивать величину ничему не принадлежащему введенной последовательности, а если задача на минимум будет тогда 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) не сможете найти. Так тоже не пойдет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.08.2011, 12:02
Помогаю со студенческими работами здесь

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

Нахождение суммы трех наибольших чисел в наборе из 7 чисел
Помогите написать, программу нахождения суммы из трех наибольших чисел набора 7 чисел. Я вообще без понятия как это сделать(((

Поиск наименьших, наибольших из 10 элементов.
Найти два наименьших1|наибольших2 из данных десяти элементов Заранее спасибо Добавлено через 3 минуты паскаль

матрица и поиск наибольших элементов
люди добрые, помоги выполнить задание с клавиатуры вводится матрица размера 7 на 6. Найти местоположение всех наибольших элементов...

Поиск заданного количества наибольших значений
Найти заданное количество наибольших значений массива. using System; using System.Collections.Generic; using System.Linq; using...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru