Отличия операторов repeat и while

Отличий три:

· Компьютер выходит из цикла оператора repeat тогда, когда условие истинно, а из цикла оператора while - когда условие ложно.

· while может ни разу не выполнить оператор, стоящий после do. repeat же хотя бы раз операторы, стоящие между repeat и until, выполнит.

Так, фрагмент k:=8; repeat k:=1 until 3>2; WriteLn(k) напечатает 1.

А фрагмент k:=8; while 2>3 do k:=1; WriteLn(k) напечатает 8.

· При компиляции оператор while дает несколько более эффективную программу, чем оператор repeat.

Часто эти отличия для начинающих малосущественны, поэтому выбирайте оператор по вкусу. Мне, например, надоели паскалевские begin и end, поэтому я охотнее пользуюсь оператором repeat.

Оператор цикла for

Выполняя программу печати чисел 3 5 7 9, оператор repeat выполнил цикл 4 раза. То же самое сделал и оператор while. Однако, обычно, когда мы пишем операторы repeat и while, нам совсем неважно знать, сколько раз они выполнят цикл. Тем не менее, существует много задач, для решения которых цикл нужно выполнить именно определенное количество раз. В этом случае удобно использовать оператор цикла for.

Задача: 200 раз напечатать слово ФУТБОЛ.

Попробуем сначала решить задачу при помощи оператора goto. Начнем с такого фрагмента:

metka: WriteLn('ФУТБОЛ');
goto metka

Но здесь цикл будет повторяться бесконечно, а нам нужно только 200 раз. Мы уже видели, что для выхода из цикла оператор goto нужно включить в состав оператора if. Кроме этого нужна переменная, меняющая свое значение от одного выполнения цикла к следующему. Придумаем этой величине какое-нибудь имя, скажем i. Проще всего задачу решает такой фрагмент:

i:=1;
metka: WriteLn('ФУТБОЛ');
i:=i+1; {увеличение i на 1}
if i<=200 then goto metka

END.

Здесь i вначале равно 1, но к каждому следующему выполнению цикла оно увеличивается на 1. В первый раз выполняя оператор if, компьютер проверяет условие 2<=200 и найдя его истинным, выполняет оператор goto metka. Во второй раз проверяется условие 3<=200 и т.д. В 199-й раз компьютер проверяет условие 200<=200 и найдя его истинным, выполняет оператор goto metka. В 200-й раз компьютер проверяет условие 201<=200 и найдя его ложным, выходит из цикла.

В нашем фрагменте "полезную" работу выполняет только одна строка из четырех - WriteLn('ФУТБОЛ'). Остальные три строки заняты тем, что обеспечивают выполнение "полезной" строки ровно 200 раз. Нам пришлось организовать специальную переменную, значение которой в каждый момент выполнения программы говорит о том, в какой раз выполняется цикл. Переменная с таким свойством называется счетчиком циклов.

А теперь запишем программу полностью, правда, несколько усложнив ее, так чтобы логика ее выполнения полностью соответствовала логике выполнения программы с оператором for, которую я привожу параллельно и поясняю немедленно.

LABEL m1,m2; VAR i : Integer; BEGIN i:=1; m1: if i>200 then goto m2; WriteLn('ФУТБОЛ'); i:=i+1; goto m1; m2: END. VAR i : Integer; BEGIN for i:=1 to 200 do WriteLn('ФУТБОЛ') END.

Слово forчитается "фо", переводится "для". Слово to читается "ту", переводится "до". Слово doчитается "ду", переводится "делай". Конструкция for i:=1 to 200 do по-русски читается так: Для i, изменяющегося от 1 до 200, делай оператор, стоящий после слова do. Смысл повторения здесь такой же, как и в операторе while. Оператор, стоящий после do, тоже, конечно, может быть составным.

Синтаксис оператора for:

FOR имя := выражение1 TO выражение2 DO оператор

Пример записи: for j:=a+b to2*s dok:=k+1.

Пояснения к синтаксической схеме:

имя - это имя произвольной переменной порядкового типа (см. 5.7 и 12.8), в частности целочисленной, называемой переменной цикла,

выражение1 ивыражение2 - произвольные выражения порядкового типа, в частности - целого.

Работа оператора for:

Прежде всего вычисляется выражение1, и переменной цикла (пусть это будет i) присваивается его значение. Затем вычисляется выражение2 и сравнивается с i. Если i > выражения2, то оператор for завершает свою работу, так ничего и не сделав. В противном случае выполняется оператор, стоящий после do. После выполнения этого оператора значение i увеличивается на 1 и снова сравнивается с выражением2. Если i > выражения2, то оператор for завершает свою работу, иначе снова выполняется оператор, стоящий после do, снова i увеличивается на 1 и т.д.

В нашем примере переменная i кроме того, что обеспечивает нам выход из цикла, никакой "полезной" работы не выполняет. Усложним же немного задачу. Пусть компьютер печатает такую информацию:

10 ФУТБОЛ 11 ФУТБОЛ 12 ФУТБОЛ . . . . . 200 ФУТБОЛ

Вот программа:

VAR i : Integer;
BEGIN
for i:=10 to 200 do
begin Write(i);
Write(' ФУТБОЛ ')
end
END.

Здесь после do стоит уже составной оператор.

Можно ли удобно использовать оператор for для печати такой информации?:

100 ФУТБОЛ 99 ФУТБОЛ 98 ФУТБОЛ . . . . . 40 ФУТБОЛ

Вполне, так как оператор for позволяет не только увеличивать, но и уменьшать переменную цикла. Однако, для этого нельзя писать for i:=100 to 40, а нужно писать for i:=100 downto 40. Читается downto - "'даунту", переводится буквально "вниз до". Соответственно, для выхода из цикла должно быть истинным не условие i > выражения2, а условие i < выражения2.

Вот объединенный синтаксис оператора for:

FOR имя := выражение1 TO DOWNTO выражение2 DO оператор

Вертикальная черта между двумя элементами конструкции «TOиDOWNTO» говорит о том, что в конструкции должен присутствовать один из этих элементов.

Задание 42: Напечатать с помощью оператора for:

Прямой счет: -5 -4 -3 -2 -1 0 1 2 3 4 5 Обратный счет: 5 4 3 2 1 0 -1 -2 -3 -4 -5 Конец счета

Наши рекомендации