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

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

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

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

В чем ошибка? В массиве целых чисел найти количество максимальных элементов
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 16...

Определить количество одинаковых максимальных четных значений среди элементов массива
Дан массив А(100), заполненный случайными значениями в диапазоне от 150 до 250....

В матрице случайных числе определить количество положительных, отрицательных, нулевых и максимальных элементов
1. В матрице размерами N*M определить количество положительных, отрицательных...

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

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

88
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
28.08.2011, 20:35 #41
Петррр, можно было просто за максимум взять -INT_MAX (INT_MAX лежит в limits.h) и было бы счастье .
0
Петррр
6155 / 3455 / 896
Регистрация: 28.10.2010
Сообщений: 5,926
28.08.2011, 20:37 #42
CyBOSSeR, спасибо. Где ж ты раньше был.? Сейчас глуну.
0
Сыроежка
Заблокирован
28.08.2011, 20:37 #43
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Вы ее видели? Посмотрите внимательно, она возвращает итератор, а в случае пустой последовательности итератор указывающий на элемент следующий за последним, т.е. этот алгоритм будет работать для пустых последовательностей, достаточно лишь проверить, что возвращаемое значение не указывает на элемент следующий за последним. Ваше же "профессионально решение" в случае пустой последовательности вернет мусор, которым будет инициализировано поле count.
Почему же он вернет мусор?! Посмотрите внимательно! Алгоритму std::for_each (если вы смотрите именно то мле решение, что я имею в виду), передается функционал, конструктор которого инициализирует счетчик равным 0.

Так о каком мусоре вы говорите?!
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2011, 20:39 #44
Сыроежка, чем ваше профессиональное решение правильней моего, ну кроме того, что у вас испсользуется лишняя переменная
0
Сыроежка
Заблокирован
28.08.2011, 20:40 #45
Цитата Сообщение от alex_x_x Посмотреть сообщение
Сыроежка, чем ваше профессиональное решение правильней моего, ну кроме того, что у вас испсользуется лишняя переменная
Отвечаю: вы не инициализировали T max, а потому в нем может быть любое начальное значение.
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
28.08.2011, 20:42 #46
Сыроежка, не увидел инициализацию поля count в конструкторе . Но тогда возникает вопрос, зачем нужно тогда нужно поле initialized? Что мешает сделать так:
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
template <typename T>
 
class MaxCount : public std::unary_function<T, void>
{
public:
   MaxCount() : count( 0 ) {}
   void operator ()( const T &x )
   {
      if ( count == 0 )
      {
         max = x;
         count = 1;
      }
      else if ( max == x )
      {
         ++count;
      }
      else if ( max < x )
      {
         max   = x;
         count = 1;
      }
   }
 
public:
   size_t count;
 
private:
   T max;
};
1
alex_x_x
28.08.2011, 20:44
  #47

Не по теме:

за меня ответили

0
Сыроежка
Заблокирован
28.08.2011, 20:45 #48
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Сыроежка, не увидел инициализацию поля count в конструкторе . Но тогда возникает вопрос, зачем нужно тогда нужно поле initialized? Что мешает сделать так:
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
template <typename T>
 
class MaxCount : public std::unary_function<T, void>
{
public:
   MaxCount() : count( 0 ) {}
   void operator ()( const T &x )
   {
      if ( count == 0 )
      {
         max = x;
         count = 1;
      }
      else if ( max == x )
      {
         ++count;
      }
      else if ( max < x )
      {
         max   = x;
         count = 1;
      }
   }
 
public:
   size_t count;
 
private:
   T max;
};
Я думаю, вы допустили ошибку. У вас не увеличивается счетчик при первой итерации алгоритма. Вы, вижу, исправили эту ошибку.

Да, можно сделать и так. Но это нисколько не умаляет достоинства моего алгоритма.
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
28.08.2011, 20:47 #49
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я думаю, вы допустили ошибку. У вас не увеличивается счетчик при первой итерации алгоритма.
Сначала запостил, потом поправил, посмотрите, в вашей цитате уже поправленный вариант.
0
Сыроежка
Заблокирован
28.08.2011, 20:57 #50
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Сначала запостил, потом поправил, посмотрите, в вашей цитате уже поправленный вариант.
Да, уже поправленный. Но как я уже сказал, это нисколько не умаляет достоинств алгоритма. К тому же если вы внимательно почитаете то мое сообщение с алгоритмом, я написал его "на коленках", то есть код не набирался в компиляторе.

Добавлено через 7 минут
Цитата Сообщение от alex_x_x Посмотреть сообщение
Сыроежка, чем ваше профессиональное решение правильней моего, ну кроме того, что у вас испсользуется лишняя переменная
На самом деле отличий много! Мой код профессиональный, ваг - нет. Почему? Вы не адаптировали свой функционал, то есть в нем не определены соответсвующие typedef. Вы счетчик объявили как int, в то время, как например, у класса std::string size_type Объявлен как size_t. И, в третьих, как говорится, хорошо ложка к обеду. Ваш алгоритм уже совершенно не актуален после появления моего алгоритма. Если бы вы первым представили свой алгоритм,то тогда он бы мог быть актуальным.
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
28.08.2011, 21:27 #51
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вы не адаптировали свой функционал, то есть в нем не определены соответсвующие typedef.
Зачем здесь typedef?
Цитата Сообщение от Сыроежка Посмотреть сообщение
И, в третьих, как говорится, хорошо ложка к обеду. Ваш алгоритм уже совершенно не актуален после появления моего алгоритма. Если бы вы первым представили свой алгоритм,то тогда он бы мог быть актуальным.
По-моему, в этой теме первым появилось решение alex_x_x'а. Да и ничего сверхестественного в Вашем решении нет, я когда увидел эту тему сразу подумал о решении схожим с решением alex_x_x'а, так что ничего оригинального в Вашем подходе нет, чтобы так им кичиться.
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
28.08.2011, 23:11 #52
Цитата Сообщение от silent_1991 Посмотреть сообщение
Давайте. Ваша функция написана "в лоб", ибо она не универсальна. Предложенный мной вариант - алгоритмический....
Не буду разрывать муравейник в этой теме, а то споры те еще шли. Во-первых, моя функция применима в С++ и С (а человеку именно это и надо было). А во-вторых, название "в лоб" к ней не применимо, так как она для С.
0
silent_1991
Эксперт С++
5007 / 3066 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
28.08.2011, 23:14 #53
Цитата Сообщение от Thinker Посмотреть сообщение
А во-вторых, название "в лоб" к ней не применимо, так как она для С
Не вижу связи.

Добавлено через 1 минуту
Цитата Сообщение от Thinker Посмотреть сообщение
а человеку именно это и надо было
Человек, по-моему, и сам не знает, чего ему надо. То ему в С++ надо, то в С...
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
28.08.2011, 23:17 #54
Цитата Сообщение от silent_1991 Посмотреть сообщение
Не вижу связи.
Ну, ваш аргумент про универсальность я понял. Но зачем здесь надо было писать отдельные функции поиска максимума, отдельно подсчета количества элементов с тем или иным значением и т.д. Это конкретный пример с одним проходом и все. А про С это то, что у вас уже чисто С++ вариант.

Добавлено через 1 минуту
Цитата Сообщение от silent_1991 Посмотреть сообщение
Человек, по-моему, и сам не знает, чего ему надо. То ему в С++ надо, то в С...
Это уже вспоминать смешно, странные просьбы были у него.
0
silent_1991
Эксперт С++
5007 / 3066 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
28.08.2011, 23:20 #55
Цитата Сообщение от Thinker Посмотреть сообщение
Но зачем здесь надо было писать отдельные функции поиска максимума, отдельно подсчета количества элементов с тем или иным значением и т.д.
Задача учебная, это понятно. Но всё же в своё время появилась парадигма структурного программирования. Она заключалась в том, чтобы разбивать код на подпрограммы, которые и взаимодействовали между собой. Так зачем же отметать эту парадигму и снова писать весь функционал в одном месте?

Цитата Сообщение от Thinker Посмотреть сообщение
А про С это то, что у вас уже число С++ вариант
Я это понимаю, но смысл-то один. В одну функцию передаётся результат выполнения другой. Разница в том, что я использовал готовые функции, а можно было изобрести велосипед и написать свои (задача-то учебная, простительно).

Добавлено через 41 секунду
Цитата Сообщение от Thinker Посмотреть сообщение
странные просьбы были у него
А я о чём
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
28.08.2011, 23:24 #56
Цитата Сообщение от silent_1991 Посмотреть сообщение
Задача учебная, это понятно. Но всё же в своё время появилась парадигма структурного программирования. Она заключалась в том, чтобы разбивать код на подпрограммы, которые и взаимодействовали между собой. Так зачем же отметать эту парадигму и снова писать весь функционал в одном месте?
Я с вами не спорю. Понимаете, студентам полезно рассматривать задачи с разных сторон. Ведь все эти парадигмы не подходят для олимпиадных, например задач. Поэтому надо хотя бы понимать, что бывают и другие подходы.
0
silent_1991
Эксперт С++
5007 / 3066 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
28.08.2011, 23:28 #57
Thinker, это-то всё тоже понятно, но, к сожалению, такому "студенту", как ТС, нужно одно - отметка о сдаче лабы. Поэтому такие задачи мы пишем не для них, а больше для себя (выдалась свободная минутка - написал пару-тройку таких лаб, для души). А для себя надо писать правильно.
2
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
28.08.2011, 23:32 #58
Цитата Сообщение от silent_1991 Посмотреть сообщение
А для себя надо писать правильно.
Все от задачи зависит. Где очень нужна скорость, то приходится не то еще придумывать.
0
silent_1991
Эксперт С++
5007 / 3066 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
28.08.2011, 23:36 #59
Thinker, где очень нужна скорость, там вообще ассемблерные вставки используют. Но сомневаюсь, что это в данном случае уместно. Так что в данном лучше красиво и элегантно, чем быстро.
А вообще, преждевременная оптимизация - корень всех бед (с)
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
29.08.2011, 00:15 #60
silent_1991, все относительно и универсальность тоже
есть ситуации когда нельзя сделать повторный обход, самый простой вариант - работа с потоком

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
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
 
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; 
};
 
int main()
{ 
   std::stringstream str("-10 3 23 2 3 -34 12 23"); 
   Comp<int> comp = std::for_each( std::istream_iterator<int>(str),
                                   std::istream_iterator<int>(),
                                   Comp<int>() );
   if (comp.count)
   {
     std::cout << comp.max << ", count - " << comp.count << std::endl;
   }    
}
1
29.08.2011, 00:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2011, 00:15
Привет! Вот еще темы с решениями:

В массиве из 50 элементов определить количество элементов, кратных 6 и найти минимальный элемент
В массиве из 50 элементов определить количество элементов, кратных 6 и найти...

В массиве X определить количество элементов
В массиве X определить количество элементов меньших среднего ариф*метического...

В массиве A из N элементов (N не больше 30) определить количество элементов...
1. В массиве A из N элементов (N не больше 30) определить количество элементов,...

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


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

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

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