Согласен, там понятнее. Я просто хотел проиллюстрировать, что в Алголе-68 есть синтаксис для цикла, условие которого проверяется в середине. И для этого _дословно_ переписал алгоритм, предложенный Бойко на Си (у него был бесконечный цикл с единственным выходом по break в середине). Т.е. исходный алгоритм на Си на пару писем раньше тоже был запутанным.
From: Arkady Klimov [mailto:arkady.kli...@gmail.com] Sent: Thursday, August 10, 2017 8:42 PM To: refal@botik.ru Subject: Re: FW: Рефал умер? А все-таки на следующей странице оно понятнее (функция siftDown): https://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D0%BA%D1%83%D1%87%D0%B0 Фишка в том, что для выхода из цикла while здесь имеются две разные причины: 1) у данной текущей вершины p (там i) нет потомков (2*p+1>=n) или 2) потомки есть (один или два), но все они (в частности, больший, который обозначен через j) имеют значение a меньшее (или равное) текущей (x, там a[i]). И потому для второго выхода там используется break, т.е. неструктурность. А чтобы добиться структурности вам приходится эти два условия соединить в одно через "или" и тут же в скобках под while вписать все что надо для их вычисления. Да к тому же обеспечить доступ в теле цикла к вычисленному внутри условий индексу j, объявив j вне цикла. Стало, конечно, структурно, но более запутанно. (Программы однако разные, т.к. у вас строится пирамида для максимума, а там для минимума, что не суть.) 10 августа 2017 г., 16:14 пользователь Александр Коновалов <a.v.konovalo...@mail.ru <mailto:a.v.konovalo...@mail.ru> > написал: > А мой вариант на Си не структурный? У него один вход и один выход. > Что и есть по вашему определению структурность. Или отреклись уже? :) Формально выход один, так что по сформулированному мной определению, да, структурно. > При этом у меня процедура вроде правильно работает. А ваша на > Алголе-68 ошибится индексированием — операция and в Алголе-68 не ленивая :) Спасибо, поправил. :-) proc sift = (ref [] T a, int n, int p) void: ( int j; T x := a[p]; while ( if j := 2*p + 1; (j + 1 < n | a[j] < a[j + 1] | false) then j +:= 1; (j < n| a[j] > x | false) ) do a[p] := a[j]; p := j od; a[p] := x ) Заодно понял, для чего нужна сокращённая запись if. -----Original Message----- From: Boyko Bantchev [mailto:boyk...@gmail.com <mailto:boyk...@gmail.com> ] Sent: Thursday, August 10, 2017 11:57 AM To: refal@botik.ru <mailto:refal@botik.ru> Subject: Re: FW: Рефал умер? > Красота. И никаких break’ов и goto. Структурное программирование :-) А мой вариант на Си не структурный? У него один вход и один выход. Что и есть по вашему определению структурность. Или отреклись уже? :) При этом у меня процедура вроде правильно работает. А ваша на Алголе-68 ошибится индексированием — операция and в Алголе-68 не ленивая :) -- _______________ С уважением, Аркадий Климов, с.н.с. ИППМ РАН, +7(499)135-32-95 +7(916)072-81-48