OberonCore https://forum.oberoncore.ru/ |
|
Интересный сайт - обучение школьников С++ и Паскаль https://forum.oberoncore.ru/viewtopic.php?f=88&t=2008 |
Страница 3 из 13 |
Автор: | Валерий Лаптев [ Среда, 27 Ноябрь, 2013 17:15 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
igor писал(а): Валерий Лаптев писал(а): Я придерживаюсь определения вашего оппонента с добавлением об инварианте. Тогда у меня вопрос к Вам и к моему оппоненту. Скажите пожалуйста, чем продиктовано ваше требование, что последовательность действий в цикле должна "целиком выполняться N раз"?Блин! Писал-писал, а все гикнулось. Потому как в книге Дисциплина программирования Дейкстра придумал свой цикл для "вывода" "правильных" программ "по построению". Вы читали эту книжку? В частности, в главе 6 доказывается теорема об инварианте. |
Автор: | igor [ Среда, 27 Ноябрь, 2013 17:25 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
ilovb писал(а): igor писал(а): Скажите пожалуйста, чем продиктовано ваше требование, что последовательность действий в цикле должна "целиком выполняться N раз"? Тем, что если не придерживаться этого требования, то мы автоматически возвращаемся к программированию на ассемблере. цикл + break/exit = goto + if Цитата: EXIT есть только в неудачном синтаксисе КП, а на картинке нет никаких EXIT'ов и бряков.
(Поэтому я и начал с картинки, потому что ни в одном известном мне языке нет адекватного оператора цикла). |
Автор: | igor [ Среда, 27 Ноябрь, 2013 17:37 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Валерий Лаптев писал(а): Блин! Поэтому я когда пишу сообщение периодически нажимаю Ctrl+A, Ctrl+C Писал-писал, а все гикнулось. Валерий Лаптев писал(а): Потому как в книге Дисциплина программирования Дейкстра придумал свой цикл для "вывода" "правильных" программ "по построению". Читал давно когда-то. Спасибо, что напомнили, посмотрю ещё на досуге.Вы читали эту книжку? В частности, в главе 6 доказывается теорема об инварианте. Я вообще-то интересовался Вашим мнением (и Бориса). Получилось что-то типа: "Потому что так считает Дейкстра". Думаю, имеет смысл напомнить: igor писал(а): Под требованиями структурности к алгоритмам я понимаю не обязательно классические требования, которые я считаю устаревшими. Но развивать эту тему пока не хочу. PS: Куда же Илья запропастился! Он мог бы меня "добить". |
Автор: | ilovb [ Среда, 27 Ноябрь, 2013 18:37 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Вижу что не понят. Потому еще картинка! Попытался выделить самую суть структурного программирования (как я его понимаю) Вложение: Желтые кружочки - это действия в последовательности. Розовые кружочки - это действия в подпоследовательности. Красные кружочки - это абстрактный оператор ветвления Черные стрелки - это безусловный путь. Красные стрелки - это условный путь. 1. Первая конструкция - простая последовательность. Все действия выполняются в строгом порядке ровно 1 раз. 2. Вторая конструкция - ветвление. Получается из последовательности путем выделения подпоследовательности, которая может выполняться 0 или 1 раз. 3. Третья конструкция - цикл. Отличается от ветвления только тем, что подпоследовательность может выполняться N >= 0 раз. Вот три кита структурного программирования. (последовательность, "IF THEN END" и "WHILE DO END") Простейшие конструкции, но путем их комбинирования можно закодить любой алгоритм. И программа, построенная по таким правилам, будет легко поддаваться анализу. Подозреваю что вы спросите где ELSE. Вот он: Код: <действие1> IF cond THEN <действие2> END IF ~cond THEN (* это ELSE *) <действие3> END <действие4> REPEAT уже показывал: Код: <действие1> next := true; while next do <действие2> <действие3> if cond then next := false; end; end; <действие4> ps На самом деле IF тоже можно через WHILE выразить. (т.е. базовых конструкций всего две в сухом остатке) Код: <действие1> flag := true; while cond & flag do (* это IF *) <действие2> <действие3> flag := false; end; <действие4> pps REPEAT UNTIL, IF END, IF ELSE END etc - это все лишь синтаксический сахар для WHILE. |
Автор: | Валерий Лаптев [ Среда, 27 Ноябрь, 2013 18:45 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
igor писал(а): Я вообще-то интересовался Вашим мнением (и Бориса). Получилось что-то типа: "Потому что так считает Дейкстра". Думаю, имеет смысл напомнить: igor писал(а): Под требованиями структурности к алгоритмам я понимаю не обязательно классические требования, которые я считаю устаревшими. Но развивать эту тему пока не хочу. PS: Куда же Илья запропастился! Он мог бы меня "добить". 1. Дейкстра не "считает", а обосновывает и доказывает. И не на пустом месте. а на на теореме о трех структурных конструкциях. 2. Я не считаю эти результаты устаревшими, ибо они подтверждаются практикой - помогают бороться со сложностью. |
Автор: | igor [ Среда, 27 Ноябрь, 2013 19:33 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Борис и Валерий, спасибо за информацию и за разъяснения. Полагаю мне необходимо взять тайм-аут для осмысления. Да и Дейкстру что-то захотелось перечитать. В общем, не теряйте меня, я на некоторое время исчезну. |
Автор: | Илья Ермаков [ Четверг, 28 Ноябрь, 2013 13:07 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Ну, мне кажется, говорит, что "это цикл, а это не цикл" - терминологически неправильно... Но можно сказать о некоей канонической форме цикла. Процесс выполнения которой имеет вид: Проверка; { Действия; Проверка } (Вообще, применение грамматик к анализу алгоритмов - интересная, мало кем затронутая штука... Параллели между алгоритмов и формальным языком, процессом и текстом на формальном языке любопытны, в методическом аспекте в том числе - нахождение любых подобий, изоморфизмов сильно углубляет понимание). |
Автор: | Илья Ермаков [ Четверг, 28 Ноябрь, 2013 13:09 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Хотя рассуждения Игоря, по мне, тоже интересны - если смотреть на них как на умственное упражнение "а что, если..". Пётр Алмазов, кстати, на Оберспейсе приводил пример цикла с проверкой условия в произвольном месте. |
Автор: | Peter Almazov [ Четверг, 28 Ноябрь, 2013 13:20 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Похоже, Илья имеет ввиду это viewtopic.php?p=57745#p57745 |
Автор: | ilovb [ Четверг, 28 Ноябрь, 2013 14:19 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Остается один вопрос: Зачем? Избежать дублирования? Неужели это так важно? За свою практику написал довольно много кода, и ни разу не думал break'ами. Проблема то в том, что формализм, который тут описывал igor и Peter Almazov, никакого сильного профита не дает, но при этом он очевидно сложнее для восприятия и анализа чем классический структурный цикл. На практике, люди(большинство), которые регулярно пользуются break, никакими такими формализмами не думают. Они думают goto'ами(переходами), т.е. просто не видят цикла (хоть и употребляют это слово) Само слово "цикл", кстати, некоторые воспринимают как "переход на начало блока". Сам термин, да, провоцирует такое восприятие (ибо представляется какая-то "зацикленная" цепочка), но это не верно! Лучше бы был термин "повтор", и путаницы было бы меньше. Потому как в структурном программировании вроде как можно все последовательности завернуть в процедуры/подпрограммы. Т.е. любую программу можно представить в таком виде: Цитата: процедура1() повторять(процедура2) пока <условие1> процедура3() повторять(процедура4) пока <условие2> процедура4() И тут уже ясно видно что никаких выходов из середины цикла быть не может, потому как у "повторять" нету тела. Очевидно что формализм "break" никак в эту схему не вписывается. ps Все сказанное - это только мое личное мнение. |
Автор: | Валерий Лаптев [ Четверг, 28 Ноябрь, 2013 14:32 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Которое я поддержтиваю. Посмотрим на обобщенный цикл Алмазова. Если внимательно присмотреться, то становится понятно, что это обычный цикл с постусловием, в котором тело цикла включает оператор if. Цикл Алмазова: Код: do часть1 if (условие) выход часть2 enddo Преобразуется в следующий: Код: do часть1 if(~условие) часть2 endif while(условие) И цикл становится структурным. |
Автор: | igor [ Четверг, 28 Ноябрь, 2013 18:05 ] | ||
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль | ||
igor писал(а): Да и Дейкстру что-то захотелось перечитать. Наткнулся на перевод одной из ранних статей Никлауса Вирта, датированной 1967 годом (автор перевода мне неизвестен). В частности в ней рассматривается такой же цикл, как я предложил в этой теме. Вирт называет его "тройственной конструкцией". Свою оценку этому циклу Вирт не даёт, но говорит, что эту идею высказал Д. Кнут.Получается, что этот цикл был известен отцам-основателям с самого начала (невозможно себе представить иное), но впоследствии эта "тройственная конструкция" впала у них в немилость.
|
Автор: | ilovb [ Четверг, 28 Ноябрь, 2013 18:44 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Н.Вирт. О некоторых основных понятиях языков программирования. Перевод А.П.Ершова. Из архива Ершова ps Какой однако ужасный почерк у этого вашего Ершова... pps Оригинал: http://oberon2005.oberoncore.ru/paper/nw1967may.pdf |
Автор: | ilovb [ Четверг, 28 Ноябрь, 2013 20:16 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
igor писал(а): igor писал(а): Да и Дейкстру что-то захотелось перечитать. Наткнулся на перевод одной из ранних статей Никлауса Вирта, датированной 1967 годом (автор перевода мне неизвестен). В частности в ней рассматривается такой же цикл, как я предложил в этой теме. Вирт называет его "тройственной конструкцией". Свою оценку этому циклу Вирт не даёт, но говорит, что эту идею высказал Д. Кнут.Получается, что этот цикл был известен отцам-основателям с самого начала (невозможно себе представить иное), но впоследствии эта "тройственная конструкция" впала у них в немилость. Думаю, что даты немного проясняют эту ситуацию: 1. Bohm, Corrado; and Giuseppe Jacopini (May 1966). «Flow Diagrams, Turing Machines and Languages with Only Two Formation Rules» 2. Dijkstra, Edsger (1968). «Go To Statement Considered Harmful» Цитата: Публикация теоремы была толчком к началу дебатов о структурном программировании. Спустя 2 года вышла статья Эдсгера Дейкстры «Go To Statement Considered Harmful»[2], в которой он критиковал использование оператора GOTO и высказывался в пользу улучшения стиля программного кода за счёт использования структур управления и отказа от других инструкций, управляющих ходом алгоритма. Теорема Бёма — Якопини |
Автор: | ilovb [ Четверг, 28 Ноябрь, 2013 23:37 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Илья Ермаков писал(а): Процесс выполнения которой имеет вид: Проверка; { Действия; Проверка } Это сообщение натолкнуло на любопытную фантазию Если определить последовательность следующим образом: Последовательность = Действие; {Последовательность} и связать с каждой последовательностью охранники, то имеем первичный вид охранника: Код: flag := true while flag do <sequence> flag := false end и его модификации: IF <condition> THEN <sequence> END Код: flag := <condition> while flag do <sequence> flag := false end WHILE <condition> DO <sequence> END Код: flag := <condition> while flag do <sequence> flag := <condition> end REPEAT <sequence> UNTIL ~<condition> END Код: flag := true while flag do <sequence> flag := <condition> end Т.е. охранник в общем виде описывается так: Код: flag := [ true | <condition> ]
while flag do <sequence> flag := [ false | <condition> ] end |
Автор: | Илья Ермаков [ Пятница, 29 Ноябрь, 2013 08:58 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Ну да ) Фантазия любопытная. Вот именно такие "фантазии" (их возникновение в голове и понимание) являются индикатором программиста, чувствующего свойства императивных программ, а не просто "кодящего" и "отлаживающего". А теперь прикинем процент тех, кто о таких вещах задумывается, - и тех, кому это "многобукаффниасилилнахреннадо". |
Автор: | ilovb [ Пятница, 29 Ноябрь, 2013 09:22 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Получается, что структурная программа имеет следующий вид: <PrimaryGuard>, <SecondaryGuard>, <Sequence>; <PrimaryGuard>, <SecondaryGuard>, <Sequence>; <PrimaryGuard>, <SecondaryGuard>, <Sequence>; <PrimaryGuard>, <SecondaryGuard>, <Sequence>; <PrimaryGuard>, <SecondaryGuard>, <Sequence>; <PrimaryGuard>, <SecondaryGuard>, <Sequence>; <PrimaryGuard>, <SecondaryGuard>, <Sequence>; ... где: Sequence = Operation; {Sequence} PrimaryGuard = [True | Condition] SecondaryGuard = [False | Condition] -------------------------------------------------------------------------- Простая последовательность выглядит так: True, False, Sequence; "Последовательность выполняется, и не повторяется" Простое ветвление так: Condition, False, Sequence; "Последовательность выполняется если Condition = True, и не повторяется" Цикл с предусловием так: Condition, Condition, Sequence; "Последовательность выполняется если Condition = True, и повторяется пока Condition = True" Цикл с постусловием так: True, Condition, Sequence; "Последовательность выполняется, и повторяется пока Condition = True" |
Автор: | Владислав Жаринов [ Пятница, 29 Ноябрь, 2013 10:02 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Э... так это типа как в стандарте на "программные конструктивы": http://www.gametest.ru/doc/sw/8631_94.pdf объясняется, что ли?.. |
Автор: | ilovb [ Пятница, 29 Ноябрь, 2013 10:09 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Не. Это скорее разновидность брэйнфака получается. |
Автор: | Владислав Жаринов [ Пятница, 29 Ноябрь, 2013 10:12 ] |
Заголовок сообщения: | Re: Интересный сайт - обучение школьников С++ и Паскаль |
Просто, поскольку обдумывал формализацию строения "прогконструктивов", как они там описаны на словах, то обнаружил аналогию с Вашими формулами. |
Страница 3 из 13 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |