Автор Тема: Выход из цикла или смерть Кощея  (Прочитано 94738 раз)

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #120 : Январь 16, 2013, 03:49:53 pm »
Так вы выложили его в исходном посте... гы хорошая шутка (весь этот топик)...  +100
Вы невнимательны.
Решение здесь http://oberspace.dyndns.org/index.php/topic,425.msg13272.html#msg13272

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Выход из цикла или смерть Кощея
« Ответ #121 : Январь 16, 2013, 03:50:20 pm »
2 Kemet
Не помню ни одного случая, чтоб без бряка не получалось написать... Да и вообще не умею я думать бряками.
Но кодеров, пишущих такой код, хочется периодически прибить лопатой и закопать... да...

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #122 : Январь 16, 2013, 03:52:46 pm »
2ilovb,
ну я тоже к ним терпимо отношусь, но глаза мозолят
впрочем, здесь можно было бы замастачить цикл-паук, но уж шибко было лень
я совсем не считаю зазорным использовать переменную, индицирующую достижение результата, или состояние

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Выход из цикла или смерть Кощея
« Ответ #123 : Январь 16, 2013, 03:53:03 pm »
Петр, так чем такой вариант плох?
http://oberspace.dyndns.org/index.php/topic,425.msg13459.html#msg13459

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #124 : Январь 16, 2013, 04:08:39 pm »
Он плох процессом своего рождения.
Автор при этом думал "как бы мне извратиться?"

Т.к. этот аргумент не будет понят с вероятностью 100%, то укажу на более зримые недостатки.
В заголовке цикла лишняя проверки иглы. Можно представить картину, когда все сундуки пустые. В варианте с exit в этом случае не будет ни одной проверки иглы.
Еще более неприятно то, что после того, как игла была найдена, тело цикла (i=i+1 ) все равно выполняется. Если игла в последнем сундуке, то сработает охрана "i != сундуки.Length". Очевидно, что это будет неожиданностью для автора.

Говно, в общем  :)

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #125 : Январь 16, 2013, 04:29:24 pm »
Так вы выложили его в исходном посте... гы хорошая шутка (весь этот топик)...  +100
Вы невнимательны.
Решение здесь http://oberspace.dyndns.org/index.php/topic,425.msg13272.html#msg13272
угу... не внимателен... сорри.. -упустил этот момент....

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Выход из цикла или смерть Кощея
« Ответ #126 : Январь 16, 2013, 04:54:25 pm »
Он плох процессом своего рождения.
Автор при этом думал "как бы мне извратиться?"
Т.к. этот аргумент не будет понят с вероятностью 100%, то укажу на более зримые недостатки.
Мне вообще не пришлось думать, т.к. автор этого кода ВЫ. Я лишь перенес условие в заголовок цикла.

В заголовке цикла лишняя проверки иглы. Можно представить картину, когда все сундуки пустые. В варианте с exit в этом случае не будет ни одной проверки иглы.
Проверка на null дорогая операция? Вы уверены на 100% что это медленнее варианта с break?

Еще более неприятно то, что после того, как игла была найдена, тело цикла (i=i+1 ) все равно выполняется.
Психологический барьер?

Если игла в последнем сундуке, то сработает охрана "i != сундуки.Length". Очевидно, что это будет неожиданностью для автора.

Т.е. это по вашему безобразие?
if (игла != null) {
   result = i-1;
}

Ну делайте так тогда
int i = -1;
while (i != сундуки.Length && игла == null) {
    i = i + 1   
    заяц = ЗАЯЦ(сундуки[i]);
    if (заяц != null) {
        утка = УТКА(заяц);
        if (утка != null) {
    яйцо = ЯЙЦО(утка);
            if (яйцо != null) {
                игла = ИГЛА(яйцо);
            }
        }
    }
}

if (игла != null) {
    result = i;
}

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #127 : Январь 16, 2013, 04:55:17 pm »
.. как ваше решение проблемы, но на andwhile среагировал http://oberspace.dyndns.org/index.php?action=post;quote=13341;topic=425.75;last_msg=13468... отношение такое же как циклу Дейкстры.. особых проблем в его отсутствии в явном виде не вижу... хоть убейте...

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #128 : Январь 16, 2013, 05:02:00 pm »
Пётр, если в Ваш код вставить строку
i = сундуки.Length;
при успешном поиске, то условие завершения цикла выполнится без дополнительных переменных

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #129 : Январь 16, 2013, 06:24:44 pm »
Пётр, если в Ваш код вставить строку
i = сундуки.Length;
при успешном поиске, то условие завершения цикла выполнится без дополнительных переменных
Не понял, о чем речь.
Напишите уж полностью.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #130 : Январь 16, 2013, 06:44:25 pm »
Не понял, о чем речь.
Напишите уж полностью.
Ну как-же - всё просто
while (i != сундуки.Length && игла == null) {
    заяц = ЗАЯЦ(сундуки[i]);
    if (заяц != null) {
      утка = УТКА(заяц);
      if (утка != null) {
        яйцо = ЯЙЦО(утка);
        if (яйцо != null) {
          игла = ИГЛА(яйцо);
          i = сундуки.Length;
        }
      }
    }
    i = i + 1
}
если бы это был FOR например в Модуле-3, то значение переменной цикла за пределами цикла не определено, а если переменная локальна, то вообще недоступна. Так что то, что i в результате не указывает на нужный сундук не важно, т.к. все промежуточные значения "ящиков" сохранены.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #131 : Январь 16, 2013, 06:56:40 pm »
блин, условие в цикле нужно поменять на "меньше" или в операции добавить -1

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #132 : Январь 16, 2013, 07:00:33 pm »
а еще убрать (игла == null) в условии цикла

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #133 : Январь 17, 2013, 02:53:39 am »
Ну что вы, это изврат.
Не наш метод.

Вы же видите, что обе, т. н., "задачи" по своей сути тривиальны до крайности. Тут "решать"-то нечего. Профессионал не может позволить себе роскошь задумываться над такой ерундой.

А вот с точки зрения использования выразительных средств это - да, задачи.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #134 : Январь 17, 2013, 05:11:14 am »
а еще убрать (игла == null) в условии цикла
а, да, это же я скопировал вариант ilobv, а не Петра. Пётр, кстати, зачем Вы картинку вставили вместо текста?
Вобщем как-то так должно быть
while i < сундуки.Length {
    заяц = ЗАЯЦ(сундуки[i]);
    if (заяц != null) {
      утка = УТКА(заяц);
      if (утка != null) {
        яйцо = ЯЙЦО(утка);
        if (яйцо != null) {
          игла = ИГЛА(яйцо);
          i = сундуки.Length;
        }
      }
    }
    i = i + 1
}

Ну что вы, это изврат.
Не наш метод.
Да ладно Вам, у каждого свои тараканы, одному нужны инварианты, другой носится с циклом Дейкстры, третьему нужна выразительность, четвертому "только хардкор", пятому эффективное решение, ...
Так что и этот вариант ничуть не более извращенный, чем другие.
Вы же видите, что обе, т. н., "задачи" по своей сути тривиальны до крайности. Тут "решать"-то нечего. Профессионал не может позволить себе роскошь задумываться над такой ерундой.
Конечно, задача простейшая, и каждый решает её действительно не задумываясь, по своему, в соответствии со своим представлении о прекрасном.
Но я не согласен, что не стоит и "задумываться над такой ерундой" - сколько раз замечал, что новый подход к решению даже тривиальных задач существенно упрощает решение сложных, ибо большая сложная всегда разбивается на тривиальные.
А вот с точки зрения использования выразительных средств это - да, задачи.
Мы живем в реальном мире и вынуждены ограничивать свои фантазии, ибо иначе они переходят в область вакуумных сфероидов.
В этом смысле последний вариант ничуть не хуже варианта с andwhile, хотя бы потому, что реален.