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

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

16.10.2012, 18:40. Просмотров 4140. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

5
igorrr37
1867 / 1483 / 751
Регистрация: 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
Эксперт С++
5116 / 1554 / 950
Регистрация: 23.01.2011
Сообщений: 3,183
Завершенные тесты: 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
290 / 202 / 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

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

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

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


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

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

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