
- •17. Проектирование последовательного потока управления.
- •17.1. Оператор case.
- •17.1.1. Примеры операторов case.
- •13.1. Определение оператора case.
- •17.2. Оператор for.
- •17.2.1. Примеры для оператора for.
- •17.2.2. Определения для оператора for.
- •17.2.3. Псевдографика.
- •17.2.4. Анализ для операторов for.
- •17.3. Оператор repeat.
- •17.4. Заключение.
17.2.2. Определения для оператора for.
Синтаксические правила для оператора FOR:
<оператор FOR> ::= FOR <идентификатор переменной> := <список FOR> DO <оператор>
<список FOR> ::= <выражение> TO <выражение>
| <выражение> DOWNTO <выражение>
Контрольная переменная и выражения в списке FOR могут быть порядкового типа. Контрольная переменная должна быть идентификатором и не может появляться в левой части присваиваний внутри цикла. Значение контрольной переменной не определено после завершения выполнения оператора FOR. На некоторых Паскаль-машинах контрольная переменная может иметь значение после завершения оператора FOR, использование ее значения для дальнейших вычислений является плохой практикой, поскольку это не будет работать одинаково на всех Паскаль-машинах.
Значение оператора FOR может быть дано через эквивалентный оператор WHILE. Но нужно принимать во внимание несколько различий между двумя операторами. Наиболее очевидное соответствие неверно. Оператор FOR:
FOR Index := E1 TO E2
DO
S
не эквивалентен:
Index := E1;
WHILE Index <=E2
DO
BEGIN
S;
Index := SUCC(Index)
END
Контрольная переменная в операторе WHILE не является неопределенной после завершения цикла как это происходит в операторе FOR. Тело оператора WHILE будет выполнено последний раз, когда Index уже имеет то же значение что и E2.
Если бы это значение было последним в перечислимом типе, последнее вычисление SUCC в теле цикла привело бы к аварийному завершению, чего не происходит в цикле FOR. Также, операторы присваивания в операторе S могут изменить количество итераций в операторе WHILE, чего не происходит в операторе FOR. Приведенный ниже операторFOR выполняет пять итераций, даже если First и Last изменяются после начала выполнения.
First := 1;
Last := 5;
FOR Index := First TO Last
DO
BEGIN
First := First + 1;
Last := Last – 1;
WRITELN(Index, First, Last)
END
Выполнение:
OUTPUT: 1 2 4
2 3 3
3 4 2
4 5 1
5 6 0
Некоторые из этих различий могут быть устранены использованием контрольной переменной, которая более нигде в программе не появляется (скажем T1 и T2) и разворачиванием первого выполнения в цикле.
T1 := E1;
T2 := E2;
IF T1 <= T2
THEN
BEGIN
Index := T1;
S;
WHILE Index <> T2
DO
BEGIN
Index := SUCC(Index);
S
END
END
Хотя эта последовательность операторов ближе к значению оператора FOR, она по прежнему оставляет Index определенной в конце цикла.
Прямое определение оператора FOR может быть дано следующим образом:
FOR V := E1 TO E2 DO S
где переменная V принадлежит порядковому типу T, имеет значение:
FOR V := E1 TO E2 DO S(t) =
(VAR V: TT◦VAR V: T)(tn) если SUCCn-1 (E1) (t) = E2 (t), где
tn = S ( V := SUCC(V) (tn-1))
…
t1 = S ( V := E1 (t));
(VAR V: TT◦VAR V: T)(t) если (E1) (t) > E2 (t).
С помощью композиции VAR V: TT◦VAR V: T управляющая переменная удаляется из состояния выполнения б потом снова вставляется как будто была вновь объявлена. В результате, при выходе из оператора FOR она не определена.
Оператор FOR использующий DOWNTO определяется аналогично.