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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 60, средняя оценка - 4.75
валентин777
0 / 0 / 0
Регистрация: 01.06.2011
Сообщений: 45
#1

Определить количество максимальных элементов в массиве. - C++

26.08.2011, 19:26. Просмотров 7929. Ответов 88
Метки нет (Все метки)

Дан одномерный массив. Определить количество максимальных элементов в массиве.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2011, 19:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определить количество максимальных элементов в массиве. (C++):

Определить индекс первого из максимальных элементов в массиве - C++
Пожалуйста, решите те задачи которые можете: 1).Сортировка выбором предполагает использование трёх приёмов. Первый - нахождение...

В чем ошибка? В массиве целых чисел найти количество максимальных элементов - C++
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 16 #define A 0 #define B 5 void Init(int *a, int n) { ...

В матрице случайных числе определить количество положительных, отрицательных, нулевых и максимальных элементов - C++
1. В матрице размерами N*M определить количество положительных, отрицательных элементов и нулей (N и M не больше 10) и максимальный...

В массиве A из N элементов (N не больше 30) определить количество элементов, имеющих четные значения, и сумму этих элементов. - C++
1. В массиве A из N элементов (N не больше 30) определить количество элементов, имеющих четные значения, и сумму этих элементов. Число N и...

В массиве А(n) (n<=7) хотя бы один нуль. Определить количество положительных и количество отрицательных элементов к первому нулю. - C++
В массиве А(n) (n&lt;=7) хотя бы один нуль. Определить количество положительных и количество отрицательных элементов к первому нулю.

В массиве из 50 элементов определить количество элементов, кратных 6 и найти минимальный элемент - C++
В массиве из 50 элементов определить количество элементов, кратных 6 и найти минимальный элемент. Помогите, кто сможет. Нужно в C++

88
Сыроежка
Заблокирован
29.08.2011, 18:33 #61
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Зачем здесь typedef?

По-моему, в этой теме первым появилось решение alex_x_x'а. Да и ничего сверхестественного в Вашем решении нет, я когда увидел эту тему сразу подумал о решении схожим с решением alex_x_x'а, так что ничего оригинального в Вашем подходе нет, чтобы так им кичиться.
А чего "сверхестественного" вы ждете?! Совершенно непонятно.
Что касается временной хронологии, то как раз первым здесь появилась моя ссылка на другую аналогичную тему, где был представлен мой алгоритм.
0
easybudda
Модератор
Эксперт CЭксперт С++
9662 / 5611 / 952
Регистрация: 25.07.2009
Сообщений: 10,774
29.08.2011, 19:11 #62
Цитата Сообщение от Сыроежка Посмотреть сообщение
Мой код профессиональный
А мой - нет!
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
#include <stdio.h>
    
int * max_element(const int * arr, size_t size){
    return ( size < 2 ) ? (int*)arr : ( *arr < *(arr + size - 1) ) ? max_element(arr + 1, size - 1) : max_element(arr, size - 1);
}
 
size_t count(const int * arr, size_t size, int val){
    return ( size ) ? ( *arr == val ) + count(arr + 1, size - 1, val) : 0;
}
 
void dump(const int * arr, size_t size){
    while ( size-- )
        printf("%d%c", *arr++, ( size ) ? ' ' : '\n');
}
 
#define SIZE 10
 
int main(void){
    int arr[SIZE] = { 1, 3, 5, 3, 2, 5, 4, 3, 1, 2 }, me = *max_element(arr, SIZE);
    
    printf("Array: ");
    dump(arr, SIZE);
    printf("Max element %d meets %d times.\n", me, count(arr, SIZE, me));
    
    return 0;
}


Вот ещё до кучи...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <map>
#include <algorithm>
#include <iterator>
    
int main(){
    const int size(10);
    int arr[size] = { 1, 3, 5, 3, 2, 5, 4, 3, 1, 2 };
    
    std::cout << "Array: ";
    std::copy(arr, arr + size, std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
    std::map<int, int> map;
    for ( int i = 0; i < size; ++i )
        map[arr[i]]++;
    std::cout << "Max element " << map.rbegin()->first << " meets " << map.rbegin()->second << " times." << std::endl;
    
    return 0;
}
1
Сыроежка
Заблокирован
29.08.2011, 19:33 #63
Цитата Сообщение от easybudda Посмотреть сообщение
А мой - нет!
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
#include <stdio.h>
    
int * max_element(const int * arr, size_t size){
    return ( size < 2 ) ? (int*)arr : ( *arr < *(arr + size - 1) ) ? max_element(arr + 1, size - 1) : max_element(arr, size - 1);
}
 
size_t count(const int * arr, size_t size, int val){
    return ( size ) ? ( *arr == val ) + count(arr + 1, size - 1, val) : 0;
}
 
void dump(const int * arr, size_t size){
    while ( size-- )
        printf("%d%c", *arr++, ( size ) ? ' ' : '\n');
}
 
#define SIZE 10
 
int main(void){
    int arr[SIZE] = { 1, 3, 5, 3, 2, 5, 4, 3, 1, 2 }, me = *max_element(arr, SIZE);
    
    printf("Array: ");
    dump(arr, SIZE);
    printf("Max element %d meets %d times.\n", me, count(arr, SIZE, me));
    
    return 0;
}
Можно было бы возвращаемое значение из функции max_element сделать таким же, как и параметр массива, то есть const int * и не далать приведение типов (int*)arr Так как нет большого смысла возвращать не константную ссылку, так как в вашем алгоритме нет определенности, какой именно максимальный элемент последовательности возвращается. То есть если бы вы могли гарантировать, что ваша функция возвращает первый максимальный элемент в последовательности, или напротив, самый последний, то тогда пользователь мог бы воспользоваться не константным указателем, так как он представляет, с каким именно элементом он имеет дело. А так - это гадание на кофейной гуще.

А, возможно, я ошибся, и у вас всегда возвращается последний максимальный элемент, так как в случае равенства элементов, вы предпочитаете брать подмассив, исключая первый элемент.
0
easybudda
Модератор
Эксперт CЭксперт С++
9662 / 5611 / 952
Регистрация: 25.07.2009
Сообщений: 10,774
29.08.2011, 19:41 #64
Цитата Сообщение от Сыроежка Посмотреть сообщение
Так как нет большого смысла возвращать не константную ссылку, так как в вашем алгоритме нет определенности, какой именно максимальный элемент последовательности возвращается.
Наверное, с высоты профессионализма такие мелочи и не видны, но вообще-то в С функции, возвращающие константные значения - UB (не мне рассказывать Вам, профессионалу, что это значит). А определённость как раз есть - функция возвращает указатель (да-да, в С нет ссылок, не задалось как-то с ними) на ПЕРВЫЙ максимальный элемент. Вы своим профессиональным взглядом внимательнее присмотритесь.
2
Сыроежка
Заблокирован
29.08.2011, 19:44 #65
Цитата Сообщение от easybudda Посмотреть сообщение
Наверное, с высоты профессионализма такие мелочи и не видны, но вообще-то в С функции, возвращающие константные значения - UB (не мне рассказывать Вам, профессионалу, что это значит). А определённость как раз есть - функция возвращает указатель (да-да, в С нет ссылок, не задалось как-то с ними) на ПЕРВЫЙ максимальный элемент. Вы своим профессиональным взглядом внимательнее присмотритесь.
Да, я ошибся. В случае равенства у вас возвращается подмассив с исключением последнего элемента.
0
Thinker
Эксперт С++
4226 / 2200 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
29.08.2011, 19:53 #66
Цитата Сообщение от Сыроежка Посмотреть сообщение
Да, я ошибся...

Не по теме:

Неужели это случилось-признание ошибки!

0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
29.08.2011, 20:37 #67
Цитата Сообщение от Сыроежка Посмотреть сообщение
А чего "сверхестественного" вы ждете?! Совершенно непонятно.
В том то и дело, для чего упирать на профессионализм, если вы решили задачу очевидным способом? Чем Ваше, как вы зявляете, "профессиональное" решение отличается от решения ale_x_x, при условии что у Вас присутсвует совершенно ненужное поле?

Цитата Сообщение от Сыроежка Посмотреть сообщение
Что касается временной хронологии, то как раз первым здесь появилась моя ссылка на другую аналогичную тему, где был представлен мой алгоритм.
Первая ссылка на Ваше решение в посте #38, решение ale_x_x в #32.
1
Сыроежка
Заблокирован
30.08.2011, 20:12 #68
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
В том то и дело, для чего упирать на профессионализм, если вы решили задачу очевидным способом? Чем Ваше, как вы зявляете, "профессиональное" решение отличается от решения ale_x_x, при условии что у Вас присутсвует совершенно ненужное поле?


Первая ссылка на Ваше решение в посте #38, решение ale_x_x в #32.
Спасибо, насмешили меня! Знаете, что такое профессионально написанный код? Это не тогда, как вы наивно думаете, задача решена не очевидным способом. К написанию кода это вообще никакого отношения не имеет, как вам лично это не покажется странным. Профессионально написанный код - это 1) грамотный, 2) корректный, 3) легко читаемый код. Более того он даже не обязан быть идеальным кодом!

Что касается ваших ссылок на посты, то я имел в виду хронологию, что алгоритм уже написан в ранее обсуждаемой аналогичной теме. То есть, фактически, происходило переписание ранее написанного алгоритма, да еще не совсем грамотно и с ошибками. Это я и имел в виду, что проще обратиться к той теме, а не переписывать заново некорректно уже написанный код. Иначе это похоже на испорченный граммофон.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
30.08.2011, 20:34 #69
Не оптимально) Но вариант.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
 
int main()
{
    std::vector<int> vec((std::istream_iterator<int>(std::cin)), std::istream_iterator<int>());
    if (vec.empty())
    {
        std::cerr << "Error. Empty sequence" << std::endl;
        return 1;
    }
    int element = *std::max_element(vec.begin(), vec.end());
    std::sort(vec.begin(), vec.end());
    std::pair<std::vector<int>::iterator, std::vector<int>::iterator> maxs = 
        std::equal_range(vec.begin(), vec.end(), element);
    std::cout << std::distance(maxs.first, maxs.second) << std::endl;
    return 0;
}
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.08.2011, 20:38 #70
Цитата Сообщение от ForEveR Посмотреть сообщение
Не оптимально
Особенно, если учесть то, сколько в последовательности может быть элементов
0
Сыроежка
Заблокирован
30.08.2011, 20:40 #71
Цитата Сообщение от ForEveR Посмотреть сообщение
Не оптимально) Но вариант.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
 
int main()
{
    std::vector<int> vec((std::istream_iterator<int>(std::cin)), std::istream_iterator<int>());
    if (vec.empty())
    {
        std::cerr << "Error. Empty sequence" << std::endl;
        return 1;
    }
    int element = *std::max_element(vec.begin(), vec.end());
    std::sort(vec.begin(), vec.end());
    std::pair<std::vector<int>::iterator, std::vector<int>::iterator> maxs = 
        std::equal_range(vec.begin(), vec.end(), element);
    std::cout << std::distance(maxs.first, maxs.second) << std::endl;
    return 0;
}
Если у вас используется сортировка, то надобность в алгоритме std::max_element просто отпадает. Достаточно отсортировать в убывающем порядке, а затем вывести в поток все элементы, которые совпадают с первым элементом контейнера.

Так что у вас есть еще пути совершенствования вашего алгоритма!

Например, так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
 
int main()
{
    std::vector<int> vec((std::istream_iterator<int>(std::cin)), std::istream_iterator<int>());
    if ( vec.empty() )
    {
        std::cerr << "Error. Empty sequence" << std::endl;
        return 1;
    }
    std::sort(vec.begin(), vec.end(), std::greater<int>() );
    std::pair<std::vector<int>::iterator, std::vector<int>::iterator> maxs = 
        std::equal_range(vec.begin(), vec.end(), *v.begin() );
    std::cout << std::distance(maxs.first, maxs.second) << std::endl;
    return 0;
}
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.08.2011, 20:43 #72
Цитата Сообщение от Сыроежка Посмотреть сообщение
Что касается ваших ссылок на посты, то я имел в виду хронологию, что алгоритм уже написан в ранее обсуждаемой аналогичной теме.
Во-первых, на форуме с большой вероятностью это же задача уже решалась таким же способом. Во-вторых, с чего Вы взяли, что alex_x_x видел Ваше решение? На форуме, а тем более в этом разделе, темы плодятся пачками, Вы сами-то все посты читаете, а?
Насчет некоректности, вот код alex_x_x:
Цитата Сообщение от alex_x_x Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T> 
struct Comp
{
   Comp() : count(0) {}
   void operator() (const T& t) 
   {
      if (t > max || 0 == count){ max = t; count = 1; }
      else if (t==max) ++count;
   }   
int count;
   T max; 
};
Где здесь некоректность? Философские споры об именовании и выборе подходящих типов откинем как не имеющие отношения к корретности/некорректности решения.
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.08.2011, 20:44 #73
Или так(может, уже было, лень всю тему листать)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <map>
#include <algorithm>
int main()
{
    int arr[] = { 1, 2, 3, 5, 4, 5, 3 };
    
    std::map<int, int> map;
    
    std::for_each( arr, arr + sizeof(arr) / sizeof(*arr), [&map] (int x)
    {
        ++map[x];
    } );
    
    std::cout << (*--map.end()).second;
}
0
Сыроежка
Заблокирован
31.08.2011, 18:48 #74
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Во-первых, на форуме с большой вероятностью это же задача уже решалась таким же способом. Во-вторых, с чего Вы взяли, что alex_x_x видел Ваше решение? На форуме, а тем более в этом разделе, темы плодятся пачками, Вы сами-то все посты читаете, а?
Насчет некоректности, вот код alex_x_x:

Где здесь некоректность? Философские споры об именовании и выборе подходящих типов откинем как не имеющие отношения к корретности/некорректности решения.
Я уже писал, где здесь некорректность. Не инициализирована переменная max. Поэтому алгоритм вообще не будет корректно работать. Кроме того грамотно писать не

C++
1
if (t > max || 0 == count)
а

C++
1
[CPP]if (0 == count || max < t)
[/CPP]

Заметили два различия? Именно два, а не одно? Первый исходный код просто является безграмотным, не говоря уж о том, что некорректным.
0
easybudda
Модератор
Эксперт CЭксперт С++
9662 / 5611 / 952
Регистрация: 25.07.2009
Сообщений: 10,774
31.08.2011, 19:12 #75
Цитата Сообщение от Сыроежка Посмотреть сообщение
Кроме того грамотно писать...
Кстати да, прав Сыроежка. В принципе если эту строчку заменить, то и не важно, что max не инициализирована.
Цитата Сообщение от diagon Посмотреть сообщение
может, уже было
Ага, на предыдущей странице 62 пост 2 вариант...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2011, 19:12
Привет! Вот еще темы с ответами:

В массиве X определить количество элементов - C++
В массиве X определить количество элементов меньших среднего ариф*метического значения. Не упорядочивая массив удалить из него элемен*ты,...

В массиве A из N элементов (N не больше 30) определить количество элементов... - C++
1. В массиве A из N элементов (N не больше 30) определить количество элементов, значения которых больше среднего арифметического всех...

Определить количество элементов в массиве структур - C++
Помогите пожалуйста! Программка работает но по новому условию надо вместо &quot; введите количество продавцов&quot; чтобы я не знала заранее...

Определить количество положительных элементов в массиве - C++
Написать функцию, определяющую количество положительных элементов в массиве. Написать программу, проверяющую работу этой функции. Массив...


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

Или воспользуйтесь поиском по форуму:
75
Yandex
Объявления
31.08.2011, 19:12
Закрытая тема Создать тему
Опции темы

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