Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
основы программирования на Паскале.doc
Скачиваний:
255
Добавлен:
25.03.2016
Размер:
4.34 Mб
Скачать

10. Цикл со счетчиком и досрочное завершение циклов

Прежде, чем перейти к примерам, обсудим еще ряд проблем, связанных с циклами. Как для while, так и дляrepeat, во-первых, нигде в явном виде не задается число шагов цикла (хотя его обычно можно вычислить), во-вторых, при использовании обоих циклов программист должен заботиться об изменении управляющей переменной. Между тем, весьма распространены задачи, где объем последовательно обрабатываемых данных известен заранее (а значит, известно и требуемое число шагов цикла), а управляющая переменная меняется с шагом, равным единице. Рассмотренный выше пример с двадцатью значениямиxотносится именно к таким задачам. Поэтомудля обработки заранее известного объема данных с шагом по управляющей переменной, равным единице, вместо циклаwhileиспользуетсяцикл со счетчиком(цикл for). Его общий вид следующий:

for счетчик := начальное_значение to конечное_значение do begin

{операторы тела цикла}

end;

Здесь счетчик – целочисленная переменная, начальное и конечное значения – целочисленные выражения или константы. Тело цикла образовано не менее, чем одним оператором, если этот оператор единственный, операторные скобки можно не писать. Работает цикл forследующим образом:счетчик автоматически меняется от начального значения до конечного включительно, для каждого значения счетчика выполняется тело цикла. После каждого шага цикла значение счетчика автоматически увеличивается на единицу. Если требуется, чтобы значение счетчикауменьшалось, а не увеличивалось, вместо ключевого словаtoиспользуетсяdownto.

Подобно while, циклforможет не выполниться и ни разу – если начальное значение управляющей переменной сразу же больше конечного (при использованииto) или меньше (при использованииdownto).

Запишем рассмотренный выше цикл по переменной xс помощью оператораfor:

for x:=1 to 20 do begin

{операторы тела цикла}

end;

Удобства очевидны – границы изменения xзаданы сразу же при входе в цикл, а выполнять шаг поxотдельным оператором не требуется. Понятны и ограничения –xдолжен быть описан с типомinteger, а в случае измененияxс шагом, не равным единице, использоватьforвместоwhileне удалось бы.

Вторая проблема связана с тем, что при выполнении программы довольно часто возникает необходимость завершить цикл досрочно – например, если искомое в нем значение уже найдено или возникла ошибка, из-за которой дальнейшие шаги становятся бессмысленными. Теоретически цикл можно было бы завершить, присвоив управляющей переменной значение, выходящее за пределы ее изменения:

x:=1;

while x<10 do begin

y:=ln(x);

if y>2 then x:=10; {При y>2 цикл нужно завершить}

x:=x+0.5;

end;

Однако, во избежание трудноуловимых ошибок, управляющую переменную не принято менять иначе, чем для выполнения шага цикла. Например, после оператораif y>2 then x:=10; в нашем листинге выполнение текущего шага продолжится, что чревато лишними или неправильными вычислениями. Кроме того, текст такой программы воспринимается нелегко.

Поэтому для досрочного выхода из цикласуществует операторbreak (от англ. "to break" - прервать), немедленно прекращающий его выполнение:

x:=1;

while x<10 do begin

y:=ln(x);

if y>2 then break; {При y>2 цикл нужно завершить}

x:=x+0.5;

end;

Breakздесь передаст управление на оператор, следующий непосредственно за циклом. В отличие от предыдущего примера, здесь не будет выполняться часть тела цикла, следующая заbreak;.

Для немедленного продолжения цикла со следующего шагаиспользуется операторcontinue(от англ. "tocontinue" – продолжить):

var n:integer;

begin

repeat

writeln ('Введите положительное число:');

read (n);

if n<1 then continue; {Если введено n<1, снова запросить число}

{Здесь расположены операторы обработки положительного числа}

break; {Выход из цикла обработки}

until false;

end.

В этом примере оператор continueиспользован для повторного перехода к вводуn, если введеноn<1. Так как цикл обработки здесь – бесконечный, для выхода из него необходимbreak;. Кроме того, пример показывает одну из возможностей контроля правильности ввода данных. Указав директиву{$I-}, изученную в главе 8, мы могли бы защитить программу и от ввода пользователем нечисловых значений в качествеn.

В теме "Кратные циклы" второй части курса будет рассмотрен оператор goto, также способный решить проблему аварийного завершения циклов.