OberonCore
https://forum.oberoncore.ru/

Интересный сайт - обучение школьников С++ и Паскаль
https://forum.oberoncore.ru/viewtopic.php?f=88&t=2008
Страница 2 из 13

Автор:  igor [ Вторник, 26 Ноябрь, 2013 20:42 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

ilovb писал(а):
Ну лично мне очевидно, что это уже не цикл. :)
Вот! И все так думают (кроме меня). :D

Автор:  ilovb [ Вторник, 26 Ноябрь, 2013 21:32 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

Смотрите:
Красным цветом выделен "путь цикла". Каждое действие на этом пути выполняется ровно N раз.
Думаете я смухлевал в repeat? :) Ничего подобного. С действия 2 начинается цикл, просто это особый случай (N >= 1)
Вложение:
Snap 2013-11-26 at 22.14.46.png
Snap 2013-11-26 at 22.14.46.png [ 38.51 КБ | Просмотров: 12080 ]


А вот варианты с прыжками наружу и внутрь цикла.
Думаю видно как смешиваются пути.
В while получается мешанина логики.
В repeat обратите внимание, что цикл начинается только когда черный путь достигнет действия 2
Вложение:
Snap 2013-11-26 at 22.15.04.png
Snap 2013-11-26 at 22.15.04.png [ 33.48 КБ | Просмотров: 12080 ]

Автор:  ilovb [ Вторник, 26 Ноябрь, 2013 22:42 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

Кстати, замечу что repeat - это ни что иное как:
Код:
<действие1>
next := true;
while next do
   <действие2>
   <действие3>
   if cond then
      next := false;
   end;
end;
<действие4>


т.е. просто особый случай использования while.

Автор:  igor [ Среда, 27 Ноябрь, 2013 08:19 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

ilovb писал(а):
А вот варианты с прыжками наружу и внутрь цикла.
Думаю видно как смешиваются пути.
В while получается мешанина логики.
В repeat обратите внимание, что цикл начинается только когда черный путь достигнет действия 2
Вложение:
Вложение Snap 2013-11-26 at 22.15.04.png больше недоступно
Что это за боковые чёрные стрелки на Вашем рисунке? Вот правильная картинка:
Вложение:
Cycle.png
Cycle.png [ 3.92 КБ | Просмотров: 12052 ]
Что мы имеем:
1. Цикл имеет один вход и один выход.
2. Точка входа в цикл фиксирована. Проивольные (в середину) попадания в цикл невозможны.
3. Возможная точка выхода из цикла фиксирована. Произвольные выпрыгивания из цикла исключены.

PS: Циклы WHILE и REPEAT являются частными случаями этого цикла. У WHILE отсутствуют блоки 2 и 3, а у REPEAT - 4 и 5.

Автор:  igor [ Среда, 27 Ноябрь, 2013 08:43 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

ilovb писал(а):
Код:
   if cond then
      next := false;
   end;

Гы-ы-ы... :)
Код:
   next := ~cond;

PS: Это не одно и то же, но конкретно в данном случае такая замена кода возможна.

Автор:  igor [ Среда, 27 Ноябрь, 2013 09:45 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

Судя по названию темы, двое "школьников" обучают друг друга программированию :D

Просьба модераторам: перенесите, пожалуйста, обсуждение циклов, начиная вот с этого сообщения Ильи Ермакова, за исключением вот этого сообщения Валерия Лаптева, в новую тему "Стереотипы в построении циклов" или с любым другим подходящим названием. Спасибо!

Автор:  ilovb [ Среда, 27 Ноябрь, 2013 10:18 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

igor писал(а):
ilovb писал(а):
Код:
   if cond then
      next := false;
   end;

Гы-ы-ы... :)
Код:
   next := ~cond;

PS: Это не одно и то же, но конкретно в данном случае такая замена кода возможна.


Тык в repeat условие окончания же :wink:

Автор:  igor [ Среда, 27 Ноябрь, 2013 10:26 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

ilovb писал(а):
Тык в repeat условие окончания же :wink:
И чо?! :)

Автор:  ilovb [ Среда, 27 Ноябрь, 2013 10:27 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

igor писал(а):
Вложение:
Cycle.png
Что мы имеем:

Имеем два goto :D
Не вижу цикла. Об определениях конечно не спорят, но попробовать стоит :D
Вы можете формально определить цикл? Вот чтобы можно было отличить цикл от goto?

Напомню мое определение:
Цикл - это конечная неразрывная последовательность действий, которая целиком выполняется ровно N раз.
С этой моей точки зрения на вашей картинке цикла нет. :)

Автор:  ilovb [ Среда, 27 Ноябрь, 2013 10:29 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

igor писал(а):
И чо?! :)

Вау! Тяжелая артиллерия пошла :D

Автор:  Валерий Лаптев [ Среда, 27 Ноябрь, 2013 10:39 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

ilovb писал(а):
igor писал(а):
И чо?! :)

Вау! Тяжелая артиллерия пошла :D

Определение вашего цикла - в студию!
Очевидно, что ваш цикл - НЕ структурный.
Что иногда приводит к разного рода сложностям.

Автор:  igor [ Среда, 27 Ноябрь, 2013 10:44 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

ilovb писал(а):
igor писал(а):
Вложение:
Cycle.png

Напомню мое определение:
Цикл - это конечная неразрывная последовательность действий, которая целиком выполняется ровно N раз.
С этой моей точки зрения на вашей картинке цикла нет. :)
Для цикла не важно, целиком или не целиком выполняется последовательность. Циклы строятся исходя из инварианта цикла (эх, жаль Petr Almazov сюда не заходит, он бы сказал своё веское слово).
Имеет значение можем ли мы быть уверены в том, что постусловие соблюдаются после выхода из цикла. Посмотрите на мою последнюю картинку, там это гарантируется, потому что вы не можете "выпрыгнуть" из цикла минуя это условие.

Автор:  ilovb [ Среда, 27 Ноябрь, 2013 10:59 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

Вы говорите о цикле, а не определяете сам цикл. Попробуйте таки формально.

Автор:  igor [ Среда, 27 Ноябрь, 2013 11:35 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

ilovb писал(а):
Вы говорите о цикле, а не определяете сам цикл. Попробуйте таки формально.

Цикл - это конечная кольцевая последовательность операторов, выполнение которой прекращается по постусловию цикла, причём на каждой итерации непосредственно в момент проверки постусловия цикла соблюдается инвариант цикла.

Автор:  igor [ Среда, 27 Ноябрь, 2013 11:42 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

Валерий Лаптев писал(а):
Определение вашего цикла - в студию!
Очевидно, что ваш цикл - НЕ структурный.
Что иногда приводит к разного рода сложностям.
Ну, тогда и Ваше определение цикла - в студию! До кучи. :)

Автор:  ilovb [ Среда, 27 Ноябрь, 2013 12:22 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

igor писал(а):
ilovb писал(а):
Вы говорите о цикле, а не определяете сам цикл. Попробуйте таки формально.

Цикл - это конечная кольцевая последовательность операторов, выполнение которой прекращается по постусловию цикла, причём на каждой итерации непосредственно в момент проверки постусловия цикла соблюдается инвариант цикла.

Отлично. Определение есть. А теперь попробуйте придумать вермишель из goto, которая бы не попала под это определение. Сможете? :)

Автор:  Валерий Лаптев [ Среда, 27 Ноябрь, 2013 13:19 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

igor писал(а):
Валерий Лаптев писал(а):
Определение вашего цикла - в студию!
Очевидно, что ваш цикл - НЕ структурный.
Что иногда приводит к разного рода сложностям.
Ну, тогда и Ваше определение цикла - в студию! До кучи. :)

Я придерживаюсь определения вашего оппонента с добавлением об инварианте.

Автор:  igor [ Среда, 27 Ноябрь, 2013 16:44 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

ilovb писал(а):
igor писал(а):
Цикл - это конечная кольцевая последовательность операторов, выполнение которой прекращается по постусловию цикла, причём на каждой итерации непосредственно в момент проверки постусловия цикла соблюдается инвариант цикла.
Отлично. Определение есть. А теперь попробуйте придумать вермишель из goto, которая бы не попала под это определение. Сможете? :)
Не вижу смысла в подобном занятии. Поясните пожалуйста.

Автор:  igor [ Среда, 27 Ноябрь, 2013 16:46 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

Валерий Лаптев писал(а):
Я придерживаюсь определения вашего оппонента с добавлением об инварианте.
Тогда у меня вопрос к Вам и к моему оппоненту. Скажите пожалуйста, чем продиктовано ваше требование, что последовательность действий в цикле должна "целиком выполняться N раз"?

Автор:  ilovb [ Среда, 27 Ноябрь, 2013 17:01 ]
Заголовок сообщения:  Re: Интересный сайт - обучение школьников С++ и Паскаль

igor писал(а):
Не вижу смысла в подобном занятии. Поясните пожалуйста.

Если нельзя отличить цикл от goto, то зачем эти циклы вообще нужны?
Имхо, ценность циклов заключается в том, что они просты.
В структурном программировании вместо вермишели из goto мы имеем простую схему:
Последовательность + Ветвления + Циклы(в моем определении).

igor писал(а):
Тогда у меня вопрос к Вам и к моему оппоненту. Скажите пожалуйста, чем продиктовано ваше требование, что последовательность действий в цикле должна "целиком выполняться N раз"?

Тем, что если не придерживаться этого требования, то мы автоматически возвращаемся к программированию на ассемблере.
цикл + break/exit = goto + if

Страница 2 из 13 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/