![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| NEt_Hunter |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 9.10.2006 Где: Германия Репутация: нет Всего: нет |
Код сортировки чисел выдает ошибку, прошу помочь найти ошибку. Java тока начал изучать.
|
|||
|
||||
| drHip |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 30.5.2007 Репутация: нет Всего: нет |
это самый простой и самый медленный пузырек
|
|||
|
||||
| Kangaroo |
|
|||
|
AA - Aussie Animal ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2042 Регистрация: 7.10.2006 Где: US Репутация: 21 Всего: 104 |
NEt_Hunter,
1) код нужно писать в теге code, будет удобней читать. 2) ошибка у тебя на этой строке:
потому что условие цикла у тебя j < 5 и когда j становится 4, то j+1 равняется 5, а максимальный индекс массива 4. Вот и вылетает ошибка выхода за пределы массива. 3) лучше не используй метки, это не есть хорошо. -------------------- Lost.... |
|||
|
||||
| Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
Метод пузырька
Добавлено через 54 секунды Ого уже ответов сколько )) |
|||
|
||||
| Kangaroo |
|
|||
|
AA - Aussie Animal ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2042 Регистрация: 7.10.2006 Где: US Репутация: 21 Всего: 104 |
Что ж вы все пузырьки кидаете
-------------------- Lost.... |
|||
|
||||
| Dims |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Почему выдаёт ошибку -- уже объяснили. Для исправления нужно внутренний цикл сделать до 4, а не до 5. Есть ещё одна ошибка, логическая: в случае, если элементы не отсортированы, ты просто присваиваешь следующий элемент предыдущему. Его значение при этом теряется. Твой метод будет "размножать" некоторые числа и стирать другие. Поэтому, надо сделать обмен через временную переменную. Например вместо
вот так
Кроме того, есть синтаксическая погрешность: в твоём случае не нужен break <метка>. Если ты хочешь выйти только из внутреннего цикла. Но именно это делает простой break без метки. Поэтому, можно убрать метку. Наконец, я не совсем понимаю алгоритм. Твой алгоритм, по сути, делает только 5 перестановок. Хватит ли их для сортировки? Мне кажется, нет. И это точно не метод пузырька. По методу пузырька не надо делать break, надо во всех случаях идти дальше, но не до самого конца, на каждый раз на единицу меньше. |
||||
|
|||||
| jManiak |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 6.2.2007 Где: Санкт-Петербург Репутация: нет Всего: 1 |
||||
|
||||
| NEt_Hunter |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 9.10.2006 Где: Германия Репутация: нет Всего: нет |
Спасибо большое всем за советы!
Я не пользовался пузырьковым методом в этом примере. Просто сортировка. Знаком сним уже с С++ Должно хватить, ведь чисел 5 и перестановок 5. Для n-го количества можно ведь использовать num.length С бейзиком вообще не знаком. Знаю, можно. Я ведь говорил, что тока учусь, пробую всевозможные варианты, тем самым закрепляю уроки с метками. Это почему? Вдруг мне придется выйти с внешнего цикла или попасть в определенную строку кода проги? |
|||
|
||||
| Kangaroo |
|
|||
|
AA - Aussie Animal ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2042 Регистрация: 7.10.2006 Где: US Репутация: 21 Всего: 104 |
Ну вот представь. Вот понаставлял ты таких меток. А потом кто-нибудь другой (или ты сам через некоторое время) попытается разобраться в твоем коде. Это хорошо когда просто алгоритм. А если код будет побольше и несколько меток? Запутаться можно элементарно. Такие проги умные люди сравнивают с макаронами )) (вроде так). Метки нужно использовать только в крайних случаях, когда они реально упростят жизнь. -------------------- Lost.... |
|||
|
||||
| serger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 19.6.2007 Где: Ижевск Репутация: 1 Всего: 5 |
Метки желательно использовать только если ... я даже не могу придумать когда, тк сам ниразу не использовал и даже не думал о этом.. Почитай какую нить умную книжку, там найдёшь подробный ответ на этот вопрос. И приводятся правильные примеры, где метки нужны. Хотя для прерывания циклов обычно используется сразу return. И старайся избегать длинных методов. Каждый метод должен делать что-то элементарное и одно. И не изучай Java на реализации алгоритмов. Не к чему это. Основные алгоритмы реализованы. Не зачем городить велосипед, поэтому врятли это реально понадобиться. Лучше изучай ООП, UML, шаблоны, учись правильно строить приложения. Это реально необходимо и важно. -------------------- упс! |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Я думаю, что перестановок надо больше пяти. Смотри 0) 54321 1) 45321 2) 43521 3) 34521 4) 34251 5) 32451 Видишь? Ещё не отсортировалось. Считается, что использовать метки в Java -- "дурной тон". Иначе говоря, если тебе приходится использовать метки, то ты мыслишь не по-джавному, а применяешь навыки из других языков программирования. В Java это вообще невозможно. Ты не можешь попасть в любую строчку программы, пометив её меткой, так как оператора goto нет. Ты можешь пометить блок меткой и потом с помощью break <метка> перейти на КОНЕЦ этого блока (но не на метку!). Ты можешь пометить ЦИКЛ меткой и с помощью continue <метка> перейти на начало цикла. Но это обязательно должен быть цикл, просто так в любое место не перейдёшь. Разработчики Java специально устранили "лишние" возможности, чтобы легче было программировать. Меньше возможностей, меньше вариантов, меньше ошибок, проще думать. Очень многие вещи, которые есть в Си++ или Бейсике отсутствуют в Java именно по этой причине. |
|||
|
||||
| NEt_Hunter |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 9.10.2006 Где: Германия Репутация: нет Всего: нет |
Получается! 1) 45321 43521 43251 43215 2) 34215 32415 32145 32145 3) 23145 21345 21345 21345 4) 12345 Всего за 4 внешних цикла решено! Да, переход в любое место грубо сказал. Цикл, конечно, имел ввиду. Это сообщение отредактировал(а) NEt_Hunter - 11.11.2007, 23:15 |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
У тебя (по первому тексту) внутренний цикл идёт до первой перестановки и потом прерывается. Поэтому, на каждый внешний цикл будет выполняться только одна перестановка.
|
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Ну, вообще-то, это не причина не использовать метки. То, что это "считается дурным тоном" и "мыслишь не по-джавному" - это не причины, а лишь объяснения. Причину же объяснили немного ранее - код получается менее очевидным. Даже одной метки хватит, чтобы запутать читающего. Всего лишь требуется, чтобы при листании бряк и его метка оказались на разных страницах. Кстати, с/с++ точно так же не одобряет метки. Интересно, и почему это не пузырёк? Очень даже пузырёк. Классический. Только реализован не до конца, как уже говорили. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| iluvatar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 266 Регистрация: 17.9.2007 Репутация: нет Всего: 4 |
Про операторы перехода очень много говорили люди намного у мнее нас с вами. Лично я прислушиваюсь к авторитетному мнению и считаю, что такую логику можно ипсользовать ТОЛЬКО в исключительных случаях.
NEt_Hunter, Имей в виду, что в Java очень редко применяется сортировка руками. Классам можно определить метод compareTo для сравнения 2-х объектов и использовать встроенные методы сортировок. |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
А мне вот интересно, если метки в Java - дурной тон, то зачем тогда их вообще ввели в Java?
Ведь простые процедуры в Java писать нельзя, хотя к процедурам куда меньше претензий, чем к меткам. |
|||
|
||||
| Kangaroo |
|
|||
|
AA - Aussie Animal ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2042 Регистрация: 7.10.2006 Где: US Репутация: 21 Всего: 104 |
Метки нужны там, где они реально могут упростить жизнь программисту(например без них код получиться в пару раз больше Тем более в Java'e устранены некоторые недостатки меток благодаря тому, что они используются не с goto, а с break и continue. -------------------- Lost.... |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Ну, можно, наверное, здесь проводить разграничение, но я не уверен. Язык -- это ведь и есть "средство для придания очевидности", соответственно, любое нарушение правил или рекомендаций языка, естественно, ведут к уменьшению очевидности. Добавлено через 2 минуты и 52 секунды
Потому что мир не настолько совершенен, как Java Иными словами, пока не придумали ещё стройную теоретическую парадигму, которая одновременно подходила бы ко всем практическим случаям. По мере практического применения любой язык становится одновременно и менее совершенным. В качестве примера можно привести такие языки, как php или perl, в которых вообще намешано куча всего, и которые одновременно интенсивно используются. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |