> -- Pavel писал(а):
> А вот так:
Цикл построен неверно. n будет на единицу больше, чем чисел.
Между выполнением In.Int(i) и INC(n) должна быть проверка условия In.Done, что и обеспечивал WHILE с вынесенным действием.
Схема чтения из потока:
## Код:
```
Берем_след_элемент;
WHILE Взят_успешно() DO
   Используем элемент - например, считаем
   Берем_след_элемент
END;
```

Это цикл с вынесенным действием, т.к. чтений выполняется на одно больше, чем выполнений тела цикла с полезным действием - чтобы понять, что поток закончился, нужно попробовать прочитать.

WHILE с вынесенным действием можно реализовать и через UNTIL, но не так, как Вы написали, а вот так:
## Код:
```
REPEAT
  Берем_след_элемент;
  IF Взят_успешно() THEN
      Используем_элемент
  END
UNTIL ~ Взят_успешно();
```

Здесь тело цикла выполняется на один раз больше, чем у предыдущего WHILE. Но чтобы полезное действие не выполнялось лишний раз на последнем "холостом" витке, нужно поставить IF.
В данном случае WHILE короче и удобнее. Однако бывают ситуации, код код взятия следующего элемента весьма громоздок, и удобнее поставить лишний IF, чем дублировать код перед циклом.