В случаях, когда число повторений может быть заранее известно, для организации циклической обработки информации применяется оператор повтора for. Часто этот оператор повтора называют оператором цикла с параметром, так как число повторений задается переменной, называемой параметром цикла, или управляющей переменной.
Оператор повтора for состоит из заголовка и тела цикла.
Данный оператор может быть представлен в двух форматах:
for <параметр цикла> :== to do <оператор>;
for <параметр цикла> := downto do <оператор>;
где Sl и S2 — выражения, определяющие соответственно начальное и конечное значе-ния параметра цикла;
for ... do — заголовок цикла;
<оператор>—тело цикла.
Тело цикла может быть простым или составным оператором. Оператор for обеспечивает выполнение тела цикла до тех пор, пока не будут перебраны все значения параметра цикла от начального до конечного.
Заголовок оператора повтора for определяет:
• диапазон изменения значений управляющей переменной (параметра цикла) и одновременно число повторений оператора, содержащегося в теле цикла;
• направление изменения значения параметра цикла (возрастание — to или убывание — downto).
Пример.
for I:= 1 to 100 do Read (M[I]); {Чтение элементов массива}
for I:= 100 downto 1 do Write (M[I]); {Вывод элементов массива}
При первом обращении к оператору for вначале вычисляются выражения S1, S2 и осуществляется присваивание <параметр цикла>:=S1.
После этого циклически повторяются следующие действия.
1. Проверяется условие <параметр цикла>:<=82.
2. Если условие выполнено, то оператор for продолжает работу (выполняется оператор в теле цикла), если условие <параметр цикла>:<=82
не выполнено, то оператор for завершает работу, и управление в программе передается на опера-тор, следующий за циклом.
3. Значение управляющей переменной изменяется на +1 (to) или —1 (downto) и далее с п. 1. Обратите внимание, что шаг изменения управляющей переменной — единица.
На использование управляющей переменной (параметра цикла) в цикле for налагаются следующие ограничения.
1. В качестве параметра должна использоваться простая переменная, описанная в текущем блоке.
2. Управляющая переменная должна иметь дискретный тип (как правило, integer).
3. Начальные и конечные значения диапазона должны иметь тип, совместимый с типом управляющей переменной. При этом допустим любой скалярный тип, кро¬ме вещественного.
4. В теле цикла запрещается явное изменение значения управляющей переменной (например, оператором присваивания).
5. После завершения оператора значение управляющей переменной становится неопределенным, если только выполнение оператора не было прервано операто-ром перехода.
Примером действия оператора for может служить программа DemoFor, которая выводит на экран таблицу перевода из градусов по шкале Цельсия(С) в градусы по Фаренгейту(Р) для значений от 15°С до 30°С с шагом 1 градус. Перевод осуществляется по формуле: F = С* 1.8+32.
program DemoFor;
var
I: integer ;
F: real;
begin
Writeln (' Температура ');
for I:= 15 to 30 do {Заголовок цикла с параметром}
begin {Начало тела цикла}
F:= I*1.8+32;
Writeln ('По Цельсию= ',I,' по Фаренгейту= ', F:5:2)
end; {Конец тела цикла}
end.
В блоке описания переменных описаны параметр цикла I типа integer и переменная F — температура по Фаренгейту типа real. Переменная I, помимо функций управляющей переменной, является переменной, хранящей целочисленные значения температуры по шкале Цельсия. В начале выполнения программы на экран выводится надпись 'Температура', а затем оператором повтора выводится таблица соотношения температуры в шкалах Цельсия и Фаренгейта. Печать таблицы выполняется оператором
Writeln ('По Цельсию= ',I,' по Фаренгейту= ', F:5:2)
Цикл выполняется следующим образом.
При первом обращении к оператору for вычисляются значения начального (15) и ко-нечного (30) параметров цикла, и управляющей переменной I присваивается начальное значение 15.
Затем циклически выполняется следующее:
1. Проверяется условие I<=30.
2. Если оно соблюдается, то выполняется составной оператор в теле цикла, т. е. рассчитывается значение выражения 1*1.8+32, затем оно присваивается переменной F, и на экран выводится сообщение
'По Цельсию= ',I,' по Фаренгейту= ', F:5:2
Если условие I<=30 не соблюдается, т. е. как только I станет > 30, оператор те¬ла цикла не выполняется, а управление в программе передается за пределы опера¬тора for, в нашем примере на оператор end;. Программа завершает работу.
3. Значение параметра цикла I увеличивается на единицу, и управление передается в заголовок цикла for для проверки условия.
Далее цикл повторяется с п.1.
Вторым примером оператора цикла for может служить программа, которая печатает на экране символы американского стандартного кода обмена информацией (ASCII) в порядке убывания кода.
program DemoASCII;
var
A: integer;
begin
for A:= 255 downto 0 do {Цикл с убыванием параметра}
Writeln ('код символа = ',А, ' символ = ', Chr(A));
end.
В данной программе применяется цикл for с убыванием значения управляющей переменной А (используется указание downto — убывание).
Рассмотрим пример программы, имитирующей арифметический калькулятор, которой используются операторы присваивания, условия и повтора.
program DemoCalc;
var
X, Y, Rezult : real;
Operation, Ans: char;
begin
repeat {Начало цикла с постусловием}
Write ('X = ');
Read (X); {Считывание первого операнда}
Write ('Y = ');
Readln (Y); {Считывание второго операнда}
Writeln ('операция (+, -, *, /) >');
Readln (Operation); {Считывание знака операции}
case Operation of {Выбор арифметического действия}
'+' : Rezult := X+Y;
'-' : Rezult := X-Y;
'*' : Rezult := X*Y;
'/' : Rezult := Х/Y;
else
Writeln ('Ошибка ввода');
end;
Writeln (X,Operation,Y,'=',Rezult); {Печать арифметического выражения}
Write ('Продолжить (Y/N)');
Readln (Ans); {Считывание ответа на вопрос}
Until (Ans='M') or (Ans='n'); {Проверка условия окончания цикла}
end.
В разделе описания переменных описаны переменные — операнды X, Y и результат арифметических операций Rezult вещественного типа, а также переменная Operation символьного типа, в которой хранится значение знака арифметической операции, и Ans — переменная символьного типа, которой присваивается значение "Y" или 'V".
Процесс выполнения арифметических операций калькулятором организован с помо-щью оператора repeat и продолжается до тех пор, пока переменной Ans не будет присвоено значение V или 'п'.
В теле цикла сначала запрашиваются и считываются с клавиатуры значения
операндов:
Write ('X = ');
Read (X);
Write ('Y = ');
Readln (Y);
затем запрашивается и считывается знак арифметической операции
Writeln ('операция (+, -, *, /) >');
Readln (Operation);
Оператор выбора case по значению переменной Operation (селектор) выбирает знак операции и в зависимости от его значения выполняет арифметическую операцию. Например, если значение переменной Operation равно значению константы выбора '—', то вы-полняется оператор присваивания Rezult := Х—Y и т. д. Если значение переменной Operation не равно ни одному значению константы выбора, то управление передается на опера-тор, стоящий за словом else, и на экран выводится сообщение 'Ошибка ввода'. Если знак операции был введен верно, то на экран выводится сообщение вида: 5 —3 = 2.
После этого на экран выводится запрос 'Продолжить (Y/N)' и с клавиатуры считывается значение переменной символьного типа Ans. Если значение выражения (Ans='N') or (Ans='n') будет False, то цикл повторится вновь, иначе цикл будет завершен и управление в программе будет передано на оператор end. |