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

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

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

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

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

Дан одномерный массив. Определить количество максимальных элементов в массиве.
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++
C++ В матрице случайных числе определить количество положительных, отрицательных, нулевых и максимальных элементов
C++ Определить количество элементов в массиве структур
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2299 / 1669 / 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
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
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++
2299 / 1669 / 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++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
02.09.2011, 21:51     Определить количество максимальных элементов в массиве. #86
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Сыроежка Посмотреть сообщение
Если вы не поняли, о чем я написал, и на какой вопрос я ответил, это ваши проблемы.
Если Вы не в состоянии донести информацию до слушателя, то это исключительно Ваша проблема. Или Вы просто говорите, чтобы сказать?
Цитата Сообщение от Сыроежка Посмотреть сообщение
Что касается перегрузки операторов, то вы и здесь не поняли, о чем идет речь! Речь идет о том, что когда вызывается перегруженный оператор, то условие того, что правое выражение не будет выполняться, о чем в том сообщении говорилось, не верно!
Тот факт, что переопределение логического оператора грубо говоря отменяет sequence point, а следственно и "ленивое" вычисление условного оператора, никакого отношения к вопросу на который был дан ответ не имеет.

Сыроежка, думаю, Вам ничего в этой жизни как разработчику не грозит. Вы не умеете говорить, не умеете слушать, Вы игнорируете вопросы. Врядли адекватный человек будет работать в команде с такой надменной личностью как Вы. Самомнение аля "Я Дартаньян, все п**арасы" службу Вам не сослужит. Будьте проще.
NickoTin
Почетный модератор
8224 / 3508 / 237
Регистрация: 14.06.2010
Сообщений: 4,510
Записей в блоге: 9
02.09.2011, 22:01     Определить количество максимальных элементов в массиве. #87
Сыроежка, почти каждая тема с Вашим участием разрастается до 5+ страниц, и я Вас предупреждаю: это не раздел холивары. Я Вам предлагаю покинуть данную тему, пока не были применены санкции.
magirus
Супер-модератор
Эксперт по компьютерным сетямЭксперт Windows
26245 / 14559 / 811
Регистрация: 15.09.2009
Сообщений: 62,808
Записей в блоге: 67
02.09.2011, 22:10     Определить количество максимальных элементов в массиве. #88
SSTREGG, простите, но так как тема перешла на личности, и возвращаться в лоно адекватного обсуждения, не смотря на увещевания администрации, не собирается - ЗАКРЫТО.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2011, 09:27     Определить количество максимальных элементов в массиве.
Еще ссылки по теме:

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

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

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

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