Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
#1

Найти два максимальных значения в массиве - C++

16.10.2012, 18:40. Просмотров 3946. Ответов 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Найдти 2 максимальных значения без сортировки массива и
// и дополнительных элементов (контейнеры и доплнительные массивы).
 
#include <iostream>
#include <cstdlib>
using namespace std;
 
int main()
{
  cout << "Программа запрашивает у пользователя ввести количество\n"
       << "челочисленных элементов в массиве. Присваивает им\n"
       << "произвольное значение. И находит 2 самых больших элемента.\n"
       << endl;
 
  size_t N = 0;
  cout << "Введите, подалуйста, количество элементов (от 2 до 1000): ";
  cin >> N;
  while (  N < 2 || N > 1000 ) {
    cout << "Количество элементов не входит в диапазон значений.\n";
    cout << "Введите, подалуйста, количество элементов"
     << "(от 2 до 1000): ";
    cin >> N;
  }
 
  // Заполним массив произвольными значениями и отобразим результат
  int arr[N];
  for ( int *p = arr; p != arr + N; ++p ) {
    *p = rand();
    cout << *p << "\n";
  }
  cout << endl;
 
  // найдём максимальное значение
  int *max_val1 = arr;
  for ( int *ptr = arr + 1; ptr != arr + N; ++ptr )
    if ( *max_val1 < *ptr )
      max_val1 = ptr;
 
  //*** ДО ЭТОГО МОМЕНТА РЕЗУЛЬТАТ ПРОГРАММЫ УДОВЛЕТВОРЯЕТ УСЛОВИЕ ***
  // попытка найти наибольшее значение но меньше максимального
  int *max_val2 = arr;
  for ( int *ptr = arr + 1; ptr != arr + N; ++ptr )
    if ( *max_val2 < *ptr ) {
      if ( max_val2 == max_val1 ) continue; /* проверим, не равны ли
                           указатели и если равны,
                           перейти к следующей 
                           итерации цикла for */
      else max_val2 = ptr;
    }
 
  // отбразим результат поиска
  cout << *max_val1 << "\n"
       << *max_val2 << endl;
 
 
  return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2012, 18:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Найти два максимальных значения в массиве (C++):

В одномерном массиве найти два максимальных элемента и удалить все элементы между ними
Дана задача : В одномерном массиве найти два максимальных элемента и удалить...

Последовательность целых чисел. Найти два минимальных / два максимальных элемента
Дана последовательность целых чисел a1,a2,...,an, где n=&gt; 3. Найти: а) два...

Два максимальных значения из 10 целых чисел
Найдите два наибольших значения из 10 чисел. .

Найти два первых элемента в массиве, значения которых не попадают в заданный диапазон
Здравствуйте. Помогите с работой в c++ массивы. 1. Найти два первых элемента...

Функция, находящая два максимальных числа в массиве и возвращающая структуру с этими числами
Напишите функцию, находящую два максимальных числа в массиве и возвращающую...

Найти два первых элемента в массиве С(17), значения которых не попадают в заданный с клавиатуры диапазон [A,B], и поменя
Найти два первых элемента в массиве С(17), значения которых не попадают в...

5
igorrr37
1863 / 1481 / 749
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
16.10.2012, 20:47 #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
24
25
26
27
28
#include <iostream>
#include <algorithm>
#include <climits>
 
int main()
{
    int arr[] = {3, -5, 8, 8};
    size_t const size = sizeof(arr) / sizeof(*arr);
    // первый максимум
    int max1 = *std::max_element(std::begin(arr), std::end(arr));
    // поиск второго
    int max2 = INT_MIN;
    bool found = false;
    for(size_t i = 0; i < size; ++i)
    {
        if((arr[i] != max1) && (arr[i] >= max2))
        {
            max2 = arr[i];
            found = true;
        }
    }
    std::cout << "max1: " << max1 << std::endl;
    if(found)
    {
        std::cout << "max2: " << max2 << std::endl;
    }
    return 0;
}
1
Ev[G]eN
iOS/Android Developer
Эксперт С++
5115 / 1553 / 950
Регистрация: 23.01.2011
Сообщений: 3,179
Завершенные тесты: 1
16.10.2012, 21:06 #3
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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
int main()
{
    srand(time(0));
    
    int Size = 0;
    std::cout << "Size: ";
    std::cin >> Size;
    
    int *Array = new int [Size];
    int firstMax = 0, secondMax = 0;
    
    std::cout << "Array: " << std::endl;
    for(int i = 0; i < Size; i++)
    {
            std::cout << (Array[i] = rand() % 50) << " ";
            if(Array[i] > Array[firstMax])
                        firstMax = i;
            if((Array[i] > Array[secondMax]) && (Array[i] != Array[firstMax]))
                         secondMax = i;
    }
    std::cout << "\nFirst max: " << Array[firstMax] << "; Second max: " << Array[secondMax];
    std::cout << std::endl;
    delete [] Array;
    
    system("pause");
    return 0;
}
2
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
16.10.2012, 21:54  [ТС] #4
Я вот не пойму, почему в моём примере не проходит проверка на равенство указателей? В результате у меня получаются в обоих случаях одинаковый результат - максимальное значение. Хотя по идее, при второй переборке массива максимальное значение первой переборке должно игнорироваться.
0
Valeriy K
0 / 0 / 0
Регистрация: 14.02.2018
Сообщений: 1
14.02.2018, 21:10 #5
Можно решить так
Вариант №1:
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
template<typename _anyType,std::size_t _size>
void _twoMaxValues(std::array<_anyType,_size>_arr) {
    _anyType _firstMaxValue, _secondMaxValue;
    _firstMaxValue = _secondMaxValue=_arr[0];
    for (int j = 0; j < _size; j++) {
        for (int k = 0; k < _size; k++) {
            if (_firstMaxValue < _arr[k])_firstMaxValue = _arr[k];
            if ((_firstMaxValue != _arr[k]) && (_secondMaxValue < _arr[k]))
            _secondMaxValue = _arr[k];
        }
    }
    std::cout << "Max first = " << _firstMaxValue << std::endl;
    std::cout << "Max second = " << _secondMaxValue << std::endl;
}
 
 
int main()
{
 
    std::array<int, 10 >_arr{-5,-65,0,4,7,2,-5656,6,10000,6};
    std::array<int, 10>::iterator _iter = _arr.begin();
    int _lengthOfArr = _arr.size();
 
    for (; _iter != _arr.end(); _iter++)
        std::cout << *_iter << " ";
    std::cout << std::endl;
 
    _twoMaxValues(_arr);
 
 
    
    return 0;
}
Вариант №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
24
int main()
{
 
    std::array<int, 10 >_arr{2, 4, -4, 0, 7, 10, 55, -45, 3, -1};
    std::array<int, 10>::iterator _iter = _arr.begin();
 
 
    std::sort(_arr.begin(), _arr.end());
 
    for (; _iter != _arr.end(); _iter++)
        std::cout << *_iter << " ";
    std::cout << std::endl;
 
 
    int _firstMaxValue = _arr.back();
    int _lengthOfArr = _arr.size();
    int _secondMaxValue = _arr[_lengthOfArr-2];
 
    std::cout << "first max value = " << _firstMaxValue << '\n';
    std::cout << "second max value =  " << _secondMaxValue << std::endl;
 
    
    return 0;
}
0
Herji
288 / 200 / 173
Регистрация: 11.05.2016
Сообщений: 658
Завершенные тесты: 1
14.02.2018, 23:45 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
    int a = arr[0];
    int b = arr[1];
    if(a < b) std::swap(a,b);
 
    for(int i=2; i<n; i++)
    {
        if(arr[i] > b && arr[i]!=a)
        {
            b = arr[i];
            if(a < b) std::swap(a,b);
        }
    }
Добавлено через 3 минуты
Нет, плохо, не сработает при двух максимальных arr[0] arr[1]

Добавлено через 1 час 44 минуты
Хотя...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    int a = arr[0];
    int i=1;
    while(a == arr[i] && i<n) i++;
    if(i < n)
    {
        int b = arr[i];
        if(a < b) std::swap(a,b);
 
        for(++i; i<n; i++)
        {
            if(arr[i] > b && arr[i]!=a)
            {
                b = arr[i];
                if(a < b) std::swap(a,b);
            }
        }
        std::cout << "\n" << a << " " << b;
    } else {
        std::cout << "\n all elements same " << a;
    }
0
14.02.2018, 23:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2018, 23:45
Привет! Вот еще темы с решениями:

Найти два максимальных числа
Задача впринципе легкая, но меня что-то зациклило по полной. Найти два...

Найти два максимальных числа из потока
Здравствуйте, нужна ваша помощь. Нужно найти два максимальных числа из одного...

Найти два максимальных элемента из интервала
Даны числа a, b (0 &lt; a &lt; b) и набор из десяти элементов. Найти...

Найти r максимальных в массиве
Надо найти определенное число максимальных эл-тов в массиве. Не могу найти...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru