
- •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. Оператор for.
Циклическое управление для оператора FOR заключается в прохождении через набор значений порядкового типа и текущее значение из этого набора доступно для вычисления внутри оператора.
Пусть V будет переменная некоторого порядкового типа , а A и Z – выражения того же типа. Оператор FOR
FOR V := A TO Z
DO
S
выполняет оператор S количество раз, заданное значениями A и Z до того как цикл начнется. Предположим, что значением A является p, а значением Z является q перед выполнением цикла. Когда S выполняется первый раз, значением V является p, второй раз – SUCC(p), SUCC(SUCC(p)) и так далее, пока значение V последовательно не достигнет qв последнем выполнении S. Таким образом, количество выполнений будет q – p + 1 при условии если это значение как минимум 1, если нет, то есть если p > q, S не выполняется вообще. Оператор FOR также может быть записан, чтобы выполнить то же количество итераций но в обратном порядке:
FOR V := Z TO A
DO
S
Где значения последовательно принимаемые V
q, PRED(q), PRED(PRED(q)), …, p.
V называется контрольной переменной. В конце цикла значение V неопределено.
17.2.1. Примеры для оператора for.
Поскольку контрольные переменные принимают последовательные значения соответствующего порядкового типа при последовательно выполняемых итерациях, оператор FOR идеально подходит для выполнения повторяющихся действий над набором данных. Например, перебор перечислимого типа Month с использованием
FOR Mo := Jan TO Dec
DO
...
будет более натурален, чем с использованием WHILE.
Тип данных INTEGER также естественно управляется оператором FOR. Следующая программа может быть использована как скелет для расчета средних оценок студентов, она читает набор записей о набранных баллах и усредняет их.
PROGRAM AverageScore(INPUT, OUTPUT);
CONST
NumberOfScores = 5;
ClassSize = 3;
TYPE
Score = 0 .. 100;
VAR
WhichScore: 1 .. NumberOfScores;
Student: 1 .. ClassSize;
NextScore: Score;
Ave. TotalScore, ClassTotal: INEGER;
BEGIN {AverageScore}
ClassTotal := 0;
WRITELN('Studen averages:');
FOR Student := 1 TO ClassSize
DO
BEGIN
TotalScore := 0;
FOR WhichScore := 1 TO NumberOfScores
DO
BEGIN
READ(NextScore);
TotalScore := TotalScore + NextScore;
END;
READLN;
TotalScore := TotalScore * 10;
Ave := TotalScore DIV NumberOfScores;
IF Ave MOD 10 >= 5
THEN
WRITE(Ave DIV 10 + 1)
ELSE
WRITE(Ave DIV 10);
ClassTotal := ClassTOtal + TotalScore;
END
WRITELN;
WRITELN ('Class average:');
ClassTotal := ClassTotal DIV (ClassSize *NumberOfScores);
WRITELN(ClassTotal DIV 10, '.' ClassTotal MOD 10:1)
END. {AverageScore}
Выполнение:
INPUT: 80 100 85 85 80
90 80 75 90 90
0 50 60 85 80
OUTPUT: Student averages:
88 85 59
Class average:
77.3
Эта программа предполагает серии персональных баллов в строке и строку для каждого человека. Количество баллов в строке и количество строк задается с помощью констант. Средние значения округляются до ближайшего целого, общее среднее ограничено одним значением после запятой.