Согласен, там понятнее. Я просто хотел проиллюстрировать, что в Алголе-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

Ответить