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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 60, средняя оценка - 4.75
валентин777
0 / 0 / 0
Регистрация: 01.06.2011
Сообщений: 45
26.08.2011, 19:26     Определить количество максимальных элементов в массиве. #1
Дан одномерный массив. Определить количество максимальных элементов в массиве.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2011, 19:26     Определить количество максимальных элементов в массиве.
Посмотрите здесь:

C++ В массиве A из N элементов (N не больше 30) определить количество элементов, имеющих четные значения, и сумму этих элементов.
В массиве A из N элементов (N не больше 30) определить количество элементов... C++
В массиве А(n) (n<=7) хотя бы один нуль. Определить количество положительных и количество отрицательных элементов к первому нулю. C++
C++ В массиве X определить количество элементов
Определить количество интересных элементов в массиве C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
31.08.2011, 20:40     Определить количество максимальных элементов в массиве. #81
Цитата Сообщение от easybudda Посмотреть сообщение
Я-то думал, что если t <= max, то чему там count равно уже не проверяется... Или ещё какой-то тонкости не улавливаю?
Выражения в условных операторах вычисляются слева направо. При этом не обязательно вычисляется все выражение целиком.
В случае выражения expr1 && expr2 && ... && exprn, вычисление закончится "преждевременно" если одно из подвыражений окажется ложным, а следственно и все выражение целиком.
В случае выражения expr1 || expr2 || ... || exprn, вычисление закончится "преждевременно" если одно из подвыражений окажется истинным, а следственно и все выражение целиком.

У тела первого условного оператора в коде alex_x_x'a при первом вызове оператора() нет шансов не выполнится.
Цитата Сообщение от easybudda Посмотреть сообщение
А чем, кстати, по умолчанию поля типа int в классе инициализируются?
Если они явно не были инициализированы, то чем повезет . Это относится ко всем примитивным типам.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
31.08.2011, 20:42     Определить количество максимальных элементов в массиве. #82
Цитата Сообщение от easybudda Посмотреть сообщение
А чем, кстати, по умолчанию поля типа int в классе инициализируются?
Если в списке инициализации их нет, то они вообще не инициализируются. В отличие от объектов.

Добавлено через 55 секунд

Не по теме:

Эх...

Сыроежка
Заблокирован
02.09.2011, 21:07     Определить количество максимальных элементов в массиве. #83
Цитата Сообщение от easybudda Посмотреть сообщение
Странно, но работает. Я-то думал, что если t <= max, то чему там count равно уже не проверяется... Или ещё какой-то тонкости не улавливаю?

Вот кстати ещё одно очень простое любительское решение
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <algorithm>
 
int main(){
    const int size(10);
    int arr[size] = { 1, 3, 5, 3, 2, 5, 4, 3, 1, 2 };
    int me = *std::max_element(arr, arr + size);
    std::cout << "Max element: " << me << " meets " << std::count(arr, arr + size, me) << " times" << std::endl;
    
    return 0;
}
Может тоже было, но на вскидку не нашёл в этой теме.



Вот ей-богу надоело уже! Оставьте при себе своё мнение о профессионализме участников форума, а то ведь в правилах есть пункт "неуважительное отношение". С совсем небольшой натяжкой вполне применим. Надо оно Вам?

Добавлено через 4 минуты
А чем, кстати, по умолчанию поля типа int в классе инициализируются? Случайно не INT_MIN (ну или как там в С++ правильно минимальное значение обозначается)? А то есть подозрение, что минимальный элемент вот как-раз из-за этого нюанса и не найдётся, и не посчитается...
Вы берете примитивные ситуации и радуетесь, что работает. Я вас разочарую! Представьте себе, что у вас объект класса содержит указатель на char. А при сравнении элементов используется стандартная функция strcmpТогда использование перегруженного оператора сравнения может привести к непредсказуемым последствием.
Вы мне заявите, что пользователь при определении конструктора по умолчанию должен был инициализировать этот указатель значением NULL. Но что изменится? Произойдет аварийное завершение функции, так как будет обращение к нулевому адресу!
Вы мне снова можете возразить, что пусть пользователь об этом сам позаботится в реализации оператора <. Хорошо. Пользователь позаботился и включил в реализацию этого оператора исключение.

bool operator < ( const T &, const T & ) throw( std::exception );

Вполне грамотный код. Если его объект содержит какие-то не инициализированные данные, то произойдет исключение. Итак, он запускает алгоритм и получает исключение! "Откуда?!!!", - удивится пользователь. Ведь он на вход давал вполне корректные данные.

То есть на сампом деле имеет место, что, образно говоря, вы за его спиной, то есть без его санкции используете объекты, которые пользователь не хотел бы чтобы они использовались.

Другой пример. Я встречал его в бухгалтерии. Там можно было создавать документ с пустыми полями. То есть ни дата, ни номер документа будут неизвестны, пока бухгалтер не заполнит поля документа и не сохранит его в базе. Однако если каким-то случайным образом в базе данных обнаруживался пустой документ, то система его регистрировала в журнале ошибок. То есть при каждой операции, если, вдруг, обнаруживался пустой документ, сразу же регистрировалась такая ситуация, так как этого не должно было быть, потому что этого, как говорят, не могло быть.
Теперь представим использование вашего алгоритма. Выполняется сравнение, и система обнаруживает, что откуда-то появился пустой документ, например, пустая накладная. Система заносит об этом в свой жернал регистрации соответсвующее сообщение, чтобы пользователи потом разобрались, что произошло. И так каждый раз, когда вы будете вызывать этот алгоритм, журнал регистрации будет пополняться сообщениями об ошибке! Мало того, что это может привести к переполнению жернала регистрации ошибок, пользователи вообще могут не понять, из-за чего это сообщение беретсая. А берется оно из-за того, что алгоритм самовольно начинает сравнивать не инициализированный объект с уже имеющимся!

Это вообще плохой дизайн, когда программа делает то, о чем ее не просит пользователь! То есть, как в данном алгоритме, начинает сравнивать не инициализированные объекты.

Добавлено через 1 минуту
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Выражения в условных операторах вычисляются слева направо. При этом не обязательно вычисляется все выражение целиком.
В случае выражения expr1 && expr2 && ... && exprn, вычисление закончится "преждевременно" если одно из подвыражений окажется ложным, а следственно и все выражение целиком.
В случае выражения expr1 || expr2 || ... || exprn, вычисление закончится "преждевременно" если одно из подвыражений окажется истинным, а следственно и все выражение целиком.

У тела первого условного оператора в коде alex_x_x'a при первом вызове оператора() нет шансов не выполнится.

Если они явно не были инициализированы, то чем повезет . Это относится ко всем примитивным типам.
Проблема в том, что вы забываете, что эти операторы могут быть перегружены! По крайней мере стандарт этого не запрещает!
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
02.09.2011, 21:24     Определить количество максимальных элементов в массиве. #84
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вы берете примитивные ситуации и радуетесь, что работает. Я вас разочарую! Представьте себе, что у вас объект класса содержит указатель на char. А при сравнении элементов используется стандартная функция strcmpТогда использование перегруженного оператора сравнения может привести к непредсказуемым последствием.
Вы мне заявите, что пользователь при определении конструктора по умолчанию должен был инициализировать этот указатель значением NULL. Но что изменится? Произойдет аварийное завершение функции, так как будет обращение к нулевому адресу!
Вы мне снова можете возразить, что пусть пользователь об этом сам позаботится в реализации оператора <. Хорошо. Пользователь позаботился и включил в реализацию этого оператора исключение.
bool operator < ( const T &, const T & ) throw( std::exception );
Вполне грамотный код. Если его объект содержит какие-то не инициализированные данные, то произойдет исключение. Итак, он запускает алгоритм и получает исключение! "Откуда?!!!", - удивится пользователь. Ведь он на вход давал вполне корректные данные.
То есть на сампом деле имеет место, что, образно говоря, вы за его спиной, то есть без его санкции используете объекты, которые пользователь не хотел бы чтобы они использовались.
Другой пример. Я встречал его в бухгалтерии. Там можно было создавать документ с пустыми полями. То есть ни дата, ни номер документа будут неизвестны, пока бухгалтер не заполнит поля документа и не сохранит его в базе. Однако если каким-то случайным образом в базе данных обнаруживался пустой документ, то система его регистрировала в журнале ошибок. То есть при каждой операции, если, вдруг, обнаруживался пустой документ, сразу же регистрировалась такая ситуация, так как этого не должно было быть, потому что этого, как говорят, не могло быть.
Теперь представим использование вашего алгоритма. Выполняется сравнение, и система обнаруживает, что откуда-то появился пустой документ, например, пустая накладная. Система заносит об этом в свой жернал регистрации соответсвующее сообщение, чтобы пользователи потом разобрались, что произошло. И так каждый раз, когда вы будете вызывать этот алгоритм, журнал регистрации будет пополняться сообщениями об ошибке! Мало того, что это может привести к переполнению жернала регистрации ошибок, пользователи вообще могут не понять, из-за чего это сообщение беретсая. А берется оно из-за того, что алгоритм самовольно начинает сравнивать не инициализированный объект с уже имеющимся!
Это вообще плохой дизайн, когда программа делает то, о чем ее не просит пользователь! То есть, как в данном алгоритме, начинает сравнивать не инициализированные объекты.
Много букв и все не по делу. Как это относится к сказанному easybudda? О чем Вы вообще?

Цитата Сообщение от Сыроежка Посмотреть сообщение
Проблема в том, что вы забываете, что эти операторы могут быть перегружены! По крайней мере стандарт этого не запрещает!
Приведите пример когда перегрузка оператора || приведет к тому что тело условного оператора не выполнится:
C++
1
2
3
4
SomeType t;
int count = 0;
if (t > max || 0 == count)
  std::cout << "it works!" << std::endl;
Вот только исключениями бросаться не надо.

Цитата Сообщение от Сыроежка Посмотреть сообщение
bool operator < ( const T &, const T & ) throw( std::exception );
Непустые спецификации исключений уже давно преданы анафеме, статья Герба Саттера по этому поводу.
Сыроежка
Заблокирован
02.09.2011, 21:31     Определить количество максимальных элементов в массиве. #85
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Много букв и все не по делу. Как это относится к сказанному easybudda? О чем Вы вообще?

Приведите пример когда перегрузка оператора || приведет к тому что тело условного оператора не выполнится:
C++
1
2
3
4
SomeType t;
int count = 0;
if (t > max || 0 == count)
  std::cout << "it works!" << std::endl;
Непустые спецификации исключений уже давно преданы анафеме, статья Герба Саттера по этому поводу.
Я не занимаюсь, как бы помягче сказать, неадекватными людьми ! Это вы не по адресу обратились. Если вы не поняли, о чем я написал, и на какой вопрос я ответил, это ваши проблемы.
Что касается перегрузки операторов, то вы и здесь не поняли, о чем идет речь! Речь идет о том, что когда вызывается перегруженный оператор, то условие того, что правое выражение не будет выполняться, о чем в том сообщении говорилось, не верно! Вызывается оператор-функция, и все ее аргументы будут вычисляться!

[текст удалён]
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
02.09.2011, 21:51     Определить количество максимальных элементов в массиве. #86
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Сыроежка Посмотреть сообщение
Если вы не поняли, о чем я написал, и на какой вопрос я ответил, это ваши проблемы.
Если Вы не в состоянии донести информацию до слушателя, то это исключительно Ваша проблема. Или Вы просто говорите, чтобы сказать?
Цитата Сообщение от Сыроежка Посмотреть сообщение
Что касается перегрузки операторов, то вы и здесь не поняли, о чем идет речь! Речь идет о том, что когда вызывается перегруженный оператор, то условие того, что правое выражение не будет выполняться, о чем в том сообщении говорилось, не верно!
Тот факт, что переопределение логического оператора грубо говоря отменяет sequence point, а следственно и "ленивое" вычисление условного оператора, никакого отношения к вопросу на который был дан ответ не имеет.

Сыроежка, думаю, Вам ничего в этой жизни как разработчику не грозит. Вы не умеете говорить, не умеете слушать, Вы игнорируете вопросы. Врядли адекватный человек будет работать в команде с такой надменной личностью как Вы. Самомнение аля "Я Дартаньян, все п**арасы" службу Вам не сослужит. Будьте проще.
NickoTin
Модератор
 Аватар для NickoTin
8173 / 3477 / 233
Регистрация: 14.06.2010
Сообщений: 4,501
Записей в блоге: 9
02.09.2011, 22:01     Определить количество максимальных элементов в массиве. #87
Сыроежка, почти каждая тема с Вашим участием разрастается до 5+ страниц, и я Вас предупреждаю: это не раздел холивары. Я Вам предлагаю покинуть данную тему, пока не были применены санкции.
magirus
Супер-модератор
 Аватар для magirus
25482 / 14023 / 741
Регистрация: 15.09.2009
Сообщений: 59,710
Записей в блоге: 61
02.09.2011, 22:10     Определить количество максимальных элементов в массиве. #88
SSTREGG, простите, но так как тема перешла на личности, и возвращаться в лоно адекватного обсуждения, не смотря на увещевания администрации, не собирается - ЗАКРЫТО.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2011, 09:27     Определить количество максимальных элементов в массиве.
Еще ссылки по теме:

C++ В матрице случайных числе определить количество положительных, отрицательных, нулевых и максимальных элементов
C++ Определить количество элементов в массиве структур
C++ В чем ошибка? В массиве целых чисел найти количество максимальных элементов

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.09.2011, 09:27     Определить количество максимальных элементов в массиве. #89
Да и санкции применены после многократных предупреждений.
Yandex
Объявления
03.09.2011, 09:27     Определить количество максимальных элементов в массиве.
Закрытая тема Создать тему
Опции темы

Текущее время: 06:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru