Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
17.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
71.68 Кб
Скачать

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]